comparison mercurial/exchange.py @ 45156:c26335fa4225

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.
author Manuel Jacob <me@manueljacob.de>
date Fri, 17 Jul 2020 08:21:31 +0200
parents c93dd9d9f1e6
children 6063c1857d0a
comparison
equal deleted inserted replaced
45155:a381618210d0 45156:c26335fa4225
903 # something to push 903 # something to push
904 if not pushop.force: 904 if not pushop.force:
905 # if repo.obsstore == False --> no obsolete 905 # if repo.obsstore == False --> no obsolete
906 # then, save the iteration 906 # then, save the iteration
907 if unfi.obsstore: 907 if unfi.obsstore:
908 # this message are here for 80 char limit reason 908 obsoletes = []
909 mso = _(b"push includes obsolete changeset: %s!") 909 unstables = []
910 mspd = _(b"push includes phase-divergent changeset: %s!") 910 for node in outgoing.missing:
911 mscd = _(b"push includes content-divergent changeset: %s!")
912 mst = {
913 b"orphan": _(b"push includes orphan changeset: %s!"),
914 b"phase-divergent": mspd,
915 b"content-divergent": mscd,
916 }
917 # If we are to push if there is at least one
918 # obsolete or unstable changeset in missing, at
919 # least one of the missinghead will be obsolete or
920 # unstable. So checking heads only is ok
921 for node in outgoing.ancestorsof:
922 ctx = unfi[node] 911 ctx = unfi[node]
923 if ctx.obsolete(): 912 if ctx.obsolete():
924 raise error.Abort(mso % ctx) 913 obsoletes.append(ctx)
925 elif ctx.isunstable(): 914 elif ctx.isunstable():
926 # TODO print more than one instability in the abort 915 unstables.append(ctx)
927 # message 916 if obsoletes or unstables:
928 raise error.Abort(mst[ctx.instabilities()[0]] % ctx) 917 msg = b""
918 if obsoletes:
919 msg += _(b"push includes obsolete changesets:\n")
920 msg += b"\n".join(b' %s' % ctx for ctx in obsoletes)
921 if unstables:
922 if msg:
923 msg += b"\n"
924 msg += _(b"push includes unstable changesets:\n")
925 msg += b"\n".join(
926 b' %s (%s)'
927 % (
928 ctx,
929 b", ".join(_(ins) for ins in ctx.instabilities()),
930 )
931 for ctx in unstables
932 )
933 raise error.Abort(msg)
929 934
930 discovery.checkheads(pushop) 935 discovery.checkheads(pushop)
931 return True 936 return True
932 937
933 938