diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2013-05-24 21:30:02 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-05-28 08:02:24 -0700 |
commit | ba091c200d88b27a0bd9027f24a7250f196fc304 (patch) | |
tree | bcfeb51544a4442e0ea6616eb2224293008b2796 /contrib/remote-helpers/git-remote-hg | |
parent | remote-hg: trivial cleanup (diff) | |
download | tgif-ba091c200d88b27a0bd9027f24a7250f196fc304.tar.xz |
remote-hg: check if a fetch is needed
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'contrib/remote-helpers/git-remote-hg')
-rwxr-xr-x | contrib/remote-helpers/git-remote-hg | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index b08f909076..b983627ce3 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -973,6 +973,15 @@ def push(repo, remote, parsed_refs, p_revs): return ret +def check_tip(ref, kind, name, heads): + try: + ename = '%s/%s' % (kind, name) + tip = marks.get_tip(ename) + except KeyError: + return True + else: + return tip in heads + def do_export(parser): global parsed_refs, bmarks, peer @@ -995,6 +1004,8 @@ def do_export(parser): else: die('unhandled export command: %s' % line) + need_fetch = False + for ref, node in parsed_refs.iteritems(): bnode = hgbin(node) if ref.startswith('refs/heads/branches'): @@ -1002,6 +1013,16 @@ def do_export(parser): if branch in branches and bnode in branches[branch]: # up to date continue + + if peer: + remotemap = peer.branchmap() + if remotemap and branch in remotemap: + heads = [hghex(e) for e in remotemap[branch]] + if not check_tip(ref, 'branches', branch, heads): + print "error %s fetch first" % ref + need_fetch = True + continue + p_revs[bnode] = ref print "ok %s" % ref elif ref.startswith('refs/heads/'): @@ -1017,6 +1038,14 @@ def do_export(parser): not (bmark == 'master' and bmark not in parser.repo._bookmarks): p_bmarks.append((ref, bmark, old, new)) + if peer: + remote_old = peer.listkeys('bookmarks').get(bmark) + if remote_old: + if not check_tip(ref, 'bookmarks', bmark, remote_old): + print "error %s fetch first" % ref + need_fetch = True + continue + p_revs[bnode] = ref elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] @@ -1037,6 +1066,16 @@ def do_export(parser): # transport-helper/fast-export bugs continue + if need_fetch: + print + return + + if dry_run: + if peer and not force_push: + checkheads(parser.repo, peer, p_revs) + print + return + if peer: if not push(parser.repo, peer, parsed_refs, p_revs): # do not update bookmarks |