diff -r 57875cf423c9 -r 2372284d9457 mercurial/unionrepo.py --- a/mercurial/unionrepo.py Sat Oct 05 10:29:34 2019 -0400 +++ b/mercurial/unionrepo.py Sun Oct 06 09:45:02 2019 -0400 @@ -30,6 +30,7 @@ vfs as vfsmod, ) + class unionrevlog(revlog.revlog): def __init__(self, opener, indexfile, revlog2, linkmapper): # How it works: @@ -44,20 +45,20 @@ 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 flags = _start & 0xFFFF - 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 linkmapper is not None: # link is to same revlog + if linkmapper is not None: # link is to same revlog base = linkmapper(base) if node in self.nodemap: @@ -70,8 +71,16 @@ # TODO: it's probably wrong to set compressed length to None, but # I have no idea if csize is valid in the base revlog context. - e = (flags, None, rsize, base, - link, self.rev(p1node), self.rev(p2node), node) + e = ( + flags, + None, + rsize, + base, + link, + self.rev(p1node), + self.rev(p2node), + node, + ) self.index.append(e) self.nodemap[node] = n self.bundlerevs.add(n) @@ -87,7 +96,8 @@ if rev1 > self.repotiprev and rev2 > self.repotiprev: return self.revlog2.revdiff( self.revlog2.rev(self.node(rev1)), - self.revlog2.rev(self.node(rev2))) + self.revlog2.rev(self.node(rev2)), + ) elif rev1 <= self.repotiprev and rev2 <= self.repotiprev: return super(unionrevlog, self).revdiff(rev1, rev2) @@ -111,35 +121,50 @@ def addrevision(self, text, transaction, link, p1=None, p2=None, d=None): raise NotImplementedError - def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None, - maybemissingparents=False): + + def addgroup( + self, + deltas, + linkmapper, + transaction, + addrevisioncb=None, + maybemissingparents=False, + ): raise NotImplementedError + def strip(self, minlink, transaction): 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) + unionrevlog.__init__( + self, opener, self.indexfile, changelog2, linkmapper + ) + class unionmanifest(unionrevlog, manifest.manifestrevlog): def __init__(self, opener, opener2, linkmapper): manifest.manifestrevlog.__init__(self, opener) manifest2 = manifest.manifestrevlog(opener2) - unionrevlog.__init__(self, opener, self.indexfile, manifest2, - linkmapper) + unionrevlog.__init__( + self, opener, self.indexfile, manifest2, linkmapper + ) + class unionfilelog(filelog.filelog): def __init__(self, opener, path, opener2, linkmapper, repo): filelog.filelog.__init__(self, opener, path) filelog2 = filelog.filelog(opener2, path) - self._revlog = unionrevlog(opener, self.indexfile, - filelog2._revlog, linkmapper) + self._revlog = unionrevlog( + opener, self.indexfile, filelog2._revlog, linkmapper + ) self._repo = repo self.repotiprev = self._revlog.repotiprev self.revlog2 = self._revlog.revlog2 @@ -151,16 +176,19 @@ node = self.node(rev) return self.revlog2.iscensored(self.revlog2.rev(node)) + class unionpeer(localrepo.localpeer): def canpush(self): return False + class unionrepository(object): """Represents the union of data in 2 repositories. Instances are not usable if constructed directly. Use ``instance()`` or ``makeunionrepository()`` to create a usable instance. """ + def __init__(self, repo2, url): self.repo2 = repo2 self._url = url @@ -173,10 +201,12 @@ @localrepo.unfilteredpropertycache def manifestlog(self): - rootstore = unionmanifest(self.svfs, self.repo2.svfs, - self.unfiltered()._clrev) - return manifest.manifestlog(self.svfs, self, rootstore, - self.narrowmatch()) + rootstore = unionmanifest( + self.svfs, self.repo2.svfs, self.unfiltered()._clrev + ) + return manifest.manifestlog( + self.svfs, self, rootstore, self.narrowmatch() + ) def _clrev(self, rev2): """map from repo2 changelog rev to temporary rev in self.changelog""" @@ -187,8 +217,9 @@ return self._url def file(self, f): - return unionfilelog(self.svfs, f, self.repo2.svfs, - self.unfiltered()._clrev, self) + return unionfilelog( + self.svfs, f, self.repo2.svfs, self.unfiltered()._clrev, self + ) def close(self): self.repo2.close() @@ -200,7 +231,8 @@ return unionpeer(self) def getcwd(self): - return encoding.getcwd() # always outside the repo + return encoding.getcwd() # always outside the repo + def instance(ui, path, create, intents=None, createopts=None): if create: @@ -220,7 +252,7 @@ else: cwd = pathutil.normasprefix(cwd) if parentpath.startswith(cwd): - parentpath = parentpath[len(cwd):] + parentpath = parentpath[len(cwd) :] if path.startswith('union:'): s = path.split(":", 1)[1].split("+", 1) if len(s) == 1: @@ -232,13 +264,16 @@ return makeunionrepository(ui, repopath, repopath2) + def makeunionrepository(ui, repopath1, repopath2): """Make a union repository object from 2 local repo paths.""" repo1 = localrepo.instance(ui, repopath1, create=False) repo2 = localrepo.instance(ui, repopath2, create=False) - url = 'union:%s+%s' % (util.expandpath(repopath1), - util.expandpath(repopath2)) + url = 'union:%s+%s' % ( + util.expandpath(repopath1), + util.expandpath(repopath2), + ) class derivedunionrepository(unionrepository, repo1.__class__): pass