Show More
@@ -49,6 +49,49 b' class manifestdict(dict):' | |||||
49 | # be sure to check the templates/ dir again (especially *-raw.tmpl) |
|
49 | # be sure to check the templates/ dir again (especially *-raw.tmpl) | |
50 | return ''.join("%s\0%s%s\n" % (f, hex(self[f]), flags(f)) for f in fl) |
|
50 | return ''.join("%s\0%s%s\n" % (f, hex(self[f]), flags(f)) for f in fl) | |
51 |
|
51 | |||
|
52 | def fastdelta(self, base, changes): | |||
|
53 | """Given a base manifest text as an array.array and a list of changes | |||
|
54 | relative to that text, compute a delta that can be used by revlog. | |||
|
55 | """ | |||
|
56 | delta = [] | |||
|
57 | dstart = None | |||
|
58 | dend = None | |||
|
59 | dline = [""] | |||
|
60 | start = 0 | |||
|
61 | # zero copy representation of base as a buffer | |||
|
62 | addbuf = util.buffer(base) | |||
|
63 | ||||
|
64 | # start with a readonly loop that finds the offset of | |||
|
65 | # each line and creates the deltas | |||
|
66 | for f, todelete in changes: | |||
|
67 | # bs will either be the index of the item or the insert point | |||
|
68 | start, end = _msearch(addbuf, f, start) | |||
|
69 | if not todelete: | |||
|
70 | l = "%s\0%s%s\n" % (f, revlog.hex(self[f]), self.flags(f)) | |||
|
71 | else: | |||
|
72 | if start == end: | |||
|
73 | # item we want to delete was not found, error out | |||
|
74 | raise AssertionError( | |||
|
75 | _("failed to remove %s from manifest") % f) | |||
|
76 | l = "" | |||
|
77 | if dstart is not None and dstart <= start and dend >= start: | |||
|
78 | if dend < end: | |||
|
79 | dend = end | |||
|
80 | if l: | |||
|
81 | dline.append(l) | |||
|
82 | else: | |||
|
83 | if dstart is not None: | |||
|
84 | delta.append([dstart, dend, "".join(dline)]) | |||
|
85 | dstart = start | |||
|
86 | dend = end | |||
|
87 | dline = [l] | |||
|
88 | ||||
|
89 | if dstart is not None: | |||
|
90 | delta.append([dstart, dend, "".join(dline)]) | |||
|
91 | # apply the delta to the base, and get a delta for addrevision | |||
|
92 | deltatext, arraytext = _addlistdelta(base, delta) | |||
|
93 | return arraytext, deltatext | |||
|
94 | ||||
52 | def _msearch(m, s, lo=0, hi=None): |
|
95 | def _msearch(m, s, lo=0, hi=None): | |
53 | '''return a tuple (start, end) that says where to find s within m. |
|
96 | '''return a tuple (start, end) that says where to find s within m. | |
54 |
|
97 | |||
@@ -173,7 +216,6 b' class manifest(revlog.revlog):' | |||||
173 | # compute a delta here using properties we know about the |
|
216 | # compute a delta here using properties we know about the | |
174 | # manifest up-front, which may save time later for the |
|
217 | # manifest up-front, which may save time later for the | |
175 | # revlog layer. |
|
218 | # revlog layer. | |
176 | addlist = self._mancache[p1][1] |
|
|||
177 |
|
219 | |||
178 | _checkforbidden(added) |
|
220 | _checkforbidden(added) | |
179 | # combine the changed lists into one list for sorting |
|
221 | # combine the changed lists into one list for sorting | |
@@ -183,45 +225,8 b' class manifest(revlog.revlog):' | |||||
183 | # since the lists are already sorted |
|
225 | # since the lists are already sorted | |
184 | work.sort() |
|
226 | work.sort() | |
185 |
|
227 | |||
186 | delta = [] |
|
228 | arraytext, deltatext = map.fastdelta(self._mancache[p1][1], work) | |
187 | dstart = None |
|
229 | cachedelta = self.rev(p1), deltatext | |
188 | dend = None |
|
|||
189 | dline = [""] |
|
|||
190 | start = 0 |
|
|||
191 | # zero copy representation of addlist as a buffer |
|
|||
192 | addbuf = util.buffer(addlist) |
|
|||
193 |
|
||||
194 | # start with a readonly loop that finds the offset of |
|
|||
195 | # each line and creates the deltas |
|
|||
196 | for f, todelete in work: |
|
|||
197 | # bs will either be the index of the item or the insert point |
|
|||
198 | start, end = _msearch(addbuf, f, start) |
|
|||
199 | if not todelete: |
|
|||
200 | l = "%s\0%s%s\n" % (f, revlog.hex(map[f]), map.flags(f)) |
|
|||
201 | else: |
|
|||
202 | if start == end: |
|
|||
203 | # item we want to delete was not found, error out |
|
|||
204 | raise AssertionError( |
|
|||
205 | _("failed to remove %s from manifest") % f) |
|
|||
206 | l = "" |
|
|||
207 | if dstart is not None and dstart <= start and dend >= start: |
|
|||
208 | if dend < end: |
|
|||
209 | dend = end |
|
|||
210 | if l: |
|
|||
211 | dline.append(l) |
|
|||
212 | else: |
|
|||
213 | if dstart is not None: |
|
|||
214 | delta.append([dstart, dend, "".join(dline)]) |
|
|||
215 | dstart = start |
|
|||
216 | dend = end |
|
|||
217 | dline = [l] |
|
|||
218 |
|
||||
219 | if dstart is not None: |
|
|||
220 | delta.append([dstart, dend, "".join(dline)]) |
|
|||
221 | # apply the delta to the addlist, and get a delta for addrevision |
|
|||
222 | deltatext, addlist = _addlistdelta(addlist, delta) |
|
|||
223 | cachedelta = (self.rev(p1), deltatext) |
|
|||
224 | arraytext = addlist |
|
|||
225 | text = util.buffer(arraytext) |
|
230 | text = util.buffer(arraytext) | |
226 | else: |
|
231 | else: | |
227 | # The first parent manifest isn't already loaded, so we'll |
|
232 | # The first parent manifest isn't already loaded, so we'll |
General Comments 0
You need to be logged in to leave comments.
Login now