[PATCH] patchbomb: check that targets exist at the publicurl
Augie Fackler
raf at durin42.com
Mon Oct 12 12:20:26 CDT 2015
On Mon, Oct 12, 2015 at 1:18 PM, Pierre-Yves David
<pierre-yves.david at ens-lyon.org> wrote:
>
>
> On 10/12/2015 10:14 AM, Augie Fackler wrote:
>>
>> On Mon, Oct 12, 2015 at 09:11:35AM -0700, Pierre-Yves David wrote:
>>>
>>> # HG changeset patch
>>> # User Pierre-Yves David <pierre-yves.david at fb.com>
>>> # Date 1444626783 25200
>>> # Sun Oct 11 22:13:03 2015 -0700
>>> # Node ID 004264d03eca64967c9288559cfc18be0bcab630
>>> # Parent 9ca13d10881d7044b79d903ad64653f6541591f1
>>> # EXP-Topic pb.publicurl
>>> # Available At http://hg.netv6.net/marmoute-wip/mercurial/
>>> # hg pull http://hg.netv6.net/marmoute-wip/mercurial/ -r
>>> 004264d03eca
>>> patchbomb: check that targets exist at the publicurl
>>>
>>> Advertising that the patch are available to be pulled requires that to be
>>> true.
>>> So we check revision availability on the remote before sending any email.
>>>
>>> diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py
>>> --- a/hgext/patchbomb.py
>>> +++ b/hgext/patchbomb.py
>>> @@ -525,10 +525,39 @@ def patchbomb(ui, repo, *revs, **opts):
>>> if outgoing:
>>> revs = _getoutgoing(repo, dest, revs)
>>> if bundle:
>>> opts['revs'] = [str(r) for r in revs]
>>>
>>> + # check if revision exist on the public destination
>>> + publicurl = repo.ui.config('patchbomb', 'publicurl')
>>> + if publicurl is not None:
>>> + repo.ui.debug('checking that revision exist in the public repo')
>>> + try:
>>> + publicpeer = hg.peer(repo, {}, publicurl)
>>> + except error.RepoError:
>>> + repo.ui.write_err(_('unable to access public repo: %s\n')
>>> + % publicurl)
>>> + raise
>>> + if not publicpeer.capable('known'):
>>> + repo.ui.debug('skipping existence checks: public repo too
>>> old')
>>> + else:
>>> + out = [repo[r] for r in revs]
>>> + known = publicpeer.known(h.node() for h in out)
>>> + missing = []
>>> + for idx, h in enumerate(out):
>>> + if not known[idx]:
>>> + missing.append(h)
>>> + if missing:
>>> + if 1 < len(missing):
>>> + msg = _('public "%s" is missing %s and %i others')
>>> + msg %= (publicurl, missing[0], len(missing) - 1)
>>> + else:
>>> + msg = _('public url %s is missing %s')
>>> + msg %= (publicurl, missing[0])
>>> + hint = _('use "hg push %s -r %s"') % (publicurl,
>>> missing[0])
>>
>>
>> shouldn't the hint be something like ' '.join('-r ' + node for node in
>> heads(missing))?
>
>
> There might be multiple heads, but we should probably hint for pushing heads
> yes.
>
>
>>> + raise error.Abort(msg, hint=hint)
>>> +
>>> # start
>>> if date:
>>> start_time = util.parsedate(date)
>>> else:
>>> start_time = util.makedate()
>>> diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t
>>> --- a/tests/test-patchbomb.t
>>> +++ b/tests/test-patchbomb.t
>>> @@ -2843,17 +2843,36 @@ single rev
>>> +d
>>>
>>> Test pull url header
>>> =================================
>>>
>>> +basic version
>>> +
>>> $ echo 'intro=auto' >> $HGRCPATH
>>> - $ echo 'publicurl=http://example.com/myrepo/' >> $HGRCPATH
>>> + $ echo "publicurl=$TESTTMP/t2" >> $HGRCPATH
>>> $ hg email --date '1980-1-1 0:1' -n -t foo -s test -r '10' | grep
>>> '^#'
>>> - # HG changeset patch
>>> - # User test
>>> - # Date 5 0
>>> - # Thu Jan 01 00:00:05 1970 +0000
>>> - # Branch test
>>> - # Node ID 3b6f1ec9dde933a40a115a7990f8b320477231af
>>> - # Parent 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
>>> - # Available At http://example.com/myrepo/
>>> - # hg pull http://example.com/myrepo/ -r 3b6f1ec9dde9
>>> + abort: public url $TESTTMP/t2 is missing 3b6f1ec9dde9
>>> + (use "hg push $TESTTMP/t2 -r 3b6f1ec9dde9")
>>> + [1]
>>> +
>>> +remote missing
>>> +
>>> + $ echo 'publicurl=$TESTTMP/missing' >> $HGRCPATH
>>> + $ hg email --date '1980-1-1 0:1' -n -t foo -s test -r '10'
>>> + unable to access public repo: $TESTTMP/missing
>>> + abort: repository $TESTTMP/missing not found!
>>> + [255]
>>> +
>>> +node missing at remote
>>> +
>>> + $ hg clone -r '9' . ../t3
>>> + adding changesets
>>> + adding manifests
>>> + adding file changes
>>> + added 3 changesets with 3 changes to 3 files
>>> + updating to branch test
>>> + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
>>> + $ echo 'publicurl=$TESTTMP/t3' >> $HGRCPATH
>>> + $ hg email --date '1980-1-1 0:1' -n -t foo -s test -r '10'
>>> + abort: public url $TESTTMP/t3 is missing 3b6f1ec9dde9
>>
>>
>> Aborting seems heavy-handed here. For trivial patches I might want to
>> continue anyway, so maybe prompt?
>
>
> Meh, broken pull url will be really annoying on the other end. The way to go
> is probably more to allow automatic push on patchbomb.
My (unstated, I should have mentioned it) assumption would be that the
pull URL would be omitted if it was broken.
> In the mean-time, this is still an experimental featureso I would says it is
> fine.
Fix the hint for multiple heads and I'll take it.
>
> --
> Pierre-Yves David
More information about the Mercurial-devel
mailing list