# HG changeset patch # User David Demelier # Date 2017-02-03 14:02:27 # Node ID c2fe2b00db53b5db6170d5e57301a798332c3c9f # Parent 4f6645ec6bb2c7d2626cd333b981f79fa6b82181 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. diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py --- a/hgext/patchbomb.py +++ b/hgext/patchbomb.py @@ -90,6 +90,7 @@ from mercurial import ( node as nodemod, patch, registrar, + repair, scmutil, templater, util, @@ -442,6 +443,7 @@ emailopts = [ ('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 @@ def email(ui, repo, *revs, **opts): 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 @@ def email(ui, repo, *revs, **opts): 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,14 @@ def email(ui, repo, *revs, **opts): mbox = opts.get('mbox') outgoing = opts.get('outgoing') rev = opts.get('rev') + bookmark = opts.get('bookmark') 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 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 +573,10 @@ def email(ui, repo, *revs, **opts): if revs: raise error.Abort(_('use only one form to specify the revision')) revs = rev + elif bookmark: + if bookmark not in repo._bookmarks: + raise error.Abort(_("bookmark '%s' not found") % bookmark) + revs = repair.stripbmrevset(repo, bookmark) revs = scmutil.revrange(repo, revs) if outgoing: diff --git a/tests/test-patchbomb-bookmark.t b/tests/test-patchbomb-bookmark.t new file mode 100644 --- /dev/null +++ b/tests/test-patchbomb-bookmark.t @@ -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: (glob) + User-Agent: Mercurial-patchbomb/* (glob) + 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: (glob) + X-Mercurial-Series-Id: (glob) + In-Reply-To: (glob) + References: (glob) + User-Agent: Mercurial-patchbomb/* (glob) + 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@*> (glob) + X-Mercurial-Series-Id: (glob) + In-Reply-To: (glob) + References: (glob) + User-Agent: Mercurial-patchbomb/* (glob) + 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@*> (glob) + X-Mercurial-Series-Id: <8dab2639fd35f1e337ad.378691260@*> (glob) + User-Agent: Mercurial-patchbomb/* (glob) + 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 +