diff options
author | Michał Górny <mgorny@gentoo.org> | 2017-08-03 16:12:32 +0200 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2017-08-06 12:26:40 +0200 |
commit | e9b3515143e66a35aa4e0d34d4b8c3995817863a (patch) | |
tree | 7fcfd01c87a1faf2e660e4c6cbeccbde8ea57db5 | |
parent | repoman commit: Merge code generating common part of the footer (DCO) (diff) | |
download | portage-e9b35151.tar.gz portage-e9b35151.tar.bz2 portage-e9b35151.zip |
repoman commit: Support --bug (-b) and --closes (-c) for git footer
Support two new options: --bug (-b) and --closes (-c) to add a plain
'Bug' reference and a 'Closes' footer for a GitHub pull request. Both
options can be specified multiple times, resulting in multiple footer
tags being written.
The --bug option accepts either a Gentoo Bugzilla bug number or an URL
to any bug tracker. In the latter case, it performs two trivial
transformations automatically: replaces long 'show_bug.cgi' Bugzilla
URLs with the short 'https://bugs.gentoo.org/NNNNNN', and forces
https:// for a few known services.
The --closes option accepts either a GitHub Gentoo repository pull
request number or an URL to any pull request (or bug) that uses
the 'Closes' tag. In the latter case, https:// is forced for a few known
services.
Reviewed-by: Zac Medico <zmedico@gentoo.org>
-rw-r--r-- | repoman/man/repoman.1 | 14 | ||||
-rw-r--r-- | repoman/pym/repoman/actions.py | 42 | ||||
-rw-r--r-- | repoman/pym/repoman/argparser.py | 16 |
3 files changed, 71 insertions, 1 deletions
diff --git a/repoman/man/repoman.1 b/repoman/man/repoman.1 index 4101c283f..a49c72c0d 100644 --- a/repoman/man/repoman.1 +++ b/repoman/man/repoman.1 @@ -21,6 +21,20 @@ BASH. \fB-a\fR, \fB--ask\fR Request a confirmation before commiting .TP +\fB-b\fR, \fB--bug\fR +Include a bug reference in the commit message footer. The argument can +be either a Gentoo bug number or a full bug URL (either Gentoo +or upstream). Gentoo bug URLs are automatically shortened to +the canonical \fBhttps://bugs.gentoo.org/NNNNNN\fR form, and HTTPS +is forced for known bug trackers. +.TP +\fB-c\fR, \fB--closes\fR +Include a \fBCloses\fR tag in the commit message footer that can be used +to close pull requests (and issues) on GitHub and other compatible +services (GitLab, Bitbucket). The argument can be either a PR number for +the gentoo/gentoo GitHub repository or a full PR/bug URL. For bug URLs, +HTTPS is forced automatically for known bug/PR trackers. +.TP \fB\-\-digest=<y|n>\fR Automatically update Manifest digests for modified files. This option triggers a behavior that is very similar to that enabled diff --git a/repoman/pym/repoman/actions.py b/repoman/pym/repoman/actions.py index 00bb5b2ca..2112299c0 100644 --- a/repoman/pym/repoman/actions.py +++ b/repoman/pym/repoman/actions.py @@ -14,6 +14,11 @@ import tempfile import time from itertools import chain +try: + from urllib.parse import parse_qs, urlsplit, urlunsplit +except ImportError: + from urlparse import parse_qs, urlsplit, urlunsplit + from _emerge.UserQuery import UserQuery from repoman._portage import portage @@ -324,6 +329,13 @@ class Actions(object): return (changes.new, changes.changed, changes.removed, changes.no_expansion, changes.expansion) + https_bugtrackers = frozenset([ + 'bitbucket.org', + 'bugs.gentoo.org', + 'github.com', + 'gitlab.com', + ]) + def get_commit_footer(self): portage_version = getattr(portage, "VERSION", None) gpg_key = self.repoman_settings.get("PORTAGE_GPG_KEY", "") @@ -345,6 +357,36 @@ class Actions(object): # Common part of commit footer commit_footer = "\n" + for bug in self.options.bug: + # case 1: pure number NNNNNN + if bug.isdigit(): + bug = 'https://bugs.gentoo.org/%s' % (bug, ) + else: + purl = urlsplit(bug) + qs = parse_qs(purl.query) + # case 2: long Gentoo bugzilla URL to shorten + if (purl.netloc == 'bugs.gentoo.org' and + purl.path == '/show_bug.cgi' and + tuple(qs.keys()) == ('id',)): + bug = urlunsplit(('https', purl.netloc, + qs['id'][-1], '', purl.fragment)) + # case 3: bug tracker w/ http -> https + elif (purl.scheme == 'http' and + purl.netloc in self.https_bugtrackers): + bug = urlunsplit(('https',) + purl[1:]) + commit_footer += "Bug: %s\n" % (bug, ) + + for closes in self.options.closes: + # case 1: pure number NNNN + if closes.isdigit(): + closes = 'https://github.com/gentoo/gentoo/pull/%s' % (closes, ) + else: + purl = urlsplit(closes) + # case 2: bug tracker w/ http -> https + if purl.netloc in self.https_bugtrackers: + closes = urlunsplit(('https',) + purl[1:]) + commit_footer += "Closes: %s\n" % (closes, ) + if dco_sob: commit_footer += "Signed-off-by: %s\n" % (dco_sob, ) diff --git a/repoman/pym/repoman/argparser.py b/repoman/pym/repoman/argparser.py index 2d56a87e6..f32972288 100644 --- a/repoman/pym/repoman/argparser.py +++ b/repoman/pym/repoman/argparser.py @@ -1,5 +1,5 @@ # repoman: Argument parser -# Copyright 2007-2014 Gentoo Foundation +# Copyright 2007-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 """This module contains functions used in Repoman to parse CLI arguments.""" @@ -58,6 +58,20 @@ def parse_args(argv, qahelp, repoman_default_opts): help='Request a confirmation before commiting') parser.add_argument( + '-b', '--bug', dest='bug', action='append', metavar='<BUG-NO|BUG-URL>', + default=[], + help=( + 'Mention a Gentoo or upstream bug in the commit footer; ' + 'takes either Gentoo bug number or full bug URL')) + + parser.add_argument( + '-c', '--closes', dest='closes', action='append', metavar='<PR-NO|PR-URL>', + default=[], + help=( + 'Adds a Closes footer to close GitHub pull request (or compatible); ' + 'takes either GitHub PR number or full PR URL')) + + parser.add_argument( '-m', '--commitmsg', dest='commitmsg', help='specify a commit message on the command line') |