##// END OF EJS Templates
lfs: don't add extension to hgrc after clone or share (BC)...
lfs: don't add extension to hgrc after clone or share (BC) Now that repository loading in core supports automatically loading the lfs extension when the "lfs" requirement is present, we no longer need to update the .hg/hgrc of newly-created repos to load the lfs extension! I'm marking this as BC because it is a change in behavior. But users should not notice unless they create an LFS repo with new Mercurial and then attempt to use it with an old versions that doesn't support automatic extension loading. Differential Revision: https://phab.mercurial-scm.org/D4712

File last commit:

r39880:0cb3e02e default
r39889:bcf72d7b default
Show More
filelog.py
271 lines | 8.5 KiB | text/x-python | PythonLexer
mpm@selenic.com
Break apart hg.py...
r1089 # filelog.py - file history class for mercurial
#
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
mpm@selenic.com
Break apart hg.py...
r1089 #
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
mpm@selenic.com
Break apart hg.py...
r1089
Gregory Szorc
filelog: use absolute_import
r25948 from __future__ import absolute_import
from . import (
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 error,
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 repository,
Gregory Szorc
filelog: use absolute_import
r25948 revlog,
)
Gregory Szorc
interfaceutil: module to stub out zope.interface...
r37828 from .utils import (
interfaceutil,
)
mpm@selenic.com
Break apart hg.py...
r1089
Gregory Szorc
interfaceutil: module to stub out zope.interface...
r37828 @interfaceutil.implementer(repository.ifilestorage)
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 class filelog(object):
Matt Mackall
revlog: simplify revlog version handling...
r4258 def __init__(self, opener, path):
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 self._revlog = revlog.revlog(opener,
'/'.join(('data', path + '.i')),
censorable=True)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Full name of the user visible file, relative to the repository root.
# Used by LFS.
Matt Harbison
filelog: add the ability to report the user facing name...
r35583 self.filename = path
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by repo upgrade.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 self.index = self._revlog.index
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by changegroup generation.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 self._generaldelta = self._revlog._generaldelta
def __len__(self):
return len(self._revlog)
def __iter__(self):
return self._revlog.__iter__()
def revs(self, start=0, stop=None):
return self._revlog.revs(start=start, stop=stop)
def parents(self, node):
return self._revlog.parents(node)
def parentrevs(self, rev):
return self._revlog.parentrevs(rev)
def rev(self, node):
return self._revlog.rev(node)
def node(self, rev):
return self._revlog.node(rev)
def lookup(self, node):
return self._revlog.lookup(node)
def linkrev(self, rev):
return self._revlog.linkrev(rev)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by LFS, verify.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def flags(self, rev):
return self._revlog.flags(rev)
def commonancestorsheads(self, node1, node2):
return self._revlog.commonancestorsheads(node1, node2)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by dagop.blockdescendants().
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def descendants(self, revs):
return self._revlog.descendants(revs)
def heads(self, start=None, stop=None):
return self._revlog.heads(start, stop)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by hgweb, children extension.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def children(self, node):
return self._revlog.children(node)
def deltaparent(self, rev):
return self._revlog.deltaparent(rev)
def iscensored(self, rev):
return self._revlog.iscensored(rev)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by verify.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def rawsize(self, rev):
return self._revlog.rawsize(rev)
Gregory Szorc
filelog: record what's using attributes...
r39819 # Might be unused.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def checkhash(self, text, node, p1=None, p2=None, rev=None):
return self._revlog.checkhash(text, node, p1=p1, p2=p2, rev=rev)
def revision(self, node, _df=None, raw=False):
return self._revlog.revision(node, _df=_df, raw=raw)
def revdiff(self, rev1, rev2):
return self._revlog.revdiff(rev1, rev2)
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 def emitrevisiondeltas(self, requests):
return self._revlog.emitrevisiondeltas(requests)
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def addrevision(self, revisiondata, transaction, linkrev, p1, p2,
node=None, flags=revlog.REVIDX_DEFAULT_FLAGS,
cachedelta=None):
return self._revlog.addrevision(revisiondata, transaction, linkrev,
p1, p2, node=node, flags=flags,
cachedelta=cachedelta)
def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None):
return self._revlog.addgroup(deltas, linkmapper, transaction,
addrevisioncb=addrevisioncb)
def getstrippoint(self, minlink):
return self._revlog.getstrippoint(minlink)
def strip(self, minlink, transaction):
return self._revlog.strip(minlink, transaction)
Gregory Szorc
revlog: move censor logic out of censor extension...
r39814 def censorrevision(self, tr, node, tombstone=b''):
return self._revlog.censorrevision(node, tombstone=tombstone)
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def files(self):
return self._revlog.files()
mpm@selenic.com
Break apart hg.py...
r1089 def read(self, node):
t = self.revision(node)
if not t.startswith('\1\n'):
return t
Benoit Boissinot
use __contains__, index or split instead of str.find...
r2579 s = t.index('\1\n', 2)
Matt Mackall
many, many trivial check-code fixups
r10282 return t[s + 2:]
mpm@selenic.com
Break apart hg.py...
r1089
def add(self, text, meta, transaction, link, p1=None, p2=None):
if meta or text.startswith('\1\n'):
Gregory Szorc
revlog: move parsemeta() and packmeta() from filelog (API)...
r37460 text = revlog.packmeta(meta, text)
mpm@selenic.com
Break apart hg.py...
r1089 return self.addrevision(text, transaction, link, p1, p2)
mpm@selenic.com
Add some rename debugging support
r1116 def renamed(self, node):
Matt Mackall
revlog: kill from-style imports...
r7634 if self.parents(node)[0] != revlog.nullid:
mpm@selenic.com
Add some rename debugging support
r1116 return False
Matt Mackall
filelog: move metadata parsing to a helper function
r13240 t = self.revision(node)
Gregory Szorc
revlog: move parsemeta() and packmeta() from filelog (API)...
r37460 m = revlog.parsemeta(t)[0]
Gregory Szorc
filelog: don't crash on invalid copy metadata (issue5748)...
r37854 # copy and copyrev occur in pairs. In rare cases due to bugs,
# one can occur without the other.
if m and "copy" in m and "copyrev" in m:
Matt Mackall
revlog: kill from-style imports...
r7634 return (m["copy"], revlog.bin(m["copyrev"]))
mpm@selenic.com
Add some rename debugging support
r1116 return False
Matt Mackall
merge: use file size stored in revlog index...
r2898 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))
Mike Edgar
revlog: add "iscensored()" to revlog public API...
r24118 if self.iscensored(rev):
Mike Edgar
filelog: censored files compare against empty data, have 0 size...
r22597 return 0
Matt Mackall
merge: use file size stored in revlog index...
r2898
Nicolas Dumazet
filelog: test behaviour for data starting with "\1\n"...
r11540 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 return self._revlog.size(rev)
Matt Mackall
merge: use file size stored in revlog index...
r2898
Matt Mackall
filelog: add hash-based comparisons...
r2887 def cmp(self, node, text):
Nicolas Dumazet
cmp: document the fact that we return True if content is different...
r11539 """compare text with a given file revision
returns True if text is different than what is stored.
"""
Matt Mackall
filelog: add hash-based comparisons...
r2887
Nicolas Dumazet
filelog: cmp: don't read data if hashes are identical (issue2273)...
r11541 t = text
if text.startswith('\1\n'):
t = '\1\n\1\n' + text
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 samehashes = not self._revlog.cmp(node, t)
Nicolas Dumazet
filelog: cmp: don't read data if hashes are identical (issue2273)...
r11541 if samehashes:
return False
Mike Edgar
filelog: censored files compare against empty data, have 0 size...
r22597 # censored files compare against the empty file
Mike Edgar
revlog: add "iscensored()" to revlog public API...
r24118 if self.iscensored(self.rev(node)):
Mike Edgar
filelog: censored files compare against empty data, have 0 size...
r22597 return text != ''
Nicolas Dumazet
filelog: cmp: don't read data if hashes are identical (issue2273)...
r11541 # renaming a file produces a different hash, even if the data
# remains unchanged. Check if it's the case (slow):
if self.renamed(node):
Matt Mackall
filelog: add hash-based comparisons...
r2887 t2 = self.read(node)
Matt Mackall
filelog.cmp: return 0 for equality...
r2895 return t2 != text
Matt Mackall
filelog: add hash-based comparisons...
r2887
Nicolas Dumazet
filelog: cmp: don't read data if hashes are identical (issue2273)...
r11541 return True
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515
Gregory Szorc
verify: start to abstract file verification...
r39878 def verifyintegrity(self, state):
return self._revlog.verifyintegrity(state)
Gregory Szorc
filelog: record what's using attributes...
r39819 # TODO these aren't part of the interface and aren't internal methods.
# Callers should be fixed to not use them.
# Used by LFS.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 @property
def filename(self):
return self._revlog.filename
@filename.setter
def filename(self, value):
self._revlog.filename = value
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by bundlefilelog, unionfilelog.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 @property
def indexfile(self):
return self._revlog.indexfile
@indexfile.setter
def indexfile(self, value):
self._revlog.indexfile = value
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by LFS, repo upgrade.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 @property
def opener(self):
return self._revlog.opener
Gregory Szorc
filelog: record what's using attributes...
r39819 # Used by repo upgrade.
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 def clone(self, tr, destrevlog, **kwargs):
if not isinstance(destrevlog, filelog):
raise error.ProgrammingError('expected filelog to clone()')
return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
Gregory Szorc
filelog: custom filelog to be used with narrow repos...
r39801 class narrowfilelog(filelog):
"""Filelog variation to be used with narrow stores."""
def __init__(self, opener, path, narrowmatch):
super(narrowfilelog, self).__init__(opener, path)
self._narrowmatch = narrowmatch
def renamed(self, node):
res = super(narrowfilelog, self).renamed(node)
# Renames that come from outside the narrowspec are problematic
# because we may lack the base text for the rename. This can result
# in code attempting to walk the ancestry or compute a diff
# encountering a missing revision. We address this by silently
# removing rename metadata if the source file is outside the
# narrow spec.
#
# A better solution would be to see if the base revision is available,
# rather than assuming it isn't.
#
# An even better solution would be to teach all consumers of rename
# metadata that the base revision may not be available.
#
# TODO consider better ways of doing this.
if res and not self._narrowmatch(res[0]):
return None
return res
def size(self, rev):
# Because we have a custom renamed() that may lie, we need to call
# the base renamed() to report accurate results.
node = self.node(rev)
if super(narrowfilelog, self).renamed(node):
return len(self.read(node))
else:
return super(narrowfilelog, self).size(rev)
def cmp(self, node, text):
different = super(narrowfilelog, self).cmp(node, text)
# Because renamed() may lie, we may get false positives for
# different content. Check for this by comparing against the original
# renamed() implementation.
if different:
if super(narrowfilelog, self).renamed(node):
t2 = self.read(node)
return t2 != text
return different