Subject: Re: [PATCH 7/9] git-hash-object: Add --stdin-paths option

From: "Shawn O. Pearce" <[email-masked]>
Date: Tue, 23 Oct 2007 02:10:22 -0400

Adam Roben <[email-masked]> wrote:
> Shawn O. Pearce wrote:
> >Adam Roben <[email-masked]> wrote:
> >  
> >>This allows multiple paths to be specified on stdin.
> >
> >git-fast-import wasn't suited to the task?
> 
> I actually considered using fast-import for the whole shebang, but 
> decided that I don't yet understand the workings and structure of 
> git-svn well enough to make such a big change.
> 
> git-svn uses git-hash-object to both determine a file's hash and insert 
> it into the index in one go -- can fast-import do this? Or will it just 
> put it in the index and not give you the hash back? The latter was my 
> impression.

It doesn't currently give you the hash back.  You can sort of get
to it by marking the blob then using the 'checkpoint' command to
dump the marks to a file, which you can read in.  Not good.

It probably wouldn't be very difficult to give fast-import a way
to dump marks back on stdout as they are assigned.  So long as the
frontend either locksteps with fast-import or is willing to monitor
it with a select/poll type of arrangement and read from stdout as
soon as its ready.

Probably a 5 line code change to fast-import.  Like this.  Only Git
won't recognize that object SHA-1 as its in a packfile that has
no index.  You'd need to 'checkpoint' to flush the object out, or
just use all of fast-import for the processing.  So yea, I guess
I can see now how its not suited to this.

--8>--
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index d511967..7fd8b2c 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -67,6 +67,10 @@ OPTIONS
 	at checkpoint (or completion) the same path can also be
 	safely given to \--import-marks.
 
+--export-marks-to-stdout::
+	Dumps marks to stdout as soon as they are assigned.
+	Marks are written one per line as `:markid SHA-1`.
+
 --import-marks=<file>::
 	Before processing any input, load the marks specified in
 	<file>.  The input file must exist, must be readable, and
diff --git a/fast-import.c b/fast-import.c
index 6f888f6..619ed05 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -272,6 +272,7 @@ struct recent_command
 static unsigned long max_depth = 10;
 static off_t max_packsize = (1LL << 32) - 1;
 static int force_update;
+static int marks_to_stdout;
 
 /* Stats and misc. counters */
 static uintmax_t alloc_count;
@@ -561,6 +562,7 @@ static char *pool_strdup(const char *s)
 
 static void insert_mark(uintmax_t idnum, struct object_entry *oe)
 {
+	uintmax_t orig_idnum = idnum;
 	struct mark_set *s = marks;
 	while ((idnum >> s->shift) >= 1024) {
 		s = pool_calloc(1, sizeof(struct mark_set));
@@ -580,6 +582,8 @@ static void insert_mark(uintmax_t idnum, struct object_entry *oe)
 	if (!s->data.marked[idnum])
 		marks_set_count++;
 	s->data.marked[idnum] = oe;
+	if (marks_to_stdout)
+		printf(":%" PRIuMAX " %s\n", orig_idnum, sha1_to_hex(oe->sha1));
 }
 
 static struct object_entry *find_mark(uintmax_t idnum)
@@ -2294,6 +2298,8 @@ int main(int argc, const char **argv)
 			max_active_branches = strtoul(a + 18, NULL, 0);
 		else if (!prefixcmp(a, "--import-marks="))
 			import_marks(a + 15);
+		else if (!prefixcmp(a, "--export-marks-to-stdout"))
+			marks_to_stdout = 1;
 		else if (!prefixcmp(a, "--export-marks="))
 			mark_file = a + 15;
 		else if (!prefixcmp(a, "--export-pack-edges=")) {

-- 
Shawn.