Mercurial > public > mercurial-scm > hg-stable
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() |