[PATCH V2] patchbomb: check that targets exist at the publicurl
Augie Fackler
raf at durin42.com
Tue Oct 13 10:00:55 CDT 2015
On Mon, Oct 12, 2015 at 10:31:04AM -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 170de3b33ef457b154bd76ab1d724281180c0632
> # 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 170de3b33ef4
> patchbomb: check that targets exist at the publicurl
Queued, thanks.
>
> 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,41 @@ 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])
> + revhint = ''.join('-r %s' % h
> + for h in repo.set('heads(%ld)', missing))
> + hint = _('use "hg push %s %s"') % (publicurl, revhint)
> + 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
> + (use "hg push $TESTTMP/t3 -r 3b6f1ec9dde9")
> + [255]
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list