Thread (24 messages) flat view 24 messages, 7 authors, 2016-06-15

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

From: Shawn O. Pearce <hidden>
Date: 2016-06-15 22:43:44
Subsystem: documentation, the rest · Maintainers: Jonathan Corbet, Linus Torvalds

Adam Roben [off-list ref] wrote:
Shawn O. Pearce wrote:
quoted
Adam Roben [off-list ref] wrote:
 
quoted
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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help