comparison mercurial/context.py @ 23012:bdb3349cf7ab

changectx: wrap the `changeid` processing in a try/except We are going to introduce more precise exception classes for filtered nodes. So we will have to upgrade them to the `RepoLookupError` level here. We wrap the whole thing into a try/except to ease this future catching. Some of the current exception catching will be moved in this one. But the current changeset focuses on code movement only.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Wed, 15 Oct 2014 16:05:24 -0700
parents 03602f76deee
children b50ed6b9b513
comparison
equal deleted inserted replaced
23011:006a81d07e57 23012:bdb3349cf7ab
374 374
375 if changeid == '': 375 if changeid == '':
376 changeid = '.' 376 changeid = '.'
377 self._repo = repo 377 self._repo = repo
378 378
379 if isinstance(changeid, int): 379 try:
380 try: 380 if isinstance(changeid, int):
381 self._node = repo.changelog.node(changeid) 381 try:
382 except IndexError: 382 self._node = repo.changelog.node(changeid)
383 raise error.RepoLookupError( 383 except IndexError:
384 _("unknown revision '%s'") % changeid) 384 raise error.RepoLookupError(
385 self._rev = changeid 385 _("unknown revision '%s'") % changeid)
386 return 386 self._rev = changeid
387 if isinstance(changeid, long):
388 changeid = str(changeid)
389 if changeid == '.':
390 self._node = repo.dirstate.p1()
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 387 return
406 except LookupError: 388 if isinstance(changeid, long):
407 pass 389 changeid = str(changeid)
408 390 if changeid == '.':
409 try: 391 self._node = repo.dirstate.p1()
410 r = int(changeid)
411 if str(r) != changeid:
412 raise ValueError
413 l = len(repo.changelog)
414 if r < 0:
415 r += l
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
424 if len(changeid) == 40:
425 try:
426 self._node = bin(changeid)
427 self._rev = repo.changelog.rev(self._node) 392 self._rev = repo.changelog.rev(self._node)
428 return 393 return
429 except (TypeError, LookupError): 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
410 try:
411 r = int(changeid)
412 if str(r) != changeid:
413 raise ValueError
414 l = len(repo.changelog)
415 if r < 0:
416 r += l
417 if r < 0 or r >= l:
418 raise ValueError
419 self._rev = r
420 self._node = repo.changelog.node(r)
421 return
422 except (ValueError, OverflowError, IndexError):
430 pass 423 pass
431 424
432 if changeid in repo._bookmarks: 425 if len(changeid) == 40:
433 self._node = repo._bookmarks[changeid] 426 try:
434 self._rev = repo.changelog.rev(self._node) 427 self._node = bin(changeid)
435 return 428 self._rev = repo.changelog.rev(self._node)
436 if changeid in repo._tagscache.tags: 429 return
437 self._node = repo._tagscache.tags[changeid] 430 except (TypeError, LookupError):
438 self._rev = repo.changelog.rev(self._node) 431 pass
439 return 432
440 try: 433 if changeid in repo._bookmarks:
441 self._node = repo.branchtip(changeid) 434 self._node = repo._bookmarks[changeid]
442 self._rev = repo.changelog.rev(self._node) 435 self._rev = repo.changelog.rev(self._node)
443 return 436 return
444 except error.RepoLookupError: 437 if changeid in repo._tagscache.tags:
445 pass 438 self._node = repo._tagscache.tags[changeid]
446 439 self._rev = repo.changelog.rev(self._node)
447 self._node = repo.changelog._partialmatch(changeid) 440 return
448 if self._node is not None: 441 try:
449 self._rev = repo.changelog.rev(self._node) 442 self._node = repo.branchtip(changeid)
450 return 443 self._rev = repo.changelog.rev(self._node)
451 444 return
452 # lookup failed 445 except error.RepoLookupError:
453 # check if it might have come from damaged dirstate 446 pass
454 # 447
455 # XXX we could avoid the unfiltered if we had a recognizable exception 448 self._node = repo.changelog._partialmatch(changeid)
456 # for filtered changeset access 449 if self._node is not None:
457 if changeid in repo.unfiltered().dirstate.parents(): 450 self._rev = repo.changelog.rev(self._node)
458 raise error.Abort(_("working directory has unknown parent '%s'!") 451 return
459 % short(changeid)) 452
460 try: 453 # lookup failed
461 if len(changeid) == 20: 454 # check if it might have come from damaged dirstate
462 changeid = hex(changeid) 455 #
463 except TypeError: 456 # XXX we could avoid the unfiltered if we had a recognizable
464 pass 457 # exception for filtered changeset access
458 if changeid in repo.unfiltered().dirstate.parents():
459 msg = _("working directory has unknown parent '%s'!")
460 raise error.Abort(msg % short(changeid))
461 try:
462 if len(changeid) == 20:
463 changeid = hex(changeid)
464 except TypeError:
465 pass
466 except Exception:
467 raise
465 raise error.RepoLookupError( 468 raise error.RepoLookupError(
466 _("unknown revision '%s'") % changeid) 469 _("unknown revision '%s'") % changeid)
467 470
468 def __hash__(self): 471 def __hash__(self):
469 try: 472 try: