# HG changeset patch # User Pierre-Yves David # Date 1315493218 -7200 # Node ID 3b0364fc822f69072c154dd852f804d02fc5c690 # Parent d89453a10991130776d34176a5fc36d0227f9bf9 Do not propagate obsolete changeset diff -r d89453a10991 -r 3b0364fc822f obsolete.py --- a/obsolete.py Thu Sep 08 14:02:29 2011 +0200 +++ b/obsolete.py Thu Sep 08 16:46:58 2011 +0200 @@ -12,6 +12,8 @@ from mercurial import scmutil from mercurial import extensions from mercurial import pushkey +from mercurial import discovery +from mercurial import error from mercurial.node import hex, bin # Patch changectx @@ -47,6 +49,29 @@ def extsetup(ui): revset.symbols["obsolete"] = revsetobsolete + + def filterobsoleteout(orig, repo, remote, *args,**kwargs): + common, heads = orig(repo, remote, *args, **kwargs) + + # filter obsolete + heads = set(map(repo.changelog.rev, heads)) + obsoletes = set() + for obj in repo._obsobjrels: + try: + obsoletes.add(repo.changelog.rev(obj)) + except error.LookupError: + pass # we don't have this node locally + + outgoing = set(repo.changelog.ancestors(*heads)) + outgoing.update(heads) + + selected = outgoing - obsoletes + heads = sorted(map(repo.changelog.node, selected)) + + return common, heads + + extensions.wrapfunction(discovery, 'findcommonoutgoing', filterobsoleteout) + try: rebase = extensions.find('rebase') if rebase: @@ -183,7 +208,10 @@ """Add a relation marking that node is a new version of """ self._obssubrels.setdefault(sub, set()).add(obj) self._obsobjrels.setdefault(obj, set()).add(sub) - self.changelog.hiddenrevs.add(repo[obj].rev()) + try: + self.changelog.hiddenrevs.add(repo[obj].rev()) + except error.RepoLookupError: + pass #unknow revision (but keep propagating the data self._writeobsrels() repo.__class__ = obsoletingrepo diff -r d89453a10991 -r 3b0364fc822f tests/test-obsolete.t --- a/tests/test-obsolete.t Thu Sep 08 14:02:29 2011 +0200 +++ b/tests/test-obsolete.t Thu Sep 08 16:46:58 2011 +0200 @@ -58,19 +58,19 @@ Test communication of obsolete relation with a compatible client $ hg init ../other-new - $ hg push ../other-new + $ hg push --traceback ../other-new pushing to ../other-new searching for changes adding changesets adding manifests adding file changes - added 6 changesets with 6 changes to 6 files (+2 heads) + added 5 changesets with 5 changes to 5 files (+1 heads) $ qlog -R ../other-new -r 'obsolete()' - 3 0d3f46688ccc + 2 0d3f46688ccc $ qlog -R ../other-new - 5 a7a6f2b5d8a5 - 4 725c380fe99b - 3 0d3f46688ccc + 4 a7a6f2b5d8a5 + 3 725c380fe99b + 2 0d3f46688ccc 1 7c3bad9141dc 0 1f0dee641bb7 $ hg up 3 -q @@ -93,13 +93,13 @@ adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) $ qlog -R ../other-new - 6 95de7fc6918d - 4 725c380fe99b - 3 0d3f46688ccc + 5 95de7fc6918d + 3 725c380fe99b + 2 0d3f46688ccc 1 7c3bad9141dc 0 1f0dee641bb7 $ qlog -R ../other-new -r 'obsolete()' - 3 0d3f46688ccc + 2 0d3f46688ccc $ hg up -q .^ $ mkcommit "obsol_d'" # 7 created new head @@ -110,12 +110,31 @@ adding changesets adding manifests adding file changes - added 1 changesets with 1 changes to 1 files (+1 heads) + added 2 changesets with 2 changes to 2 files (+2 heads) (run 'hg heads .' to see heads, 'hg merge' to merge) $ qlog -R ../other-new 7 909a0fb57e5d - 4 725c380fe99b - 3 0d3f46688ccc + 3 725c380fe99b + 2 0d3f46688ccc + 1 7c3bad9141dc + 0 1f0dee641bb7 + +pushing to stuff that doesn't support obsolete + + $ hg init ../other-old + $ echo '[extensions]' > ../other-old/.hg/hgrc + $ echo "obsolete=!$(echo $(dirname $TESTDIR))/obsolete.py" >> ../other-old/.hg/hgrc + $ hg push ../other-old + pushing to ../other-old + searching for changes + adding changesets + adding manifests + adding file changes + added 5 changesets with 5 changes to 5 files (+1 heads) + $ qlog -R ../other-old + 4 909a0fb57e5d + 3 725c380fe99b + 2 0d3f46688ccc 1 7c3bad9141dc 0 1f0dee641bb7