summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/internal-fs-layout.md3
-rw-r--r--project.py4
-rw-r--r--subcmds/upload.py43
3 files changed, 39 insertions, 11 deletions
diff --git a/docs/internal-fs-layout.md b/docs/internal-fs-layout.md
index 8050e4f0..530252b1 100644
--- a/docs/internal-fs-layout.md
+++ b/docs/internal-fs-layout.md
@@ -193,7 +193,8 @@ The `[branch]` settings are updated by `repo start` and `git branch`.
193| review.\<url\>.autocopy | upload | Automatically add to `--cc=<value>` | 193| review.\<url\>.autocopy | upload | Automatically add to `--cc=<value>` |
194| review.\<url\>.autoreviewer | upload | Automatically add to `--reviewers=<value>` | 194| review.\<url\>.autoreviewer | upload | Automatically add to `--reviewers=<value>` |
195| review.\<url\>.autoupload | upload | Automatically answer "yes" or "no" to all prompts | 195| review.\<url\>.autoupload | upload | Automatically answer "yes" or "no" to all prompts |
196| review.\<url\>.uploadhashtags | upload | Automatically add to `--hashtags=<value>` | 196| review.\<url\>.uploadhashtags | upload | Automatically add to `--hashtag=<value>` |
197| review.\<url\>.uploadlabels | upload | Automatically add to `--label=<value>` |
197| review.\<url\>.uploadtopic | upload | Default [topic] to use | 198| review.\<url\>.uploadtopic | upload | Default [topic] to use |
198| review.\<url\>.username | upload | Override username with `ssh://` review URIs | 199| review.\<url\>.username | upload | Override username with `ssh://` review URIs |
199| remote.\<remote\>.fetch | sync | Set of refs to fetch | 200| remote.\<remote\>.fetch | sync | Set of refs to fetch |
diff --git a/project.py b/project.py
index 3138eb19..66a4b3be 100644
--- a/project.py
+++ b/project.py
@@ -201,6 +201,7 @@ class ReviewableBranch(object):
201 dryrun=False, 201 dryrun=False,
202 auto_topic=False, 202 auto_topic=False,
203 hashtags=(), 203 hashtags=(),
204 labels=(),
204 draft=False, 205 draft=False,
205 private=False, 206 private=False,
206 notify=None, 207 notify=None,
@@ -213,6 +214,7 @@ class ReviewableBranch(object):
213 dryrun=dryrun, 214 dryrun=dryrun,
214 auto_topic=auto_topic, 215 auto_topic=auto_topic,
215 hashtags=hashtags, 216 hashtags=hashtags,
217 labels=labels,
216 draft=draft, 218 draft=draft,
217 private=private, 219 private=private,
218 notify=notify, 220 notify=notify,
@@ -1346,6 +1348,7 @@ class Project(object):
1346 dryrun=False, 1348 dryrun=False,
1347 auto_topic=False, 1349 auto_topic=False,
1348 hashtags=(), 1350 hashtags=(),
1351 labels=(),
1349 draft=False, 1352 draft=False,
1350 private=False, 1353 private=False,
1351 notify=None, 1354 notify=None,
@@ -1406,6 +1409,7 @@ class Project(object):
1406 if auto_topic: 1409 if auto_topic:
1407 opts += ['topic=' + branch.name] 1410 opts += ['topic=' + branch.name]
1408 opts += ['t=%s' % p for p in hashtags] 1411 opts += ['t=%s' % p for p in hashtags]
1412 opts += ['l=%s' % p for p in labels]
1409 1413
1410 opts += ['r=%s' % p for p in people[0]] 1414 opts += ['r=%s' % p for p in people[0]]
1411 opts += ['cc=%s' % p for p in people[1]] 1415 opts += ['cc=%s' % p for p in people[1]]
diff --git a/subcmds/upload.py b/subcmds/upload.py
index ef6d0242..93f9c1e7 100644
--- a/subcmds/upload.py
+++ b/subcmds/upload.py
@@ -134,7 +134,13 @@ review.URL.uploadhashtags:
134 134
135To add hashtags whenever uploading a commit, you can set a per-project 135To add hashtags whenever uploading a commit, you can set a per-project
136or global Git option to do so. The value of review.URL.uploadhashtags 136or global Git option to do so. The value of review.URL.uploadhashtags
137will be used as comma delimited hashtags like the --hashtags option. 137will be used as comma delimited hashtags like the --hashtag option.
138
139review.URL.uploadlabels:
140
141To add labels whenever uploading a commit, you can set a per-project
142or global Git option to do so. The value of review.URL.uploadlabels
143will be used as comma delimited labels like the --label option.
138 144
139# References 145# References
140 146
@@ -152,6 +158,9 @@ Gerrit Code Review: https://www.gerritcodereview.com/
152 p.add_option('--hashtag-branch', '--htb', 158 p.add_option('--hashtag-branch', '--htb',
153 action='store_true', 159 action='store_true',
154 help='Add local branch name as a hashtag.') 160 help='Add local branch name as a hashtag.')
161 p.add_option('-l', '--label',
162 dest='labels', action='append', default=[],
163 help='Add a label when uploading.')
155 p.add_option('--re', '--reviewers', 164 p.add_option('--re', '--reviewers',
156 type='string', action='append', dest='reviewers', 165 type='string', action='append', dest='reviewers',
157 help='Request reviews from these people.') 166 help='Request reviews from these people.')
@@ -410,22 +419,35 @@ Gerrit Code Review: https://www.gerritcodereview.com/
410 key = 'review.%s.uploadtopic' % branch.project.remote.review 419 key = 'review.%s.uploadtopic' % branch.project.remote.review
411 opt.auto_topic = branch.project.config.GetBoolean(key) 420 opt.auto_topic = branch.project.config.GetBoolean(key)
412 421
413 # Check if hashtags should be included. 422 def _ExpandCommaList(value):
414 def _ExpandHashtag(value): 423 """Split |value| up into comma delimited entries."""
415 """Split |value| up into comma delimited tags."""
416 if not value: 424 if not value:
417 return 425 return
418 for tag in value.split(','): 426 for ret in value.split(','):
419 tag = tag.strip() 427 ret = ret.strip()
420 if tag: 428 if ret:
421 yield tag 429 yield ret
430
431 # Check if hashtags should be included.
422 key = 'review.%s.uploadhashtags' % branch.project.remote.review 432 key = 'review.%s.uploadhashtags' % branch.project.remote.review
423 hashtags = set(_ExpandHashtag(branch.project.config.GetString(key))) 433 hashtags = set(_ExpandCommaList(branch.project.config.GetString(key)))
424 for tag in opt.hashtags: 434 for tag in opt.hashtags:
425 hashtags.update(_ExpandHashtag(tag)) 435 hashtags.update(_ExpandCommaList(tag))
426 if opt.hashtag_branch: 436 if opt.hashtag_branch:
427 hashtags.add(branch.name) 437 hashtags.add(branch.name)
428 438
439 # Check if labels should be included.
440 key = 'review.%s.uploadlabels' % branch.project.remote.review
441 labels = set(_ExpandCommaList(branch.project.config.GetString(key)))
442 for label in opt.labels:
443 labels.update(_ExpandCommaList(label))
444 # Basic sanity check on label syntax.
445 for label in labels:
446 if not re.match(r'^.+[+-][0-9]+$', label):
447 print('repo: error: invalid label syntax "%s": labels use forms '
448 'like CodeReview+1 or Verified-1' % (label,), file=sys.stderr)
449 sys.exit(1)
450
429 destination = opt.dest_branch or branch.project.dest_branch 451 destination = opt.dest_branch or branch.project.dest_branch
430 452
431 # Make sure our local branch is not setup to track a different remote branch 453 # Make sure our local branch is not setup to track a different remote branch
@@ -445,6 +467,7 @@ Gerrit Code Review: https://www.gerritcodereview.com/
445 dryrun=opt.dryrun, 467 dryrun=opt.dryrun,
446 auto_topic=opt.auto_topic, 468 auto_topic=opt.auto_topic,
447 hashtags=hashtags, 469 hashtags=hashtags,
470 labels=labels,
448 draft=opt.draft, 471 draft=opt.draft,
449 private=opt.private, 472 private=opt.private,
450 notify=None if opt.notify else 'NONE', 473 notify=None if opt.notify else 'NONE',