mercurial/revlog.py
changeset 32684 af854b1b36f8
parent 32659 7b17f9de6d3e
child 32697 19b9fc40cc51
equal deleted inserted replaced
32683:9f840d99054c 32684:af854b1b36f8
    24 from .node import (
    24 from .node import (
    25     bin,
    25     bin,
    26     hex,
    26     hex,
    27     nullid,
    27     nullid,
    28     nullrev,
    28     nullrev,
       
    29     wdirhex,
    29     wdirid,
    30     wdirid,
    30     wdirrev,
    31     wdirrev,
    31 )
    32 )
    32 from .i18n import _
    33 from .i18n import _
    33 from . import (
    34 from . import (
  1036                 return node
  1037                 return node
  1037             except (TypeError, LookupError):
  1038             except (TypeError, LookupError):
  1038                 pass
  1039                 pass
  1039 
  1040 
  1040     def _partialmatch(self, id):
  1041     def _partialmatch(self, id):
       
  1042         maybewdir = wdirhex.startswith(id)
  1041         try:
  1043         try:
  1042             partial = self.index.partialmatch(id)
  1044             partial = self.index.partialmatch(id)
  1043             if partial and self.hasnode(partial):
  1045             if partial and self.hasnode(partial):
       
  1046                 if maybewdir:
       
  1047                     # single 'ff...' match in radix tree, ambiguous with wdir
       
  1048                     raise RevlogError
  1044                 return partial
  1049                 return partial
       
  1050             if maybewdir:
       
  1051                 # no 'ff...' match in radix tree, wdir identified
       
  1052                 raise error.WdirUnsupported
  1045             return None
  1053             return None
  1046         except RevlogError:
  1054         except RevlogError:
  1047             # parsers.c radix tree lookup gave multiple matches
  1055             # parsers.c radix tree lookup gave multiple matches
  1048             # fast path: for unfiltered changelog, radix tree is accurate
  1056             # fast path: for unfiltered changelog, radix tree is accurate
  1049             if not getattr(self, 'filteredrevs', None):
  1057             if not getattr(self, 'filteredrevs', None):
  1064                 prefix = bin(id[:l * 2])
  1072                 prefix = bin(id[:l * 2])
  1065                 nl = [e[7] for e in self.index if e[7].startswith(prefix)]
  1073                 nl = [e[7] for e in self.index if e[7].startswith(prefix)]
  1066                 nl = [n for n in nl if hex(n).startswith(id) and
  1074                 nl = [n for n in nl if hex(n).startswith(id) and
  1067                       self.hasnode(n)]
  1075                       self.hasnode(n)]
  1068                 if len(nl) > 0:
  1076                 if len(nl) > 0:
  1069                     if len(nl) == 1:
  1077                     if len(nl) == 1 and not maybewdir:
  1070                         self._pcache[id] = nl[0]
  1078                         self._pcache[id] = nl[0]
  1071                         return nl[0]
  1079                         return nl[0]
  1072                     raise LookupError(id, self.indexfile,
  1080                     raise LookupError(id, self.indexfile,
  1073                                       _('ambiguous identifier'))
  1081                                       _('ambiguous identifier'))
       
  1082                 if maybewdir:
       
  1083                     raise error.WdirUnsupported
  1074                 return None
  1084                 return None
  1075             except TypeError:
  1085             except TypeError:
  1076                 pass
  1086                 pass
  1077 
  1087 
  1078     def lookup(self, id):
  1088     def lookup(self, id):