From 37958be79227dc01f965993174af42672fc6756c Mon Sep 17 00:00:00 2001 From: Rene Scharfe Date: Sun, 18 Jun 2006 12:57:56 +0200 Subject: [PATCH 1/3] git-tar-tree: Simplify write_trailer() We can write the trailer in one or at most two steps; it will always fit within two blocks. With the last caller of get_record() gone we can get rid of it. Signed-off-by: Rene Scharfe Signed-off-by: Junio C Hamano --- builtin-tar-tree.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/builtin-tar-tree.c b/builtin-tar-tree.c index f6310b9032..f646c5bd6e 100644 --- a/builtin-tar-tree.c +++ b/builtin-tar-tree.c @@ -47,31 +47,6 @@ static void write_if_needed(void) } } -/* acquire the next record from the buffer; user must call write_if_needed() */ -static char *get_record(void) -{ - char *p = block + offset; - memset(p, 0, RECORDSIZE); - offset += RECORDSIZE; - return p; -} - -/* - * The end of tar archives is marked by 1024 nul bytes and after that - * follows the rest of the block (if any). - */ -static void write_trailer(void) -{ - get_record(); - write_if_needed(); - get_record(); - write_if_needed(); - while (offset) { - get_record(); - write_if_needed(); - } -} - /* * queues up writes, so that all our write(2) calls write exactly one * full block; pads writes to RECORDSIZE @@ -107,6 +82,21 @@ static void write_blocked(void *buf, unsigned long size) write_if_needed(); } +/* + * The end of tar archives is marked by 2*512 nul bytes and after that + * follows the rest of the block (if any). + */ +static void write_trailer(void) +{ + int tail = BLOCKSIZE - offset; + memset(block + offset, 0, tail); + reliable_write(block, BLOCKSIZE); + if (tail < 2 * RECORDSIZE) { + memset(block, 0, offset); + reliable_write(block, BLOCKSIZE); + } +} + static void strbuf_append_string(struct strbuf *sb, const char *s) { int slen = strlen(s); From 9236cdd488c26ec09e23adec34f64fd6fca3dc7c Mon Sep 17 00:00:00 2001 From: Rene Scharfe Date: Sun, 18 Jun 2006 12:57:59 +0200 Subject: [PATCH 2/3] git-tar-tree: documentation update * add example on how to avoid adding a global extended pax header * don't mention linux anymore, use git itself as an example instead * update to v1.4.0 ;-) * append missing :: to the examples Signed-off-by: Rene Scharfe Signed-off-by: Junio C Hamano --- Documentation/git-tar-tree.txt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Documentation/git-tar-tree.txt b/Documentation/git-tar-tree.txt index 831537b6ff..f2675c4193 100644 --- a/Documentation/git-tar-tree.txt +++ b/Documentation/git-tar-tree.txt @@ -39,19 +39,24 @@ OPTIONS Examples -------- -git tar-tree HEAD | (cd /var/tmp/ && mkdir junk && tar Cxf junk -):: +git tar-tree HEAD junk | (cd /var/tmp/ && tar xf -):: Create a tar archive that contains the contents of the latest commit on the current branch, and extracts it in `/var/tmp/junk` directory. -git tar-tree v2.6.17 linux-2.6.17 | gzip >linux-2.6.17.tar.gz +git tar-tree v1.4.0 git-1.4.0 | gzip >git-1.4.0.tar.gz:: - Create a tarball for v2.6.17 release. + Create a tarball for v1.4.0 release. -git tar-tree --remote=example.com:git.git v0.99 >git-0.99.tar +git tar-tree v1.4.0{caret}\{tree\} git-1.4.0 | gzip >git-1.4.0.tar.gz:: - Get a tarball v0.99 from example.com. + Create a tarball for v1.4.0 release, but without a + global extended pax header. + +git tar-tree --remote=example.com:git.git v1.4.0 >git-1.4.0.tar:: + + Get a tarball v1.4.0 from example.com. Author ------ From 6698060c15e837babb3b80f980bbed290934a692 Mon Sep 17 00:00:00 2001 From: Rene Scharfe Date: Sun, 18 Jun 2006 12:58:01 +0200 Subject: [PATCH 3/3] git-tar-tree: no more void pointer arithmetic Noticed by Florian Forster: Use a char pointer when adding offsets, because void pointer arithmetic is a GNU extension. Const'ify the function arguments while we're at it. Signed-off-by: Rene Scharfe Signed-off-by: Junio C Hamano --- builtin-tar-tree.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/builtin-tar-tree.c b/builtin-tar-tree.c index f646c5bd6e..39a61b6293 100644 --- a/builtin-tar-tree.c +++ b/builtin-tar-tree.c @@ -22,8 +22,10 @@ static unsigned long offset; static time_t archive_time; /* tries hard to write, either succeeds or dies in the attempt */ -static void reliable_write(void *buf, unsigned long size) +static void reliable_write(const void *data, unsigned long size) { + const char *buf = data; + while (size > 0) { long ret = xwrite(1, buf, size); if (ret < 0) { @@ -51,8 +53,9 @@ static void write_if_needed(void) * queues up writes, so that all our write(2) calls write exactly one * full block; pads writes to RECORDSIZE */ -static void write_blocked(void *buf, unsigned long size) +static void write_blocked(const void *data, unsigned long size) { + const char *buf = data; unsigned long tail; if (offset) {