So that when a diverge is detected, we know which ref to report an error for. Also, since we are not throwing an exception, return a proper error code. Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx> --- contrib/remote-helpers/git-remote-hg | 34 +++++++++++++++++++++------------- contrib/remote-helpers/test-hg.sh | 6 +++--- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg index abc0738..5a5667d 100755 --- a/contrib/remote-helpers/git-remote-hg +++ b/contrib/remote-helpers/git-remote-hg @@ -837,18 +837,19 @@ def write_tag(repo, tag, node, msg, author): encoding.encoding = tmp - return tagnode + return (tagnode, branch) def checkheads(repo, remote, p_revs): remotemap = remote.branchmap() if not remotemap: # empty repo - return + return True new = {} + ret = True - for node in p_revs: + for node, ref in p_revs.iteritems(): ctx = repo[node] branch = ctx.branch() if not branch in remotemap: @@ -870,7 +871,11 @@ def checkheads(repo, remote, p_revs): if found: continue - raise Exception("non-fast-forward") + node = repo.changelog.node(rev) + print "error %s non-fast forward" % p_revs[node] + ret = False + + return ret def push_unsafe(repo, remote, parsed_refs, p_revs): @@ -887,8 +892,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs): # nothing to push return None - if not force: - checkheads(unfi, remote, p_revs) + if not force and not checkheads(unfi, remote, p_revs): + return None cg = repo.getlocalbundle('push', outgoing) @@ -924,7 +929,7 @@ def do_export(parser): global parsed_refs, bmarks, peer p_bmarks = [] - p_revs = set() + p_revs = {} parser.next() @@ -949,7 +954,7 @@ def do_export(parser): if branch in branches and bnode in branches[branch]: # up to date continue - p_revs.add(bnode) + p_revs[bnode] = ref print "ok %s" % ref elif ref.startswith('refs/heads/'): bmark = ref[len('refs/heads/'):] @@ -966,7 +971,7 @@ def do_export(parser): else: p_bmarks.append((ref, bmark, old, new)) - p_revs.add(bnode) + p_revs[bnode] = ref elif ref.startswith('refs/tags/'): tag = ref[len('refs/tags/'):] tag = hgref(tag) @@ -974,20 +979,23 @@ def do_export(parser): if mode == 'git': if not msg: msg = 'Added tag %s for changeset %s' % (tag, node[:12]); - tagnode = write_tag(parser.repo, tag, node, msg, author) - p_revs.add(tagnode) + tagnode, branch = write_tag(parser.repo, tag, node, msg, author) + p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch) else: fp = parser.repo.opener('localtags', 'a') fp.write('%s %s\n' % (node, tag)) fp.close() - p_revs.add(bnode) + p_revs[bnode] = ref print "ok %s" % ref else: # transport-helper/fast-export bugs continue if peer: - push(parser.repo, peer, parsed_refs, p_revs) + if not push(parser.repo, peer, parsed_refs, p_revs): + # do not update bookmarks + print + return # update remote bookmarks remote_bmarks = peer.listkeys('bookmarks') diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh index 9d62e26..4f6fd4c 100755 --- a/contrib/remote-helpers/test-hg.sh +++ b/contrib/remote-helpers/test-hg.sh @@ -268,7 +268,7 @@ test_expect_success 'remote new bookmark' ' check_bookmark hgrepo feature-b feature-b ' -test_expect_failure 'remote push diverged' ' +test_expect_success 'remote push diverged' ' test_when_finished "rm -rf gitrepo*" && git clone "hg::hgrepo" gitrepo && @@ -291,7 +291,7 @@ test_expect_failure 'remote push diverged' ' check_branch hgrepo default bump ' -test_expect_failure 'remote update bookmark diverge' ' +test_expect_success 'remote update bookmark diverge' ' test_when_finished "rm -rf gitrepo*" && ( @@ -338,7 +338,7 @@ test_expect_failure 'remote new bookmark multiple branch head' ' # cleanup previous stuff rm -rf hgrepo -test_expect_failure 'remote big push' ' +test_expect_success 'remote big push' ' test_when_finished "rm -rf hgrepo gitrepo*" && ( -- 1.8.3.rc1.579.g184e698 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html