Changeset - 75f746df73e2
[Not reviewed]
default
0 2 0
Manuel Jacob - 7 years ago 2019-02-18 21:17:58
me@manueljacob.de
hg: improve implementations of `successors` and `precursors` properties of Mercurial changesets

* On Mercurial versions supporting it, make the properties return the closest changesets in the obsolescence chain that are in the repository.
* On older Mercurial versions, fall back to the previous implementations.
2 files changed with 17 insertions and 13 deletions:
0 comments (0 inline, 0 general)
kallithea/lib/vcs/backends/hg/changeset.py
Show inline comments
 
@@ -86,36 +86,40 @@ class MercurialChangeset(BaseChangeset):
 
        else:
 
            return ''
 

	
 
    @LazyProperty
 
    def successors(self):
 
        try:
 
            # This works starting from Mercurial 4.3: the function `successorssets` was moved to the mercurial.obsutil module and gained the `closest` parameter.
 
            from mercurial import obsutil
 
            successors = obsutil.successorssets(self._ctx._repo, self._ctx.node())
 
        except ImportError:  # moved in Mercurial 4.3 (4f49810a1011)
 
            successors = obsutil.successorssets(self._ctx._repo, self._ctx.node(), closest=True)
 
        except ImportError:
 
            # fallback for older versions
 
            successors = obsolete.successorssets(self._ctx._repo, self._ctx.node())
 
        if successors:
 
            # flatten the list here handles both divergent (len > 1)
 
            # and the usual case (len = 1)
 
            successors = [hex(n)[:12] for sub in successors for n in sub if n != self._ctx.node()]
 

	
 
        return successors
 

	
 
    @LazyProperty
 
    def predecessors(self):
 
        predecessors = set()
 
        nm = self._ctx._repo.changelog.nodemap
 
        try:
 
            raw_predecessors = self._ctx._repo.obsstore.predecessors
 
        except AttributeError:  # renamed in Mercurial 4.4 (d5acd967f95a)
 
            raw_predecessors = self._ctx._repo.obsstore.precursors
 
        for p in raw_predecessors.get(self._ctx.node(), ()):
 
            pr = nm.get(p[0])
 
            if pr is not None:
 
                predecessors.add(hex(p[0])[:12])
 
        return predecessors
 
            # This works starting from Mercurial 4.3: the function `closestpredecessors` was added.
 
            from mercurial import obsutil
 
            return [hex(n)[:12] for n in obsutil.closestpredecessors(self._ctx._repo, self._ctx.node())]
 
        except ImportError:
 
            # fallback for older versions
 
            predecessors = set()
 
            nm = self._ctx._repo.changelog.nodemap
 
            for p in self._ctx._repo.obsstore.precursors.get(self._ctx.node(), ()):
 
                pr = nm.get(p[0])
 
                if pr is not None:
 
                    predecessors.add(hex(p[0])[:12])
 
            return predecessors
 

	
 
    @LazyProperty
 
    def bookmarks(self):
 
        return map(safe_unicode, self._ctx.bookmarks())
 

	
 
    @LazyProperty
kallithea/tests/vcs/test_hg.py
Show inline comments
 
@@ -588,7 +588,7 @@ class TestMercurialChangeset(object):
 
    def test_successors(self):
 
        init_chset = self.repo.get_changeset(0)
 
        assert init_chset.successors == []
 

	
 
    def test_predecessors(self):
 
        init_chset = self.repo.get_changeset(0)
 
        assert init_chset.predecessors == set([])
 
        assert len(init_chset.predecessors) == 0
0 comments (0 inline, 0 general)