##// END OF EJS Templates
changectx: wrap the `changeid` processing in a try/except...
Pierre-Yves David -
r23012:bdb3349c default
parent child Browse files
Show More
@@ -376,92 +376,95 b' class changectx(basectx):'
376 changeid = '.'
376 changeid = '.'
377 self._repo = repo
377 self._repo = repo
378
378
379 if isinstance(changeid, int):
379 try:
380 if isinstance(changeid, int):
381 try:
382 self._node = repo.changelog.node(changeid)
383 except IndexError:
384 raise error.RepoLookupError(
385 _("unknown revision '%s'") % changeid)
386 self._rev = changeid
387 return
388 if isinstance(changeid, long):
389 changeid = str(changeid)
390 if changeid == '.':
391 self._node = repo.dirstate.p1()
392 self._rev = repo.changelog.rev(self._node)
393 return
394 if changeid == 'null':
395 self._node = nullid
396 self._rev = nullrev
397 return
398 if changeid == 'tip':
399 self._node = repo.changelog.tip()
400 self._rev = repo.changelog.rev(self._node)
401 return
402 if len(changeid) == 20:
403 try:
404 self._node = changeid
405 self._rev = repo.changelog.rev(changeid)
406 return
407 except LookupError:
408 pass
409
380 try:
410 try:
381 self._node = repo.changelog.node(changeid)
411 r = int(changeid)
382 except IndexError:
412 if str(r) != changeid:
383 raise error.RepoLookupError(
413 raise ValueError
384 _("unknown revision '%s'") % changeid)
414 l = len(repo.changelog)
385 self._rev = changeid
415 if r < 0:
386 return
416 r += l
387 if isinstance(changeid, long):
417 if r < 0 or r >= l:
388 changeid = str(changeid)
418 raise ValueError
389 if changeid == '.':
419 self._rev = r
390 self._node = repo.dirstate.p1()
420 self._node = repo.changelog.node(r)
391 self._rev = repo.changelog.rev(self._node)
392 return
393 if changeid == 'null':
394 self._node = nullid
395 self._rev = nullrev
396 return
397 if changeid == 'tip':
398 self._node = repo.changelog.tip()
399 self._rev = repo.changelog.rev(self._node)
400 return
401 if len(changeid) == 20:
402 try:
403 self._node = changeid
404 self._rev = repo.changelog.rev(changeid)
405 return
421 return
406 except LookupError:
422 except (ValueError, OverflowError, IndexError):
407 pass
423 pass
408
424
409 try:
425 if len(changeid) == 40:
410 r = int(changeid)
426 try:
411 if str(r) != changeid:
427 self._node = bin(changeid)
412 raise ValueError
428 self._rev = repo.changelog.rev(self._node)
413 l = len(repo.changelog)
429 return
414 if r < 0:
430 except (TypeError, LookupError):
415 r += l
431 pass
416 if r < 0 or r >= l:
417 raise ValueError
418 self._rev = r
419 self._node = repo.changelog.node(r)
420 return
421 except (ValueError, OverflowError, IndexError):
422 pass
423
432
424 if len(changeid) == 40:
433 if changeid in repo._bookmarks:
425 try:
434 self._node = repo._bookmarks[changeid]
426 self._node = bin(changeid)
427 self._rev = repo.changelog.rev(self._node)
435 self._rev = repo.changelog.rev(self._node)
428 return
436 return
429 except (TypeError, LookupError):
437 if changeid in repo._tagscache.tags:
438 self._node = repo._tagscache.tags[changeid]
439 self._rev = repo.changelog.rev(self._node)
440 return
441 try:
442 self._node = repo.branchtip(changeid)
443 self._rev = repo.changelog.rev(self._node)
444 return
445 except error.RepoLookupError:
430 pass
446 pass
431
447
432 if changeid in repo._bookmarks:
448 self._node = repo.changelog._partialmatch(changeid)
433 self._node = repo._bookmarks[changeid]
449 if self._node is not None:
434 self._rev = repo.changelog.rev(self._node)
450 self._rev = repo.changelog.rev(self._node)
435 return
451 return
436 if changeid in repo._tagscache.tags:
437 self._node = repo._tagscache.tags[changeid]
438 self._rev = repo.changelog.rev(self._node)
439 return
440 try:
441 self._node = repo.branchtip(changeid)
442 self._rev = repo.changelog.rev(self._node)
443 return
444 except error.RepoLookupError:
445 pass
446
452
447 self._node = repo.changelog._partialmatch(changeid)
453 # lookup failed
448 if self._node is not None:
454 # check if it might have come from damaged dirstate
449 self._rev = repo.changelog.rev(self._node)
455 #
450 return
456 # XXX we could avoid the unfiltered if we had a recognizable
451
457 # exception for filtered changeset access
452 # lookup failed
458 if changeid in repo.unfiltered().dirstate.parents():
453 # check if it might have come from damaged dirstate
459 msg = _("working directory has unknown parent '%s'!")
454 #
460 raise error.Abort(msg % short(changeid))
455 # XXX we could avoid the unfiltered if we had a recognizable exception
461 try:
456 # for filtered changeset access
462 if len(changeid) == 20:
457 if changeid in repo.unfiltered().dirstate.parents():
463 changeid = hex(changeid)
458 raise error.Abort(_("working directory has unknown parent '%s'!")
464 except TypeError:
459 % short(changeid))
465 pass
460 try:
466 except Exception:
461 if len(changeid) == 20:
467 raise
462 changeid = hex(changeid)
463 except TypeError:
464 pass
465 raise error.RepoLookupError(
468 raise error.RepoLookupError(
466 _("unknown revision '%s'") % changeid)
469 _("unknown revision '%s'") % changeid)
467
470
General Comments 0
You need to be logged in to leave comments. Login now