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

Re: Teach git-fetch(1) to use a quarantine directory

From
JTJonathan Tan <jonathantanmy@google.com>
Date
Jul 17, 2023, 23:47 UTC
Message-ID
<20230717234704.1906465-1-jonathantanmy@google.com>
In-Reply-To
<87edl6bx7o.fsf@iotcl.com>
Toon Claes <toon@iotcl.com> writes:
> Hi,
> 
> I've been looking into making git-fetch(1) to use a quarantine
> directory, but I'm a bit stuck on direction.
Thanks for looking into this!
Show 6 quoted lines
> I took git-receive-pack(1) as an example how it uses a quarantine
> directory. It seems it sets the environment variables
> $GIT_OBJECT_DIRECTORY and $GIT_ALTERNATE_OBJECT_DIRECTORIES so the real
> object db is used as an alternative, and a temporary is set as the
> default. Then a sub-process is spawned to uses these. In case of
> git-receive-pack(1), it calls git-unpack-objects(1).

From a reading of the source code, it may call git-unpack-objects or git-index-pack, I think. (unpack() in builtin/receive-pack.c)

> At the moment git-fetch(1) does not spawn any similar subprocess, so if
> we want to take the same approach to use the quarantine, we'll need to
> split up that command.

It calls get_pack() in fetch-pack.c, which actually may call one of the two commands above in the same way. (The calling may happen in various ways. IIRC in fetch protocol v2, get_pack() is invoked directly by git- fetch, whereas in earlier protocol versions, it may be the remote helper that calls git-fetch-pack that invokes this function.)

> But then we run into another problem as well. git-fetch(1) updates
> references, and that is something that's not allowed when using a tmp
> object directory.
execute_commands() in builtin/receive-pack.c has this:
          /*                                                                                                                          
           * Now we'll start writing out refs, which means the objects need                                                           
           * to be in their final positions so that other processes can see them.                                                     
           */                                                                                                                         
          if (tmp_objdir_migrate(tmp_objdir) < 0) {     

which seems to be a solution to the same problem. I think Taylor wrote something similar [1].

[1] https://lore.kernel.org/git/ZLVK5nzVZU48uvYE@nand.local/
Show 6 quoted lines
> As far as I can tell from the code, fetching packs and updating refs is
> heavily intertwined, so I'm not sure this approach is the best way
> forward. So a few questions:
> 
> 1) Does it even make sense to make use git-fetch(1) use a quarantine
>    directory?
I don't know off-hand if this will work, but this sounds promising.
> 2) When making git-fetch(1) use a quarantine directory, what is the
>    recommended way to achieve this? Is this by calling a subprocess?
>    Maybe git-fetch-pack(1)?

I also don't know off-hand if this will work, but replicating what git- receive-pack does makes sense to me.

Previous: Patrick SteinhardtNext: Junio C Hamano
Message 4 of 5 in “Teach git-fetch(1) to use a quarantine directory”
  1. Toon ClaesJul 17, 2023
  2. Taylor BlauJul 17, 2023
  3. Patrick SteinhardtJul 19, 2023
  4. Jonathan TanJul 17, 2023
  5. Junio C HamanoJul 17, 2023

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.