Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/obsutil.py @ 36960:efc4fb344c05
debug: add debugwhyunstable that explains instabilities
This is a port of evolve's feature of listing all unstable changesets in detail
(`hg evolve --list`).
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Mon, 26 Feb 2018 20:44:01 +0800 |
parents | b9bbcf9ffac1 |
children | 11d51e518808 |
comparison
equal
deleted
inserted
replaced
36959:b9bbcf9ffac1 | 36960:efc4fb344c05 |
---|---|
921 firstsuccessors = ', '.join(succs[:2]) | 921 firstsuccessors = ', '.join(succs[:2]) |
922 remainingnumber = len(succs) - 2 | 922 remainingnumber = len(succs) - 2 |
923 | 923 |
924 args = (changeid, firstsuccessors, remainingnumber) | 924 args = (changeid, firstsuccessors, remainingnumber) |
925 return filteredmsgtable['superseded_split_several'] % args | 925 return filteredmsgtable['superseded_split_several'] % args |
926 | |
927 def divergentsets(repo, ctx): | |
928 """Compute sets of commits divergent with a given one""" | |
929 cache = {} | |
930 base = {} | |
931 for n in allpredecessors(repo.obsstore, [ctx.node()]): | |
932 if n == ctx.node(): | |
933 # a node can't be a base for divergence with itself | |
934 continue | |
935 nsuccsets = successorssets(repo, n, cache) | |
936 for nsuccset in nsuccsets: | |
937 if ctx.node() in nsuccset: | |
938 # we are only interested in *other* successor sets | |
939 continue | |
940 if tuple(nsuccset) in base: | |
941 # we already know the latest base for this divergency | |
942 continue | |
943 base[tuple(nsuccset)] = n | |
944 return [{'divergentnodes': divset, 'commonpredecessor': b} | |
945 for divset, b in base.iteritems()] | |
946 | |
947 def whyunstable(repo, ctx): | |
948 result = [] | |
949 if ctx.orphan(): | |
950 for parent in ctx.parents(): | |
951 kind = None | |
952 if parent.orphan(): | |
953 kind = 'orphan' | |
954 elif parent.obsolete(): | |
955 kind = 'obsolete' | |
956 if kind is not None: | |
957 result.append({'instability': 'orphan', | |
958 'reason': '%s parent' % kind, | |
959 'node': parent.hex()}) | |
960 if ctx.phasedivergent(): | |
961 predecessors = allpredecessors(repo.obsstore, [ctx.node()], | |
962 ignoreflags=bumpedfix) | |
963 immutable = [repo[p] for p in predecessors | |
964 if p in repo and not repo[p].mutable()] | |
965 for predecessor in immutable: | |
966 result.append({'instability': 'phase-divergent', | |
967 'reason': 'immutable predecessor', | |
968 'node': predecessor.hex()}) | |
969 if ctx.contentdivergent(): | |
970 dsets = divergentsets(repo, ctx) | |
971 for dset in dsets: | |
972 divnodes = [repo[n] for n in dset['divergentnodes']] | |
973 result.append({'instability': 'content-divergent', | |
974 'divergentnodes': divnodes, | |
975 'reason': 'predecessor', | |
976 'node': nodemod.hex(dset['commonpredecessor'])}) | |
977 return result |