Add a bosancestors revset
diff --git a/hgext/obsolete.py b/hgext/obsolete.py --- a/hgext/obsolete.py +++ b/hgext/obsolete.py @@ -135,7 +135,8 @@ def revsetextinct(repo, subset, x): return [r for r in subset if r in repo._extinctset] -def _obsparents(repo, narrow, s): +def _obsparents(repo, s): + """obsolete parents of a subset""" cs = set() nm = repo.changelog.nodemap for r in s: @@ -145,13 +146,38 @@ def _obsparents(repo, narrow, s): cs.add(pr) return cs +def revsetobsparents(repo, subset, x): + """obsolete parents""" + s = revset.getset(repo, range(len(repo)), x) + cs = _obsparents(repo, s) + return [r for r in subset if r in cs] -def revsetobsparents(repo, subset, x): - """obsolete parents of a changeset""" +def _obsancestors(repo, s): + """obsolete ancestors of a subset""" + toproceed = [repo[r].node() for r in s] + seen = set() + while toproceed: + nc = toproceed.pop() + for np in repo._obssubrels.get(nc, ()): + if np not in seen: + seen.add(np) + toproceed.append(np) + nm = repo.changelog.nodemap + cs = set() + for p in seen: + pr = nm.get(p, None) + if pr is not None: + cs.add(pr) + return cs + +def revsetobsancestors(repo, subset, x): + """obsolete parents""" s = revset.getset(repo, range(len(repo)), x) - cs = _obsparents(repo, subset, s) + cs = _obsancestors(repo, s) return [r for r in subset if r in cs] + + ### Other Extension compat ############################ @@ -179,6 +205,7 @@ def extsetup(ui): revset.symbols["suspended"] = revsetsuspended revset.symbols["extinct"] = revsetextinct revset.symbols["obsparents"] = revsetobsparents + revset.symbols["obsancestors"] = revsetobsancestors try: diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t --- a/tests/test-obsolete.t +++ b/tests/test-obsolete.t @@ -90,6 +90,11 @@ test obsolete changeset with no-obsolete - 4538525df7e2 3 - 0d3f46688ccc + $ qlog -r 'obsancestors(4)' --hidden + 2 + - 4538525df7e2 + 3 + - 0d3f46688ccc $ hg up 3 -q Working directory parent is obsolete $ mkcommit d # 5 (on 3)