aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2017-08-03 16:12:32 +0200
committerMichał Górny <mgorny@gentoo.org>2017-08-06 12:26:40 +0200
commite9b3515143e66a35aa4e0d34d4b8c3995817863a (patch)
tree7fcfd01c87a1faf2e660e4c6cbeccbde8ea57db5
parentrepoman commit: Merge code generating common part of the footer (DCO) (diff)
downloadportage-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.114
-rw-r--r--repoman/pym/repoman/actions.py42
-rw-r--r--repoman/pym/repoman/argparser.py16
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')