Patchwork [v2] patchbomb: add -B option to select a bookmark

login
register
mail settings
Submitter David Demelier
Date May 30, 2017, 9:14 a.m.
Message ID <78767485c1feff1593ca.1496135651@localhost.localdomain>
Download mbox | patch
Permalink /patch/21062/
State Accepted
Headers show

Comments

David Demelier - May 30, 2017, 9:14 a.m.
# HG changeset patch
# User David Demelier <demelier.david@gmail.com>
# Date 1486130547 -3600
#      Fri Feb 03 15:02:27 2017 +0100
# Node ID 78767485c1feff1593ca39c8986a29abd44cc567
# Parent  1df80eff24cfbde6654149bd8aa969f246672405
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.
Yuya Nishihara - June 2, 2017, 2:33 p.m.
On Tue, 30 May 2017 11:14:11 +0200, David Demelier wrote:
> # HG changeset patch
> # User David Demelier <demelier.david@gmail.com>
> # Date 1486130547 -3600
> #      Fri Feb 03 15:02:27 2017 +0100
> # Node ID 78767485c1feff1593ca39c8986a29abd44cc567
> # Parent  1df80eff24cfbde6654149bd8aa969f246672405
> patchbomb: add -B option to select a bookmark

Generally looks good. Queued, thanks.

I found a couple of nits, so can you make follow-up patches?

> diff -r 1df80eff24cf -r 78767485c1fe hgext/patchbomb.py

> @@ -540,13 +547,16 @@
>      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')

This looks like a merge error. Dropped.

> @@ -565,6 +575,10 @@
>          if revs:
>              raise error.Abort(_('use only one form to specify the revision'))
>          revs = rev
> +    elif bookmark:

-r and -B are mutually exclusive, so we should reject if both are specified.

> +        if not bookmark in repo._bookmarks:
> +            raise error.Abort(_("bookmark '%s' not found") % bookmark)
> +        revs = repair.stripbmrevset(repo, bookmark)

Perhaps stripbmrevset() needs a better name and should be moved to e.g. scmutil.

> +  Message-Id: <patchbomb.347155260@localhost.localdomain>
> +  User-Agent: Mercurial-patchbomb/4.2+374-2f9ccd83ecf8

Masked these platform specific outputs.
Sean Farley - June 2, 2017, 5:34 p.m.
Yuya Nishihara <yuya@tcha.org> writes:

> On Tue, 30 May 2017 11:14:11 +0200, David Demelier wrote:
>> # HG changeset patch
>> # User David Demelier <demelier.david@gmail.com>
>> # Date 1486130547 -3600
>> #      Fri Feb 03 15:02:27 2017 +0100
>> # Node ID 78767485c1feff1593ca39c8986a29abd44cc567
>> # Parent  1df80eff24cfbde6654149bd8aa969f246672405
>> patchbomb: add -B option to select a bookmark
>
> Generally looks good. Queued, thanks.
>
> I found a couple of nits, so can you make follow-up patches?
>
>> diff -r 1df80eff24cf -r 78767485c1fe hgext/patchbomb.py
>
>> @@ -540,13 +547,16 @@
>>      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')
>
> This looks like a merge error. Dropped.
>
>> @@ -565,6 +575,10 @@
>>          if revs:
>>              raise error.Abort(_('use only one form to specify the revision'))
>>          revs = rev
>> +    elif bookmark:
>
> -r and -B are mutually exclusive, so we should reject if both are specified.
>
>> +        if not bookmark in repo._bookmarks:
>> +            raise error.Abort(_("bookmark '%s' not found") % bookmark)
>> +        revs = repair.stripbmrevset(repo, bookmark)
>
> Perhaps stripbmrevset() needs a better name and should be moved to e.g. scmutil.

Is it not just 'BOOK%'?
Yuya Nishihara - June 3, 2017, 3:04 a.m.
On Fri, 02 Jun 2017 10:34:40 -0700, Sean Farley wrote:
> Yuya Nishihara <yuya@tcha.org> writes:
> > On Tue, 30 May 2017 11:14:11 +0200, David Demelier wrote:
> >> # HG changeset patch
> >> # User David Demelier <demelier.david@gmail.com>
> >> # Date 1486130547 -3600
> >> #      Fri Feb 03 15:02:27 2017 +0100
> >> # Node ID 78767485c1feff1593ca39c8986a29abd44cc567
> >> # Parent  1df80eff24cfbde6654149bd8aa969f246672405
> >> patchbomb: add -B option to select a bookmark
> >
> > Generally looks good. Queued, thanks.
> >
> > I found a couple of nits, so can you make follow-up patches?
> >
> >> diff -r 1df80eff24cf -r 78767485c1fe hgext/patchbomb.py
> >
> >> @@ -540,13 +547,16 @@
> >>      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')
> >
> > This looks like a merge error. Dropped.
> >
> >> @@ -565,6 +575,10 @@
> >>          if revs:
> >>              raise error.Abort(_('use only one form to specify the revision'))
> >>          revs = rev
> >> +    elif bookmark:
> >
> > -r and -B are mutually exclusive, so we should reject if both are specified.
> >
> >> +        if not bookmark in repo._bookmarks:
> >> +            raise error.Abort(_("bookmark '%s' not found") % bookmark)
> >> +        revs = repair.stripbmrevset(repo, bookmark)
> >
> > Perhaps stripbmrevset() needs a better name and should be moved to e.g. scmutil.
> 
> Is it not just 'BOOK%'?

Most likely, but stripbmrevset() also excludes descendants of the other
bookmarks.

  "- ancestors(bookmark() and not bookmark(%s))"

Patch

diff -r 1df80eff24cf -r 78767485c1fe hgext/patchbomb.py
--- a/hgext/patchbomb.py	Wed May 24 19:39:33 2017 -0700
+++ b/hgext/patchbomb.py	Fri Feb 03 15:02:27 2017 +0100
@@ -90,6 +90,7 @@ 
     node as nodemod,
     patch,
     registrar,
+    repair,
     scmutil,
     templater,
     util,
@@ -442,6 +443,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')),
@@ -480,6 +482,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)
@@ -518,6 +523,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
@@ -540,13 +547,16 @@ 
     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')
 
     if not (opts.get('test') or mbox):
         # really sending
         mail.validateconfig(ui)
 
-    if not (revs or rev or outgoing or bundle):
-        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;"
@@ -565,6 +575,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:
diff -r 1df80eff24cf -r 78767485c1fe tests/test-patchbomb-bookmark.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-patchbomb-bookmark.t	Fri Feb 03 15:02:27 2017 +0100
@@ -0,0 +1,168 @@ 
+Create @ bookmark as main reference
+
+  $ hg init repo
+  $ cd repo
+  $ echo "[extensions]" >> $HGRCPATH
+  $ echo "patchbomb=" >> $HGRCPATH
+  $ hg book @
+
+Create a dummy revision that must never be exported
+
+  $ echo no > no
+  $ hg ci -Amno -d '6 0'
+  adding no
+
+Create a feature and use -B
+
+  $ hg book booktest
+  $ echo first > a
+  $ hg ci -Amfirst -d '7 0'
+  adding a
+  $ echo second > b
+  $ hg ci -Amsecond -d '8 0'
+  adding b
+  $ hg email --date '1981-1-1 0:1' -n -t foo -s bookmark -B booktest
+  From [test]: test
+  this patch series consists of 2 patches.
+  
+  
+  Write the introductory message for the patch series.
+  
+  Cc: 
+  
+  displaying [PATCH 0 of 2] bookmark ...
+  Content-Type: text/plain; charset="us-ascii"
+  MIME-Version: 1.0
+  Content-Transfer-Encoding: 7bit
+  Subject: [PATCH 0 of 2] bookmark
+  Message-Id: <patchbomb.347155260@localhost.localdomain>
+  User-Agent: Mercurial-patchbomb/4.2+374-2f9ccd83ecf8
+  Date: Thu, 01 Jan 1981 00:01:00 +0000
+  From: test
+  To: foo
+  
+  
+  displaying [PATCH 1 of 2] first ...
+  Content-Type: text/plain; charset="us-ascii"
+  MIME-Version: 1.0
+  Content-Transfer-Encoding: 7bit
+  Subject: [PATCH 1 of 2] first
+  X-Mercurial-Node: accde9b8b6dce861c185d0825c1affc09a79cb26
+  X-Mercurial-Series-Index: 1
+  X-Mercurial-Series-Total: 2
+  Message-Id: <accde9b8b6dce861c185.347155261@localhost.localdomain>
+  X-Mercurial-Series-Id: <accde9b8b6dce861c185.347155261@localhost.localdomain>
+  In-Reply-To: <patchbomb.347155260@localhost.localdomain>
+  References: <patchbomb.347155260@localhost.localdomain>
+  User-Agent: Mercurial-patchbomb/4.2+374-2f9ccd83ecf8
+  Date: Thu, 01 Jan 1981 00:01:01 +0000
+  From: test
+  To: foo
+  
+  # HG changeset patch
+  # User test
+  # Date 7 0
+  #      Thu Jan 01 00:00:07 1970 +0000
+  # Node ID accde9b8b6dce861c185d0825c1affc09a79cb26
+  # Parent  043bd3889e5aaf7d88fe3713cf425f782ad2fb71
+  first
+  
+  diff -r 043bd3889e5a -r accde9b8b6dc a
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/a	Thu Jan 01 00:00:07 1970 +0000
+  @@ -0,0 +1,1 @@
+  +first
+  
+  displaying [PATCH 2 of 2] second ...
+  Content-Type: text/plain; charset="us-ascii"
+  MIME-Version: 1.0
+  Content-Transfer-Encoding: 7bit
+  Subject: [PATCH 2 of 2] second
+  X-Mercurial-Node: 417defd1559c396ba06a44dce8dc1c2d2d653f3f
+  X-Mercurial-Series-Index: 2
+  X-Mercurial-Series-Total: 2
+  Message-Id: <417defd1559c396ba06a.347155262@localhost.localdomain>
+  X-Mercurial-Series-Id: <accde9b8b6dce861c185.347155261@localhost.localdomain>
+  In-Reply-To: <patchbomb.347155260@localhost.localdomain>
+  References: <patchbomb.347155260@localhost.localdomain>
+  User-Agent: Mercurial-patchbomb/4.2+374-2f9ccd83ecf8
+  Date: Thu, 01 Jan 1981 00:01:02 +0000
+  From: test
+  To: foo
+  
+  # HG changeset patch
+  # User test
+  # Date 8 0
+  #      Thu Jan 01 00:00:08 1970 +0000
+  # Node ID 417defd1559c396ba06a44dce8dc1c2d2d653f3f
+  # Parent  accde9b8b6dce861c185d0825c1affc09a79cb26
+  second
+  
+  diff -r accde9b8b6dc -r 417defd1559c b
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/b	Thu Jan 01 00:00:08 1970 +0000
+  @@ -0,0 +1,1 @@
+  +second
+  
+Do the same and combine with -o only one must be exported
+
+  $ cd ..
+  $ hg clone repo repo2
+  updating to bookmark @
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd repo
+  $ hg up @
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  (activating bookmark @)
+  $ hg book outgoing
+  $ echo 1 > x
+  $ hg ci -Am1 -d '8 0'
+  adding x
+  created new head
+  $ hg push ../repo2 -B outgoing
+  pushing to ../repo2
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  exporting bookmark outgoing
+  $ echo 2 > y
+  $ hg ci -Am2 -d '9 0'
+  adding y
+  $ hg email --date '1982-1-1 0:1' -n -t foo -s bookmark -B outgoing -o ../repo2
+  comparing with ../repo2
+  From [test]: test
+  this patch series consists of 1 patches.
+  
+  Cc: 
+  
+  displaying [PATCH] bookmark ...
+  Content-Type: text/plain; charset="us-ascii"
+  MIME-Version: 1.0
+  Content-Transfer-Encoding: 7bit
+  Subject: [PATCH] bookmark
+  X-Mercurial-Node: 8dab2639fd35f1e337ad866c372a5c44f1064e3c
+  X-Mercurial-Series-Index: 1
+  X-Mercurial-Series-Total: 1
+  Message-Id: <8dab2639fd35f1e337ad.378691260@localhost.localdomain>
+  X-Mercurial-Series-Id: <8dab2639fd35f1e337ad.378691260@localhost.localdomain>
+  User-Agent: Mercurial-patchbomb/4.2+374-2f9ccd83ecf8
+  Date: Fri, 01 Jan 1982 00:01:00 +0000
+  From: test
+  To: foo
+  
+  # HG changeset patch
+  # User test
+  # Date 9 0
+  #      Thu Jan 01 00:00:09 1970 +0000
+  # Node ID 8dab2639fd35f1e337ad866c372a5c44f1064e3c
+  # Parent  0b24b8316483bf30bfc3e4d4168e922b169dbe66
+  2
+  
+  diff -r 0b24b8316483 -r 8dab2639fd35 y
+  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/y	Thu Jan 01 00:00:09 1970 +0000
+  @@ -0,0 +1,1 @@
+  +2
+