# HG changeset patch # User Mads Kiilerich # Date 1361924798 -3600 # Node ID 6354556781ef097b12630abd808c5f52800732e0 # Parent 4e9f00ddde4a3a0e7bd5c13c3b93159a7aa785e7 update unionrepo for Mercurial 2.5.1 diff -r 4e9f00ddde4a -r 6354556781ef rhodecode/lib/unionrepo.py --- a/rhodecode/lib/unionrepo.py Tue Feb 26 13:36:38 2013 +0100 +++ b/rhodecode/lib/unionrepo.py Wed Feb 27 01:26:38 2013 +0100 @@ -1,17 +1,20 @@ -# unionrepo.py - repository class for viewing union of repositories +# unionrepo.py - repository class for viewing union of repository changesets # -# Derived from Mercurial 2.5 bundlerepo.py +# Derived from bundlerepo.py # Copyright 2006, 2007 Benoit Boissinot # Copyright 2013 Unity Technologies, Mads Kiilerich # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -"""Repository class for in-memory pull of one local repository to another. +"""Repository class for "in-memory pull" of one local repository to another, +allowing operations like diff and log with revsets. """ +import os from mercurial.node import nullid -from mercurial import util, mdiff +from mercurial.i18n import _ +from mercurial import util, mdiff, cmdutil, scmutil from mercurial import localrepo, changelog, manifest, filelog, revlog class unionrevlog(revlog.revlog): @@ -20,15 +23,14 @@ # To retrieve a revision, we just need to know the node id so we can # look it up in revlog2. # - # basemap is indexed with revisions coming from the second revlog. - # # To differentiate a rev in the second revlog from a rev in the revlog, - # we check revision against basemap. + # we check revision against repotiprev. + opener = scmutil.readonlyvfs(opener) revlog.revlog.__init__(self, opener, indexfile) self.revlog2 = revlog2 - self.basemap = {} # mapping rev that is in revlog2 to ... nothing n = len(self) + self.repotiprev = n - 1 self.bundlerevs = set() # used by 'bundle()' revset expression for rev2 in self.revlog2: rev = self.revlog2.index[rev2] @@ -42,7 +44,7 @@ link = linkmapper(linkrev) if node in self.nodemap: - # this happens for for the common revlog revisions + # this happens for the common revlog revisions self.bundlerevs.add(self.nodemap[node]) continue @@ -51,24 +53,23 @@ e = (None, None, None, None, link, self.rev(p1node), self.rev(p2node), node) - self.basemap[n] = None self.index.insert(-1, e) self.nodemap[node] = n self.bundlerevs.add(n) n += 1 def _chunk(self, rev): - if rev not in self.basemap: + if rev <= self.repotiprev: return revlog.revlog._chunk(self, rev) return self.revlog2._chunk(self.node(rev)) def revdiff(self, rev1, rev2): """return or calculate a delta between two revisions""" - if rev1 in self.basemap and rev2 in self.basemap: + if rev1 > self.repotiprev and rev2 > self.repotiprev: return self.revlog2.revdiff( self.revlog2.rev(self.node(rev1)), self.revlog2.rev(self.node(rev2))) - elif rev1 not in self.basemap and rev2 not in self.basemap: + elif rev1 <= self.repotiprev and rev2 <= self.repotiprev: return revlog.revlog.revdiff(self, rev1, rev2) return mdiff.textdiff(self.revision(self.node(rev1)), @@ -88,7 +89,7 @@ if node == nullid: return "" - if rev in self.basemap: + if rev > self.repotiprev: text = self.revlog2.revision(node) self._cache = (node, rev, text) else: @@ -144,7 +145,7 @@ util.expandpath(path2)) self.repo2 = localrepo.localrepository(ui, path2) - @util.propertycache + @localrepo.unfilteredpropertycache def changelog(self): return unionchangelog(self.sopener, self.repo2.sopener) @@ -153,7 +154,7 @@ node = self.repo2.changelog.node(rev2) return self.changelog.rev(node) - @util.propertycache + @localrepo.unfilteredpropertycache def manifest(self): return unionmanifest(self.sopener, self.repo2.sopener, self._clrev) @@ -174,8 +175,34 @@ def peer(self): return unionpeer(self) + def getcwd(self): + return os.getcwd() # always outside the repo + def instance(ui, path, create): - u = util.url(path) - assert u.scheme == 'union' - repopath, repopath2 = u.path.split("+", 1) + if create: + raise util.Abort(_('cannot create new union repository')) + parentpath = ui.config("bundle", "mainreporoot", "") + if not parentpath: + # try to find the correct path to the working directory repo + parentpath = cmdutil.findrepo(os.getcwd()) + if parentpath is None: + parentpath = '' + if parentpath: + # Try to make the full path relative so we get a nice, short URL. + # In particular, we don't want temp dir names in test outputs. + cwd = os.getcwd() + if parentpath == cwd: + parentpath = '' + else: + cwd = os.path.join(cwd,'') + if parentpath.startswith(cwd): + parentpath = parentpath[len(cwd):] + if path.startswith('union:'): + s = path.split(":", 1)[1].split("+", 1) + if len(s) == 1: + repopath, repopath2 = parentpath, s[0] + else: + repopath, repopath2 = s + else: + repopath, repopath2 = parentpath, path return unionrepository(ui, repopath, repopath2)