mercurial/context.py
changeset 23012 bdb3349cf7ab
parent 22942 03602f76deee
child 23013 b50ed6b9b513
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: