git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 35/48] remote-hg: pass around revision refs

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
May 25, 2013, 02:29 UTC
Message-ID
<1369449004-17981-36-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1369449004-17981-1-git-send-email-felipe.contreras@gmail.com>

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>
---
 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 7eb809b..b6f85b2 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -857,18 +857,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:
@@ -893,7 +894,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):
 
@@ -903,8 +908,8 @@ def push_unsafe(repo, remote, parsed_refs, p_revs):
     commoninc = fci(repo, remote, force=force)
     common, _, remoteheads = commoninc
 
-    if not force:
-        checkheads(repo, remote, p_revs)
+    if not force and not checkheads(repo, remote, p_revs):
+        return None
 
     cg = repo.getbundle('push', heads=list(p_revs), common=common)
 
@@ -940,7 +945,7 @@ def do_export(parser):
     global parsed_refs, bmarks, peer
 
     p_bmarks = []
-    p_revs = set()
+    p_revs = {}
 
     parser.next()
 
@@ -965,7 +970,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/'):]
@@ -980,7 +985,7 @@ def do_export(parser):
                     not (bmark == 'master' and bmark not in parser.repo._bookmarks):
                 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)
@@ -988,20 +993,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 c4d98b5..c4e4a1a 100755
--- a/contrib/remote-helpers/test-hg.sh
+++ b/contrib/remote-helpers/test-hg.sh
@@ -328,7 +328,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 &&
@@ -351,7 +351,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*" &&
 
 	(
@@ -398,7 +398,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.rc3.312.g47657de
Previous: Felipe ContrerasNext: Felipe Contreras
Message 38 of 51 in “remote-hg: fixes for next”
  1. 00/48 remote-hg: fixes for nextFelipe Contreras, May 25, 2013
  2. 01/48 remote-hg: test: be a little more quietFelipe Contreras, May 25, 2013
  3. 02/48 remote-hg: trivial reorganizationFelipe Contreras, May 25, 2013
  4. 03/48 remote-helpers: test: cleanup white-spacesFelipe Contreras, May 25, 2013
  5. 04/48 remote-helpers: test: cleanup styleFelipe Contreras, May 25, 2013
  6. 05/48 remote-helpers: tests: general improvementsFelipe Contreras, May 25, 2013
  7. 06/48 remote-helpers: test: simplify remote URLsFelipe Contreras, May 25, 2013
  8. 07/48 remote-hg: test: simplify previous branch checkoutFelipe Contreras, May 25, 2013
  9. 08/48 remote-hg: load all extensionsFelipe Contreras, May 25, 2013
  10. 09/48 remote-hg: use a shared repository storeFelipe Contreras, May 25, 2013
  11. 10/48 remote-hg: shuffle some codeFelipe Contreras, May 25, 2013
  12. 11/48 remote-hg: improve node traversingFelipe Contreras, May 25, 2013
  13. 12/48 remote-hg: add version checks to the marksFelipe Contreras, May 25, 2013
  14. 13/48 remote-hg: switch from revisions to SHA-1 noteidsFelipe Contreras, May 25, 2013
  15. 14/48 remote-hg: upgrade version 1 marksFelipe Contreras, May 25, 2013
  16. 15/48 remote-hg: ensure remote rebasing worksFelipe Contreras, May 25, 2013
  17. 16/48 remote-hg: trivial cleanupsFelipe Contreras, May 25, 2013
  18. 17/48 remote-hg: improve progress calculationFelipe Contreras, May 25, 2013
  19. 18/48 remote-hg: always point HEAD to masterFelipe Contreras, May 25, 2013
  20. 19/48 remote-hg: add tests for 'master' bookmarkFelipe Contreras, May 25, 2013
  21. 20/48 remote-bzr: simplify test checksFelipe Contreras, May 25, 2013
  22. 21/48 remote-hg: add check_bookmark() test helperFelipe Contreras, May 25, 2013
  23. 22/48 remote-hg: update bookmarks when using a remoteFelipe Contreras, May 25, 2013
  24. 23/48 remote-hg: add remote testsFelipe Contreras, May 25, 2013
  25. 24/48 remote-hg: add test to push new bookmarkFelipe Contreras, May 25, 2013
  26. 25/48 remote-hg: add test for diverged pushFelipe Contreras, May 25, 2013
  27. Eric SunshineMay 25, 2013
  28. 26/48 remote-hg: add test for bookmark divergeFelipe Contreras, May 25, 2013
  29. 27/48 remote-hg: add test for new bookmark specialFelipe Contreras, May 25, 2013
  30. Eric SunshineMay 25, 2013
  31. 28/48 remote-hg: add test for big pushFelipe Contreras, May 25, 2013
  32. 29/48 remote-hg: add test for failed double pushFelipe Contreras, May 25, 2013
  33. 30/48 remote-hg: reorganize bookmark handlingFelipe Contreras, May 25, 2013
  34. 31/48 remote-hg: force remote bookmark push selectivelyFelipe Contreras, May 25, 2013
  35. 32/48 remote-hg: only update necessary revisionsFelipe Contreras, May 25, 2013
  36. 33/48 remote-hg: implement custom push()Felipe Contreras, May 25, 2013
  37. 34/48 remote-hg: implement custom checkheads()Felipe Contreras, May 25, 2013
  38. 35/48 remote-hg: pass around revision refsFelipe Contreras, May 25, 2013
  39. 36/48 remote-hg: check diverged bookmarksFelipe Contreras, May 25, 2013
  40. 37/48 remote-hg: simplify branch_tip()Felipe Contreras, May 25, 2013
  41. 38/48 remote-hg: improve branch listingFelipe Contreras, May 25, 2013
  42. 39/48 remote-hg: use remote 'default' not local oneFelipe Contreras, May 25, 2013
  43. 40/48 remote-hg: improve lightweight tag authorFelipe Contreras, May 25, 2013
  44. 41/48 remote-hg: remove files before modificationsFelipe Contreras, May 25, 2013
  45. 42/48 remote-hg: add setup_big_push() helperFelipe Contreras, May 25, 2013
  46. 43/48 remote-hg: add check_push() helperFelipe Contreras, May 25, 2013
  47. 44/48 remote-helpers: improve marks usageFelipe Contreras, May 25, 2013
  48. 45/48 remote-hg: trivial cleanupFelipe Contreras, May 25, 2013
  49. 46/48 remote-hg: check if a fetch is neededFelipe Contreras, May 25, 2013
  50. 47/48 remote-hg: add support for --dry-runFelipe Contreras, May 25, 2013
  51. 48/48 remote-hg: add support for --forceFelipe Contreras, May 25, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.