Mercurial > hg
comparison hgext/convert/hg.py @ 7231:8e7130a10f3b
convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
This flag makes missing revlog errors to be ignored which allow broken
repositories to be fixed by converting them from and to Mercurial.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Tue, 21 Oct 2008 21:24:47 +0200 |
parents | 12472a240398 |
children | c2ac09f81ec9 |
comparison
equal
deleted
inserted
replaced
7230:261a9f47b44b | 7231:8e7130a10f3b |
---|---|
190 self.filemapmode = active | 190 self.filemapmode = active |
191 | 191 |
192 class mercurial_source(converter_source): | 192 class mercurial_source(converter_source): |
193 def __init__(self, ui, path, rev=None): | 193 def __init__(self, ui, path, rev=None): |
194 converter_source.__init__(self, ui, path, rev) | 194 converter_source.__init__(self, ui, path, rev) |
195 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False) | |
196 self.ignored = {} | |
195 self.saverev = ui.configbool('convert', 'hg.saverev', True) | 197 self.saverev = ui.configbool('convert', 'hg.saverev', True) |
196 try: | 198 try: |
197 self.repo = hg.repository(self.ui, path) | 199 self.repo = hg.repository(self.ui, path) |
198 # try to provoke an exception if this isn't really a hg | 200 # try to provoke an exception if this isn't really a hg |
199 # repo, but some other bogus compatible-looking url | 201 # repo, but some other bogus compatible-looking url |
251 def getchanges(self, rev): | 253 def getchanges(self, rev): |
252 ctx = self.changectx(rev) | 254 ctx = self.changectx(rev) |
253 parents = self.parents(ctx) | 255 parents = self.parents(ctx) |
254 if not parents: | 256 if not parents: |
255 files = util.sort(ctx.manifest().keys()) | 257 files = util.sort(ctx.manifest().keys()) |
256 return [(f, rev) for f in files], {} | 258 return [(f, rev) for f in files if f not in self.ignored], {} |
257 if self._changescache and self._changescache[0] == rev: | 259 if self._changescache and self._changescache[0] == rev: |
258 m, a, r = self._changescache[1] | 260 m, a, r = self._changescache[1] |
259 else: | 261 else: |
260 m, a, r = self.repo.status(parents[0], ctx.node())[:3] | 262 m, a, r = self.repo.status(parents[0], ctx.node())[:3] |
261 changes = [(name, rev) for name in m + a + r] | 263 # getcopies() detects missing revlogs early, run it before |
262 return util.sort(changes), self.getcopies(ctx, m + a) | 264 # filtering the changes. |
265 copies = self.getcopies(ctx, m + a) | |
266 changes = [(name, rev) for name in m + a + r | |
267 if name not in self.ignored] | |
268 return util.sort(changes), copies | |
263 | 269 |
264 def getcopies(self, ctx, files): | 270 def getcopies(self, ctx, files): |
265 copies = {} | 271 copies = {} |
266 for name in files: | 272 for name in files: |
267 try: | 273 if name in self.ignored: |
268 copynode = ctx.filectx(name).renamed()[0] | 274 continue |
269 if self.keep(copynode): | 275 try: |
270 copies[name] = copynode | 276 copysource, copynode = ctx.filectx(name).renamed() |
277 if copysource in self.ignored or not self.keep(copynode): | |
278 continue | |
279 copies[name] = copysource | |
271 except TypeError: | 280 except TypeError: |
272 pass | 281 pass |
282 except revlog.LookupError, e: | |
283 if not self.ignoreerrors: | |
284 raise | |
285 self.ignored[name] = 1 | |
286 self.ui.warn(_('ignoring: %s\n') % e) | |
273 return copies | 287 return copies |
274 | 288 |
275 def getcommit(self, rev): | 289 def getcommit(self, rev): |
276 ctx = self.changectx(rev) | 290 ctx = self.changectx(rev) |
277 parents = [hex(p) for p in self.parents(ctx)] | 291 parents = [hex(p) for p in self.parents(ctx)] |
295 i = 0 | 309 i = 0 |
296 changes = [], ctx.manifest().keys(), [] | 310 changes = [], ctx.manifest().keys(), [] |
297 else: | 311 else: |
298 i = i or 0 | 312 i = i or 0 |
299 changes = self.repo.status(parents[i], ctx.node())[:3] | 313 changes = self.repo.status(parents[i], ctx.node())[:3] |
314 changes = [[f for f in l if f not in self.ignored] for l in changes] | |
300 | 315 |
301 if i == 0: | 316 if i == 0: |
302 self._changescache = (rev, changes) | 317 self._changescache = (rev, changes) |
303 | 318 |
304 return changes[0] + changes[1] + changes[2] | 319 return changes[0] + changes[1] + changes[2] |