diff options
author | Junio C Hamano <junkio@cox.net> | 2006-06-18 04:20:50 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-18 04:20:50 -0700 |
commit | 94b9e07d05325e49936a0bc90ed5b177c3e9f215 (patch) | |
tree | bab96837f92b0886c86abf6cac34819933347a66 | |
parent | Merge branch 'yl/build' into next (diff) | |
parent | git-tar-tree: no more void pointer arithmetic (diff) | |
download | tgif-94b9e07d05325e49936a0bc90ed5b177c3e9f215.tar.xz |
Merge branch 'master' into next
* master:
git-tar-tree: no more void pointer arithmetic
git-tar-tree: documentation update
git-tar-tree: Simplify write_trailer()
-rw-r--r-- | Documentation/git-tar-tree.txt | 15 | ||||
-rw-r--r-- | builtin-tar-tree.c | 47 |
2 files changed, 30 insertions, 32 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 ------ diff --git a/builtin-tar-tree.c b/builtin-tar-tree.c index f6310b9032..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) { @@ -47,37 +49,13 @@ 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 */ -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) { @@ -107,6 +85,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); |