[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