[PATCH 5 of 5 RFC] patchbomb: add support for a file that configures default To and CC
Augie Fackler
raf at durin42.com
Tue Jun 13 18:12:40 EDT 2017
# HG changeset patch
# User Augie Fackler <augie at google.com>
# Date 1497387366 14400
# Tue Jun 13 16:56:06 2017 -0400
# Node ID f89290549dcefcb9d6be2af966f870cb1dd1ead0
# Parent c98f63a3e8ee15645646539ba08b7b7682237cab
patchbomb: add support for a file that configures default To and CC
This lets repositories configure a shorthand (I used devel in the
tests, but you could do anything) for their project list, and also
supports fileset-based "subscriptions" so that people can request
being CC'ed on certain changes by default.
diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py
--- a/hgext/patchbomb.py
+++ b/hgext/patchbomb.py
@@ -83,6 +83,7 @@ from mercurial.i18n import _
from mercurial import (
cmdutil,
commands,
+ config,
error,
formatter,
hg,
@@ -641,7 +642,7 @@ def email(ui, repo, *revs, **opts):
showaddrs = []
- def getaddrs(header, ask=False, default=None):
+ def getaddrs(header, ask=False, trustdefault=True, default=None):
configkey = header.lower()
opt = header.replace('-', '_').lower()
addrs = opts.get(opt)
@@ -655,7 +656,7 @@ def email(ui, repo, *revs, **opts):
if not addr:
specified = (ui.hasconfig('email', configkey) or
ui.hasconfig('patchbomb', configkey))
- if not specified and ask:
+ if (not trustdefault or not specified) and ask:
addr = prompt(ui, header, default=default)
if addr:
showaddrs.append('%s: %s' % (header, addr))
@@ -665,11 +666,56 @@ def email(ui, repo, *revs, **opts):
ui, [default], _charsets, opts.get('test'))
return []
- to = getaddrs('To', ask=True)
+ todefault = set()
+ ccdefault = set(opts['cc'])
+ tocctrustdefault = True
+ if opts['to'] and repo.wvfs.exists('.hgemaildefaults'):
+ mailconf = config.config()
+ confpath = repo.wvfs.join('.hgemaildefaults')
+ with repo.wvfs('.hgemaildefaults') as fp:
+ mailconf.parse(confpath, fp.read())
+ for toflag in opts['to']:
+ # @ is unsupported in destination configs to avoid
+ # collisions with routable email addresses.
+ if '@' in toflag:
+ todefault.add(toflag)
+ continue
+ setsubs = toflag + '.setsubscriptions'
+ # Awkward dance time: we want to preserve the value of
+ # this --to flag iff there are no config sections defined
+ # for this name. For now, it's this simple. If we grow
+ # other sections beyond setsubscriptions, make sure to
+ # update this logic.
+ if setsubs in mailconf:
+ confdefault = None
+ else:
+ confdefault = toflag
+ todefault.add(mailconf.get(toflag, 'to', confdefault))
+ for fileset, wantcc in mailconf.items(setsubs):
+ for r in revs:
+ q = ('(modified() or added() or removed()) and (%s)' %
+ fileset)
+ if repo[r].getfileset(q):
+ ui.debug(
+ 'subscription fileset %s matched, adding cc: %s\n'
+ % (q, wantcc))
+ ccdefault.update(config.parselist(wantcc))
+ todefault = {t for t in todefault if t is not None}
+ # We've already handled the flags, so null the flag out. This
+ # also means the user will be prompted for an address, which
+ # is what we want, since the configuration can change as part
+ # of an `hg pull --update` or similar.
+ opts['to'] = []
+ opts['cc'] = []
+ tocctrustdefault = False
+
+ to = getaddrs('To', ask=True, default=', '.join(sorted(todefault)),
+ trustdefault=tocctrustdefault)
if not to:
# we can get here in non-interactive mode
raise error.Abort(_('no recipient addresses provided'))
- cc = getaddrs('Cc', ask=True, default='')
+ cc = getaddrs('Cc', ask=True, default=', '.join(sorted(ccdefault)),
+ trustdefault=tocctrustdefault)
bcc = getaddrs('Bcc')
replyto = getaddrs('Reply-To')
diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t
--- a/tests/test-patchbomb.t
+++ b/tests/test-patchbomb.t
@@ -3036,12 +3036,17 @@ Test hg email defaults settings:
> [devel.setsubscriptions]
> c or d = c-or-d at example.com
> a or b = a-or-b at example.com
+ > [foo.setsubscriptions]
+ > binary() = hates-binary-files at example.com
> EOF
-This change modifies file d
- $ hg email --date '1970-1-1 0:2' --to=devel --test -r 10 --config patchbomb.publicurl=
+This change modifies file d. Note that the "foo" to disappears from
+the To line because it has a setsubscription defined above.
+ $ hg email --date '1970-1-1 0:2' --to=devel --to=foo --test -r 10 --config patchbomb.publicurl=
From [test]: test
this patch series consists of 1 patches.
+ To [mercurial-devel at example.com]: mercurial-devel at example.com
+ Cc [c-or-d at example.com]: c-or-d at example.com
displaying [PATCH] dd ...
Content-Type: text/plain; charset="us-ascii"
@@ -3056,7 +3061,8 @@ This change modifies file d
User-Agent: Mercurial-patchbomb/* (glob)
Date: Thu, 01 Jan 1970 00:02:00 +0000
From: test
- To: devel
+ To: mercurial-devel at example.com
+ Cc: c-or-d at example.com
# HG changeset patch
# User test
@@ -3079,6 +3085,8 @@ This change modifies file b
From [test]: test
this patch series consists of 1 patches.
+ To [mercurial-devel at example.com]: mercurial-devel at example.com
+ Cc [a-or-b at example.com]: a-or-b at example.com
displaying [PATCH] b ...
Content-Type: text/plain; charset="us-ascii"
@@ -3093,7 +3101,8 @@ This change modifies file b
User-Agent: Mercurial-patchbomb/* (glob)
Date: Thu, 01 Jan 1970 00:02:00 +0000
From: test
- To: devel
+ To: mercurial-devel at example.com
+ Cc: a-or-b at example.com
# HG changeset patch
# User test
@@ -3115,6 +3124,8 @@ This change modifies file b
this patch series consists of 2 patches.
(optional) Subject: [PATCH 0 of 2]
+ To [mercurial-devel at example.com, specific-person at example.com]: mercurial-devel at example.com, specific-person at example.com
+ Cc [a-or-b at example.com, c-or-d at example.com, this-person-also at example.com]: a-or-b at example.com, c-or-d at example.com, this-person-also at example.com
displaying [PATCH 1 of 2] b ...
Content-Type: text/plain; charset="us-ascii"
@@ -3129,8 +3140,8 @@ This change modifies file b
User-Agent: Mercurial-patchbomb/* (glob)
Date: Thu, 01 Jan 1970 00:02:00 +0000
From: test
- To: devel, specific-person at example.com
- Cc: this-person-also at example.com
+ To: mercurial-devel at example.com, specific-person at example.com
+ Cc: a-or-b at example.com, c-or-d at example.com, this-person-also at example.com
# HG changeset patch
# User test
@@ -3161,8 +3172,8 @@ This change modifies file b
User-Agent: Mercurial-patchbomb/* (glob)
Date: Thu, 01 Jan 1970 00:02:01 +0000
From: test
- To: devel, specific-person at example.com
- Cc: this-person-also at example.com
+ To: mercurial-devel at example.com, specific-person at example.com
+ Cc: a-or-b at example.com, c-or-d at example.com, this-person-also at example.com
# HG changeset patch
# User test
More information about the Mercurial-devel
mailing list