comparison mercurial/sparse.py @ 33550:32f348d741e5

sparse: use set for capturing profiles Order doesn't need to be preserved. A set is acceptable. Differential Revision: https://phab.mercurial-scm.org/D95
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 15 Jul 2017 13:07:57 -0700
parents 0407a51b9d8c
children 1d1779734c99
comparison
equal deleted inserted replaced
33549:9a2ee9591acc 33550:32f348d741e5
32 Returns a tuple of includes, excludes, and profiles. 32 Returns a tuple of includes, excludes, and profiles.
33 """ 33 """
34 includes = set() 34 includes = set()
35 excludes = set() 35 excludes = set()
36 current = includes 36 current = includes
37 profiles = [] 37 profiles = set()
38 for line in raw.split('\n'): 38 for line in raw.split('\n'):
39 line = line.strip() 39 line = line.strip()
40 if not line or line.startswith('#'): 40 if not line or line.startswith('#'):
41 # empty or comment line, skip 41 # empty or comment line, skip
42 continue 42 continue
43 elif line.startswith('%include '): 43 elif line.startswith('%include '):
44 line = line[9:].strip() 44 line = line[9:].strip()
45 if line: 45 if line:
46 profiles.append(line) 46 profiles.add(line)
47 elif line == '[include]': 47 elif line == '[include]':
48 if current != includes: 48 if current != includes:
49 # TODO pass filename into this API so we can report it. 49 # TODO pass filename into this API so we can report it.
50 raise error.Abort(_('sparse config cannot have includes ' + 50 raise error.Abort(_('sparse config cannot have includes ' +
51 'after excludes')) 51 'after excludes'))
74 Returns a tuple of iterables representing includes, excludes, and 74 Returns a tuple of iterables representing includes, excludes, and
75 patterns. 75 patterns.
76 """ 76 """
77 # Feature isn't enabled. No-op. 77 # Feature isn't enabled. No-op.
78 if not enabled: 78 if not enabled:
79 return set(), set(), [] 79 return set(), set(), set()
80 80
81 raw = repo.vfs.tryread('sparse') 81 raw = repo.vfs.tryread('sparse')
82 if not raw: 82 if not raw:
83 return set(), set(), [] 83 return set(), set(), set()
84 84
85 if rev is None: 85 if rev is None:
86 raise error.Abort(_('cannot parse sparse patterns from working ' 86 raise error.Abort(_('cannot parse sparse patterns from working '
87 'directory')) 87 'directory'))
88 88
113 continue 113 continue
114 114
115 pincludes, pexcludes, subprofs = parseconfig(repo.ui, raw) 115 pincludes, pexcludes, subprofs = parseconfig(repo.ui, raw)
116 includes.update(pincludes) 116 includes.update(pincludes)
117 excludes.update(pexcludes) 117 excludes.update(pexcludes)
118 for subprofile in subprofs: 118 profiles.update(subprofs)
119 profiles.append(subprofile)
120 119
121 profiles = visited 120 profiles = visited
122 121
123 if includes: 122 if includes:
124 includes.add('.hg*') 123 includes.add('.hg*')
140 139
141 for rev in revs: 140 for rev in revs:
142 includes, excludes, profiles = patternsforrev(repo, rev) 141 includes, excludes, profiles = patternsforrev(repo, rev)
143 allincludes |= includes 142 allincludes |= includes
144 allexcludes |= excludes 143 allexcludes |= excludes
145 allprofiles |= set(profiles) 144 allprofiles |= profiles
146 145
147 return allincludes, allexcludes, allprofiles 146 return allincludes, allexcludes, allprofiles
148 147
149 def configsignature(repo, includetemp=True): 148 def configsignature(repo, includetemp=True):
150 """Obtain the signature string for the current sparse configuration. 149 """Obtain the signature string for the current sparse configuration.
502 ctx = repo[node] 501 ctx = repo[node]
503 502
504 profiles = patternsforrev(repo, ctx.rev())[2] 503 profiles = patternsforrev(repo, ctx.rev())[2]
505 504
506 # profiles will only have data if sparse is enabled. 505 # profiles will only have data if sparse is enabled.
507 if set(profiles) & set(ctx.files()): 506 if profiles & set(ctx.files()):
508 origstatus = repo.status() 507 origstatus = repo.status()
509 origsparsematch = matcher(repo) 508 origsparsematch = matcher(repo)
510 refreshwdir(repo, origstatus, origsparsematch, force=True) 509 refreshwdir(repo, origstatus, origsparsematch, force=True)
511 510
512 prunetemporaryincludes(repo) 511 prunetemporaryincludes(repo)
553 552
554 iincludes, iexcludes, iprofiles = parseconfig(repo.ui, raw) 553 iincludes, iexcludes, iprofiles = parseconfig(repo.ui, raw)
555 oldsize = len(includes) + len(excludes) + len(profiles) 554 oldsize = len(includes) + len(excludes) + len(profiles)
556 includes.update(iincludes - aincludes) 555 includes.update(iincludes - aincludes)
557 excludes.update(iexcludes - aexcludes) 556 excludes.update(iexcludes - aexcludes)
558 profiles.update(set(iprofiles) - aprofiles) 557 profiles.update(iprofiles - aprofiles)
559 if len(includes) + len(excludes) + len(profiles) > oldsize: 558 if len(includes) + len(excludes) + len(profiles) > oldsize:
560 changed = True 559 changed = True
561 560
562 profilecount = includecount = excludecount = 0 561 profilecount = includecount = excludecount = 0
563 fcounts = (0, 0, 0) 562 fcounts = (0, 0, 0)
602 with repo.wlock(): 601 with repo.wlock():
603 oldmatcher = matcher(repo) 602 oldmatcher = matcher(repo)
604 603
605 raw = repo.vfs.tryread('sparse') 604 raw = repo.vfs.tryread('sparse')
606 oldinclude, oldexclude, oldprofiles = parseconfig(repo.ui, raw) 605 oldinclude, oldexclude, oldprofiles = parseconfig(repo.ui, raw)
607 oldprofiles = set(oldprofiles)
608 606
609 if reset: 607 if reset:
610 newinclude = set() 608 newinclude = set()
611 newexclude = set() 609 newexclude = set()
612 newprofiles = set() 610 newprofiles = set()