2005-08-28 01:21:25 +04:00
|
|
|
# filelog.py - file history class for mercurial
|
|
|
|
#
|
2007-06-19 10:51:34 +04:00
|
|
|
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
|
2005-08-28 01:21:25 +04:00
|
|
|
#
|
2009-04-26 03:08:54 +04:00
|
|
|
# This software may be used and distributed according to the terms of the
|
2010-01-20 07:20:08 +03:00
|
|
|
# GNU General Public License version 2 or any later version.
|
2005-08-28 01:21:25 +04:00
|
|
|
|
2009-01-12 07:55:36 +03:00
|
|
|
import revlog
|
2005-08-28 01:21:25 +04:00
|
|
|
|
2009-01-12 07:55:36 +03:00
|
|
|
class filelog(revlog.revlog):
|
2007-03-23 03:52:38 +03:00
|
|
|
def __init__(self, opener, path):
|
2009-01-12 07:55:36 +03:00
|
|
|
revlog.revlog.__init__(self, opener,
|
2009-05-20 20:35:47 +04:00
|
|
|
"/".join(("data", path + ".i")))
|
2005-08-28 01:21:25 +04:00
|
|
|
|
|
|
|
def read(self, node):
|
|
|
|
t = self.revision(node)
|
|
|
|
if not t.startswith('\1\n'):
|
|
|
|
return t
|
2006-07-09 03:30:30 +04:00
|
|
|
s = t.index('\1\n', 2)
|
2005-08-28 01:21:25 +04:00
|
|
|
return t[s+2:]
|
|
|
|
|
2006-09-18 07:38:06 +04:00
|
|
|
def _readmeta(self, node):
|
2005-08-28 01:21:25 +04:00
|
|
|
t = self.revision(node)
|
|
|
|
if not t.startswith('\1\n'):
|
2005-08-28 07:58:53 +04:00
|
|
|
return {}
|
2006-07-09 03:30:30 +04:00
|
|
|
s = t.index('\1\n', 2)
|
2005-08-28 01:21:25 +04:00
|
|
|
mt = t[2:s]
|
2005-08-28 07:58:53 +04:00
|
|
|
m = {}
|
2005-08-28 01:21:25 +04:00
|
|
|
for l in mt.splitlines():
|
|
|
|
k, v = l.split(": ", 1)
|
|
|
|
m[k] = v
|
|
|
|
return m
|
|
|
|
|
|
|
|
def add(self, text, meta, transaction, link, p1=None, p2=None):
|
|
|
|
if meta or text.startswith('\1\n'):
|
|
|
|
mt = ""
|
|
|
|
if meta:
|
2009-01-12 11:16:03 +03:00
|
|
|
mt = ["%s: %s\n" % (k, v) for k, v in meta.iteritems()]
|
2005-11-14 03:30:19 +03:00
|
|
|
text = "\1\n%s\1\n%s" % ("".join(mt), text)
|
2005-08-28 01:21:25 +04:00
|
|
|
return self.addrevision(text, transaction, link, p1, p2)
|
|
|
|
|
2005-08-28 07:58:53 +04:00
|
|
|
def renamed(self, node):
|
2009-01-12 07:55:36 +03:00
|
|
|
if self.parents(node)[0] != revlog.nullid:
|
2005-08-28 07:58:53 +04:00
|
|
|
return False
|
2006-09-18 07:38:06 +04:00
|
|
|
m = self._readmeta(node)
|
2008-01-20 16:39:25 +03:00
|
|
|
if m and "copy" in m:
|
2009-01-12 07:55:36 +03:00
|
|
|
return (m["copy"], revlog.bin(m["copyrev"]))
|
2005-08-28 07:58:53 +04:00
|
|
|
return False
|
|
|
|
|
2006-08-16 07:46:35 +04:00
|
|
|
def size(self, rev):
|
|
|
|
"""return the size of a given revision"""
|
|
|
|
|
|
|
|
# for revisions with renames, we have to go the slow way
|
|
|
|
node = self.node(rev)
|
|
|
|
if self.renamed(node):
|
|
|
|
return len(self.read(node))
|
|
|
|
|
2009-01-12 07:55:36 +03:00
|
|
|
return revlog.revlog.size(self, rev)
|
2006-08-16 07:46:35 +04:00
|
|
|
|
2006-08-15 00:07:00 +04:00
|
|
|
def cmp(self, node, text):
|
|
|
|
"""compare text with a given file revision"""
|
|
|
|
|
|
|
|
# for renames, we have to go the slow way
|
|
|
|
if self.renamed(node):
|
|
|
|
t2 = self.read(node)
|
2006-08-16 01:28:00 +04:00
|
|
|
return t2 != text
|
2006-08-15 00:07:00 +04:00
|
|
|
|
2009-01-12 07:55:36 +03:00
|
|
|
return revlog.revlog.cmp(self, node, text)
|