eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/filelog.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 # filelog.py - file history class for mercurial
       
     2 #
       
     3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 import revlog
       
     9 
       
    10 class filelog(revlog.revlog):
       
    11     def __init__(self, opener, path):
       
    12         revlog.revlog.__init__(self, opener,
       
    13                         "/".join(("data", path + ".i")))
       
    14 
       
    15     def read(self, node):
       
    16         t = self.revision(node)
       
    17         if not t.startswith('\1\n'):
       
    18             return t
       
    19         s = t.index('\1\n', 2)
       
    20         return t[s + 2:]
       
    21 
       
    22     def _readmeta(self, node):
       
    23         t = self.revision(node)
       
    24         if not t.startswith('\1\n'):
       
    25             return {}
       
    26         s = t.index('\1\n', 2)
       
    27         mt = t[2:s]
       
    28         m = {}
       
    29         for l in mt.splitlines():
       
    30             k, v = l.split(": ", 1)
       
    31             m[k] = v
       
    32         return m
       
    33 
       
    34     def add(self, text, meta, transaction, link, p1=None, p2=None):
       
    35         if meta or text.startswith('\1\n'):
       
    36             mt = ["%s: %s\n" % (k, v) for k, v in sorted(meta.iteritems())]
       
    37             text = "\1\n%s\1\n%s" % ("".join(mt), text)
       
    38         return self.addrevision(text, transaction, link, p1, p2)
       
    39 
       
    40     def renamed(self, node):
       
    41         if self.parents(node)[0] != revlog.nullid:
       
    42             return False
       
    43         m = self._readmeta(node)
       
    44         if m and "copy" in m:
       
    45             return (m["copy"], revlog.bin(m["copyrev"]))
       
    46         return False
       
    47 
       
    48     def size(self, rev):
       
    49         """return the size of a given revision"""
       
    50 
       
    51         # for revisions with renames, we have to go the slow way
       
    52         node = self.node(rev)
       
    53         if self.renamed(node):
       
    54             return len(self.read(node))
       
    55 
       
    56         # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
       
    57         return revlog.revlog.size(self, rev)
       
    58 
       
    59     def cmp(self, node, text):
       
    60         """compare text with a given file revision
       
    61 
       
    62         returns True if text is different than what is stored.
       
    63         """
       
    64 
       
    65         t = text
       
    66         if text.startswith('\1\n'):
       
    67             t = '\1\n\1\n' + text
       
    68 
       
    69         samehashes = not revlog.revlog.cmp(self, node, t)
       
    70         if samehashes:
       
    71             return False
       
    72 
       
    73         # renaming a file produces a different hash, even if the data
       
    74         # remains unchanged. Check if it's the case (slow):
       
    75         if self.renamed(node):
       
    76             t2 = self.read(node)
       
    77             return t2 != text
       
    78 
       
    79         return True