Mercurial > public > mercurial-scm > hg
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: |