exchange: check actually missing revs for obsolete / unstable revs (issue6372)
The previous code was using `outgoing.ancestorsof`, which was originally called
`outgoing.missingheads` although not containing the missing heads. This
confusion was probably the reason why the buggy code was written.
The actually outgoing changesets are stored in `outgoing.missing`. By checking
all outgoing changesets, we avoid the problem and can show the list of all
obsolete or unstable changesets, which is more helpful for the user.
--- a/mercurial/exchange.py Fri Jul 17 07:59:20 2020 +0200
+++ b/mercurial/exchange.py Fri Jul 17 08:21:31 2020 +0200
@@ -905,27 +905,32 @@
# if repo.obsstore == False --> no obsolete
# then, save the iteration
if unfi.obsstore:
- # this message are here for 80 char limit reason
- mso = _(b"push includes obsolete changeset: %s!")
- mspd = _(b"push includes phase-divergent changeset: %s!")
- mscd = _(b"push includes content-divergent changeset: %s!")
- mst = {
- b"orphan": _(b"push includes orphan changeset: %s!"),
- b"phase-divergent": mspd,
- b"content-divergent": mscd,
- }
- # If we are to push if there is at least one
- # obsolete or unstable changeset in missing, at
- # least one of the missinghead will be obsolete or
- # unstable. So checking heads only is ok
- for node in outgoing.ancestorsof:
+ obsoletes = []
+ unstables = []
+ for node in outgoing.missing:
ctx = unfi[node]
if ctx.obsolete():
- raise error.Abort(mso % ctx)
+ obsoletes.append(ctx)
elif ctx.isunstable():
- # TODO print more than one instability in the abort
- # message
- raise error.Abort(mst[ctx.instabilities()[0]] % ctx)
+ unstables.append(ctx)
+ if obsoletes or unstables:
+ msg = b""
+ if obsoletes:
+ msg += _(b"push includes obsolete changesets:\n")
+ msg += b"\n".join(b' %s' % ctx for ctx in obsoletes)
+ if unstables:
+ if msg:
+ msg += b"\n"
+ msg += _(b"push includes unstable changesets:\n")
+ msg += b"\n".join(
+ b' %s (%s)'
+ % (
+ ctx,
+ b", ".join(_(ins) for ins in ctx.instabilities()),
+ )
+ for ctx in unstables
+ )
+ raise error.Abort(msg)
discovery.checkheads(pushop)
return True
--- a/tests/test-obsolete-divergent.t Fri Jul 17 07:59:20 2020 +0200
+++ b/tests/test-obsolete-divergent.t Fri Jul 17 08:21:31 2020 +0200
@@ -118,7 +118,9 @@
$ hg push ../other
pushing to ../other
searching for changes
- abort: push includes content-divergent changeset: 392fd25390da!
+ abort: push includes unstable changesets:
+ 82623d38b9ba (content-divergent)
+ 392fd25390da (content-divergent)
[255]
$ cd ..
--- a/tests/test-obsolete.t Fri Jul 17 07:59:20 2020 +0200
+++ b/tests/test-obsolete.t Fri Jul 17 08:21:31 2020 +0200
@@ -251,7 +251,8 @@
$ hg push ../tmpa
pushing to ../tmpa
searching for changes
- abort: push includes phase-divergent changeset: 5601fb93a350!
+ abort: push includes unstable changesets:
+ 5601fb93a350 (phase-divergent)
[255]
Fixing "bumped" situation
@@ -616,7 +617,8 @@
$ hg push ../tmpc/ -r 'desc("original_d")'
pushing to ../tmpc/
searching for changes
- abort: push includes obsolete changeset: 94b33453f93b!
+ abort: push includes obsolete changesets:
+ 94b33453f93b
[255]
refuse to push unstable changeset
@@ -624,7 +626,10 @@
$ hg push ../tmpc/
pushing to ../tmpc/
searching for changes
- abort: push includes orphan changeset: cda648ca50f5!
+ abort: push includes obsolete changesets:
+ 94b33453f93b
+ push includes unstable changesets:
+ cda648ca50f5 (orphan)
[255]
with --force it will work anyway
@@ -647,6 +652,26 @@
no changes found
[1]
+pushing should work even if the outgoing changes contain an unrelated changeset
+(neither obsolete nor unstable) (issue6372)
+
+ $ hg up 1 -q
+ $ hg branch new -q
+ $ mkcommit c
+
+ $ hg push ../tmpc/ --new-branch
+ pushing to ../tmpc/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+make later tests work unmodified
+
+ $ hg --config extensions.strip= strip tip -q
+ $ hg up 5 -q
+
Test that extinct changeset are properly detected
$ hg log -r 'extinct()'
@@ -1196,6 +1221,14 @@
phase-divergent: immutable predecessor 245b
content-divergent: predecessor 245b
+ $ hg push ../tmpf -r 50c51b361e60
+ pushing to ../tmpf
+ searching for changes
+ abort: push includes unstable changesets:
+ 50c51b361e60 (orphan, phase-divergent, content-divergent)
+ [255]
+
+
#if serve
$ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log