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

Re: [PATCH 03/19] t5800: document some non-functional parts of remote helpers

From
Jeff King <peff@peff.net>
Date
Jun 10, 2011, 01:18 UTC
Message-ID
<20110610011858.GA12256@sigill.intra.peff.net>
In-Reply-To
<20110608192850.GF27715@elie>
On Wed, Jun 08, 2011 at 02:28:51PM -0500, Jonathan Nieder wrote:
Show 10 quoted lines
> > but we have no way of
> > communicating to fast-export that this name mapping is
> > happening.
> 
> It's not just name mapping, no?  E.g., I could try
> 
> 	git push testgit::/path/to/repo $(git rev-parse HEAD):new
> 
> So I think the current implementation of "export" by testgit
> is just wrong. ;-)

Yeah, it's the same issue. We have no way of communicating the name of the right-hand ref at all to a helper, aside from asking fast-export to munge the refname in its output stream. But we have no way of telling fast-export that even though we asked for "foo", it needs to write the result into "bar" (and potentially _also_ into "foo", if it's a ref found on the RHS of a different refspec).

Show 7 quoted lines
> This seems like a reasonable solution.  One way would be to teach
> fast-export about refspecs; another way would be to set up refs in a
> private namespace and then munge the stream that fast-export spits out
> before passing it back to the transport-helper; another (more ugly and
> hackish) way would be to set up a private repository with the real
> repository set up as an alternate, put the appropriate refs there, and
> point fast-export to that.

Munging the stream is a little tricky. We have to correctly parse the stream and not just do something hack-ish like sed (which is what git-remote-testgit does, but that's OK, because it's a hack-ish test script).

But we also have to take care to handle duplicates. So exporting "refs/heads/foo:refs/heads/bar" would mean that we rewrite all of refs/heads/foo into refs/heads/bar on commit lines. But two refspecs like "refs/heads/foo:refs/heads/bar refs/heads/foo:refs/heads/foo" mean we must write all of the commit lines as "foo" and then do a "reset" of bar to foo at the end (at least this is what fast-export already does). But we also need to handle criss-crosses, like:

  refs/heads/foo:refs/heads/bar refs/heads/baz:refs/heads/foo

In that case we want change all commit lines for "foo" to "bar", but also all for "baz" to "foo".

So implementation-wise, the simplest way is if you can give each tip a name, and then at the end assign all of the tips to refnames (this is more or less what regular push does internally, of course).

I'm not too familiar with the fast-import protocol or what other systems' fast importers are capable of. Is it OK to just make a bunch of commits with marks, and then at the end do our resets? That would make the problem much simpler, I think.

> Anyway, I don't think this should be in the commit message for the new
> test which doesn't even know about the remote helper protocol. :)

Yeah, maybe not. I wanted to stick the discussion somewhere, and since I never actually fixed this bug, there wasn't another relevant commit. :)

Show 17 quoted lines
> > --- 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' '
> 
> Side note: this repeated PYTHON_24 implementation detail as a
> prerequisite feels wrong.  Would it make sense to do something like
> 
> 	if test_have_prereq PYTHON_24
> 	then
> 		test_set_prereq REMOTE_TESTGIT
> 	fi
> 
> at the start and use that?

Really, I think you could just exit early if PYTHON_24 isn't set, as all of the tests require it. If we end up with other non-python helper tests, they will probably go in a separate script anyway.

Show 10 quoted lines
> > +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
> > +'
> 
> It would also be interesting to test tag pushes and pushes by object
> name.
> [examples]
Agreed.
-Peff
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 12 of 54 in “remote-helper improvements”
  1. 00/19 remote-helper improvementsSverre Rabbelier, Jun 8, 2011
  2. 01/19 transport-helper: fix minor leak in push_refs_with_exportSverre Rabbelier, Jun 8, 2011
  3. Jeff KingJun 8, 2011
  4. Sverre RabbelierJun 8, 2011
  5. 02/19 t5800: factor out some ref testsSverre Rabbelier, Jun 8, 2011
  6. 03/19 t5800: document some non-functional parts of remote helpersSverre Rabbelier, Jun 8, 2011
  7. Jonathan NiederJun 8, 2011
  8. Jonathan NiederJun 8, 2011
  9. Sverre RabbelierJun 8, 2011
  10. Sverre RabbelierJun 8, 2011
  11. Sverre RabbelierJun 9, 2011
  12. Jeff KingJun 10, 2011
  13. 04/19 teach remote-testgit to import non-HEAD refsSverre Rabbelier, Jun 8, 2011
  14. Jonathan NiederJun 8, 2011
  15. Sverre RabbelierJun 8, 2011
  16. Jeff KingJun 8, 2011
  17. Junio C HamanoJun 8, 2011
  18. Sverre RabbelierJun 9, 2011
  19. 05/19 transport-helper: don't feed bogus refs to export pushSverre Rabbelier, Jun 8, 2011
  20. 06/19 git_remote_helpers: push all refs during a non-local exportSverre Rabbelier, Jun 8, 2011
  21. Jonathan NiederJun 8, 2011
  22. Jeff KingJun 8, 2011
  23. Sverre RabbelierJun 8, 2011
  24. Jonathan NiederJun 9, 2011
  25. Sverre RabbelierJun 9, 2011
  26. Jonathan NiederJun 9, 2011
  27. Sverre RabbelierJun 9, 2011
  28. Jeff KingJun 10, 2011
  29. 07/19 remote-curl: accept empty line as terminatorSverre Rabbelier, Jun 8, 2011
  30. 08/19 git-remote-testgit: only push for non-local repositoriesSverre Rabbelier, Jun 8, 2011
  31. 09/19 git-remote-testgit: fix error handlingSverre Rabbelier, Jun 8, 2011
  32. 10/19 fast-import: introduce 'done' commandSverre Rabbelier, Jun 8, 2011
  33. Jonathan NiederJun 8, 2011
  34. Sverre RabbelierJun 8, 2011
  35. 11/19 fast-export: support done featureSverre Rabbelier, Jun 8, 2011
  36. 12/19 transport-helper: factor out push_update_refs_statusSverre Rabbelier, Jun 8, 2011
  37. 13/19 transport-helper: check status code of finish_commandSverre Rabbelier, Jun 8, 2011
  38. 14/19 transport-helper: use the new done feature where possibleSverre Rabbelier, Jun 8, 2011
  39. 15/19 transport-helper: update ref status after push with exportSverre Rabbelier, Jun 8, 2011
  40. Jonathan NiederJun 9, 2011
  41. Sverre RabbelierJun 9, 2011
  42. 16/19 transport-helper: change import semanticsSverre Rabbelier, Jun 8, 2011
  43. Jonathan NiederJun 8, 2011
  44. Sverre RabbelierJun 8, 2011
  45. 17/19 transport-helper: export is no longer always the last commandSverre Rabbelier, Jun 8, 2011
  46. Junio C HamanoJun 9, 2011
  47. Sverre RabbelierJun 9, 2011
  48. Jonathan NiederJun 9, 2011
  49. Sverre RabbelierJun 9, 2011
  50. Junio C HamanoJun 13, 2011
  51. 18/19 transport-helper: Use capname for gitdir capability tooSverre Rabbelier, Jun 8, 2011
  52. Jonathan NiederJun 8, 2011
  53. Sverre RabbelierJun 8, 2011
  54. 19/19 transport-helper: implement marks location as capabilitySverre Rabbelier, Jun 8, 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.