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: |