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

Re: fast-import fails in read-only tree

From
Jeff King <peff@peff.net>
Date
Jan 30, 2016, 05:13 UTC
Message-ID
<20160130051340.GA1677@sigill.intra.peff.net>
In-Reply-To
<jwv7fisxyhz.fsf-monnier+gmane.comp.version-control.git@gnu.org>
On Fri, Jan 29, 2016 at 09:28:44AM -0500, Stefan Monnier wrote:
Show 7 quoted lines
> > The primary goal of fast-import is to write that packfile.  It kind of
> > sounds like you are using the wrong tool for the job.
> 
> Yes, I realize that.  But in some cases it's the best tool available.
> `fast-import' is very close to being a "generic access API" which can be
> used instead of something like libgit.  I think it'd be good to push it
> yet a bit closer.

I'm not sure I agree. Git tries to make its innards available via flexible plumbing commands. If we're not succeeding, I think that should be fixed, rather than trying to shoe-horn an unrelated command to do the job, even if it would be less code.

Show 7 quoted lines
> > Can you elaborate on what you are sending to fast-import (preferably
> > with a concrete example)?
> 
> I'm sending a stream of "progress <foo>; cat-blob <foo>", basically.
> 
> The concrete example is in [BuGit](https://gitlab.com/monnier/bugit),
> see for example https://gitlab.com/monnier/bugit/commit/3678dcb8830a9c79c6f3404d75d63e6dd07bfe4c

You can use custom cat-file formatting to output your "name" strings as part of the same field. IOW, something like:

  git cat-file -p refs/heads/bugit-master:numbers |
  awk '{print $3 " " $4 }' |
  git cat-file --batch="%(rest)" |
  while read number; do
    read id; # assuming blob contents are single-line
    read _junk; # assumes blob ended in its own newline
    $fun "$id" "$number"
  done

That's from a fairly cursory reading of that bugit patch, though, so I might be missing some requirement.

Show 6 quoted lines
> Yes, I switched to using "cat-file --batch" instead, but it's less
> convenient (I can't intersperse ad-hoc info in the output, the way I can
> with "progress" in fast-import) and there are cases where the list of
> files I need to extract cannot be determined without first looking at
> some of those extracted files (I currently have been able to avoid
> this in BuGit, luckily).
I think the example above should handle the "intersperse" thing.

If you're really going to do a lot of interactive back-and-forth access of objects, though, I think you want to set up pipes to cat-file. It's a little tedious to allocate fifos, but something like:

  mkfifo in out
  (exec git cat-file --batch <in >out) &
  exec 8>in
  exec 9<out
  echo $sha >&8
  read mode type size <&9
  read content ;# or read $size, or read until newline
  echo $content >&8 ;# imagine content is another sha to look up
  ...read from &9, etc..

The fifos and numbered descriptors are annoying, but that's shell for you. I suspect using "fast-import" wouldn't be much different.

One feature I do think would be useful (and almost implemented when I added --batch-check=<format>) is a formatter for the object content, with a pretty modifier. I.e., it would be nice to do:

  echo $some_tree |
  git cat-file --batch-check="%(objectsize:pretty) %(contents:pretty)"

to work as the rough equivalent of "git cat-file -p" (but here you could feed multiple trees and get multiple answers).

-Peff
Previous: Stefan MonnierNext: Andreas Schwab
Message 4 of 6 in “fast-import fails in read-only tree”
  1. Stefan MonnierJan 28, 2016
  2. Jeff KingJan 29, 2016
  3. Stefan MonnierJan 29, 2016
  4. Jeff KingJan 30, 2016
  5. Andreas SchwabJan 30, 2016
  6. Stefan MonnierJan 30, 2016

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.