Use run_command within receive-pack to invoke index-pack

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Shawn O. Pearce 2007-03-12 19:00:26 -04:00 committed by Junio C Hamano
parent b49809c961
commit e8016abf8d

View File

@ -382,10 +382,10 @@ static const char *unpack(void)
} }
} else { } else {
const char *keeper[6]; const char *keeper[6];
int fd[2], s, len, status; int s, len, status;
pid_t pid;
char keep_arg[256]; char keep_arg[256];
char packname[46]; char packname[46];
struct child_process ip;
s = sprintf(keep_arg, "--keep=receive-pack %i on ", getpid()); s = sprintf(keep_arg, "--keep=receive-pack %i on ", getpid());
if (gethostname(keep_arg + s, sizeof(keep_arg) - s)) if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
@ -397,20 +397,12 @@ static const char *unpack(void)
keeper[3] = hdr_arg; keeper[3] = hdr_arg;
keeper[4] = keep_arg; keeper[4] = keep_arg;
keeper[5] = NULL; keeper[5] = NULL;
memset(&ip, 0, sizeof(ip));
if (pipe(fd) < 0) ip.argv = keeper;
return "index-pack pipe failed"; ip.out = -1;
pid = fork(); ip.git_cmd = 1;
if (pid < 0) if (start_command(&ip))
return "index-pack fork failed"; return "index-pack fork failed";
if (!pid) {
dup2(fd[1], 1);
close(fd[1]);
close(fd[0]);
execv_git_cmd(keeper);
die("execv of index-pack failed");
}
close(fd[1]);
/* /*
* The first thing we expects from index-pack's output * The first thing we expects from index-pack's output
@ -420,9 +412,8 @@ static const char *unpack(void)
* later on. If we don't get that then tough luck with it. * later on. If we don't get that then tough luck with it.
*/ */
for (len = 0; for (len = 0;
len < 46 && (s = xread(fd[0], packname+len, 46-len)) > 0; len < 46 && (s = xread(ip.out, packname+len, 46-len)) > 0;
len += s); len += s);
close(fd[0]);
if (len == 46 && packname[45] == '\n' && if (len == 46 && packname[45] == '\n' &&
memcmp(packname, "keep\t", 5) == 0) { memcmp(packname, "keep\t", 5) == 0) {
char path[PATH_MAX]; char path[PATH_MAX];
@ -432,14 +423,8 @@ static const char *unpack(void)
pack_lockfile = xstrdup(path); pack_lockfile = xstrdup(path);
} }
/* Then wrap our index-pack process. */ status = finish_command(&ip);
while (waitpid(pid, &status, 0) < 0) if (!status) {
if (errno != EINTR)
return "waitpid failed";
if (WIFEXITED(status)) {
int code = WEXITSTATUS(status);
if (code)
return "index-pack exited with error code";
reprepare_packed_git(); reprepare_packed_git();
return NULL; return NULL;
} }