Changeset - f3283898d431
[Not reviewed]
beta
0 1 0
Marcin Kuzminski - 13 years ago 2013-03-24 19:53:09
marcin@python-works.com
pep8 unionrepo
1 file changed with 16 insertions and 6 deletions:
0 comments (0 inline, 0 general)
rhodecode/lib/unionrepo.py
Show inline comments
 
@@ -8,48 +8,49 @@
 
# GNU General Public License version 2 or any later version.
 

	
 
"""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.i18n import _
 
from mercurial import util, mdiff, cmdutil, scmutil
 
from mercurial import localrepo, changelog, manifest, filelog, revlog
 

	
 

	
 
class unionrevlog(revlog.revlog):
 
    def __init__(self, opener, indexfile, revlog2, linkmapper):
 
        # How it works:
 
        # To retrieve a revision, we just need to know the node id so we can
 
        # look it up in revlog2.
 
        #
 
        # To differentiate a rev in the second revlog from a rev in the revlog,
 
        # we check revision against repotiprev.
 
        opener = scmutil.readonlyvfs(opener)
 
        revlog.revlog.__init__(self, opener, indexfile)
 
        self.revlog2 = revlog2
 

	
 
        n = len(self)
 
        self.repotiprev = n - 1
 
        self.bundlerevs = set() # used by 'bundle()' revset expression
 
        self.bundlerevs = set()  # used by 'bundle()' revset expression
 
        for rev2 in self.revlog2:
 
            rev = self.revlog2.index[rev2]
 
            # rev numbers - in revlog2, very different from self.rev
 
            _start, _csize, _rsize, _base, linkrev, p1rev, p2rev, node = rev
 

	
 
            if linkmapper is None: # link is to same revlog
 
                assert linkrev == rev2 # we never link back
 
            if linkmapper is None:  # link is to same revlog
 
                assert linkrev == rev2  # we never link back
 
                link = n
 
            else: # rev must be mapped from repo2 cl to unified cl by linkmapper
 
            else:  # rev must be mapped from repo2 cl to unified cl by linkmapper
 
                link = linkmapper(linkrev)
 

	
 
            if node in self.nodemap:
 
                # this happens for the common revlog revisions
 
                self.bundlerevs.add(self.nodemap[node])
 
                continue
 

	
 
            p1node = self.revlog2.node(p1rev)
 
            p2node = self.revlog2.node(p2rev)
 

	
 
            e = (None, None, None, None,
 
                 link, self.rev(p1node), self.rev(p2node), node)
 
@@ -90,61 +91,69 @@ class unionrevlog(revlog.revlog):
 
            return ""
 

	
 
        if rev > self.repotiprev:
 
            text = self.revlog2.revision(node)
 
            self._cache = (node, rev, text)
 
        else:
 
            text = revlog.revlog.revision(self, rev)
 
            # already cached
 
        return text
 

	
 
    def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
 
        raise NotImplementedError
 

	
 
    def addgroup(self, revs, linkmapper, transaction):
 
        raise NotImplementedError
 

	
 
    def strip(self, rev, minlink):
 
        raise NotImplementedError
 

	
 
    def checksize(self):
 
        raise NotImplementedError
 

	
 

	
 
class unionchangelog(unionrevlog, changelog.changelog):
 
    def __init__(self, opener, opener2):
 
        changelog.changelog.__init__(self, opener)
 
        linkmapper = None
 
        changelog2 = changelog.changelog(opener2)
 
        unionrevlog.__init__(self, opener, self.indexfile, changelog2,
 
                             linkmapper)
 

	
 

	
 
class unionmanifest(unionrevlog, manifest.manifest):
 
    def __init__(self, opener, opener2, linkmapper):
 
        manifest.manifest.__init__(self, opener)
 
        manifest2 = manifest.manifest(opener2)
 
        unionrevlog.__init__(self, opener, self.indexfile, manifest2,
 
                             linkmapper)
 

	
 

	
 
class unionfilelog(unionrevlog, filelog.filelog):
 
    def __init__(self, opener, path, opener2, linkmapper, repo):
 
        filelog.filelog.__init__(self, opener, path)
 
        filelog2 = filelog.filelog(opener2, path)
 
        unionrevlog.__init__(self, opener, self.indexfile, filelog2,
 
                             linkmapper)
 
        self._repo = repo
 

	
 
    def _file(self, f):
 
        self._repo.file(f)
 

	
 

	
 
class unionpeer(localrepo.localpeer):
 
    def canpush(self):
 
        return False
 

	
 

	
 
class unionrepository(localrepo.localrepository):
 
    def __init__(self, ui, path, path2):
 
        localrepo.localrepository.__init__(self, ui, path)
 
        self.ui.setconfig('phases', 'publish', False)
 

	
 
        self._url = 'union:%s+%s' % (util.expandpath(path),
 
                                     util.expandpath(path2))
 
        self.repo2 = localrepo.localrepository(ui, path2)
 

	
 
    @localrepo.unfilteredpropertycache
 
    def changelog(self):
 
        return unionchangelog(self.sopener, self.repo2.sopener)
 
@@ -167,42 +176,43 @@ class unionrepository(localrepo.localrep
 
                            self._clrev, self)
 

	
 
    def close(self):
 
        self.repo2.close()
 

	
 
    def cancopy(self):
 
        return False
 

	
 
    def peer(self):
 
        return unionpeer(self)
 

	
 
    def getcwd(self):
 
        return os.getcwd() # always outside the repo
 
        return os.getcwd()  # always outside the repo
 

	
 

	
 
def instance(ui, path, create):
 
    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,'')
 
            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)
0 comments (0 inline, 0 general)