comparison mercurial/obsutil.py @ 43077:687b865b95ad

formatting: byteify all mercurial/ and hgext/ string literals Done with python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py') black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**') # skip-blame mass-reformatting only Differential Revision: https://phab.mercurial-scm.org/D6972
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:48:39 -0400
parents 2372284d9457
children d783f945a701
comparison
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
321 augmented with obsolescence information. 321 augmented with obsolescence information.
322 322
323 Beware that possible obsolescence cycle may result if complex situation. 323 Beware that possible obsolescence cycle may result if complex situation.
324 """ 324 """
325 repo = repo.unfiltered() 325 repo = repo.unfiltered()
326 foreground = set(repo.set('%ln::', nodes)) 326 foreground = set(repo.set(b'%ln::', nodes))
327 if repo.obsstore: 327 if repo.obsstore:
328 # We only need this complicated logic if there is obsolescence 328 # We only need this complicated logic if there is obsolescence
329 # XXX will probably deserve an optimised revset. 329 # XXX will probably deserve an optimised revset.
330 nm = repo.changelog.nodemap 330 nm = repo.changelog.nodemap
331 plen = -1 331 plen = -1
334 plen = len(foreground) 334 plen = len(foreground)
335 succs = set(c.node() for c in foreground) 335 succs = set(c.node() for c in foreground)
336 mutable = [c.node() for c in foreground if c.mutable()] 336 mutable = [c.node() for c in foreground if c.mutable()]
337 succs.update(allsuccessors(repo.obsstore, mutable)) 337 succs.update(allsuccessors(repo.obsstore, mutable))
338 known = (n for n in succs if n in nm) 338 known = (n for n in succs if n in nm)
339 foreground = set(repo.set('%ln::', known)) 339 foreground = set(repo.set(b'%ln::', known))
340 return set(c.node() for c in foreground) 340 return set(c.node() for c in foreground)
341 341
342 342
343 # effectflag field 343 # effectflag field
344 # 344 #
353 # 353 #
354 # The effect-flag is placed behind an experimental flag 354 # The effect-flag is placed behind an experimental flag
355 # `effect-flags` set to off by default. 355 # `effect-flags` set to off by default.
356 # 356 #
357 357
358 EFFECTFLAGFIELD = "ef1" 358 EFFECTFLAGFIELD = b"ef1"
359 359
360 DESCCHANGED = 1 << 0 # action changed the description 360 DESCCHANGED = 1 << 0 # action changed the description
361 METACHANGED = 1 << 1 # action change the meta 361 METACHANGED = 1 << 1 # action change the meta
362 DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset 362 DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset
363 PARENTCHANGED = 1 << 2 # action change the parent 363 PARENTCHANGED = 1 << 2 # action change the parent
364 USERCHANGED = 1 << 4 # the user changed 364 USERCHANGED = 1 << 4 # the user changed
365 DATECHANGED = 1 << 5 # the date changed 365 DATECHANGED = 1 << 5 # the date changed
366 BRANCHCHANGED = 1 << 6 # the branch changed 366 BRANCHCHANGED = 1 << 6 # the branch changed
367 367
368 METABLACKLIST = [ 368 METABLACKLIST = [
369 re.compile('^branch$'), 369 re.compile(b'^branch$'),
370 re.compile('^.*-source$'), 370 re.compile(b'^.*-source$'),
371 re.compile('^.*_source$'), 371 re.compile(b'^.*_source$'),
372 re.compile('^source$'), 372 re.compile(b'^source$'),
373 ] 373 ]
374 374
375 375
376 def metanotblacklisted(metaitem): 376 def metanotblacklisted(metaitem):
377 """ Check that the key of a meta item (extrakey, extravalue) does not 377 """ Check that the key of a meta item (extrakey, extravalue) does not
406 def _cmpdiff(leftctx, rightctx): 406 def _cmpdiff(leftctx, rightctx):
407 """return True if both ctx introduce the "same diff" 407 """return True if both ctx introduce the "same diff"
408 408
409 This is a first and basic implementation, with many shortcoming. 409 This is a first and basic implementation, with many shortcoming.
410 """ 410 """
411 diffopts = diffutil.diffallopts(leftctx.repo().ui, {'git': True}) 411 diffopts = diffutil.diffallopts(leftctx.repo().ui, {b'git': True})
412 412
413 # Leftctx or right ctx might be filtered, so we need to use the contexts 413 # Leftctx or right ctx might be filtered, so we need to use the contexts
414 # with an unfiltered repository to safely compute the diff 414 # with an unfiltered repository to safely compute the diff
415 415
416 # leftctx and rightctx can be from different repository views in case of 416 # leftctx and rightctx can be from different repository views in case of
479 """return the set of pre-existing revisions obsoleted by a transaction""" 479 """return the set of pre-existing revisions obsoleted by a transaction"""
480 torev = repo.unfiltered().changelog.nodemap.get 480 torev = repo.unfiltered().changelog.nodemap.get
481 phase = repo._phasecache.phase 481 phase = repo._phasecache.phase
482 succsmarkers = repo.obsstore.successors.get 482 succsmarkers = repo.obsstore.successors.get
483 public = phases.public 483 public = phases.public
484 addedmarkers = tr.changes['obsmarkers'] 484 addedmarkers = tr.changes[b'obsmarkers']
485 origrepolen = tr.changes['origrepolen'] 485 origrepolen = tr.changes[b'origrepolen']
486 seenrevs = set() 486 seenrevs = set()
487 obsoleted = set() 487 obsoleted = set()
488 for mark in addedmarkers: 488 for mark in addedmarkers:
489 node = mark[0] 489 node = mark[0]
490 rev = torev(node) 490 rev = torev(node)
792 if not foundany: 792 if not foundany:
793 fullsuccessorsets.append(_succs()) 793 fullsuccessorsets.append(_succs())
794 794
795 values = [] 795 values = []
796 for sset in fullsuccessorsets: 796 for sset in fullsuccessorsets:
797 values.append({'successors': sset, 'markers': sset.markers}) 797 values.append({b'successors': sset, b'markers': sset.markers})
798 798
799 return values 799 return values
800 800
801 801
802 def _getobsfate(successorssets): 802 def _getobsfate(successorssets):
811 - superseded_split 811 - superseded_split
812 """ 812 """
813 813
814 if len(successorssets) == 0: 814 if len(successorssets) == 0:
815 # The commit has been pruned 815 # The commit has been pruned
816 return 'pruned' 816 return b'pruned'
817 elif len(successorssets) > 1: 817 elif len(successorssets) > 1:
818 return 'diverged' 818 return b'diverged'
819 else: 819 else:
820 # No divergence, only one set of successors 820 # No divergence, only one set of successors
821 successors = successorssets[0] 821 successors = successorssets[0]
822 822
823 if len(successors) == 1: 823 if len(successors) == 1:
824 return 'superseded' 824 return b'superseded'
825 else: 825 else:
826 return 'superseded_split' 826 return b'superseded_split'
827 827
828 828
829 def obsfateverb(successorset, markers): 829 def obsfateverb(successorset, markers):
830 """ Return the verb summarizing the successorset and potentially using 830 """ Return the verb summarizing the successorset and potentially using
831 information from the markers 831 information from the markers
832 """ 832 """
833 if not successorset: 833 if not successorset:
834 verb = 'pruned' 834 verb = b'pruned'
835 elif len(successorset) == 1: 835 elif len(successorset) == 1:
836 verb = 'rewritten' 836 verb = b'rewritten'
837 else: 837 else:
838 verb = 'split' 838 verb = b'split'
839 return verb 839 return verb
840 840
841 841
842 def markersdates(markers): 842 def markersdates(markers):
843 """returns the list of dates for a list of markers 843 """returns the list of dates for a list of markers
848 def markersusers(markers): 848 def markersusers(markers):
849 """ Returns a sorted list of markers users without duplicates 849 """ Returns a sorted list of markers users without duplicates
850 """ 850 """
851 markersmeta = [dict(m[3]) for m in markers] 851 markersmeta = [dict(m[3]) for m in markers]
852 users = set( 852 users = set(
853 encoding.tolocal(meta['user']) 853 encoding.tolocal(meta[b'user'])
854 for meta in markersmeta 854 for meta in markersmeta
855 if meta.get('user') 855 if meta.get(b'user')
856 ) 856 )
857 857
858 return sorted(users) 858 return sorted(users)
859 859
860 860
861 def markersoperations(markers): 861 def markersoperations(markers):
862 """ Returns a sorted list of markers operations without duplicates 862 """ Returns a sorted list of markers operations without duplicates
863 """ 863 """
864 markersmeta = [dict(m[3]) for m in markers] 864 markersmeta = [dict(m[3]) for m in markers]
865 operations = set( 865 operations = set(
866 meta.get('operation') for meta in markersmeta if meta.get('operation') 866 meta.get(b'operation') for meta in markersmeta if meta.get(b'operation')
867 ) 867 )
868 868
869 return sorted(operations) 869 return sorted(operations)
870 870
871 871
883 line.append(obsfateverb(successors, markers)) 883 line.append(obsfateverb(successors, markers))
884 884
885 # Operations 885 # Operations
886 operations = markersoperations(markers) 886 operations = markersoperations(markers)
887 if operations: 887 if operations:
888 line.append(" using %s" % ", ".join(operations)) 888 line.append(b" using %s" % b", ".join(operations))
889 889
890 # Successors 890 # Successors
891 if successors: 891 if successors:
892 fmtsuccessors = [formatctx(repo[succ]) for succ in successors] 892 fmtsuccessors = [formatctx(repo[succ]) for succ in successors]
893 line.append(" as %s" % ", ".join(fmtsuccessors)) 893 line.append(b" as %s" % b", ".join(fmtsuccessors))
894 894
895 # Users 895 # Users
896 users = markersusers(markers) 896 users = markersusers(markers)
897 # Filter out current user in not verbose mode to reduce amount of 897 # Filter out current user in not verbose mode to reduce amount of
898 # information 898 # information
900 currentuser = ui.username(acceptempty=True) 900 currentuser = ui.username(acceptempty=True)
901 if len(users) == 1 and currentuser in users: 901 if len(users) == 1 and currentuser in users:
902 users = None 902 users = None
903 903
904 if (verbose or normal) and users: 904 if (verbose or normal) and users:
905 line.append(" by %s" % ", ".join(users)) 905 line.append(b" by %s" % b", ".join(users))
906 906
907 # Date 907 # Date
908 dates = markersdates(markers) 908 dates = markersdates(markers)
909 909
910 if dates and verbose: 910 if dates and verbose:
911 min_date = min(dates) 911 min_date = min(dates)
912 max_date = max(dates) 912 max_date = max(dates)
913 913
914 if min_date == max_date: 914 if min_date == max_date:
915 fmtmin_date = dateutil.datestr(min_date, '%Y-%m-%d %H:%M %1%2') 915 fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
916 line.append(" (at %s)" % fmtmin_date) 916 line.append(b" (at %s)" % fmtmin_date)
917 else: 917 else:
918 fmtmin_date = dateutil.datestr(min_date, '%Y-%m-%d %H:%M %1%2') 918 fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
919 fmtmax_date = dateutil.datestr(max_date, '%Y-%m-%d %H:%M %1%2') 919 fmtmax_date = dateutil.datestr(max_date, b'%Y-%m-%d %H:%M %1%2')
920 line.append(" (between %s and %s)" % (fmtmin_date, fmtmax_date)) 920 line.append(b" (between %s and %s)" % (fmtmin_date, fmtmax_date))
921 921
922 return "".join(line) 922 return b"".join(line)
923 923
924 924
925 filteredmsgtable = { 925 filteredmsgtable = {
926 "pruned": _("hidden revision '%s' is pruned"), 926 b"pruned": _(b"hidden revision '%s' is pruned"),
927 "diverged": _("hidden revision '%s' has diverged"), 927 b"diverged": _(b"hidden revision '%s' has diverged"),
928 "superseded": _("hidden revision '%s' was rewritten as: %s"), 928 b"superseded": _(b"hidden revision '%s' was rewritten as: %s"),
929 "superseded_split": _("hidden revision '%s' was split as: %s"), 929 b"superseded_split": _(b"hidden revision '%s' was split as: %s"),
930 "superseded_split_several": _( 930 b"superseded_split_several": _(
931 "hidden revision '%s' was split as: %s and " "%d more" 931 b"hidden revision '%s' was split as: %s and " b"%d more"
932 ), 932 ),
933 } 933 }
934 934
935 935
936 def _getfilteredreason(repo, changeid, ctx): 936 def _getfilteredreason(repo, changeid, ctx):
938 """ 938 """
939 successors = successorssets(repo, ctx.node()) 939 successors = successorssets(repo, ctx.node())
940 fate = _getobsfate(successors) 940 fate = _getobsfate(successors)
941 941
942 # Be more precise in case the revision is superseded 942 # Be more precise in case the revision is superseded
943 if fate == 'pruned': 943 if fate == b'pruned':
944 return filteredmsgtable['pruned'] % changeid 944 return filteredmsgtable[b'pruned'] % changeid
945 elif fate == 'diverged': 945 elif fate == b'diverged':
946 return filteredmsgtable['diverged'] % changeid 946 return filteredmsgtable[b'diverged'] % changeid
947 elif fate == 'superseded': 947 elif fate == b'superseded':
948 single_successor = nodemod.short(successors[0][0]) 948 single_successor = nodemod.short(successors[0][0])
949 return filteredmsgtable['superseded'] % (changeid, single_successor) 949 return filteredmsgtable[b'superseded'] % (changeid, single_successor)
950 elif fate == 'superseded_split': 950 elif fate == b'superseded_split':
951 951
952 succs = [] 952 succs = []
953 for node_id in successors[0]: 953 for node_id in successors[0]:
954 succs.append(nodemod.short(node_id)) 954 succs.append(nodemod.short(node_id))
955 955
956 if len(succs) <= 2: 956 if len(succs) <= 2:
957 fmtsuccs = ', '.join(succs) 957 fmtsuccs = b', '.join(succs)
958 return filteredmsgtable['superseded_split'] % (changeid, fmtsuccs) 958 return filteredmsgtable[b'superseded_split'] % (changeid, fmtsuccs)
959 else: 959 else:
960 firstsuccessors = ', '.join(succs[:2]) 960 firstsuccessors = b', '.join(succs[:2])
961 remainingnumber = len(succs) - 2 961 remainingnumber = len(succs) - 2
962 962
963 args = (changeid, firstsuccessors, remainingnumber) 963 args = (changeid, firstsuccessors, remainingnumber)
964 return filteredmsgtable['superseded_split_several'] % args 964 return filteredmsgtable[b'superseded_split_several'] % args
965 965
966 966
967 def divergentsets(repo, ctx): 967 def divergentsets(repo, ctx):
968 """Compute sets of commits divergent with a given one""" 968 """Compute sets of commits divergent with a given one"""
969 cache = {} 969 cache = {}
980 if tuple(nsuccset) in base: 980 if tuple(nsuccset) in base:
981 # we already know the latest base for this divergency 981 # we already know the latest base for this divergency
982 continue 982 continue
983 base[tuple(nsuccset)] = n 983 base[tuple(nsuccset)] = n
984 return [ 984 return [
985 {'divergentnodes': divset, 'commonpredecessor': b} 985 {b'divergentnodes': divset, b'commonpredecessor': b}
986 for divset, b in base.iteritems() 986 for divset, b in base.iteritems()
987 ] 987 ]
988 988
989 989
990 def whyunstable(repo, ctx): 990 def whyunstable(repo, ctx):
991 result = [] 991 result = []
992 if ctx.orphan(): 992 if ctx.orphan():
993 for parent in ctx.parents(): 993 for parent in ctx.parents():
994 kind = None 994 kind = None
995 if parent.orphan(): 995 if parent.orphan():
996 kind = 'orphan' 996 kind = b'orphan'
997 elif parent.obsolete(): 997 elif parent.obsolete():
998 kind = 'obsolete' 998 kind = b'obsolete'
999 if kind is not None: 999 if kind is not None:
1000 result.append( 1000 result.append(
1001 { 1001 {
1002 'instability': 'orphan', 1002 b'instability': b'orphan',
1003 'reason': '%s parent' % kind, 1003 b'reason': b'%s parent' % kind,
1004 'node': parent.hex(), 1004 b'node': parent.hex(),
1005 } 1005 }
1006 ) 1006 )
1007 if ctx.phasedivergent(): 1007 if ctx.phasedivergent():
1008 predecessors = allpredecessors( 1008 predecessors = allpredecessors(
1009 repo.obsstore, [ctx.node()], ignoreflags=bumpedfix 1009 repo.obsstore, [ctx.node()], ignoreflags=bumpedfix
1012 repo[p] for p in predecessors if p in repo and not repo[p].mutable() 1012 repo[p] for p in predecessors if p in repo and not repo[p].mutable()
1013 ] 1013 ]
1014 for predecessor in immutable: 1014 for predecessor in immutable:
1015 result.append( 1015 result.append(
1016 { 1016 {
1017 'instability': 'phase-divergent', 1017 b'instability': b'phase-divergent',
1018 'reason': 'immutable predecessor', 1018 b'reason': b'immutable predecessor',
1019 'node': predecessor.hex(), 1019 b'node': predecessor.hex(),
1020 } 1020 }
1021 ) 1021 )
1022 if ctx.contentdivergent(): 1022 if ctx.contentdivergent():
1023 dsets = divergentsets(repo, ctx) 1023 dsets = divergentsets(repo, ctx)
1024 for dset in dsets: 1024 for dset in dsets:
1025 divnodes = [repo[n] for n in dset['divergentnodes']] 1025 divnodes = [repo[n] for n in dset[b'divergentnodes']]
1026 result.append( 1026 result.append(
1027 { 1027 {
1028 'instability': 'content-divergent', 1028 b'instability': b'content-divergent',
1029 'divergentnodes': divnodes, 1029 b'divergentnodes': divnodes,
1030 'reason': 'predecessor', 1030 b'reason': b'predecessor',
1031 'node': nodemod.hex(dset['commonpredecessor']), 1031 b'node': nodemod.hex(dset[b'commonpredecessor']),
1032 } 1032 }
1033 ) 1033 )
1034 return result 1034 return result