From patchwork Wed Apr 1 13:25:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4,of,5] patchbomb: add config option to generate flag by template From: Yuya Nishihara X-Patchwork-Id: 8413 Message-Id: <98290eaf4e6bf993f5e3.1427894753@mimosa> To: mercurial-devel@selenic.com Date: Wed, 01 Apr 2015 22:25:53 +0900 # HG changeset patch # User Yuya Nishihara # Date 1427726446 -32400 # Mon Mar 30 23:40:46 2015 +0900 # Node ID 98290eaf4e6bf993f5e351bd8f954b8f6e99479a # Parent 79696ed77d0e958b4291900a831981211e6d6bfe patchbomb: add config option to generate flag by template This allows us to flag stable patches automatically. [patchbomb] flagtemplate = {ifeq(branch, 'default', '', branch|upper)} I assume that the following rules are acceptable in most cases, but some of them won't be applied to the other projects. - flag is generated from the last revision because it is likely to be a head that has bookmarks. - flagtemplate can't be overridden by --flag because we'll want to add extra flag such as --flag V2. diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py --- a/hgext/patchbomb.py +++ b/hgext/patchbomb.py @@ -53,6 +53,12 @@ overwritten by command line flags like - intro=never # never include an introduction message intro=always # always include an introduction message +You can specify the template for the flag to add in subject prefixes. The flag +will be generated from the last revision to be sent. + + [patchbomb] + flagtemplate = {ifeq(branch, 'default', '', branch|upper)} + You can set patchbomb to always ask for confirmation by setting ``patchbomb.confirm`` to true. ''' @@ -65,7 +71,7 @@ import email.Generator import email.MIMEMultipart from mercurial import cmdutil, commands, hg, mail, patch, util -from mercurial import scmutil +from mercurial import scmutil, templater from mercurial.i18n import _ from mercurial.node import bin @@ -264,6 +270,25 @@ def _getbundlemsgs(repo, sender, bundle, msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test')) return [(msg, subj, None)] +def _makeflag(repo, revs): + """make a flag from the last revision which is likely to be a branch or + bookmark head""" + ui = repo.ui + tmpl = ui.config('patchbomb', 'flagtemplate') + if not revs or not tmpl: + return '' + tmpl = templater.parsestring(tmpl, quoted=False) + try: + t = cmdutil.changeset_templater(ui, repo, None, {}, tmpl, None, False) + except SyntaxError, inst: + raise util.Abort(inst.args[0]) + ui.pushbuffer() + try: + t.show(repo[revs.last()]) + t.close() + finally: + return ui.popbuffer() + def _makeintro(repo, sender, patches, **opts): """make an introduction email, asking the user for content if needed @@ -505,6 +530,10 @@ def patchbomb(ui, repo, *revs, **opts): if bundle: opts['revs'] = [str(r) for r in revs] + flag = _makeflag(repo, revs) + if flag: + opts.setdefault('flag', []).insert(0, flag) + # start if date: start_time = util.parsedate(date) diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t --- a/tests/test-patchbomb.t +++ b/tests/test-patchbomb.t @@ -2330,6 +2330,113 @@ test multi-address parsing: +test flag template: + $ hg bookmark -r1 foo + $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -r 0:1 \ + > --config patchbomb.flagtemplate='{bookmarks}' + this patch series consists of 2 patches. + + (optional) Subject: [PATCH 0 of 2 foo] + Cc: + + displaying [PATCH 1 of 2 foo] a ... + Content-Type: text/plain; charset="us-ascii" + MIME-Version: 1.0 + Content-Transfer-Encoding: 7bit + Subject: [PATCH 1 of 2 foo] a + X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab + X-Mercurial-Series-Index: 1 + X-Mercurial-Series-Total: 2 + Message-Id: <8580ff50825a50c8f716.60@*> (glob) + X-Mercurial-Series-Id: <8580ff50825a50c8f716.60@*> (glob) + User-Agent: Mercurial-patchbomb/* (glob) + Date: Thu, 01 Jan 1970 00:01:00 +0000 + From: quux + To: foo + + # HG changeset patch + # User test + # Date 1 0 + # Thu Jan 01 00:00:01 1970 +0000 + # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab + # Parent 0000000000000000000000000000000000000000 + a + + diff -r 000000000000 -r 8580ff50825a a + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:01 1970 +0000 + @@ -0,0 +1,1 @@ + +a + + displaying [PATCH 2 of 2 foo] b ... + Content-Type: text/plain; charset="us-ascii" + MIME-Version: 1.0 + Content-Transfer-Encoding: 7bit + Subject: [PATCH 2 of 2 foo] b + X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9 + X-Mercurial-Series-Index: 2 + X-Mercurial-Series-Total: 2 + Message-Id: <97d72e5f12c7e84f8506.61@*> (glob) + X-Mercurial-Series-Id: <8580ff50825a50c8f716.60@*> (glob) + In-Reply-To: <8580ff50825a50c8f716.60@*> (glob) + References: <8580ff50825a50c8f716.60@*> (glob) + User-Agent: Mercurial-patchbomb/* (glob) + Date: Thu, 01 Jan 1970 00:01:01 +0000 + From: quux + To: foo + + # HG changeset patch + # User test + # Date 2 0 + # Thu Jan 01 00:00:02 1970 +0000 + # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9 + # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab + b + + diff -r 8580ff50825a -r 97d72e5f12c7 b + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/b Thu Jan 01 00:00:02 1970 +0000 + @@ -0,0 +1,1 @@ + +b + + +test flag template plus --flag: + $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -r 0 --flag 'V2' \ + > --config patchbomb.flagtemplate='{branch}' + this patch series consists of 1 patches. + + Cc: + + displaying [PATCH default V2] a ... + Content-Type: text/plain; charset="us-ascii" + MIME-Version: 1.0 + Content-Transfer-Encoding: 7bit + Subject: [PATCH default V2] a + X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab + X-Mercurial-Series-Index: 1 + X-Mercurial-Series-Total: 1 + Message-Id: <8580ff50825a50c8f716.60@*> (glob) + X-Mercurial-Series-Id: <8580ff50825a50c8f716.60@*> (glob) + User-Agent: Mercurial-patchbomb/* (glob) + Date: Thu, 01 Jan 1970 00:01:00 +0000 + From: quux + To: foo + + # HG changeset patch + # User test + # Date 1 0 + # Thu Jan 01 00:00:01 1970 +0000 + # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab + # Parent 0000000000000000000000000000000000000000 + a + + diff -r 000000000000 -r 8580ff50825a a + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:01 1970 +0000 + @@ -0,0 +1,1 @@ + +a + + test multi-byte domain parsing: $ UUML=`$PYTHON -c 'import sys; sys.stdout.write("\374")'` $ HGENCODING=iso-8859-1