Patchwork patchbomb: add -B option to select a bookmark

login
register
mail settings
Submitter David Demelier
Date Feb. 3, 2017, 2:04 p.m.
Message ID <a9061ca9a25c8e16150f.1486130661@localhost.localdomain>
Download mbox | patch
Permalink /patch/18320/
State Changes Requested
Headers show

Comments

David Demelier - Feb. 3, 2017, 2:04 p.m.
# HG changeset patch
# User David Demelier <demelier.david@gmail.com>
# Date 1486130547 -3600
#      Fri Feb 03 15:02:27 2017 +0100
# Node ID a9061ca9a25c8e16150fd2e1574ccac1310b7a03
# Parent  abf029200e198878a4576a87e095bd8d77d9cea9
patchbomb: add -B option to select a bookmark

Add the -B/--bookmark option to select a bookmark whose changesets
and its ancestors will be selected unless a new bookmark/head is
found.

This is inspired by hg strip -B option.
Sean Farley - Feb. 3, 2017, 11:22 p.m.
David Demelier <demelier.david@gmail.com> writes:

> # HG changeset patch
> # User David Demelier <demelier.david@gmail.com>
> # Date 1486130547 -3600
> #      Fri Feb 03 15:02:27 2017 +0100
> # Node ID a9061ca9a25c8e16150fd2e1574ccac1310b7a03
> # Parent  abf029200e198878a4576a87e095bd8d77d9cea9
> patchbomb: add -B option to select a bookmark
>
> Add the -B/--bookmark option to select a bookmark whose changesets
> and its ancestors will be selected unless a new bookmark/head is
> found.
>
> This is inspired by hg strip -B option.

Totally fine idea, I like it.

> diff -r abf029200e19 -r a9061ca9a25c hgext/patchbomb.py
> --- a/hgext/patchbomb.py	Wed Feb 01 11:30:26 2017 -0600
> +++ b/hgext/patchbomb.py	Fri Feb 03 15:02:27 2017 +0100
> @@ -81,6 +81,7 @@
>      mail,
>      node as nodemod,
>      patch,
> +    repair,
>      scmutil,
>      util,
>  )
> @@ -411,6 +412,7 @@
>      ('o', 'outgoing', None,
>       _('send changes not found in the target repository')),
>      ('b', 'bundle', None, _('send changes not in target as a binary bundle')),

Unrelated: -b option not meaning 'branch' makes me so very sad.

> +    ('B', 'bookmark', '', _('send changes only reachable by given bookmark')),
>      ('', 'bundlename', 'bundle',
>       _('name of the bundle attachment file'), _('NAME')),
>      ('r', 'rev', [], _('a revision to send'), _('REV')),
> @@ -449,6 +451,9 @@
>      body and as a regular or an inline attachment by combining the
>      -a/--attach or -i/--inline with the --body option.
>  
> +    With -B/--bookmark changesets reachable by the given bookmark are
> +    selected.
> +
>      With -o/--outgoing, emails will be generated for patches not found
>      in the destination repository (or only those which are ancestors
>      of the specified revisions if any are provided)
> @@ -489,6 +494,8 @@
>        hg email -o -r 3000       # send all ancestors of 3000 not in default
>        hg email -o -r 3000 DEST  # send all ancestors of 3000 not in DEST
>  
> +      hg email -B feature       # send all ancestors of feature bookmark
> +
>        hg email -b               # send bundle of all patches not in default
>        hg email -b DEST          # send bundle of all patches not in DEST
>        hg email -b -r 3000       # bundle of all ancestors of 3000 not in default
> @@ -511,6 +518,7 @@
>      mbox = opts.get('mbox')
>      outgoing = opts.get('outgoing')
>      rev = opts.get('rev')
> +    bookmark = opts.get('bookmark')
>      # internal option used by pbranches
>      patches = opts.get('patches')
>  
> @@ -518,8 +526,8 @@
>          # really sending
>          mail.validateconfig(ui)
>  
> -    if not (revs or rev or outgoing or bundle or patches):
> -        raise error.Abort(_('specify at least one changeset with -r or -o'))
> +    if not (revs or rev or outgoing or bundle or patches or bookmark):
> +        raise error.Abort(_('specify at least one changeset with -B, -r or -o'))
>  
>      if outgoing and bundle:
>          raise error.Abort(_("--outgoing mode always on with --bundle;"
> @@ -538,6 +546,10 @@
>          if revs:
>              raise error.Abort(_('use only one form to specify the revision'))
>          revs = rev
> +    elif bookmark:
> +        if not bookmark in repo._bookmarks:
> +            raise error.Abort(_("bookmark '%s' not found") % bookmark)
> +        revs = repair.stripbmrevset(repo, bookmark)

My only suggestion here is to add a test. I'm working on cleaning up the
bookmark module so I'm thinking I can refactor this revset then.

Patch

diff -r abf029200e19 -r a9061ca9a25c hgext/patchbomb.py
--- a/hgext/patchbomb.py	Wed Feb 01 11:30:26 2017 -0600
+++ b/hgext/patchbomb.py	Fri Feb 03 15:02:27 2017 +0100
@@ -81,6 +81,7 @@ 
     mail,
     node as nodemod,
     patch,
+    repair,
     scmutil,
     util,
 )
@@ -411,6 +412,7 @@ 
     ('o', 'outgoing', None,
      _('send changes not found in the target repository')),
     ('b', 'bundle', None, _('send changes not in target as a binary bundle')),
+    ('B', 'bookmark', '', _('send changes only reachable by given bookmark')),
     ('', 'bundlename', 'bundle',
      _('name of the bundle attachment file'), _('NAME')),
     ('r', 'rev', [], _('a revision to send'), _('REV')),
@@ -449,6 +451,9 @@ 
     body and as a regular or an inline attachment by combining the
     -a/--attach or -i/--inline with the --body option.
 
+    With -B/--bookmark changesets reachable by the given bookmark are
+    selected.
+
     With -o/--outgoing, emails will be generated for patches not found
     in the destination repository (or only those which are ancestors
     of the specified revisions if any are provided)
@@ -489,6 +494,8 @@ 
       hg email -o -r 3000       # send all ancestors of 3000 not in default
       hg email -o -r 3000 DEST  # send all ancestors of 3000 not in DEST
 
+      hg email -B feature       # send all ancestors of feature bookmark
+
       hg email -b               # send bundle of all patches not in default
       hg email -b DEST          # send bundle of all patches not in DEST
       hg email -b -r 3000       # bundle of all ancestors of 3000 not in default
@@ -511,6 +518,7 @@ 
     mbox = opts.get('mbox')
     outgoing = opts.get('outgoing')
     rev = opts.get('rev')
+    bookmark = opts.get('bookmark')
     # internal option used by pbranches
     patches = opts.get('patches')
 
@@ -518,8 +526,8 @@ 
         # really sending
         mail.validateconfig(ui)
 
-    if not (revs or rev or outgoing or bundle or patches):
-        raise error.Abort(_('specify at least one changeset with -r or -o'))
+    if not (revs or rev or outgoing or bundle or patches or bookmark):
+        raise error.Abort(_('specify at least one changeset with -B, -r or -o'))
 
     if outgoing and bundle:
         raise error.Abort(_("--outgoing mode always on with --bundle;"
@@ -538,6 +546,10 @@ 
         if revs:
             raise error.Abort(_('use only one form to specify the revision'))
         revs = rev
+    elif bookmark:
+        if not bookmark in repo._bookmarks:
+            raise error.Abort(_("bookmark '%s' not found") % bookmark)
+        revs = repair.stripbmrevset(repo, bookmark)
 
     revs = scmutil.revrange(repo, revs)
     if outgoing: