Skip to content

Commit a3116fa

Browse files
authored
feat: add optional commit message (#859)
* feat: add optional commit message to dataset commands * fix: raise if not str * fix: python35 update
1 parent 54ba91d commit a3116fa

File tree

8 files changed

+92
-28
lines changed

8 files changed

+92
-28
lines changed

renku/core/commands/client.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
from renku.core.management import LocalClient
2828

29+
from ..management.config import RENKU_HOME
30+
from ..management.repository import default_path
2931
from .git import get_git_isolation
3032

3133

@@ -63,8 +65,17 @@ def pass_local_client(
6365
)
6466

6567
def new_func(*args, **kwargs):
66-
ctx = click.get_current_context()
67-
client = ctx.ensure_object(LocalClient)
68+
ctx = click.get_current_context(silent=True)
69+
if ctx is None:
70+
client = LocalClient(
71+
path=default_path(),
72+
renku_home=RENKU_HOME,
73+
use_external_storage=True,
74+
)
75+
ctx = click.Context(click.Command(method))
76+
else:
77+
client = ctx.ensure_object(LocalClient)
78+
6879
stack = contextlib.ExitStack()
6980

7081
# Handle --isolation option:
@@ -73,20 +84,24 @@ def new_func(*args, **kwargs):
7384

7485
transaction = client.transaction(
7586
clean=clean,
76-
up_to_date=up_to_date,
7787
commit=commit,
88+
commit_empty=commit_empty,
89+
commit_message=kwargs.get('commit_message', None),
7890
commit_only=commit_only,
7991
ignore_std_streams=ignore_std_streams,
80-
commit_empty=commit_empty,
8192
raise_if_empty=raise_if_empty,
93+
up_to_date=up_to_date,
8294
)
8395
stack.enter_context(transaction)
8496

8597
if lock or (lock is None and commit):
8698
stack.enter_context(client.lock)
8799

88-
with stack:
89-
result = ctx.invoke(method, client, *args, **kwargs)
100+
result = None
101+
if ctx:
102+
with stack:
103+
result = ctx.invoke(method, client, *args, **kwargs)
104+
90105
return result
91106

92107
return functools.update_wrapper(new_func, method)

renku/core/commands/clone.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def renku_clone(
2929
path=None,
3030
install_githooks=True,
3131
skip_smudge=True,
32-
progress=None
32+
progress=None,
33+
commit_message=None
3334
):
3435
"""Clone Renku project repo, install Git hooks and LFS."""
3536
install_lfs = client.use_external_storage

renku/core/commands/config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,15 @@ def _split_section_and_key(key):
3636
commit_only=CONFIG_LOCAL_PATH,
3737
commit_empty=False
3838
)
39-
def update_config(client, key, *, value=None, remove=False, global_only=False):
39+
def update_config(
40+
client,
41+
key,
42+
*,
43+
value=None,
44+
remove=False,
45+
global_only=False,
46+
commit_message=None
47+
):
4048
"""Add, update, or remove configuration values."""
4149
section, section_key = _split_section_and_key(key)
4250
if remove:

renku/core/commands/dataset.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def dataset_parent(client, revision, datadir, format, ctx=None):
101101
@pass_local_client(
102102
clean=False, commit=True, commit_only=DATASET_METADATA_PATHS
103103
)
104-
def create_dataset(client, name):
104+
def create_dataset(client, name, commit_message=None):
105105
"""Create an empty dataset in the current repo.
106106
107107
:raises: ``renku.core.errors.ParameterError``
@@ -115,7 +115,7 @@ def create_dataset(client, name):
115115
@pass_local_client(
116116
clean=False, commit=True, commit_only=DATASET_METADATA_PATHS
117117
)
118-
def edit_dataset(client, dataset_id, transform_fn):
118+
def edit_dataset(client, dataset_id, transform_fn, commit_message=None):
119119
"""Edit dataset metadata."""
120120
dataset = client.load_dataset(dataset_id)
121121

@@ -146,7 +146,8 @@ def add_file(
146146
destination='',
147147
ref=None,
148148
with_metadata=None,
149-
urlscontext=contextlib.nullcontext
149+
urlscontext=contextlib.nullcontext,
150+
commit_message=None,
150151
):
151152
"""Add data file to a dataset."""
152153
add_to_dataset(
@@ -166,7 +167,8 @@ def add_to_dataset(
166167
destination='',
167168
ref=None,
168169
with_metadata=None,
169-
urlscontext=contextlib.nullcontext
170+
urlscontext=contextlib.nullcontext,
171+
commit_message=None,
170172
):
171173
"""Add data to a dataset."""
172174
if len(urls) == 0:
@@ -247,7 +249,7 @@ def list_files(client, names, creators, include, exclude, format):
247249
commit_only=COMMIT_DIFF_STRATEGY,
248250
)
249251
@contextmanager
250-
def file_unlink(client, name, include, exclude):
252+
def file_unlink(client, name, include, exclude, commit_message=None):
251253
"""Remove matching files from a dataset."""
252254
dataset = client.load_dataset(name=name)
253255

@@ -278,7 +280,8 @@ def dataset_remove(
278280
names,
279281
with_output=False,
280282
datasetscontext=contextlib.nullcontext,
281-
referencescontext=contextlib.nullcontext
283+
referencescontext=contextlib.nullcontext,
284+
commit_message=None
282285
):
283286
"""Delete a dataset."""
284287
datasets = {name: client.dataset_path(name) for name in names}
@@ -338,7 +341,8 @@ def export_dataset(
338341
publish,
339342
tag,
340343
handle_access_token_fn=None,
341-
handle_tag_selection_fn=None
344+
handle_tag_selection_fn=None,
345+
commit_message=None,
342346
):
343347
"""Export data to 3rd party provider.
344348
@@ -423,7 +427,8 @@ def import_dataset(
423427
with_prompt=False,
424428
pool_init_fn=None,
425429
pool_init_args=None,
426-
download_file_fn=default_download_file
430+
download_file_fn=default_download_file,
431+
commit_message=None,
427432
):
428433
"""Import data from a 3rd party provider."""
429434
provider, err = ProviderFactory.from_uri(uri)
@@ -538,7 +543,8 @@ def update_datasets(
538543
exclude,
539544
ref,
540545
delete,
541-
progress_context=contextlib.nullcontext
546+
progress_context=contextlib.nullcontext,
547+
commit_message=None,
542548
):
543549
"""Update files from a remote Git repo."""
544550
records = _filter(
@@ -650,7 +656,9 @@ def _filter(client, names=None, creators=None, include=None, exclude=None):
650656
commit=True,
651657
commit_only=COMMIT_DIFF_STRATEGY,
652658
)
653-
def tag_dataset_with_client(client, name, tag, description, force=False):
659+
def tag_dataset_with_client(
660+
client, name, tag, description, force=False, commit_message=None
661+
):
654662
"""Creates a new tag for a dataset and injects a LocalClient."""
655663
tag_dataset(client, name, tag, description, force)
656664

@@ -674,7 +682,7 @@ def tag_dataset(client, name, tag, description, force=False):
674682
commit=True,
675683
commit_only=COMMIT_DIFF_STRATEGY,
676684
)
677-
def remove_dataset_tags(client, name, tags):
685+
def remove_dataset_tags(client, name, tags, commit_message=True):
678686
"""Removes tags from a dataset."""
679687
dataset = client.load_dataset(name)
680688
if not dataset:

renku/core/commands/migrate.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
@pass_local_client(
2525
clean=True, commit=True, commit_empty=False, raise_if_empty=True
2626
)
27-
def migrate_datasets(client):
27+
def migrate_datasets(
28+
client,
29+
commit_message=None,
30+
):
2831
"""Migrate dataset metadata."""
2932
results = [
3033
migration(client) is not False for migration in STRUCTURE_MIGRATIONS

renku/core/errors.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ def __init__(self):
198198
super(NothingToCommit, self).__init__('There is nothing to commit.')
199199

200200

201+
class CommitMessageEmpty(RenkuException):
202+
"""Raise invalid commit message."""
203+
204+
def __init__(self):
205+
"""Build a custom message."""
206+
super(CommitMessageEmpty, self).__init__('Invalid commit message.')
207+
208+
201209
class FailedMerge(RenkuException):
202210
"""Raise when automatic merge failed."""
203211

renku/core/management/git.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,11 @@ def ensure_unstaged(self, path):
230230

231231
@contextmanager
232232
def commit(
233-
self, commit_only=None, commit_empty=True, raise_if_empty=False
233+
self,
234+
commit_only=None,
235+
commit_empty=True,
236+
raise_if_empty=False,
237+
commit_message=None
234238
):
235239
"""Automatic commit."""
236240
from git import Actor
@@ -302,12 +306,18 @@ def commit(
302306
raise errors.NothingToCommit()
303307
return
304308

305-
argv = [os.path.basename(sys.argv[0])
306-
] + [remove_credentials(arg) for arg in sys.argv[1:]]
309+
if commit_message and not isinstance(commit_message, str):
310+
raise errors.CommitMessageEmpty()
311+
312+
elif not commit_message:
313+
argv = [os.path.basename(sys.argv[0])
314+
] + [remove_credentials(arg) for arg in sys.argv[1:]]
315+
316+
commit_message = ' '.join(argv)
307317

308318
# Ignore pre-commit hooks since we have already done everything.
309319
self.repo.index.commit(
310-
' '.join(argv),
320+
commit_message,
311321
committer=committer,
312322
skip_hooks=True,
313323
)
@@ -316,12 +326,13 @@ def commit(
316326
def transaction(
317327
self,
318328
clean=True,
319-
up_to_date=False,
320329
commit=True,
330+
commit_empty=True,
331+
commit_message=None,
321332
commit_only=None,
322333
ignore_std_streams=False,
323-
commit_empty=True,
324-
raise_if_empty=False
334+
raise_if_empty=False,
335+
up_to_date=False,
325336
):
326337
"""Perform Git checks and operations."""
327338
if clean:
@@ -335,8 +346,9 @@ def transaction(
335346

336347
if commit:
337348
with self.commit(
338-
commit_only=commit_only,
339349
commit_empty=commit_empty,
350+
commit_message=commit_message,
351+
commit_only=commit_only,
340352
raise_if_empty=raise_if_empty
341353
):
342354
yield self

tests/core/commands/test_dataset.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
from contextlib import contextmanager
2424

2525
import pytest
26+
from git import Repo
2627

2728
from renku.core import errors
29+
from renku.core.commands.dataset import create_dataset
2830
from renku.core.models.datasets import Dataset, DatasetFile
2931
from renku.core.models.provenance.agents import Person
3032

@@ -174,3 +176,10 @@ def test_dataset_serialization(dataset):
174176
assert dataset.identifier == dataset_metadata.get('identifier')
175177
assert dataset.name == dataset_metadata.get('name')
176178
assert dataset.path == dataset_metadata.get('path')
179+
180+
181+
def test_create_dataset_custom_message(project):
182+
"""Test create dataset custom message."""
183+
create_dataset('ds1', commit_message='my awesome dataset')
184+
last_commit = Repo('.').head.commit
185+
assert 'my awesome dataset' == last_commit.message

0 commit comments

Comments
 (0)