Show More
@@ -38,16 +38,8 b' def _collectbrokencsets(repo, files, str' | |||||
38 | """return the changesets which will be broken by the truncation""" |
|
38 | """return the changesets which will be broken by the truncation""" | |
39 | s = set() |
|
39 | s = set() | |
40 | def collectone(revlog): |
|
40 | def collectone(revlog): | |
41 | linkgen = (revlog.linkrev(i) for i in revlog) |
|
41 | _, brokenset = revlog.getstrippoint(striprev) | |
42 | # find the truncation point of the revlog |
|
42 | s.update([revlog.linkrev(r) for r in brokenset]) | |
43 | for lrev in linkgen: |
|
|||
44 | if lrev >= striprev: |
|
|||
45 | break |
|
|||
46 | # see if any revision after this point has a linkrev |
|
|||
47 | # less than striprev (those will be broken by strip) |
|
|||
48 | for lrev in linkgen: |
|
|||
49 | if lrev < striprev: |
|
|||
50 | s.add(lrev) |
|
|||
51 |
|
43 | |||
52 | collectone(repo.manifest) |
|
44 | collectone(repo.manifest) | |
53 | for fname in files: |
|
45 | for fname in files: |
@@ -1285,6 +1285,46 b' class revlog(object):' | |||||
1285 |
|
1285 | |||
1286 | return content |
|
1286 | return content | |
1287 |
|
1287 | |||
|
1288 | def getstrippoint(self, minlink): | |||
|
1289 | """find the minimum rev that must be stripped to strip the linkrev | |||
|
1290 | ||||
|
1291 | Returns a tuple containing the minimum rev and a set of all revs that | |||
|
1292 | have linkrevs that will be broken by this strip. | |||
|
1293 | """ | |||
|
1294 | brokenrevs = set() | |||
|
1295 | strippoint = len(self) | |||
|
1296 | ||||
|
1297 | heads = {} | |||
|
1298 | futurelargelinkrevs = set() | |||
|
1299 | for head in self.headrevs(): | |||
|
1300 | headlinkrev = self.linkrev(head) | |||
|
1301 | heads[head] = headlinkrev | |||
|
1302 | if headlinkrev >= minlink: | |||
|
1303 | futurelargelinkrevs.add(headlinkrev) | |||
|
1304 | ||||
|
1305 | # This algorithm involves walking down the rev graph, starting at the | |||
|
1306 | # heads. Since the revs are topologically sorted according to linkrev, | |||
|
1307 | # once all head linkrevs are below the minlink, we know there are | |||
|
1308 | # no more revs that could have a linkrev greater than minlink. | |||
|
1309 | # So we can stop walking. | |||
|
1310 | while futurelargelinkrevs: | |||
|
1311 | strippoint -= 1 | |||
|
1312 | linkrev = heads.pop(strippoint) | |||
|
1313 | ||||
|
1314 | if linkrev < minlink: | |||
|
1315 | brokenrevs.add(strippoint) | |||
|
1316 | else: | |||
|
1317 | futurelargelinkrevs.remove(linkrev) | |||
|
1318 | ||||
|
1319 | for p in self.parentrevs(strippoint): | |||
|
1320 | if p != nullrev: | |||
|
1321 | plinkrev = self.linkrev(p) | |||
|
1322 | heads[p] = plinkrev | |||
|
1323 | if plinkrev >= minlink: | |||
|
1324 | futurelargelinkrevs.add(plinkrev) | |||
|
1325 | ||||
|
1326 | return strippoint, brokenrevs | |||
|
1327 | ||||
1288 | def strip(self, minlink, transaction): |
|
1328 | def strip(self, minlink, transaction): | |
1289 | """truncate the revlog on the first revision with a linkrev >= minlink |
|
1329 | """truncate the revlog on the first revision with a linkrev >= minlink | |
1290 |
|
1330 | |||
@@ -1302,10 +1342,8 b' class revlog(object):' | |||||
1302 | if len(self) == 0: |
|
1342 | if len(self) == 0: | |
1303 | return |
|
1343 | return | |
1304 |
|
1344 | |||
1305 | for rev in self: |
|
1345 | rev, _ = self.getstrippoint(minlink) | |
1306 | if self.index[rev][4] >= minlink: |
|
1346 | if rev == len(self): | |
1307 | break |
|
|||
1308 | else: |
|
|||
1309 | return |
|
1347 | return | |
1310 |
|
1348 | |||
1311 | # first truncate the files on disk |
|
1349 | # first truncate the files on disk |
General Comments 0
You need to be logged in to leave comments.
Login now