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

[PATCH 4/8] t5800: document some non-functional parts of remote helpers

From
Jeff King <peff@peff.net>
Date
Jun 7, 2011, 17:20 UTC
Message-ID
<20110607172030.GC22111@sigill.intra.peff.net>
In-Reply-To
<20110607171838.GA21685@sigill.intra.peff.net>

These are all things one might expect to work in a helper that is capable of handling multiple branches (which our testgit helper in theory should be able to do, as it is backed by git). All of these bugs are specific to the import/export codepaths, so they don't affect helpers like git-remote-curl that use fetch/push commands.

The first and fourth tests are about fetching and pushing new refs, and demonstrate bugs in the git_remote_helpers library (so they would be most likely to impact helpers for other VCSs which import/export git).

The second test is about importing multiple refs; it demonstrates a bug in git-remote-testgit, which is mostly for exercising the test code. Therefore it probably doesn't affect anyone in practice.

The third test demonstrates a bug in git's side of the helper code when the upstream has added new refs without us. This could impact git users who use remote helpers to access foreign VCSs.

All of those bugs have fixes later in this series.

The fifth test is the most complex, and does not have a fix in this series. It tests pushing a ref via the export mechanism to a new name on the remote side (i.e., "git push $remote old:new").

The problem is that we push all of the work of generating the export stream onto fast-export, but we have no way of communicating to fast-export that this name mapping is happening. So we tell fast-export to generate a stream with the commits for "old", but we can't tell it to label them all as "new".

There are two possible solutions:
  1. Indicate the mapping to fast-export, so that it can
     generate the "mapped" names. Unfortunately, this is
     somewhat difficult due to the way fast-import is
     implemented. It feeds its revision parameters to the
     regular rev-walking machinery, asking the revision code
     to mark the "source" of each commit. So if fast-export
     sees that we want commits from "refs/heads/old", but
     also that we want to call commits from old as
     "refs/heads/new", it can't distinguish between the
     case of "I want _only_ new, using the commits of old"
     and "I want _both_ old and new, which happen to point
     to the same commits".
     And it's important to distinguish those cases, because
     in one, the remote will update master, and in the
     other, it will not.
     This isn't an insurmountable obstacle, but it's going
     to mean either fast-export has to take on more of the
     revision argument parsing and revwalking
     responsibility, or the revision walker's show_source
     code will have to learn about mapping names.
  2. Indicate the mapping to the remote helper, who can then
     apply the mapping to the results of the export. Right
     now the export remote helper command has no arguments;
     it simply says "hey, I'm going to dump a fast-export
     stream on you". And the remote-helper looks through the
     results of the stream to decide which refs are being
     pushed. This could be extended instead to something
     like:
       export refs/heads/foo
       export refs/heads/old:refs/heads/new
       <blank line>
     which would allow the remote helper to map names as
     appropriate. This a reasonably elegant solution; the
     downside is that it breaks compatibility with existing
     remote helpers.
Signed-off-by: Jeff King <peff@peff.net>
---
 t/t5800-remote-helpers.sh |   47 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh
index 3a37ad0..a10a48d 100755
--- a/t/t5800-remote-helpers.sh
+++ b/t/t5800-remote-helpers.sh
@@ -81,4 +81,51 @@ test_expect_success PYTHON_24 'pushing remote local repo' '
 	compare_refs clone HEAD server HEAD
 '
 
+test_expect_failure PYTHON_24 'fetch new branch' '
+	(cd public &&
+	 git checkout -b new &&
+	 echo content >>file &&
+	 git commit -a -m five &&
+	 git push origin new
+	) &&
+	(cd localclone &&
+	 git fetch origin new
+	) &&
+	compare_refs public HEAD localclone FETCH_HEAD
+'
+
+test_expect_failure PYTHON_24 'fetch multiple branches' '
+	(cd localclone &&
+	 git fetch
+	) &&
+	compare_refs server master localclone refs/remotes/origin/master &&
+	compare_refs server new localclone refs/remotes/origin/new
+'
+
+test_expect_failure PYTHON_24 'push when remote has extra refs' '
+	(cd clone &&
+	 echo content >>file &&
+	 git commit -a -m six &&
+	 git push
+	) &&
+	compare_refs clone master server master
+'
+
+test_expect_failure PYTHON_24 'push new branch by name' '
+	(cd clone &&
+	 git checkout -b new-name  &&
+	 echo content >>file &&
+	 git commit -a -m seven &&
+	 git push origin new-name
+	) &&
+	compare_refs clone HEAD server refs/heads/new-name
+'
+
+test_expect_failure PYTHON_24 'push new branch with old:new refspec' '
+	(cd clone &&
+	 git push origin new-name:new-refspec
+	) &&
+	compare_refs clone HEAD server refs/heads/new-refspec
+'
+
 test_done
-- 
1.7.6.rc0.35.gc40cb
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 32 of 65 in “git clone (ssh://) skips detached HEAD”
  1. Dmitry IvankovJun 1, 2011
  2. Jeff KingJun 1, 2011
  3. Dmitry IvankovJun 1, 2011
  4. Junio C HamanoJun 1, 2011
  5. Jeff KingJun 1, 2011
  6. Jeff KingJun 1, 2011
  7. Jeff KingJun 3, 2011
  8. 1/3 t: add tests for cloning remotes with detached HEADJeff King, Jun 3, 2011
  9. 2/3 consider only branches in guess_remote_headJeff King, Jun 3, 2011
  10. 3/3 clone: always fetch remote HEADJeff King, Jun 3, 2011
  11. Sverre RabbelierJun 3, 2011
  12. Jeff KingJun 3, 2011
  13. Jeff KingJun 3, 2011
  14. Junio C HamanoJun 3, 2011
  15. Jeff KingJun 3, 2011
  16. Sverre RabbelierJun 4, 2011
  17. Jeff KingJun 6, 2011
  18. Junio C HamanoJun 6, 2011
  19. Junio C HamanoJun 6, 2011
  20. Sverre RabbelierJun 6, 2011
  21. Junio C HamanoJun 6, 2011
  22. Jeff KingJun 6, 2011
  23. Sverre RabbelierJun 6, 2011
  24. Jeff KingJun 7, 2011
  25. Sverre RabbelierJun 7, 2011
  26. 0/8 minor import/export remote helper fixesJeff King, Jun 7, 2011
  27. 1/8 transport-helper: fix minor leak in push_refs_with_exportJeff King, Jun 7, 2011
  28. 2/8 git-remote-testgit: exit gracefully after pushJeff King, Jun 7, 2011
  29. Sverre RabbelierJun 7, 2011
  30. 3/8 t5800: factor out some ref testsJeff King, Jun 7, 2011
  31. Sverre RabbelierJun 7, 2011
  32. 4/8 t5800: document some non-functional parts of remote helpersJeff King, Jun 7, 2011
  33. Sverre RabbelierJun 7, 2011
  34. Jeff KingJun 7, 2011
  35. Sverre RabbelierJun 7, 2011
  36. Jeff KingJun 7, 2011
  37. Sverre RabbelierJun 7, 2011
  38. Jeff KingJun 7, 2011
  39. Junio C HamanoJun 8, 2011
  40. Jeff KingJun 9, 2011
  41. Junio C HamanoJun 9, 2011
  42. Jeff KingJun 9, 2011
  43. Sverre RabbelierJun 9, 2011
  44. 5/8 teach remote-testgit to import non-HEAD refsJeff King, Jun 7, 2011
  45. Junio C HamanoJun 8, 2011
  46. Jeff KingJun 9, 2011
  47. 6/8 teach remote-testgit to import multiple refsJeff King, Jun 7, 2011
  48. 7/8 transport-helper: don't feed bogus refs to export pushJeff King, Jun 7, 2011
  49. Sverre RabbelierJun 7, 2011
  50. 8/8 git_remote_helpers: push all refs during a non-local exportJeff King, Jun 7, 2011
  51. Sverre RabbelierJun 7, 2011
  52. Jeff KingJun 7, 2011
  53. Sverre RabbelierJun 7, 2011
  54. Junio C HamanoJun 6, 2011
  55. Jeff KingJun 6, 2011
  56. Jeff KingJun 7, 2011
  57. 1/2 make copy_ref globally availableJeff King, Jun 7, 2011
  58. 2/2 clone: always fetch remote HEADJeff King, Jun 7, 2011
  59. Junio C HamanoJun 7, 2011
  60. Junio C HamanoJun 3, 2011
  61. Jeff KingJun 3, 2011
  62. Jakub NarebskiJun 1, 2011
  63. Jeff KingJun 1, 2011
  64. Jakub NarebskiJun 2, 2011
  65. Jeff KingJun 3, 2011

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.