comparison hgext/largefiles/overrides.py @ 51601:ea3343104f07

largefiles: track if a matcher was tampered with This is used to make sure rust fast path is not taken for the modified matchers.
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Tue, 09 Apr 2024 11:00:52 +0100
parents d718eddf01d9
children 493034cc3265 187d7c859be7
comparison
equal deleted inserted replaced
51600:ee1b648e4453 51601:ea3343104f07
69 69
70 def composelargefilematcher(match, manifest): 70 def composelargefilematcher(match, manifest):
71 """create a matcher that matches only the largefiles in the original 71 """create a matcher that matches only the largefiles in the original
72 matcher""" 72 matcher"""
73 m = copy.copy(match) 73 m = copy.copy(match)
74 m._was_tampered_with = True
74 lfile = lambda f: lfutil.standin(f) in manifest 75 lfile = lambda f: lfutil.standin(f) in manifest
75 m._files = [lf for lf in m._files if lfile(lf)] 76 m._files = [lf for lf in m._files if lfile(lf)]
76 m._fileset = set(m._files) 77 m._fileset = set(m._files)
77 m.always = lambda: False 78 m.always = lambda: False
78 origmatchfn = m.matchfn 79 origmatchfn = m.matchfn
84 excluded = set() 85 excluded = set()
85 if exclude is not None: 86 if exclude is not None:
86 excluded.update(exclude) 87 excluded.update(exclude)
87 88
88 m = copy.copy(match) 89 m = copy.copy(match)
90 m._was_tampered_with = True
89 notlfile = lambda f: not ( 91 notlfile = lambda f: not (
90 lfutil.isstandin(f) or lfutil.standin(f) in manifest or f in excluded 92 lfutil.isstandin(f) or lfutil.standin(f) in manifest or f in excluded
91 ) 93 )
92 m._files = [lf for lf in m._files if notlfile(lf)] 94 m._files = [lf for lf in m._files if notlfile(lf)]
93 m._fileset = set(m._files) 95 m._fileset = set(m._files)
439 if lfutil.isstandin(f): 441 if lfutil.isstandin(f):
440 return f 442 return f
441 return lfutil.standin(f) 443 return lfutil.standin(f)
442 444
443 pats.update(fixpats(f, tostandin) for f in p) 445 pats.update(fixpats(f, tostandin) for f in p)
446
447 m._was_tampered_with = True
444 448
445 for i in range(0, len(m._files)): 449 for i in range(0, len(m._files)):
446 # Don't add '.hglf' to m.files, since that is already covered by '.' 450 # Don't add '.hglf' to m.files, since that is already covered by '.'
447 if m._files[i] == b'.': 451 if m._files[i] == b'.':
448 continue 452 continue
847 newpats.append(pat.replace(lfutil.shortname, b'')) 851 newpats.append(pat.replace(lfutil.shortname, b''))
848 else: 852 else:
849 newpats.append(pat) 853 newpats.append(pat)
850 match = orig(ctx, newpats, opts, globbed, default, badfn=badfn) 854 match = orig(ctx, newpats, opts, globbed, default, badfn=badfn)
851 m = copy.copy(match) 855 m = copy.copy(match)
856 m._was_tampered_with = True
852 lfile = lambda f: lfutil.standin(f) in manifest 857 lfile = lambda f: lfutil.standin(f) in manifest
853 m._files = [lfutil.standin(f) for f in m._files if lfile(f)] 858 m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
854 m._fileset = set(m._files) 859 m._fileset = set(m._files)
855 origmatchfn = m.matchfn 860 origmatchfn = m.matchfn
856 861
965 ): 970 ):
966 if opts is None: 971 if opts is None:
967 opts = {} 972 opts = {}
968 match = orig(mctx, pats, opts, globbed, default, badfn=badfn) 973 match = orig(mctx, pats, opts, globbed, default, badfn=badfn)
969 m = copy.copy(match) 974 m = copy.copy(match)
975 m._was_tampered_with = True
970 976
971 # revert supports recursing into subrepos, and though largefiles 977 # revert supports recursing into subrepos, and though largefiles
972 # currently doesn't work correctly in that case, this match is 978 # currently doesn't work correctly in that case, this match is
973 # called, so the lfdirstate above may not be the correct one for 979 # called, so the lfdirstate above may not be the correct one for
974 # this invocation of match. 980 # this invocation of match.
1593 # to have handled by original addremove. Monkey patching here makes sure 1599 # to have handled by original addremove. Monkey patching here makes sure
1594 # we don't remove the standin in the largefiles code, preventing a very 1600 # we don't remove the standin in the largefiles code, preventing a very
1595 # confused state later. 1601 # confused state later.
1596 if s.deleted: 1602 if s.deleted:
1597 m = copy.copy(matcher) 1603 m = copy.copy(matcher)
1604 m._was_tampered_with = True
1598 1605
1599 # The m._files and m._map attributes are not changed to the deleted list 1606 # The m._files and m._map attributes are not changed to the deleted list
1600 # because that affects the m.exact() test, which in turn governs whether 1607 # because that affects the m.exact() test, which in turn governs whether
1601 # or not the file name is printed, and how. Simply limit the original 1608 # or not the file name is printed, and how. Simply limit the original
1602 # matches to those in the deleted status list. 1609 # matches to those in the deleted status list.
1719 def overridecat(orig, ui, repo, file1, *pats, **opts): 1726 def overridecat(orig, ui, repo, file1, *pats, **opts):
1720 ctx = logcmdutil.revsingle(repo, opts.get('rev')) 1727 ctx = logcmdutil.revsingle(repo, opts.get('rev'))
1721 err = 1 1728 err = 1
1722 notbad = set() 1729 notbad = set()
1723 m = scmutil.match(ctx, (file1,) + pats, pycompat.byteskwargs(opts)) 1730 m = scmutil.match(ctx, (file1,) + pats, pycompat.byteskwargs(opts))
1731 m._was_tampered_with = True
1724 origmatchfn = m.matchfn 1732 origmatchfn = m.matchfn
1725 1733
1726 def lfmatchfn(f): 1734 def lfmatchfn(f):
1727 if origmatchfn(f): 1735 if origmatchfn(f):
1728 return True 1736 return True