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

Re: [PATCH v5 15/15] fast-export: don't handle uninteresting refs

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Nov 21, 2012, 03:03 UTC
Message-ID
<CAMP44s0UhTm7rRAQOHbwnv682xWCmD2JKQJBRB7+pXmzBUPqOw@mail.gmail.com>
In-Reply-To
<7vd2z7rj3y.fsf@alter.siamese.dyndns.org>
On Tue, Nov 20, 2012 at 11:43 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 11 quoted lines
> Felipe Contreras <felipe.contreras@gmail.com> writes:
>
>> Of course, transport-helper shouldn't even be specifying the negative
>> (^) refs, but that's another story.
>
> Hrm, I am not sure I understand what you mean by this.
>
> How should it be telling the fast-export up to what commit the
> receiving end should already have the history for (hence they do not
> need to be sent)?  Or are you advocating to re-send the entire
> history down to the root commit every time?
No, it would not re-send the whole history, that's what marks are for.

And right now it doesn't exactly which was the last commit. Let's suppose the remote helper has a refspec like this:

refs/heads/*:refs/hg/origin/heads/*
1) What happens the first time you push?

5203a268546295ebd895fd87522217ef53bd3313 refs/heads/master 5203a268546295ebd895fd87522217ef53bd3313 refs/remotes/tmp/master

Notice how the remote ref is updated correctly, but it's not the remote helper refspec, so the next time you push, you will from root.

It's only when you fetch that you get the refspec'ed refs:

5203a268546295ebd895fd87522217ef53bd3313 refs/heads/master 5203a268546295ebd895fd87522217ef53bd3313 refs/hg/tmp/heads/master 5203a268546295ebd895fd87522217ef53bd3313 refs/remotes/tmp/master

So, there's already a mismatch.
2) What happens when you have no marks?

You get something like: reset refs/heads/heads from :0

Which is totally useless. Somebody proposed a patch that would replace the :0 with a git sha-1, but that is equally useless for a remote helper: we need a hg ref id, or a bzr id, or whatever, and no, there's mapping between git sha-1's and hg ref ids, there's only git->mark mark->hg, without marks, there's no way to map the git id to the hg id.

3) What happens when you have a refspec like this?
*:*

Now nothing works, because we would be requesting ^refs/heads/master refs/heads/master.

And according to the documentation, this is the default when no refspec is used, which is not true.

4) What happens when there's no refspec at all.
Now it's even worst; nothing gets done at all:
if (!data->refspecs)
	continue;
I documented all this breakages in this patch:
http://article.gmane.org/gmane.comp.version-control.git/209365

not ok 10 - push new branch with old:new refspec # TODO known breakage ok 11 - cloning without refspec ok 12 - pulling without refspecs not ok 13 - pushing without refspecs # TODO known breakage not ok 14 - pulling with straight refspec # TODO known breakage not ok 15 - pushing with straight refspec # TODO known breakage not ok 16 - pulling without marks # TODO known breakage not ok 17 - pushing without marks # TODO known breakage

And if you apply this patch:
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -750,6 +750,7 @@ static int push_refs_with_export(struct transport
*transport,
        struct helper_data *data = transport->data;
        struct string_list revlist_args = STRING_LIST_INIT_NODUP;
        struct strbuf buf = STRBUF_INIT;
+       struct remote *remote = transport->remote;

        helper = get_helper(transport);

@@ -761,22 +762,23 @@ static int push_refs_with_export(struct
transport *transport,
                char *private;
                unsigned char sha1[20];

-               if (!data->refspecs)
+               if (ref->deletion)
+                       die("remote-helpers do not support ref deletion");
+
+               if (!ref->peer_ref)
+                       continue;
+
+               string_list_append(&revlist_args, ref->peer_ref->name);
+
+               if (!data->import_marks)
                        continue;
-               private = apply_refspecs(data->refspecs,
data->refspec_nr, ref->name);
+
+               private = apply_refspecs(remote->fetch,
remote->fetch_refspec_nr, ref->name);
                if (private && !get_sha1(private, sha1)) {
                        strbuf_addf(&buf, "^%s", private);
                        string_list_append(&revlist_args,
strbuf_detach(&buf, NULL));
                }
                free(private);
-
-               if (ref->deletion) {
-                       die("remote-helpers do not support ref deletion");
-               }
-
-               if (ref->peer_ref)
-                       string_list_append(&revlist_args, ref->peer_ref->name);
-
        }

        if (get_exporter(transport, &exporter, &revlist_args))

ok 13 - pushing without refspecs # TODO known breakage
ok 14 - pulling with straight refspec # TODO known breakage
ok 15 - pushing with straight refspec # TODO known breakage
ok 16 - pulling without marks # TODO known breakage
ok 17 - pushing without marks # TODO known breakage

Cheers.
-- 
Felipe Contreras
Previous: Junio C HamanoNext: Jonathan Nieder
Message 42 of 65 in “fast-export and remote-testgit improvements”
  1. 00/15 fast-export and remote-testgit improvementsFelipe Contreras, Nov 11, 2012
  2. 01/15 fast-export: avoid importing blob marksFelipe Contreras, Nov 11, 2012
  3. Torsten BögershausenNov 11, 2012
  4. Jeff KingNov 11, 2012
  5. Junio C HamanoNov 12, 2012
  6. Felipe ContrerasNov 11, 2012
  7. 02/15 remote-testgit: fix direction of marksFelipe Contreras, Nov 11, 2012
  8. Max HornNov 11, 2012
  9. 03/15 remote-helpers: fix failure messageFelipe Contreras, Nov 11, 2012
  10. 04/15 Rename git-remote-testgit to git-remote-testpyFelipe Contreras, Nov 11, 2012
  11. 05/15 Add new simplified git-remote-testgitFelipe Contreras, Nov 11, 2012
  12. Max HornNov 11, 2012
  13. Junio C HamanoNov 21, 2012
  14. Felipe ContrerasNov 21, 2012
  15. 06/15 remote-testgit: get rid of non-local functionalityFelipe Contreras, Nov 11, 2012
  16. Junio C HamanoNov 21, 2012
  17. Felipe ContrerasNov 21, 2012
  18. 07/15 remote-testgit: remove irrelevant testFelipe Contreras, Nov 11, 2012
  19. 08/15 remote-testgit: cleanup testsFelipe Contreras, Nov 11, 2012
  20. Junio C HamanoNov 21, 2012
  21. Felipe ContrerasNov 22, 2012
  22. 09/15 remote-testgit: exercise more featuresFelipe Contreras, Nov 11, 2012
  23. Junio C HamanoNov 21, 2012
  24. Felipe ContrerasNov 21, 2012
  25. 10/15 remote-testgit: report success after an importFelipe Contreras, Nov 11, 2012
  26. 11/15 remote-testgit: make clear the 'done' featureFelipe Contreras, Nov 11, 2012
  27. Max HornNov 11, 2012
  28. Felipe ContrerasNov 11, 2012
  29. Max HornNov 12, 2012
  30. Jonathan NiederNov 12, 2012
  31. Felipe ContrerasNov 12, 2012
  32. Junio C HamanoNov 21, 2012
  33. Sverre RabbelierNov 21, 2012
  34. 12/15 fast-export: trivial cleanupFelipe Contreras, Nov 11, 2012
  35. 13/15 fast-export: fix comparison in testsFelipe Contreras, Nov 11, 2012
  36. 14/15 fast-export: make sure updated refs get updatedFelipe Contreras, Nov 11, 2012
  37. Max HornNov 11, 2012
  38. Junio C HamanoNov 21, 2012
  39. 15/15 fast-export: don't handle uninteresting refsFelipe Contreras, Nov 11, 2012
  40. Felipe ContrerasNov 12, 2012
  41. Junio C HamanoNov 20, 2012
  42. Felipe ContrerasNov 21, 2012
  43. Jonathan NiederNov 21, 2012
  44. Felipe ContrerasNov 21, 2012
  45. Junio C HamanoNov 21, 2012
  46. Felipe ContrerasNov 21, 2012
  47. Felipe ContrerasNov 21, 2012
  48. Jeff KingNov 21, 2012
  49. Felipe ContrerasNov 22, 2012
  50. Junio C HamanoNov 26, 2012
  51. Felipe ContrerasNov 26, 2012
  52. Johannes SchindelinNov 26, 2012
  53. Junio C HamanoNov 26, 2012
  54. Felipe ContrerasNov 26, 2012
  55. Johannes SchindelinNov 26, 2012
  56. Sverre RabbelierNov 26, 2012
  57. Junio C HamanoNov 26, 2012
  58. Max HornNov 21, 2012
  59. Felipe ContrerasNov 22, 2012
  60. Junio C HamanoNov 21, 2012
  61. Felipe ContrerasNov 22, 2012
  62. Felipe ContrerasNov 24, 2012
  63. Felipe ContrerasNov 21, 2012
  64. Junio C HamanoNov 21, 2012
  65. Felipe ContrerasNov 22, 2012

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.