[Updated] D8454: phabricator: ensure that `phabsend` is given a contiguous, linear commit range
mharbison72 (Matt Harbison)
phabricator at mercurial-scm.org
Fri Apr 24 19:06:14 UTC 2020
mharbison72 updated this revision to Diff 21216.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D8454?vs=21159&id=21216
BRANCH
stable
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D8454/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D8454
AFFECTED FILES
hgext/phabricator.py
tests/test-phabricator.t
CHANGE DETAILS
diff --git a/tests/test-phabricator.t b/tests/test-phabricator.t
--- a/tests/test-phabricator.t
+++ b/tests/test-phabricator.t
@@ -589,6 +589,13 @@
applying patch from D7917
applying patch from D7918
+Phabsend requires a linear range of commits
+
+ $ hg phabsend -r 0+2+3
+ abort: cannot phabsend multiple head revisions: c44b38f24a45
+ (the revisions must form a linear chain)
+ [255]
+
Validate arguments with --fold
$ hg phabsend --fold -r 1
@@ -597,9 +604,6 @@
$ hg phabsend --fold --no-amend -r 1::
abort: cannot fold with --no-amend
[255]
- $ hg phabsend --fold -r 0+3
- abort: cannot fold non-linear revisions
- [255]
$ hg phabsend --fold -r 1::
abort: cannot fold revisions with different DREV values
[255]
diff --git a/hgext/phabricator.py b/hgext/phabricator.py
--- a/hgext/phabricator.py
+++ b/hgext/phabricator.py
@@ -1307,6 +1307,26 @@
if any(c for c in ctxs if c.obsolete()):
raise error.Abort(_(b"obsolete commits cannot be posted for review"))
+ # Ensure the local commits are an unbroken range. The semantics of the
+ # --fold option implies this, and the auto restacking of orphans requires
+ # it. Otherwise A+C in A->B->C will cause B to be orphaned, and C' to
+ # get A' as a parent.
+ def _fail_nonlinear_revs(revs, skiprev, revtype):
+ badnodes = [repo[r].node() for r in revs if r != skiprev]
+ raise error.Abort(
+ _(b"cannot phabsend multiple %s revisions: %s")
+ % (revtype, scmutil.nodesummaries(repo, badnodes)),
+ hint=_(b"the revisions must form a linear chain"),
+ )
+
+ heads = repo.revs(b'heads(%ld)', revs)
+ if len(heads) > 1:
+ _fail_nonlinear_revs(heads, heads.max(), b"head")
+
+ roots = repo.revs(b'roots(%ld)', revs)
+ if len(roots) > 1:
+ _fail_nonlinear_revs(roots, roots.min(), b"root")
+
fold = opts.get(b'fold')
if fold:
if len(revs) == 1:
@@ -1322,13 +1342,6 @@
if not opts.get(b"amend"):
raise error.Abort(_(b"cannot fold with --no-amend"))
- # Ensure the local commits are an unbroken range
- revrange = repo.revs(b'(first(%ld)::last(%ld))', revs, revs)
- if any(r for r in revs if r not in revrange) or any(
- r for r in revrange if r not in revs
- ):
- raise error.Abort(_(b"cannot fold non-linear revisions"))
-
# It might be possible to bucketize the revisions by the DREV value, and
# iterate over those groups when posting, and then again when amending.
# But for simplicity, require all selected revisions to be for the same
To: mharbison72, #hg-reviewers, marmoute
Cc: mercurial-patches, marmoute, Kwan, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20200424/5ae04bb6/attachment-0002.html>
More information about the Mercurial-patches
mailing list