mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Andy Whitcroft](/assets/img/avatar_default.png)
We have a number of badly checked write() calls. Often we are expecting write() to write exactly the size we requested or fail, this fails to handle interrupts or short writes. Switch to using the new write_in_full(). Otherwise we at a minimum need to check for EINTR and EAGAIN, where this is appropriate use xwrite(). Note, the changes to config handling are much larger and handled in the next patch in the sequence. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
91 lines
2.1 KiB
C
91 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2005, 2006 Rene Scharfe
|
|
*/
|
|
#include "cache.h"
|
|
#include "commit.h"
|
|
#include "tar.h"
|
|
#include "builtin.h"
|
|
#include "quote.h"
|
|
|
|
static const char tar_tree_usage[] =
|
|
"git-tar-tree [--remote=<repo>] <tree-ish> [basedir]\n"
|
|
"*** Note that this command is now deprecated; use git-archive instead.";
|
|
|
|
int cmd_tar_tree(int argc, const char **argv, const char *prefix)
|
|
{
|
|
/*
|
|
* git-tar-tree is now a wrapper around git-archive --format=tar
|
|
*
|
|
* $0 --remote=<repo> arg... ==>
|
|
* git-archive --format=tar --remote=<repo> arg...
|
|
* $0 tree-ish ==>
|
|
* git-archive --format=tar tree-ish
|
|
* $0 tree-ish basedir ==>
|
|
* git-archive --format-tar --prefix=basedir tree-ish
|
|
*/
|
|
int i;
|
|
const char **nargv = xcalloc(sizeof(*nargv), argc + 2);
|
|
char *basedir_arg;
|
|
int nargc = 0;
|
|
|
|
nargv[nargc++] = "git-archive";
|
|
nargv[nargc++] = "--format=tar";
|
|
|
|
if (2 <= argc && !strncmp("--remote=", argv[1], 9)) {
|
|
nargv[nargc++] = argv[1];
|
|
argv++;
|
|
argc--;
|
|
}
|
|
switch (argc) {
|
|
default:
|
|
usage(tar_tree_usage);
|
|
break;
|
|
case 3:
|
|
/* base-path */
|
|
basedir_arg = xmalloc(strlen(argv[2]) + 11);
|
|
sprintf(basedir_arg, "--prefix=%s/", argv[2]);
|
|
nargv[nargc++] = basedir_arg;
|
|
/* fallthru */
|
|
case 2:
|
|
/* tree-ish */
|
|
nargv[nargc++] = argv[1];
|
|
}
|
|
nargv[nargc] = NULL;
|
|
|
|
fprintf(stderr,
|
|
"*** git-tar-tree is now deprecated.\n"
|
|
"*** Running git-archive instead.\n***");
|
|
for (i = 0; i < nargc; i++) {
|
|
fputc(' ', stderr);
|
|
sq_quote_print(stderr, nargv[i]);
|
|
}
|
|
fputc('\n', stderr);
|
|
return cmd_archive(nargc, nargv, prefix);
|
|
}
|
|
|
|
/* ustar header + extended global header content */
|
|
#define RECORDSIZE (512)
|
|
#define HEADERSIZE (2 * RECORDSIZE)
|
|
|
|
int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
|
|
{
|
|
char buffer[HEADERSIZE];
|
|
struct ustar_header *header = (struct ustar_header *)buffer;
|
|
char *content = buffer + RECORDSIZE;
|
|
ssize_t n;
|
|
|
|
n = read_in_full(0, buffer, HEADERSIZE);
|
|
if (n < HEADERSIZE)
|
|
die("git-get-tar-commit-id: read error");
|
|
if (header->typeflag[0] != 'g')
|
|
return 1;
|
|
if (memcmp(content, "52 comment=", 11))
|
|
return 1;
|
|
|
|
n = write_in_full(1, content + 11, 41);
|
|
if (n < 41)
|
|
die("git-get-tar-commit-id: write error");
|
|
|
|
return 0;
|
|
}
|