Show More
@@ -674,9 +674,10 b' class sqlitefilestore(object):' | |||||
674 | linkmapper, |
|
674 | linkmapper, | |
675 | transaction, |
|
675 | transaction, | |
676 | addrevisioncb=None, |
|
676 | addrevisioncb=None, | |
|
677 | duplicaterevisioncb=None, | |||
677 | maybemissingparents=False, |
|
678 | maybemissingparents=False, | |
678 | ): |
|
679 | ): | |
679 |
|
|
680 | empty = True | |
680 |
|
681 | |||
681 | for node, p1, p2, linknode, deltabase, delta, wireflags in deltas: |
|
682 | for node, p1, p2, linknode, deltabase, delta, wireflags in deltas: | |
682 | storeflags = 0 |
|
683 | storeflags = 0 | |
@@ -715,8 +716,6 b' class sqlitefilestore(object):' | |||||
715 |
|
716 | |||
716 | linkrev = linkmapper(linknode) |
|
717 | linkrev = linkmapper(linknode) | |
717 |
|
718 | |||
718 | nodes.append(node) |
|
|||
719 |
|
||||
720 | if node in self._revisions: |
|
719 | if node in self._revisions: | |
721 | # Possibly reset parents to make them proper. |
|
720 | # Possibly reset parents to make them proper. | |
722 | entry = self._revisions[node] |
|
721 | entry = self._revisions[node] | |
@@ -741,6 +740,9 b' class sqlitefilestore(object):' | |||||
741 | (self._nodetorev[p1], entry.flags, entry.rid), |
|
740 | (self._nodetorev[p1], entry.flags, entry.rid), | |
742 | ) |
|
741 | ) | |
743 |
|
742 | |||
|
743 | if duplicaterevisioncb: | |||
|
744 | duplicaterevisioncb(self, node) | |||
|
745 | empty = False | |||
744 | continue |
|
746 | continue | |
745 |
|
747 | |||
746 | if deltabase == nullid: |
|
748 | if deltabase == nullid: | |
@@ -763,8 +765,9 b' class sqlitefilestore(object):' | |||||
763 |
|
765 | |||
764 | if addrevisioncb: |
|
766 | if addrevisioncb: | |
765 | addrevisioncb(self, node) |
|
767 | addrevisioncb(self, node) | |
|
768 | empty = False | |||
766 |
|
769 | |||
767 |
return no |
|
770 | return not empty | |
768 |
|
771 | |||
769 | def censorrevision(self, tr, censornode, tombstone=b''): |
|
772 | def censorrevision(self, tr, censornode, tombstone=b''): | |
770 | tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
|
773 | tombstone = storageutil.packmeta({b'censored': tombstone}, b'') |
@@ -316,20 +316,29 b' class cg1unpacker(object):' | |||||
316 | self.callback = progress.increment |
|
316 | self.callback = progress.increment | |
317 |
|
317 | |||
318 | efilesset = set() |
|
318 | efilesset = set() | |
|
319 | cgnodes = [] | |||
319 |
|
320 | |||
320 | def onchangelog(cl, node): |
|
321 | def onchangelog(cl, node): | |
321 | efilesset.update(cl.readfiles(node)) |
|
322 | efilesset.update(cl.readfiles(node)) | |
|
323 | cgnodes.append(node) | |||
|
324 | ||||
|
325 | def ondupchangelog(cl, node): | |||
|
326 | cgnodes.append(node) | |||
322 |
|
327 | |||
323 | self.changelogheader() |
|
328 | self.changelogheader() | |
324 | deltas = self.deltaiter() |
|
329 | deltas = self.deltaiter() | |
325 | cgnodes = cl.addgroup(deltas, csmap, trp, addrevisioncb=onchangelog) |
|
330 | if not cl.addgroup( | |
326 | efiles = len(efilesset) |
|
331 | deltas, | |
327 |
|
332 | csmap, | ||
328 | if not cgnodes: |
|
333 | trp, | |
|
334 | addrevisioncb=onchangelog, | |||
|
335 | duplicaterevisioncb=ondupchangelog, | |||
|
336 | ): | |||
329 | repo.ui.develwarn( |
|
337 | repo.ui.develwarn( | |
330 | b'applied empty changelog from changegroup', |
|
338 | b'applied empty changelog from changegroup', | |
331 | config=b'warn-empty-changegroup', |
|
339 | config=b'warn-empty-changegroup', | |
332 | ) |
|
340 | ) | |
|
341 | efiles = len(efilesset) | |||
333 | clend = len(cl) |
|
342 | clend = len(cl) | |
334 | changesets = clend - clstart |
|
343 | changesets = clend - clstart | |
335 | progress.complete() |
|
344 | progress.complete() |
@@ -343,16 +343,21 b' def _processchangesetdata(repo, tr, objs' | |||||
343 | ) |
|
343 | ) | |
344 |
|
344 | |||
345 | manifestnodes = {} |
|
345 | manifestnodes = {} | |
|
346 | added = [] | |||
346 |
|
347 | |||
347 | def linkrev(node): |
|
348 | def linkrev(node): | |
348 | repo.ui.debug(b'add changeset %s\n' % short(node)) |
|
349 | repo.ui.debug(b'add changeset %s\n' % short(node)) | |
349 | # Linkrev for changelog is always self. |
|
350 | # Linkrev for changelog is always self. | |
350 | return len(cl) |
|
351 | return len(cl) | |
351 |
|
352 | |||
|
353 | def ondupchangeset(cl, node): | |||
|
354 | added.append(node) | |||
|
355 | ||||
352 | def onchangeset(cl, node): |
|
356 | def onchangeset(cl, node): | |
353 | progress.increment() |
|
357 | progress.increment() | |
354 |
|
358 | |||
355 | revision = cl.changelogrevision(node) |
|
359 | revision = cl.changelogrevision(node) | |
|
360 | added.append(node) | |||
356 |
|
361 | |||
357 | # We need to preserve the mapping of changelog revision to node |
|
362 | # We need to preserve the mapping of changelog revision to node | |
358 | # so we can set the linkrev accordingly when manifests are added. |
|
363 | # so we can set the linkrev accordingly when manifests are added. | |
@@ -403,8 +408,12 b' def _processchangesetdata(repo, tr, objs' | |||||
403 | 0, |
|
408 | 0, | |
404 | ) |
|
409 | ) | |
405 |
|
410 | |||
406 |
|
|
411 | cl.addgroup( | |
407 | iterrevisions(), linkrev, weakref.proxy(tr), addrevisioncb=onchangeset |
|
412 | iterrevisions(), | |
|
413 | linkrev, | |||
|
414 | weakref.proxy(tr), | |||
|
415 | addrevisioncb=onchangeset, | |||
|
416 | duplicaterevisioncb=ondupchangeset, | |||
408 | ) |
|
417 | ) | |
409 |
|
418 | |||
410 | progress.complete() |
|
419 | progress.complete() | |
@@ -516,12 +525,15 b' def _fetchmanifests(repo, tr, remote, ma' | |||||
516 | # Chomp off header object. |
|
525 | # Chomp off header object. | |
517 | next(objs) |
|
526 | next(objs) | |
518 |
|
527 | |||
519 | added.extend( |
|
528 | def onchangeset(cl, node): | |
520 | rootmanifest.addgroup( |
|
529 | added.append(node) | |
521 | iterrevisions(objs, progress), |
|
530 | ||
522 | linkrevs.__getitem__, |
|
531 | rootmanifest.addgroup( | |
523 | weakref.proxy(tr), |
|
532 | iterrevisions(objs, progress), | |
524 | ) |
|
533 | linkrevs.__getitem__, | |
|
534 | weakref.proxy(tr), | |||
|
535 | addrevisioncb=onchangeset, | |||
|
536 | duplicaterevisioncb=onchangeset, | |||
525 | ) |
|
537 | ) | |
526 |
|
538 | |||
527 | progress.complete() |
|
539 | progress.complete() |
@@ -139,6 +139,7 b' class filelog(object):' | |||||
139 | linkmapper, |
|
139 | linkmapper, | |
140 | transaction, |
|
140 | transaction, | |
141 | addrevisioncb=None, |
|
141 | addrevisioncb=None, | |
|
142 | duplicaterevisioncb=None, | |||
142 | maybemissingparents=False, |
|
143 | maybemissingparents=False, | |
143 | ): |
|
144 | ): | |
144 | if maybemissingparents: |
|
145 | if maybemissingparents: | |
@@ -150,7 +151,11 b' class filelog(object):' | |||||
150 | ) |
|
151 | ) | |
151 |
|
152 | |||
152 | return self._revlog.addgroup( |
|
153 | return self._revlog.addgroup( | |
153 | deltas, linkmapper, transaction, addrevisioncb=addrevisioncb |
|
154 | deltas, | |
|
155 | linkmapper, | |||
|
156 | transaction, | |||
|
157 | addrevisioncb=addrevisioncb, | |||
|
158 | duplicaterevisioncb=duplicaterevisioncb, | |||
154 | ) |
|
159 | ) | |
155 |
|
160 | |||
156 | def getstrippoint(self, minlink): |
|
161 | def getstrippoint(self, minlink): |
@@ -756,6 +756,7 b' class ifilemutation(interfaceutil.Interf' | |||||
756 | linkmapper, |
|
756 | linkmapper, | |
757 | transaction, |
|
757 | transaction, | |
758 | addrevisioncb=None, |
|
758 | addrevisioncb=None, | |
|
759 | duplicaterevisioncb=None, | |||
759 | maybemissingparents=False, |
|
760 | maybemissingparents=False, | |
760 | ): |
|
761 | ): | |
761 | """Process a series of deltas for storage. |
|
762 | """Process a series of deltas for storage. | |
@@ -1247,7 +1248,13 b' class imanifeststorage(interfaceutil.Int' | |||||
1247 | See the documentation for ``ifiledata`` for more. |
|
1248 | See the documentation for ``ifiledata`` for more. | |
1248 | """ |
|
1249 | """ | |
1249 |
|
1250 | |||
1250 | def addgroup(deltas, linkmapper, transaction, addrevisioncb=None): |
|
1251 | def addgroup( | |
|
1252 | deltas, | |||
|
1253 | linkmapper, | |||
|
1254 | transaction, | |||
|
1255 | addrevisioncb=None, | |||
|
1256 | duplicaterevisioncb=None, | |||
|
1257 | ): | |||
1251 | """Process a series of deltas for storage. |
|
1258 | """Process a series of deltas for storage. | |
1252 |
|
1259 | |||
1253 | See the documentation in ``ifilemutation`` for more. |
|
1260 | See the documentation in ``ifilemutation`` for more. |
@@ -1832,9 +1832,20 b' class manifestrevlog(object):' | |||||
1832 | deltamode=deltamode, |
|
1832 | deltamode=deltamode, | |
1833 | ) |
|
1833 | ) | |
1834 |
|
1834 | |||
1835 | def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None): |
|
1835 | def addgroup( | |
|
1836 | self, | |||
|
1837 | deltas, | |||
|
1838 | linkmapper, | |||
|
1839 | transaction, | |||
|
1840 | addrevisioncb=None, | |||
|
1841 | duplicaterevisioncb=None, | |||
|
1842 | ): | |||
1836 | return self._revlog.addgroup( |
|
1843 | return self._revlog.addgroup( | |
1837 | deltas, linkmapper, transaction, addrevisioncb=addrevisioncb |
|
1844 | deltas, | |
|
1845 | linkmapper, | |||
|
1846 | transaction, | |||
|
1847 | addrevisioncb=addrevisioncb, | |||
|
1848 | duplicaterevisioncb=duplicaterevisioncb, | |||
1838 | ) |
|
1849 | ) | |
1839 |
|
1850 | |||
1840 | def rawsize(self, rev): |
|
1851 | def rawsize(self, rev): |
@@ -2368,7 +2368,14 b' class revlog(object):' | |||||
2368 | self._enforceinlinesize(transaction, ifh) |
|
2368 | self._enforceinlinesize(transaction, ifh) | |
2369 | nodemaputil.setup_persistent_nodemap(transaction, self) |
|
2369 | nodemaputil.setup_persistent_nodemap(transaction, self) | |
2370 |
|
2370 | |||
2371 | def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None): |
|
2371 | def addgroup( | |
|
2372 | self, | |||
|
2373 | deltas, | |||
|
2374 | linkmapper, | |||
|
2375 | transaction, | |||
|
2376 | addrevisioncb=None, | |||
|
2377 | duplicaterevisioncb=None, | |||
|
2378 | ): | |||
2372 | """ |
|
2379 | """ | |
2373 | add a delta group |
|
2380 | add a delta group | |
2374 |
|
2381 | |||
@@ -2383,8 +2390,6 b' class revlog(object):' | |||||
2383 | if self._writinghandles: |
|
2390 | if self._writinghandles: | |
2384 | raise error.ProgrammingError(b'cannot nest addgroup() calls') |
|
2391 | raise error.ProgrammingError(b'cannot nest addgroup() calls') | |
2385 |
|
2392 | |||
2386 | nodes = [] |
|
|||
2387 |
|
||||
2388 | r = len(self) |
|
2393 | r = len(self) | |
2389 | end = 0 |
|
2394 | end = 0 | |
2390 | if r: |
|
2395 | if r: | |
@@ -2405,6 +2410,7 b' class revlog(object):' | |||||
2405 | ifh.flush() |
|
2410 | ifh.flush() | |
2406 |
|
2411 | |||
2407 | self._writinghandles = (ifh, dfh) |
|
2412 | self._writinghandles = (ifh, dfh) | |
|
2413 | empty = True | |||
2408 |
|
2414 | |||
2409 | try: |
|
2415 | try: | |
2410 | deltacomputer = deltautil.deltacomputer(self) |
|
2416 | deltacomputer = deltautil.deltacomputer(self) | |
@@ -2414,11 +2420,12 b' class revlog(object):' | |||||
2414 | link = linkmapper(linknode) |
|
2420 | link = linkmapper(linknode) | |
2415 | flags = flags or REVIDX_DEFAULT_FLAGS |
|
2421 | flags = flags or REVIDX_DEFAULT_FLAGS | |
2416 |
|
2422 | |||
2417 | nodes.append(node) |
|
|||
2418 |
|
||||
2419 | if self.index.has_node(node): |
|
2423 | if self.index.has_node(node): | |
|
2424 | # this can happen if two branches make the same change | |||
2420 | self._nodeduplicatecallback(transaction, node) |
|
2425 | self._nodeduplicatecallback(transaction, node) | |
2421 | # this can happen if two branches make the same change |
|
2426 | if duplicaterevisioncb: | |
|
2427 | duplicaterevisioncb(self, node) | |||
|
2428 | empty = False | |||
2422 | continue |
|
2429 | continue | |
2423 |
|
2430 | |||
2424 | for p in (p1, p2): |
|
2431 | for p in (p1, p2): | |
@@ -2472,6 +2479,7 b' class revlog(object):' | |||||
2472 |
|
2479 | |||
2473 | if addrevisioncb: |
|
2480 | if addrevisioncb: | |
2474 | addrevisioncb(self, node) |
|
2481 | addrevisioncb(self, node) | |
|
2482 | empty = False | |||
2475 |
|
2483 | |||
2476 | if not dfh and not self._inline: |
|
2484 | if not dfh and not self._inline: | |
2477 | # addrevision switched from inline to conventional |
|
2485 | # addrevision switched from inline to conventional | |
@@ -2486,8 +2494,7 b' class revlog(object):' | |||||
2486 | if dfh: |
|
2494 | if dfh: | |
2487 | dfh.close() |
|
2495 | dfh.close() | |
2488 | ifh.close() |
|
2496 | ifh.close() | |
2489 |
|
2497 | return not empty | ||
2490 | return nodes |
|
|||
2491 |
|
2498 | |||
2492 | def iscensored(self, rev): |
|
2499 | def iscensored(self, rev): | |
2493 | """Check if a file revision is censored.""" |
|
2500 | """Check if a file revision is censored.""" |
@@ -1117,7 +1117,22 b' class ifilemutationtests(basetestcase):' | |||||
1117 | return 0 |
|
1117 | return 0 | |
1118 |
|
1118 | |||
1119 | with self._maketransactionfn() as tr: |
|
1119 | with self._maketransactionfn() as tr: | |
1120 | nodes = f.addgroup([], None, tr, addrevisioncb=cb) |
|
1120 | nodes = [] | |
|
1121 | ||||
|
1122 | def onchangeset(cl, node): | |||
|
1123 | nodes.append(node) | |||
|
1124 | cb(cl, node) | |||
|
1125 | ||||
|
1126 | def ondupchangeset(cl, node): | |||
|
1127 | nodes.append(node) | |||
|
1128 | ||||
|
1129 | f.addgroup( | |||
|
1130 | [], | |||
|
1131 | None, | |||
|
1132 | tr, | |||
|
1133 | addrevisioncb=onchangeset, | |||
|
1134 | duplicaterevisioncb=ondupchangeset, | |||
|
1135 | ) | |||
1121 |
|
1136 | |||
1122 | self.assertEqual(nodes, []) |
|
1137 | self.assertEqual(nodes, []) | |
1123 | self.assertEqual(callbackargs, []) |
|
1138 | self.assertEqual(callbackargs, []) | |
@@ -1136,7 +1151,22 b' class ifilemutationtests(basetestcase):' | |||||
1136 | ] |
|
1151 | ] | |
1137 |
|
1152 | |||
1138 | with self._maketransactionfn() as tr: |
|
1153 | with self._maketransactionfn() as tr: | |
1139 | nodes = f.addgroup(deltas, linkmapper, tr, addrevisioncb=cb) |
|
1154 | nodes = [] | |
|
1155 | ||||
|
1156 | def onchangeset(cl, node): | |||
|
1157 | nodes.append(node) | |||
|
1158 | cb(cl, node) | |||
|
1159 | ||||
|
1160 | def ondupchangeset(cl, node): | |||
|
1161 | nodes.append(node) | |||
|
1162 | ||||
|
1163 | f.addgroup( | |||
|
1164 | deltas, | |||
|
1165 | linkmapper, | |||
|
1166 | tr, | |||
|
1167 | addrevisioncb=onchangeset, | |||
|
1168 | duplicaterevisioncb=ondupchangeset, | |||
|
1169 | ) | |||
1140 |
|
1170 | |||
1141 | self.assertEqual( |
|
1171 | self.assertEqual( | |
1142 | nodes, |
|
1172 | nodes, | |
@@ -1175,7 +1205,19 b' class ifilemutationtests(basetestcase):' | |||||
1175 | deltas.append((nodes[i], nullid, nullid, nullid, nullid, delta, 0)) |
|
1205 | deltas.append((nodes[i], nullid, nullid, nullid, nullid, delta, 0)) | |
1176 |
|
1206 | |||
1177 | with self._maketransactionfn() as tr: |
|
1207 | with self._maketransactionfn() as tr: | |
1178 | self.assertEqual(f.addgroup(deltas, lambda x: 0, tr), nodes) |
|
1208 | newnodes = [] | |
|
1209 | ||||
|
1210 | def onchangeset(cl, node): | |||
|
1211 | newnodes.append(node) | |||
|
1212 | ||||
|
1213 | f.addgroup( | |||
|
1214 | deltas, | |||
|
1215 | lambda x: 0, | |||
|
1216 | tr, | |||
|
1217 | addrevisioncb=onchangeset, | |||
|
1218 | duplicaterevisioncb=onchangeset, | |||
|
1219 | ) | |||
|
1220 | self.assertEqual(newnodes, nodes) | |||
1179 |
|
1221 | |||
1180 | self.assertEqual(len(f), len(deltas)) |
|
1222 | self.assertEqual(len(f), len(deltas)) | |
1181 | self.assertEqual(list(f.revs()), [0, 1, 2]) |
|
1223 | self.assertEqual(list(f.revs()), [0, 1, 2]) |
@@ -129,6 +129,7 b' class unionrevlog(revlog.revlog):' | |||||
129 | linkmapper, |
|
129 | linkmapper, | |
130 | transaction, |
|
130 | transaction, | |
131 | addrevisioncb=None, |
|
131 | addrevisioncb=None, | |
|
132 | duplicaterevisioncb=None, | |||
132 | maybemissingparents=False, |
|
133 | maybemissingparents=False, | |
133 | ): |
|
134 | ): | |
134 | raise NotImplementedError |
|
135 | raise NotImplementedError |
@@ -532,6 +532,7 b' class filestorage(object):' | |||||
532 | linkmapper, |
|
532 | linkmapper, | |
533 | transaction, |
|
533 | transaction, | |
534 | addrevisioncb=None, |
|
534 | addrevisioncb=None, | |
|
535 | duplicaterevisioncb=None, | |||
535 | maybemissingparents=False, |
|
536 | maybemissingparents=False, | |
536 | ): |
|
537 | ): | |
537 | if maybemissingparents: |
|
538 | if maybemissingparents: | |
@@ -539,7 +540,7 b' class filestorage(object):' | |||||
539 | _('simple store does not support missing parents ' 'write mode') |
|
540 | _('simple store does not support missing parents ' 'write mode') | |
540 | ) |
|
541 | ) | |
541 |
|
542 | |||
542 |
|
|
543 | empty = True | |
543 |
|
544 | |||
544 | transaction.addbackup(self._indexpath) |
|
545 | transaction.addbackup(self._indexpath) | |
545 |
|
546 | |||
@@ -547,9 +548,10 b' class filestorage(object):' | |||||
547 | linkrev = linkmapper(linknode) |
|
548 | linkrev = linkmapper(linknode) | |
548 | flags = flags or revlog.REVIDX_DEFAULT_FLAGS |
|
549 | flags = flags or revlog.REVIDX_DEFAULT_FLAGS | |
549 |
|
550 | |||
550 | nodes.append(node) |
|
|||
551 |
|
||||
552 | if node in self._indexbynode: |
|
551 | if node in self._indexbynode: | |
|
552 | if duplicaterevisioncb: | |||
|
553 | duplicaterevisioncb(self, node) | |||
|
554 | empty = False | |||
553 | continue |
|
555 | continue | |
554 |
|
556 | |||
555 | # Need to resolve the fulltext from the delta base. |
|
557 | # Need to resolve the fulltext from the delta base. | |
@@ -564,7 +566,8 b' class filestorage(object):' | |||||
564 |
|
566 | |||
565 | if addrevisioncb: |
|
567 | if addrevisioncb: | |
566 | addrevisioncb(self, node) |
|
568 | addrevisioncb(self, node) | |
567 | return nodes |
|
569 | empty = False | |
|
570 | return not empty | |||
568 |
|
571 | |||
569 | def _headrevs(self): |
|
572 | def _headrevs(self): | |
570 | # Assume all revisions are heads by default. |
|
573 | # Assume all revisions are heads by default. |
General Comments 0
You need to be logged in to leave comments.
Login now