git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 3/3] mimic unpack-objects when --stdin is used with index-pack
@ 2006-10-26  3:31 Nicolas Pitre
  2006-10-26  7:55 ` Junio C Hamano
  0 siblings, 1 reply; 3+ messages in thread
From: Nicolas Pitre @ 2006-10-26  3:31 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

It appears that git-unpack-objects writes the last part of the input
buffer to stdout after the pack has been parsed.  This looks a bit
suspicious since the last fill() might have filled the buffer up to
the 4096 byte limit and more data might still be pending on stdin,
but since this is about being a drop-in replacement for unpack-objects
let's simply duplicate the same behavior for now.

Signed-off-by: Nicolas Pitre <nico@cam.org>
---
 index-pack.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/index-pack.c b/index-pack.c
index 2046b37..7f7dc5d 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -456,6 +456,7 @@ static void parse_pack_objects(unsigned
 	SHA1_Final(sha1, &input_ctx);
 	if (hashcmp(fill(20), sha1))
 		die("pack is corrupted (SHA1 mismatch)");
+	use(20);
 
 	/* If input_fd is a file, we should have reached its end now. */
 	if (fstat(input_fd, &st))
@@ -765,6 +766,18 @@ static void final(const char *final_pack
 		if (err)
 			die("error while closing pack file: %s", strerror(errno));
 		chmod(curr_pack_name, 0444);
+
+		/*
+		 * Let's just mimic git-unpack-objects here and write
+		 * the last part of the buffer to stdout.
+		 */
+		while (input_len) {
+			err = xwrite(1, input_buffer + input_offset, input_len);
+			if (err <= 0)
+				break;
+			input_len -= err;
+			input_offset += err;
+		}
 	}
 
 	if (final_pack_name != curr_pack_name) {
@@ -863,7 +876,6 @@ int main(int argc, char **argv)
 			    nr_deltas - nr_resolved_deltas);
 	} else {
 		/* Flush remaining pack final 20-byte SHA1. */
-		use(20);
 		flush();
 	}
 	free(deltas);
@@ -872,7 +884,8 @@ int main(int argc, char **argv)
 	free(objects);
 	free(index_name_buf);
 
-	printf("%s\n", sha1_to_hex(sha1));
+	if (!from_stdin)
+		printf("%s\n", sha1_to_hex(sha1));
 
 	return 0;
 }
-- 
1.4.3.3.g10cf-dirty

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 3/3] mimic unpack-objects when --stdin is used with index-pack
  2006-10-26  3:31 [PATCH 3/3] mimic unpack-objects when --stdin is used with index-pack Nicolas Pitre
@ 2006-10-26  7:55 ` Junio C Hamano
  2006-10-26 13:46   ` Nicolas Pitre
  0 siblings, 1 reply; 3+ messages in thread
From: Junio C Hamano @ 2006-10-26  7:55 UTC (permalink / raw)
  To: Nicolas Pitre; +Cc: git

Nicolas Pitre <nico@cam.org> writes:

> It appears that git-unpack-objects writes the last part of the input
> buffer to stdout after the pack has been parsed.  This looks a bit
> suspicious since the last fill() might have filled the buffer up to
> the 4096 byte limit and more data might still be pending on stdin,
> but since this is about being a drop-in replacement for unpack-objects
> let's simply duplicate the same behavior for now.

This seems to break t5300 when applied on top of everything
else.  The other two numbered patches are Ok.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 3/3] mimic unpack-objects when --stdin is used with index-pack
  2006-10-26  7:55 ` Junio C Hamano
@ 2006-10-26 13:46   ` Nicolas Pitre
  0 siblings, 0 replies; 3+ messages in thread
From: Nicolas Pitre @ 2006-10-26 13:46 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On Thu, 26 Oct 2006, Junio C Hamano wrote:

> Nicolas Pitre <nico@cam.org> writes:
> 
> > It appears that git-unpack-objects writes the last part of the input
> > buffer to stdout after the pack has been parsed.  This looks a bit
> > suspicious since the last fill() might have filled the buffer up to
> > the 4096 byte limit and more data might still be pending on stdin,
> > but since this is about being a drop-in replacement for unpack-objects
> > let's simply duplicate the same behavior for now.
> 
> This seems to break t5300 when applied on top of everything
> else.  The other two numbered patches are Ok.

Yeah.... actually the problem appeared to me in my sleep! (Worrisome 
isn't it?)

So you just need to amend this patch with:

diff --git a/index-pack.c b/index-pack.c
index 7f7dc5d..5c747a6 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -461,7 +461,7 @@ static void parse_pack_objects(unsigned
 	/* If input_fd is a file, we should have reached its end now. */
 	if (fstat(input_fd, &st))
 		die("cannot fstat packfile: %s", strerror(errno));
-	if (S_ISREG(st.st_mode) && st.st_size != consumed_bytes + 20)
+	if (S_ISREG(st.st_mode) && st.st_size != consumed_bytes)
 		die("pack has junk at the end");
 
 	if (!nr_deltas)



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2006-10-26 13:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-26  3:31 [PATCH 3/3] mimic unpack-objects when --stdin is used with index-pack Nicolas Pitre
2006-10-26  7:55 ` Junio C Hamano
2006-10-26 13:46   ` Nicolas Pitre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).