# HG changeset patch # User Pierre-Yves David # Date 1341596049 -7200 # Node ID c621f84dbb35ddab18b82aa25eb49395f0931dc3 # Parent 12fdaa30063a6694492c35f6c39bae90c3a4c1ac obsolete: compute extinct changesets `extinct` changesets are obsolete changesets with obsolete descendants only. They are of no interest anymore and can be: - exclude from exchange - hidden to the user in most situation - safely garbage collected This changeset just allows mercurial to detect them. The implementation is a bit naive, as for unstable changesets. We better use a simple revset query and a cache, but simple version comes first. diff -r 12fdaa30063a -r c621f84dbb35 mercurial/context.py --- a/mercurial/context.py Tue Jul 10 01:39:03 2012 +0200 +++ b/mercurial/context.py Fri Jul 06 19:34:09 2012 +0200 @@ -235,6 +235,21 @@ return (self.node() in self._repo.obsstore.precursors and self.phase() > phases.public) + def extinct(self): + """True if the changeset is extinct""" + # We should just compute a cache a check againts it. + # see revset implementation for details + # + # But this naive implementation does not require cache + if self.phase() <= phases.public: + return False + if not self.obsolete(): + return False + for desc in self.descendants(): + if not desc.obsolete(): + return False + return True + def unstable(self): """True if the changeset is not obsolete but it's ancestor are""" # We should just compute /(obsolete()::) - obsolete()/ diff -r 12fdaa30063a -r c621f84dbb35 mercurial/revset.py --- a/mercurial/revset.py Tue Jul 10 01:39:03 2012 +0200 +++ b/mercurial/revset.py Fri Jul 06 19:34:09 2012 +0200 @@ -568,6 +568,13 @@ pc = repo._phasecache return [r for r in subset if pc.phase(repo, r) == phases.draft] +def extinct(repo, subset, x): + """``extinct()`` + obsolete changeset with obsolete descendant only.""" + getargs(x, 0, 0, _("obsolete takes no arguments")) + extinctset = set(repo.revs('(obsolete()::) - (::(not obsolete()))')) + return [r for r in subset if r in extinctset] + def extra(repo, subset, x): """``extra(label, [value])`` Changesets with the given label in the extra metadata, with the given @@ -1365,6 +1372,7 @@ "descendants": descendants, "_firstdescendants": _firstdescendants, "draft": draft, + "extinct": extinct, "extra": extra, "file": hasfile, "filelog": filelog, diff -r 12fdaa30063a -r c621f84dbb35 tests/test-obsolete.t --- a/tests/test-obsolete.t Tue Jul 10 01:39:03 2012 +0200 +++ b/tests/test-obsolete.t Fri Jul 06 19:34:09 2012 +0200 @@ -320,3 +320,13 @@ searching for changes abort: push includes an unstable changeset: 7878242aeece! [255] + +Test that extinct changeset are properly detected + + $ hg log -r 'extinct()' + changeset: 3:cdbce2fbb163 + parent: 1:7c3bad9141dc + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add new_c +