diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -7,10 +7,10 @@ from node import hex, nullid, nullrev, short from i18n import _ -import os, sys, errno, re, glob, tempfile +import os, sys, errno, re, tempfile import util, scmutil, templater, patch, error, templatekw, wdutil import match as matchmod -import similar, revset, subrepo +import revset, subrepo expandpats = wdutil.expandpats match = wdutil.match diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -21,7 +21,7 @@ propertycache = util.propertycache class localrepository(repo.repository): capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey', 'known', 'getbundle')) - supportedformats = set(('revlogv1',)) + supportedformats = set(('revlogv1', 'generaldelta')) supported = supportedformats | set(('store', 'fncache', 'shared', 'dotencode')) @@ -61,6 +61,8 @@ class localrepository(repo.repository): '\0\0\0\2' # represents revlogv2 ' dummy changelog to prevent using the old repo layout' ) + if self.ui.configbool('format', 'generaldelta', False): + requirements.append("generaldelta") else: raise error.RepoError(_("repository %s not found") % path) elif create: @@ -115,6 +117,8 @@ class localrepository(repo.repository): def _applyrequirements(self, requirements): self.requirements = requirements self.sopener.options = {} + if 'generaldelta' in requirements: + self.sopener.options['generaldelta'] = 1 def _writerequirements(self): reqfile = self.opener("requires", "w") @@ -700,7 +704,7 @@ class localrepository(repo.repository): if os.path.exists(bkname): util.copyfile(bkname, self.join('journal.bookmarks')) else: - self.opener('journal.bookmarks', 'w').write('') + self.opener.write('journal.bookmarks', '') return (self.sjoin('journal'), self.join('journal.dirstate'), self.join('journal.branch'), self.join('journal.desc'), diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -226,10 +226,13 @@ class revlog(object): self._nodepos = None v = REVLOG_DEFAULT_VERSION - if hasattr(opener, 'options') and 'defversion' in opener.options: - v = opener.options['defversion'] - if v & REVLOGNG: - v |= REVLOGNGINLINEDATA + if hasattr(opener, 'options'): + if 'defversion' in opener.options: + v = opener.options['defversion'] + if v & REVLOGNG: + v |= REVLOGNGINLINEDATA + if v & REVLOGNG and 'generaldelta' in opener.options: + v |= REVLOGGENERALDELTA i = '' try: @@ -1003,10 +1006,14 @@ class revlog(object): l = len(data[1]) + len(data[0]) basecache = self._basecache if basecache and basecache[0] == rev: - base = basecache[1] + chainbase = basecache[1] else: - base = self.chainbase(rev) - dist = l + offset - self.start(base) + chainbase = self.chainbase(rev) + dist = l + offset - self.start(chainbase) + if self._generaldelta: + base = rev + else: + base = chainbase return dist, l, data, base curr = len(self) @@ -1019,7 +1026,10 @@ class revlog(object): # should we try to build a delta? if prev != nullrev: - d = builddelta(prev) + if self._generaldelta: + d = builddelta(p1r) + else: + d = builddelta(prev) dist, l, data, base = d # full versions are inserted when the needed deltas