Show More
@@ -2096,39 +2096,9 b' class revlog(object):' | |||||
2096 | Returns a tuple containing the minimum rev and a set of all revs that |
|
2096 | Returns a tuple containing the minimum rev and a set of all revs that | |
2097 | have linkrevs that will be broken by this strip. |
|
2097 | have linkrevs that will be broken by this strip. | |
2098 | """ |
|
2098 | """ | |
2099 | brokenrevs = set() |
|
2099 | return storageutil.resolvestripinfo(minlink, len(self) - 1, | |
2100 | strippoint = len(self) |
|
2100 | self.headrevs(), | |
2101 |
|
2101 | self.linkrev, self.parentrevs) | ||
2102 | heads = {} |
|
|||
2103 | futurelargelinkrevs = set() |
|
|||
2104 | for head in self.headrevs(): |
|
|||
2105 | headlinkrev = self.linkrev(head) |
|
|||
2106 | heads[head] = headlinkrev |
|
|||
2107 | if headlinkrev >= minlink: |
|
|||
2108 | futurelargelinkrevs.add(headlinkrev) |
|
|||
2109 |
|
||||
2110 | # This algorithm involves walking down the rev graph, starting at the |
|
|||
2111 | # heads. Since the revs are topologically sorted according to linkrev, |
|
|||
2112 | # once all head linkrevs are below the minlink, we know there are |
|
|||
2113 | # no more revs that could have a linkrev greater than minlink. |
|
|||
2114 | # So we can stop walking. |
|
|||
2115 | while futurelargelinkrevs: |
|
|||
2116 | strippoint -= 1 |
|
|||
2117 | linkrev = heads.pop(strippoint) |
|
|||
2118 |
|
||||
2119 | if linkrev < minlink: |
|
|||
2120 | brokenrevs.add(strippoint) |
|
|||
2121 | else: |
|
|||
2122 | futurelargelinkrevs.remove(linkrev) |
|
|||
2123 |
|
||||
2124 | for p in self.parentrevs(strippoint): |
|
|||
2125 | if p != nullrev: |
|
|||
2126 | plinkrev = self.linkrev(p) |
|
|||
2127 | heads[p] = plinkrev |
|
|||
2128 | if plinkrev >= minlink: |
|
|||
2129 | futurelargelinkrevs.add(plinkrev) |
|
|||
2130 |
|
||||
2131 | return strippoint, brokenrevs |
|
|||
2132 |
|
2102 | |||
2133 | def strip(self, minlink, transaction): |
|
2103 | def strip(self, minlink, transaction): | |
2134 | """truncate the revlog on the first revision with a linkrev >= minlink |
|
2104 | """truncate the revlog on the first revision with a linkrev >= minlink |
@@ -14,6 +14,7 b' from ..i18n import _' | |||||
14 | from ..node import ( |
|
14 | from ..node import ( | |
15 | bin, |
|
15 | bin, | |
16 | nullid, |
|
16 | nullid, | |
|
17 | nullrev, | |||
17 | ) |
|
18 | ) | |
18 | from .. import ( |
|
19 | from .. import ( | |
19 | error, |
|
20 | error, | |
@@ -155,3 +156,54 b' def fileidlookup(store, fileid, identifi' | |||||
155 | pass |
|
156 | pass | |
156 |
|
157 | |||
157 | raise error.LookupError(fileid, identifier, _('no match found')) |
|
158 | raise error.LookupError(fileid, identifier, _('no match found')) | |
|
159 | ||||
|
160 | def resolvestripinfo(minlinkrev, tiprev, headrevs, linkrevfn, parentrevsfn): | |||
|
161 | """Resolve information needed to strip revisions. | |||
|
162 | ||||
|
163 | Finds the minimum revision number that must be stripped in order to | |||
|
164 | strip ``minlinkrev``. | |||
|
165 | ||||
|
166 | Returns a 2-tuple of the minimum revision number to do that and a set | |||
|
167 | of all revision numbers that have linkrevs that would be broken | |||
|
168 | by that strip. | |||
|
169 | ||||
|
170 | ``tiprev`` is the current tip-most revision. It is ``len(store) - 1``. | |||
|
171 | ``headrevs`` is an iterable of head revisions. | |||
|
172 | ``linkrevfn`` is a callable that receives a revision and returns a linked | |||
|
173 | revision. | |||
|
174 | ``parentrevsfn`` is a callable that receives a revision number and returns | |||
|
175 | an iterable of its parent revision numbers. | |||
|
176 | """ | |||
|
177 | brokenrevs = set() | |||
|
178 | strippoint = tiprev + 1 | |||
|
179 | ||||
|
180 | heads = {} | |||
|
181 | futurelargelinkrevs = set() | |||
|
182 | for head in headrevs: | |||
|
183 | headlinkrev = linkrevfn(head) | |||
|
184 | heads[head] = headlinkrev | |||
|
185 | if headlinkrev >= minlinkrev: | |||
|
186 | futurelargelinkrevs.add(headlinkrev) | |||
|
187 | ||||
|
188 | # This algorithm involves walking down the rev graph, starting at the | |||
|
189 | # heads. Since the revs are topologically sorted according to linkrev, | |||
|
190 | # once all head linkrevs are below the minlink, we know there are | |||
|
191 | # no more revs that could have a linkrev greater than minlink. | |||
|
192 | # So we can stop walking. | |||
|
193 | while futurelargelinkrevs: | |||
|
194 | strippoint -= 1 | |||
|
195 | linkrev = heads.pop(strippoint) | |||
|
196 | ||||
|
197 | if linkrev < minlinkrev: | |||
|
198 | brokenrevs.add(strippoint) | |||
|
199 | else: | |||
|
200 | futurelargelinkrevs.remove(linkrev) | |||
|
201 | ||||
|
202 | for p in parentrevsfn(strippoint): | |||
|
203 | if p != nullrev: | |||
|
204 | plinkrev = linkrevfn(p) | |||
|
205 | heads[p] = plinkrev | |||
|
206 | if plinkrev >= minlinkrev: | |||
|
207 | futurelargelinkrevs.add(plinkrev) | |||
|
208 | ||||
|
209 | return strippoint, brokenrevs |
General Comments 0
You need to be logged in to leave comments.
Login now