Mercurial > hg
annotate mercurial/manifest.py @ 18411:8b0f0dd56cec
bundlerepo: improve performance for bundle() revset expression
Create the set of revision numbers directly instead of creating a list of nodes
first.
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Wed, 16 Jan 2013 20:41:34 +0100 |
parents | c64e646af81e |
children | a1141f04e368 |
rev | line source |
---|---|
1089 | 1 # manifest.py - manifest revision class for mercurial |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
3891 | 8 from i18n import _ |
15657
d976b1ef6760
util: don't mess with builtins to emulate buffer()
Matt Mackall <mpm@selenic.com>
parents:
14632
diff
changeset
|
9 import mdiff, parsers, error, revlog, util |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8225
diff
changeset
|
10 import array, struct |
79 | 11 |
2835
a9f5d4149123
Combine manifest dict and flags dict into a single object
Matt Mackall <mpm@selenic.com>
parents:
2834
diff
changeset
|
12 class manifestdict(dict): |
2857
18cf5349a361
Fix some bugs introduced during the manifest refactoring
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
2841
diff
changeset
|
13 def __init__(self, mapping=None, flags=None): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
14 if mapping is None: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
15 mapping = {} |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
16 if flags is None: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
17 flags = {} |
2831 | 18 dict.__init__(self, mapping) |
2839
b4f05ecf4ee8
Switch to simpler manifestdict
Matt Mackall <mpm@selenic.com>
parents:
2835
diff
changeset
|
19 self._flags = flags |
2834
35af2e56f15a
manifestflags: eliminate remaining users of direct dict access
Matt Mackall <mpm@selenic.com>
parents:
2833
diff
changeset
|
20 def flags(self, f): |
2839
b4f05ecf4ee8
Switch to simpler manifestdict
Matt Mackall <mpm@selenic.com>
parents:
2835
diff
changeset
|
21 return self._flags.get(f, "") |
16646
a1dcd842ce17
localrepo: optimize internode status calls using withflags
Jesse Glick <jesse.glick@oracle.com>
parents:
15657
diff
changeset
|
22 def withflags(self): |
a1dcd842ce17
localrepo: optimize internode status calls using withflags
Jesse Glick <jesse.glick@oracle.com>
parents:
15657
diff
changeset
|
23 return set(self._flags.keys()) |
6743 | 24 def set(self, f, flags): |
25 self._flags[f] = flags | |
2831 | 26 def copy(self): |
9416
eecbaac5ca88
manifestdict: remove unnecessary dictionary copy
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9415
diff
changeset
|
27 return manifestdict(self, dict.copy(self._flags)) |
2831 | 28 |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
29 class manifest(revlog.revlog): |
4258
b11a2fb59cf5
revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents:
4257
diff
changeset
|
30 def __init__(self, opener): |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
31 self._mancache = None |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
32 revlog.revlog.__init__(self, opener, "00manifest.i") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
33 |
4995
e45fc5d03798
manifest: speed up creation of the manifestdict
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
34 def parse(self, lines): |
e45fc5d03798
manifest: speed up creation of the manifestdict
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
35 mfdict = manifestdict() |
6389
0231f763ebc8
manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
6212
diff
changeset
|
36 parsers.parse_manifest(mfdict, mfdict._flags, lines) |
4995
e45fc5d03798
manifest: speed up creation of the manifestdict
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
37 return mfdict |
3196
f3b939444c72
Abstract manifest block parsing.
Brendan Cully <brendan@kublai.com>
parents:
3148
diff
changeset
|
38 |
f3b939444c72
Abstract manifest block parsing.
Brendan Cully <brendan@kublai.com>
parents:
3148
diff
changeset
|
39 def readdelta(self, node): |
7362
6db4a2ccef3a
revlog: remove delta function
Matt Mackall <mpm@selenic.com>
parents:
6765
diff
changeset
|
40 r = self.rev(node) |
12011
f38b0a3308b6
deltaparent(): don't return nullrev for a revision containing a full snapshot
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11962
diff
changeset
|
41 return self.parse(mdiff.patchtext(self.revdiff(self.deltaparent(r), r))) |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3196
diff
changeset
|
42 |
13711
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
43 def readfast(self, node): |
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
44 '''use the faster of readdelta or read''' |
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
45 r = self.rev(node) |
14208
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
13711
diff
changeset
|
46 deltaparent = self.deltaparent(r) |
d62d597b8974
revlog: compute correct deltaparent in the deltaparent function
Sune Foldager <cryo@cyanite.org>
parents:
13711
diff
changeset
|
47 if deltaparent != revlog.nullrev and deltaparent in self.parentrevs(r): |
13711
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
48 return self.readdelta(node) |
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
49 return self.read(node) |
ed913fd7837b
manifest: add readfast method
Matt Mackall <mpm@selenic.com>
parents:
13031
diff
changeset
|
50 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
51 def read(self, node): |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
52 if node == revlog.nullid: |
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
53 return manifestdict() # don't upset local cache |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
54 if self._mancache and self._mancache[0] == node: |
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
55 return self._mancache[1] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
56 text = self.revision(node) |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
57 arraytext = array.array('c', text) |
4995
e45fc5d03798
manifest: speed up creation of the manifestdict
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
58 mapping = self.parse(text) |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
59 self._mancache = (node, mapping, arraytext) |
2835
a9f5d4149123
Combine manifest dict and flags dict into a single object
Matt Mackall <mpm@selenic.com>
parents:
2834
diff
changeset
|
60 return mapping |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
61 |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
62 def _search(self, m, s, lo=0, hi=None): |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
63 '''return a tuple (start, end) that says where to find s within m. |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
64 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
65 If the string is found m[start:end] are the line containing |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
66 that string. If start == end the string was not found and |
17426
9724f8f8850b
delete some dead comments and docstrings
Mads Kiilerich <mads@kiilerich.com>
parents:
16683
diff
changeset
|
67 they indicate the proper sorted insertion point. |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
68 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
69 m should be a buffer or a string |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
70 s is a string''' |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
71 def advance(i, c): |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
72 while i < lenm and m[i] != c: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
73 i += 1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
74 return i |
7405
f1944e74e83c
manifest: fix _search() corner-case
Patrick Mezard <pmezard@gmail.com>
parents:
7362
diff
changeset
|
75 if not s: |
f1944e74e83c
manifest: fix _search() corner-case
Patrick Mezard <pmezard@gmail.com>
parents:
7362
diff
changeset
|
76 return (lo, lo) |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
77 lenm = len(m) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
78 if not hi: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
79 hi = lenm |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
80 while lo < hi: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
81 mid = (lo + hi) // 2 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
82 start = mid |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
83 while start > 0 and m[start - 1] != '\n': |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
84 start -= 1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
85 end = advance(start, '\0') |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
86 if m[start:end] < s: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
87 # we know that after the null there are 40 bytes of sha1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
88 # this translates to the bisect lo = mid + 1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
89 lo = advance(end + 40, '\n') + 1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
90 else: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
91 # this translates to the bisect hi = mid |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
92 hi = start |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
93 end = advance(lo, '\0') |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
94 found = m[lo:end] |
11763
69e0bcf36961
manifest: removed usage of the global cmp function
Renato Cunha <renatoc@gmail.com>
parents:
10282
diff
changeset
|
95 if s == found: |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
96 # we know that after the null there are 40 bytes of sha1 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
97 end = advance(end + 40, '\n') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
98 return (lo, end + 1) |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
99 else: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
100 return (lo, lo) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
101 |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
102 def find(self, node, f): |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
103 '''look up entry for a single file efficiently. |
4159
a896607d3ec3
fix manifest.find
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3891
diff
changeset
|
104 return (node, flags) pair if found, (None, None) if not.''' |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
105 if self._mancache and self._mancache[0] == node: |
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
106 return self._mancache[1].get(f), self._mancache[1].flags(f) |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
107 text = self.revision(node) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
108 start, end = self._search(text, f) |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
109 if start == end: |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
110 return None, None |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
111 l = text[start:end] |
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
112 f, n = l.split('\0') |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
113 return revlog.bin(n[:40]), n[40:-1] |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
114 |
2841 | 115 def add(self, map, transaction, link, p1=None, p2=None, |
741 | 116 changed=None): |
644 | 117 # apply the changes collected during the bisect loop to our addlist |
1534 | 118 # return a delta suitable for addrevision |
119 def addlistdelta(addlist, x): | |
17983
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
120 # for large addlist arrays, building a new array is cheaper |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
121 # than repeatedly modifying the existing one |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
122 currentposition = 0 |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
123 newaddlist = array.array('c') |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
124 |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
125 for start, end, content in x: |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
126 newaddlist += addlist[currentposition:start] |
9413
a5adf55ee533
manifest.add(): simplify with iterators and generator expressions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8390
diff
changeset
|
127 if content: |
17983
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
128 newaddlist += array.array('c', content) |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
129 |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
130 currentposition = end |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
131 |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
132 newaddlist += addlist[currentposition:] |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
133 |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
134 deltatext = "".join(struct.pack(">lll", start, end, len(content)) |
16683 | 135 + content for start, end, content in x) |
17983
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
136 return deltatext, newaddlist |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
137 |
6765
be142cb994ff
manifest: make checkforbidden take a list
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
138 def checkforbidden(l): |
be142cb994ff
manifest: make checkforbidden take a list
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
139 for f in l: |
be142cb994ff
manifest: make checkforbidden take a list
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
140 if '\n' in f or '\r' in f: |
7633 | 141 raise error.RevlogError( |
8077
d051342f1ad1
manifest: improve error message about newlines in filenames
Greg Ward <greg-hg@gerg.ca>
parents:
7634
diff
changeset
|
142 _("'\\n' and '\\r' disallowed in filenames: %r") % f) |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3223
diff
changeset
|
143 |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
144 # if we're using the cache, make sure it is valid and |
644 | 145 # parented by the same node we're diffing against |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
146 if not (changed and self._mancache and p1 and self._mancache[0] == p1): |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8077
diff
changeset
|
147 files = sorted(map) |
6765
be142cb994ff
manifest: make checkforbidden take a list
Matt Mackall <mpm@selenic.com>
parents:
6762
diff
changeset
|
148 checkforbidden(files) |
3607
f4c9bb4ad7b1
issue352: disallow '\n' and '\r' in filenames (dirstate and manifest)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3223
diff
changeset
|
149 |
1651 | 150 # if this is changed to support newlines in filenames, |
151 # be sure to check the templates/ dir again (especially *-raw.tmpl) | |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
152 hex, flags = revlog.hex, map.flags |
14632
4819241ec1ad
manifest: use "\0" instead of "\000"
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
153 text = ''.join("%s\0%s%s\n" % (f, hex(map[f]), flags(f)) |
9420
d0db168136dc
manifest/revlog: do not let the revlog cache mutable objects
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9416
diff
changeset
|
154 for f in files) |
d0db168136dc
manifest/revlog: do not let the revlog cache mutable objects
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9416
diff
changeset
|
155 arraytext = array.array('c', text) |
644 | 156 cachedelta = None |
157 else: | |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
158 added, removed = changed |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
159 addlist = self._mancache[2] |
644 | 160 |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
161 checkforbidden(added) |
644 | 162 # combine the changed lists into one list for sorting |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
163 work = [(x, False) for x in added] |
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
164 work.extend((x, True) for x in removed) |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17426
diff
changeset
|
165 # this could use heapq.merge() (from Python 2.6+) or equivalent |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
166 # since the lists are already sorted |
644 | 167 work.sort() |
168 | |
169 delta = [] | |
1534 | 170 dstart = None |
171 dend = None | |
172 dline = [""] | |
173 start = 0 | |
174 # zero copy representation of addlist as a buffer | |
15657
d976b1ef6760
util: don't mess with builtins to emulate buffer()
Matt Mackall <mpm@selenic.com>
parents:
14632
diff
changeset
|
175 addbuf = util.buffer(addlist) |
644 | 176 |
1534 | 177 # start with a readonly loop that finds the offset of |
178 # each line and creates the deltas | |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
179 for f, todelete in work: |
741 | 180 # bs will either be the index of the item or the insert point |
2320
dbdce3b99988
fix parsing of tags. make parse errors useful. add new tag tests.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2142
diff
changeset
|
181 start, end = self._search(addbuf, f, start) |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
182 if not todelete: |
14632
4819241ec1ad
manifest: use "\0" instead of "\000"
Martin Geisler <mg@aragost.com>
parents:
14208
diff
changeset
|
183 l = "%s\0%s%s\n" % (f, revlog.hex(map[f]), map.flags(f)) |
644 | 184 else: |
9415
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
185 if start == end: |
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
186 # item we want to delete was not found, error out |
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
187 raise AssertionError( |
e0cc9fa2a576
manifest.add(): cleanup worklist construction and iteration
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9414
diff
changeset
|
188 _("failed to remove %s from manifest") % f) |
1534 | 189 l = "" |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12011
diff
changeset
|
190 if dstart is not None and dstart <= start and dend >= start: |
1534 | 191 if dend < end: |
192 dend = end | |
193 if l: | |
194 dline.append(l) | |
644 | 195 else: |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12011
diff
changeset
|
196 if dstart is not None: |
1534 | 197 delta.append([dstart, dend, "".join(dline)]) |
198 dstart = start | |
199 dend = end | |
200 dline = [l] | |
644 | 201 |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12011
diff
changeset
|
202 if dstart is not None: |
1534 | 203 delta.append([dstart, dend, "".join(dline)]) |
204 # apply the delta to the addlist, and get a delta for addrevision | |
17983
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
205 deltatext, addlist = addlistdelta(addlist, delta) |
c64e646af81e
commit: increase perf by building a new addlist instead of editing the old one
Durham Goode <durham@fb.com>
parents:
17428
diff
changeset
|
206 cachedelta = (self.rev(p1), deltatext) |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
207 arraytext = addlist |
15657
d976b1ef6760
util: don't mess with builtins to emulate buffer()
Matt Mackall <mpm@selenic.com>
parents:
14632
diff
changeset
|
208 text = util.buffer(arraytext) |
1534 | 209 |
9420
d0db168136dc
manifest/revlog: do not let the revlog cache mutable objects
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9416
diff
changeset
|
210 n = self.addrevision(text, transaction, link, p1, p2, cachedelta) |
9414
65dc516363ee
manifest: simplify cache handling, use a unique cache
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9413
diff
changeset
|
211 self._mancache = (n, map, arraytext) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
212 |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
213 return n |