Show More
@@ -122,10 +122,18 b' def _report_commit(ui, repo, ctx):' | |||||
122 | ) |
|
122 | ) | |
123 |
|
123 | |||
124 |
|
124 | |||
|
125 | def has_successor(repo, rev): | |||
|
126 | return any( | |||
|
127 | r for r in obsutil.allsuccessors(repo.obsstore, [rev]) if r != rev | |||
|
128 | ) | |||
|
129 | ||||
|
130 | ||||
125 | def hook(ui, repo, hooktype, node=None, **kwargs): |
|
131 | def hook(ui, repo, hooktype, node=None, **kwargs): | |
126 |
if hooktype != b" |
|
132 | if hooktype != b"txnclose": | |
127 | raise error.Abort( |
|
133 | raise error.Abort( | |
128 | _(b'Unsupported hook type %r') % pycompat.bytestr(hooktype) |
|
134 | _(b'Unsupported hook type %r') % pycompat.bytestr(hooktype) | |
129 | ) |
|
135 | ) | |
130 |
for rev in obsutil.getobsoleted(repo, |
|
136 | for rev in obsutil.getobsoleted(repo, changes=kwargs['changes']): | |
131 |
|
|
137 | ctx = repo.unfiltered()[rev] | |
|
138 | if not has_successor(repo, ctx.node()): | |||
|
139 | _report_commit(ui, repo, ctx) |
@@ -13,6 +13,7 b' from .i18n import _' | |||||
13 | from . import ( |
|
13 | from . import ( | |
14 | diffutil, |
|
14 | diffutil, | |
15 | encoding, |
|
15 | encoding, | |
|
16 | error, | |||
16 | node as nodemod, |
|
17 | node as nodemod, | |
17 | phases, |
|
18 | phases, | |
18 | pycompat, |
|
19 | pycompat, | |
@@ -481,14 +482,23 b' def geteffectflag(source, successors):' | |||||
481 | return effects |
|
482 | return effects | |
482 |
|
483 | |||
483 |
|
484 | |||
484 | def getobsoleted(repo, tr): |
|
485 | def getobsoleted(repo, tr=None, changes=None): | |
485 |
"""return the set of pre-existing revisions obsoleted by a transaction |
|
486 | """return the set of pre-existing revisions obsoleted by a transaction | |
|
487 | ||||
|
488 | Either the transaction or changes item of the transaction (for hooks) | |||
|
489 | must be provided, but not both. | |||
|
490 | """ | |||
|
491 | if (tr is None) == (changes is None): | |||
|
492 | e = b"exactly one of tr and changes must be provided" | |||
|
493 | raise error.ProgrammingError(e) | |||
486 | torev = repo.unfiltered().changelog.index.get_rev |
|
494 | torev = repo.unfiltered().changelog.index.get_rev | |
487 | phase = repo._phasecache.phase |
|
495 | phase = repo._phasecache.phase | |
488 | succsmarkers = repo.obsstore.successors.get |
|
496 | succsmarkers = repo.obsstore.successors.get | |
489 | public = phases.public |
|
497 | public = phases.public | |
490 | addedmarkers = tr.changes[b'obsmarkers'] |
|
498 | if changes is None: | |
491 | origrepolen = tr.changes[b'origrepolen'] |
|
499 | changes = tr.changes | |
|
500 | addedmarkers = changes[b'obsmarkers'] | |||
|
501 | origrepolen = changes[b'origrepolen'] | |||
492 | seenrevs = set() |
|
502 | seenrevs = set() | |
493 | obsoleted = set() |
|
503 | obsoleted = set() | |
494 | for mark in addedmarkers: |
|
504 | for mark in addedmarkers: |
@@ -24,7 +24,7 b'' | |||||
24 | $ cat <<EOF >> b/.hg/hgrc |
|
24 | $ cat <<EOF >> b/.hg/hgrc | |
25 | > [hooks] |
|
25 | > [hooks] | |
26 | > incoming.notify = python:hgext.notify.hook |
|
26 | > incoming.notify = python:hgext.notify.hook | |
27 |
> |
|
27 | > txnclose.changeset_obsoleted = python:hgext.hooklib.changeset_obsoleted.hook | |
28 | > EOF |
|
28 | > EOF | |
29 | $ hg --cwd b pull ../a | "$PYTHON" $TESTDIR/unwrap-message-id.py |
|
29 | $ hg --cwd b pull ../a | "$PYTHON" $TESTDIR/unwrap-message-id.py | |
30 | pulling from ../a |
|
30 | pulling from ../a | |
@@ -72,6 +72,8 b'' | |||||
72 | pushing to ../b |
|
72 | pushing to ../b | |
73 | searching for changes |
|
73 | searching for changes | |
74 | no changes found |
|
74 | no changes found | |
|
75 | 1 new obsolescence markers | |||
|
76 | obsoleted 1 changesets | |||
75 | Subject: changeset abandoned |
|
77 | Subject: changeset abandoned | |
76 | In-reply-to: <hg.81c297828fd2d5afaadf2775a6a71b74143b6451dfaac09fac939e9107a50d01@example.com> |
|
78 | In-reply-to: <hg.81c297828fd2d5afaadf2775a6a71b74143b6451dfaac09fac939e9107a50d01@example.com> | |
77 | Message-Id: <hg.d6329e9481594f0f3c8a84362b3511318bfbce50748ab1123f909eb6fbcab018@example.com> |
|
79 | Message-Id: <hg.d6329e9481594f0f3c8a84362b3511318bfbce50748ab1123f909eb6fbcab018@example.com> | |
@@ -80,5 +82,33 b'' | |||||
80 | To: baz@example.com |
|
82 | To: baz@example.com | |
81 |
|
83 | |||
82 | This changeset has been abandoned. |
|
84 | This changeset has been abandoned. | |
|
85 | ||||
|
86 | Check that known changesets with known successors do not result in a mail. | |||
|
87 | ||||
|
88 | $ hg init c | |||
|
89 | $ hg init d | |||
|
90 | $ cat <<EOF >> d/.hg/hgrc | |||
|
91 | > [hooks] | |||
|
92 | > incoming.notify = python:hgext.notify.hook | |||
|
93 | > txnclose.changeset_obsoleted = python:hgext.hooklib.changeset_obsoleted.hook | |||
|
94 | > EOF | |||
|
95 | $ hg --cwd c debugbuilddag '.:parent.*parent' | |||
|
96 | $ hg --cwd c push ../d -r 1 | |||
|
97 | pushing to ../d | |||
|
98 | searching for changes | |||
|
99 | adding changesets | |||
|
100 | adding manifests | |||
|
101 | adding file changes | |||
|
102 | added 2 changesets with 0 changes to 0 files | |||
|
103 | $ hg --cwd c debugobsolete $(hg --cwd c log -T '{node}' -r 1) $(hg --cwd c log -T '{node}' -r 2) | |||
83 | 1 new obsolescence markers |
|
104 | 1 new obsolescence markers | |
84 | obsoleted 1 changesets |
|
105 | obsoleted 1 changesets | |
|
106 | $ hg --cwd c push ../d | "$PYTHON" $TESTDIR/unwrap-message-id.py | |||
|
107 | pushing to ../d | |||
|
108 | searching for changes | |||
|
109 | adding changesets | |||
|
110 | adding manifests | |||
|
111 | adding file changes | |||
|
112 | added 1 changesets with 0 changes to 0 files (+1 heads) | |||
|
113 | 1 new obsolescence markers | |||
|
114 | obsoleted 1 changesets |
General Comments 0
You need to be logged in to leave comments.
Login now