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

[PATCH 39/47] remote-hg: implement custom push()

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
May 14, 2013, 04:37 UTC
Message-ID
<1368506230-19614-40-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1368506230-19614-1-git-send-email-felipe.contreras@gmail.com>

The one from mercurial does a ton of things we are not interested in, and we need some special modifications which are impossible otherwise.

Most of the code is borrowed from Mercurial, and cleaned up, but should be functionally the same for our purposes.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/remote-helpers/git-remote-hg | 52 ++++++++++++++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 2 deletions(-)
diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index c814188..b064a3c 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -12,7 +12,7 @@
 # For remote repositories a local clone is stored in
 # "$GIT_DIR/hg/origin/clone/.hg/".
 
-from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions
+from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery
 
 import re
 import sys
@@ -839,6 +839,54 @@ def write_tag(repo, tag, node, msg, author):
 
     return tagnode
 
+def push_unsafe(repo, remote, parsed_refs, p_revs):
+
+    unfi = repo.unfiltered()
+    force = force_push
+
+    fci = discovery.findcommonincoming
+    commoninc = fci(unfi, remote, force=force)
+    common, inc, remoteheads = commoninc
+    fco = discovery.findcommonoutgoing
+    outgoing = fco(unfi, remote, onlyheads=list(p_revs), commoninc=commoninc, force=force)
+
+    if not outgoing.missing:
+        # nothing to push
+        return None
+
+    if not force:
+        discovery.checkheads(unfi, remote, outgoing, remoteheads, True, bool(inc))
+
+    cg = repo.getlocalbundle('push', outgoing)
+
+    unbundle = remote.capable('unbundle')
+    if unbundle:
+        if force:
+            remoteheads = ['force']
+        return remote.unbundle(cg, remoteheads, 'push')
+    else:
+        return remote.addchangegroup(cg, 'push', repo.url())
+
+def push(repo, remote, parsed_refs, p_revs):
+    if not remote.canpush():
+        print "error cannot push"
+
+    if not p_revs:
+        # nothing to push
+        return
+
+    lock = None
+    unbundle = remote.capable('unbundle')
+    if not unbundle:
+        lock = remote.lock()
+    try:
+        ret = push_unsafe(repo, remote, parsed_refs, p_revs)
+    finally:
+        if lock is not None:
+            lock.release()
+
+    return ret
+
 def do_export(parser):
     global parsed_refs, bmarks, peer
 
@@ -906,7 +954,7 @@ def do_export(parser):
             continue
 
     if peer:
-        parser.repo.push(peer, force=force_push, newbranch=True, revs=list(p_revs))
+        push(parser.repo, peer, parsed_refs, p_revs)
 
         # update remote bookmarks
         remote_bmarks = peer.listkeys('bookmarks')
-- 
1.8.3.rc1.579.g184e698
Previous: Felipe ContrerasNext: Felipe Contreras
Message 42 of 50 in “remote-hg: fixes for next”
  1. 00/47 remote-hg: fixes for nextFelipe Contreras, May 14, 2013
  2. 01/47 remote-hg: trivial cleanupsFelipe Contreras, May 14, 2013
  3. 02/47 remote-hg: get rid of unused exception checksFelipe Contreras, May 14, 2013
  4. 03/47 remote-hg: enable track-branches in hg-git modeFelipe Contreras, May 14, 2013
  5. 04/47 remote-hg: add new get_config_bool() helperFelipe Contreras, May 14, 2013
  6. 05/47 remote-hg: fix new branch creationFelipe Contreras, May 14, 2013
  7. 06/47 remote-hg: disable forced push by defaultFelipe Contreras, May 14, 2013
  8. 07/47 remote-hg: don't push fake 'master' bookmarkFelipe Contreras, May 14, 2013
  9. 08/47 remote-hg: update bookmarks when pullingFelipe Contreras, May 14, 2013
  10. 09/47 remote-hg: test: be a little more quietFelipe Contreras, May 14, 2013
  11. 10/47 remote-hg: trivial reorganizationFelipe Contreras, May 14, 2013
  12. 11/47 remote-helpers: test: cleanup white-spacesFelipe Contreras, May 14, 2013
  13. 12/47 remote-helpers: test: cleanup styleFelipe Contreras, May 14, 2013
  14. 13/47 remote-helpers: tests: general improvementsFelipe Contreras, May 14, 2013
  15. 14/47 remote-helpers: test: simplify remote URLsFelipe Contreras, May 14, 2013
  16. 15/47 remote-hg: test: simplify previous branch checkoutFelipe Contreras, May 14, 2013
  17. 16/47 remote-hg: load all extensionsFelipe Contreras, May 14, 2013
  18. Eric SunshineMay 14, 2013
  19. 17/47 remote-hg: use a shared repository storeFelipe Contreras, May 14, 2013
  20. 18/47 remote-hg: shuffle some codeFelipe Contreras, May 14, 2013
  21. 19/47 remote-hg: improve node traversingFelipe Contreras, May 14, 2013
  22. 20/47 remote-hg: add version checks to the marksFelipe Contreras, May 14, 2013
  23. 21/47 remote-hg: switch from revisions to SHA-1 noteidsFelipe Contreras, May 14, 2013
  24. 22/47 remote-hg: upgrade version 1 marksFelipe Contreras, May 14, 2013
  25. 23/47 remote-hg: ensure remote rebasing worksFelipe Contreras, May 14, 2013
  26. 24/47 remote-hg: trivial cleanupsFelipe Contreras, May 14, 2013
  27. 25/47 remote-hg: improve progress calculationFelipe Contreras, May 14, 2013
  28. 26/47 remote-hg: always point HEAD to masterFelipe Contreras, May 14, 2013
  29. 27/47 remote-bzr: simplify test checksFelipe Contreras, May 14, 2013
  30. 28/47 remote-hg: add check_bookmark() test helperFelipe Contreras, May 14, 2013
  31. 29/47 remote-hg: add remote testsFelipe Contreras, May 14, 2013
  32. 30/47 remote-hg: add test to push new bookmarkFelipe Contreras, May 14, 2013
  33. 31/47 remote-hg: add test for diverged pushFelipe Contreras, May 14, 2013
  34. 32/47 remote-hg: add test for bookmark divergeFelipe Contreras, May 14, 2013
  35. 33/47 remote-hg: add test for new bookmark specialFelipe Contreras, May 14, 2013
  36. Eric SunshineMay 14, 2013
  37. 34/47 remote-hg: add test for big pushFelipe Contreras, May 14, 2013
  38. 35/47 remote-hg: add test for failed double pushFelipe Contreras, May 14, 2013
  39. 36/47 remote-hg: reorganize bookmark handlingFelipe Contreras, May 14, 2013
  40. 37/47 remote-hg: force remote bookmark push selectivelyFelipe Contreras, May 14, 2013
  41. 38/47 remote-hg: only update necessary revisionsFelipe Contreras, May 14, 2013
  42. 39/47 remote-hg: implement custom push()Felipe Contreras, May 14, 2013
  43. 40/47 remote-hg: implement custom checkheads()Felipe Contreras, May 14, 2013
  44. 41/47 remote-hg: pass around revision refsFelipe Contreras, May 14, 2013
  45. 42/47 remote-hg: check diverged bookmarksFelipe Contreras, May 14, 2013
  46. 43/47 remote-hg: simplify branch_tip()Felipe Contreras, May 14, 2013
  47. 44/47 remote-hg: improve branch listingFelipe Contreras, May 14, 2013
  48. 45/47 remote-hg: use remote 'default' not local oneFelipe Contreras, May 14, 2013
  49. 46/47 remote-hg: improve lightweight tag authorFelipe Contreras, May 14, 2013
  50. 47/47 remote-hg: remove files before modificationsFelipe Contreras, May 14, 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.