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:
parent
b49809c961
commit
e8016abf8d
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user