remote-hg: pass around revision refs
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@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Felipe Contreras committed
May 24, 2013 at 21:29 UTC
883d7be110968c0d319dfa7c595c640e616da9c5
2 files changed
+24
-16
contrib/remote-helpers/git-remote-hg
+21
-13
@@ -857,18 +857,19 @@ def write_tag(repo, tag, node, msg, author):
857
858
encoding.encoding = tmp
859
860
- return tagnode
860
+ return (tagnode, branch)
861
862
def checkheads(repo, remote, p_revs):
863
864
remotemap = remote.branchmap()
865
if not remotemap:
866
# empty repo
867
- return
867
+ return True
868
869
new = {}
870
+ ret = True
871
871
- for node in p_revs:
872
+ for node, ref in p_revs.iteritems():
873
ctx = repo[node]
874
branch = ctx.branch()
875
if not branch in remotemap:
@@ -893,7 +894,11 @@ def checkheads(repo, remote, p_revs):
894
if found:
895
continue
896
896
- raise Exception("non-fast-forward")
897
+ node = repo.changelog.node(rev)
898
+ print "error %s non-fast forward" % p_revs[node]
899
+ ret = False
900
+
901
+ return ret
902
903
def push_unsafe(repo, remote, parsed_refs, p_revs):
904
@@ -903,8 +908,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs):
908
commoninc = fci(repo, remote, force=force)
909
common, _, remoteheads = commoninc
910
906
- if not force:
907
- checkheads(repo, remote, p_revs)
911
+ if not force and not checkheads(repo, remote, p_revs):
912
+ return None
913
914
cg = repo.getbundle('push', heads=list(p_revs), common=common)
915
@@ -940,7 +945,7 @@ def do_export(parser):
945
global parsed_refs, bmarks, peer
946
947
p_bmarks = []
943
- p_revs = set()
948
+ p_revs = {}
949
950
parser.next()
951
@@ -965,7 +970,7 @@ def do_export(parser):
970
if branch in branches and bnode in branches[branch]:
971
# up to date
972
continue
968
- p_revs.add(bnode)
973
+ p_revs[bnode] = ref
974
print "ok %s" % ref
975
elif ref.startswith('refs/heads/'):
976
bmark = ref[len('refs/heads/'):]
@@ -980,7 +985,7 @@ def do_export(parser):
985
not (bmark == 'master' and bmark not in parser.repo._bookmarks):
986
p_bmarks.append((ref, bmark, old, new))
987
983
- p_revs.add(bnode)
988
+ p_revs[bnode] = ref
989
elif ref.startswith('refs/tags/'):
990
tag = ref[len('refs/tags/'):]
991
tag = hgref(tag)
@@ -988,20 +993,23 @@ def do_export(parser):
993
if mode == 'git':
994
if not msg:
995
msg = 'Added tag %s for changeset %s' % (tag, node[:12]);
991
- tagnode = write_tag(parser.repo, tag, node, msg, author)
992
- p_revs.add(tagnode)
996
+ tagnode, branch = write_tag(parser.repo, tag, node, msg, author)
997
+ p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch)
998
else:
999
fp = parser.repo.opener('localtags', 'a')
1000
fp.write('%s %s\n' % (node, tag))
1001
fp.close()
997
- p_revs.add(bnode)
1002
+ p_revs[bnode] = ref
1003
print "ok %s" % ref
1004
else:
1005
# transport-helper/fast-export bugs
1006
continue
1007
1008
if peer:
1004
- push(parser.repo, peer, parsed_refs, p_revs)
1009
+ if not push(parser.repo, peer, parsed_refs, p_revs):
1010
+ # do not update bookmarks
1011
+ print
1012
+ return
1013
1014
# update remote bookmarks
1015
remote_bmarks = peer.listkeys('bookmarks')
contrib/remote-helpers/test-hg.sh
+3
-3
@@ -328,7 +328,7 @@ test_expect_success 'remote new bookmark' '
328
check_bookmark hgrepo feature-b feature-b
329
'
330
331
-test_expect_failure 'remote push diverged' '
331
+test_expect_success 'remote push diverged' '
332
test_when_finished "rm -rf gitrepo*" &&
333
334
git clone "hg::hgrepo" gitrepo &&
@@ -351,7 +351,7 @@ test_expect_failure 'remote push diverged' '
351
check_branch hgrepo default bump
352
'
353
354
-test_expect_failure 'remote update bookmark diverge' '
354
+test_expect_success 'remote update bookmark diverge' '
355
test_when_finished "rm -rf gitrepo*" &&
356
357
(
@@ -398,7 +398,7 @@ test_expect_failure 'remote new bookmark multiple branch head' '
398
# cleanup previous stuff
399
rm -rf hgrepo
400
401
-test_expect_failure 'remote big push' '
401
+test_expect_success 'remote big push' '
402
test_when_finished "rm -rf hgrepo gitrepo*" &&
403
404
(