changeset 4262:f51317e24114

Add --outgoing option to patchbomb
author Brendan Cully <brendan@kublai.com>
date Thu, 22 Mar 2007 10:40:28 -0700
parents fe0fe0b4d73b
children 47ba52121433
files hgext/patchbomb.py
diffstat 1 files changed, 41 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/patchbomb.py	Tue Mar 20 22:21:05 2007 -0300
+++ b/hgext/patchbomb.py	Thu Mar 22 10:40:28 2007 -0700
@@ -86,7 +86,13 @@
     The message contains two or three body parts.  First, the rest of
     the changeset description.  Next, (optionally) if the diffstat
     program is installed, the result of running diffstat on the patch.
-    Finally, the patch itself, as generated by "hg export".'''
+    Finally, the patch itself, as generated by "hg export".
+
+    With --outgoing, emails will be generated for patches not
+    found in the target repository (or only those which are
+    ancestors of the specified revisions if any are provided)
+    '''
+
     def prompt(prompt, default = None, rest = ': ', empty_ok = False):
         if default: prompt += ' [%s]' % default
         prompt += rest
@@ -165,6 +171,36 @@
         msg['X-Mercurial-Node'] = node
         return msg
 
+    def outgoing(dest, revs):
+        '''Return the revisions present locally but not in dest'''
+        dest = ui.expandpath(dest or 'default-push', dest or 'default')
+        revs = [repo.lookup(rev) for rev in revs]
+        other = hg.repository(ui, dest)
+        ui.status(_('comparing with %s\n') % dest)
+        o = repo.findoutgoing(other)
+        if not o:
+            ui.status(_("no changes found\n"))
+            return []
+        o = repo.changelog.nodesbetween(o, revs or None)[0]
+        return [str(repo.changelog.rev(r)) for r in o]
+
+    # option handling
+    commands.setremoteconfig(ui, opts)
+    if opts.get('outgoing'):
+        if len(revs) > 1:
+            raise util.Abort(_("too many destinations"))
+        dest = revs and revs[0] or None
+        revs = []
+
+    if opts.get('rev'):
+        if revs:
+            raise util.Abort(_('use only one form to specify the revision'))
+        revs = opts.get('rev')
+
+    if opts.get('outgoing'):
+        revs = outgoing(dest, opts.get('rev'))
+
+    # start
     start_time = util.makedate()
 
     def genmsgid(id):
@@ -299,7 +335,9 @@
       ('', 'plain', None, 'omit hg patch header'),
       ('n', 'test', None, 'print messages that would be sent'),
       ('m', 'mbox', '', 'write messages to mbox file instead of sending them'),
+      ('o', 'outgoing', None, _('send changes not found in the target repository')),
+      ('r', 'rev', [], _('a revision to send')),
       ('s', 'subject', '', 'subject of first message (intro or single patch)'),
-      ('t', 'to', [], 'email addresses of recipients')],
-     "hg email [OPTION]... [REV]...")
+      ('t', 'to', [], 'email addresses of recipients')] + commands.remoteopts,
+     "hg email [OPTION]... [DEST]...")
     }