mercurial/revlog.py
changeset 36 da28286bf6b7
parent 26 9cf83bf9ad38
child 41 df3f46253878
equal deleted inserted replaced
35:9197c26a414b 36:da28286bf6b7
     6 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     6 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     7 #
     7 #
     8 # This software may be used and distributed according to the terms
     8 # This software may be used and distributed according to the terms
     9 # of the GNU General Public License, incorporated herein by reference.
     9 # of the GNU General Public License, incorporated herein by reference.
    10 
    10 
    11 import zlib, struct, sha, os, tempfile
    11 import zlib, struct, sha, os, tempfile, binascii
    12 from mercurial import mdiff
    12 from mercurial import mdiff
       
    13 
       
    14 def hex(node): return binascii.hexlify(node)
       
    15 def bin(node): return binascii.unhexlify(node)
    13 
    16 
    14 def compress(text):
    17 def compress(text):
    15     return zlib.compress(text)
    18     return zlib.compress(text)
    16 
    19 
    17 def decompress(bin):
    20 def decompress(bin):
    30         self.indexfile = indexfile
    33         self.indexfile = indexfile
    31         self.datafile = datafile
    34         self.datafile = datafile
    32         self.index = []
    35         self.index = []
    33         self.opener = opener
    36         self.opener = opener
    34         self.cache = None
    37         self.cache = None
    35         self.nodemap = { -1: nullid, nullid: -1 }
    38         self.nodemap = {nullid: -1}
    36         # read the whole index for now, handle on-demand later
    39         # read the whole index for now, handle on-demand later
    37         try:
    40         try:
    38             n = 0
    41             n = 0
    39             i = self.opener(self.indexfile).read()
    42             i = self.opener(self.indexfile).read()
    40             s = struct.calcsize(indexformat)
    43             s = struct.calcsize(indexformat)
    58     def start(self, rev): return self.index[rev][0]
    61     def start(self, rev): return self.index[rev][0]
    59     def length(self, rev): return self.index[rev][1]
    62     def length(self, rev): return self.index[rev][1]
    60     def end(self, rev): return self.start(rev) + self.length(rev)
    63     def end(self, rev): return self.start(rev) + self.length(rev)
    61     def base(self, rev): return self.index[rev][2]
    64     def base(self, rev): return self.index[rev][2]
    62 
    65 
       
    66     def lookup(self, id):
       
    67         try:
       
    68             rev = int(id)
       
    69             return self.node(rev)
       
    70         except ValueError:
       
    71             c = []
       
    72             for n in self.nodemap:
       
    73                 if id in hex(n):
       
    74                     c.append(n)
       
    75             if len(c) > 1: raise KeyError("Ambiguous identifier")
       
    76             if len(c) < 1: raise KeyError
       
    77             return c[0]
       
    78                 
       
    79         return None
       
    80 
    63     def revisions(self, list):
    81     def revisions(self, list):
    64         # this can be optimized to do spans, etc
    82         # this can be optimized to do spans, etc
    65         # be stupid for now
    83         # be stupid for now
    66         for node in list:
    84         for node in list:
    67             yield self.revision(node)
    85             yield self.revision(node)
    71 
    89 
    72     def patch(self, text, patch):
    90     def patch(self, text, patch):
    73         return mdiff.patch(text, patch)
    91         return mdiff.patch(text, patch)
    74 
    92 
    75     def revision(self, node):
    93     def revision(self, node):
    76         if node is nullid: return ""
    94         if node == nullid: return ""
    77         if self.cache and self.cache[0] == node: return self.cache[2]
    95         if self.cache and self.cache[0] == node: return self.cache[2]
    78 
    96 
    79         text = None
    97         text = None
    80         rev = self.rev(node)
    98         rev = self.rev(node)
    81         base = self.base(rev)
    99         base = self.base(rev)