Browse Source

http-push: avoid fork() by calling merge_bases() directly

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Johannes Schindelin 19 years ago committed by Junio C Hamano
parent
commit
61ffbcb988
  1. 49
      http-push.c

49
http-push.c

@ -2182,49 +2182,14 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1) @@ -2182,49 +2182,14 @@ static void fetch_symref(const char *path, char **symref, unsigned char *sha1)

static int verify_merge_base(unsigned char *head_sha1, unsigned char *branch_sha1)
{
int pipe_fd[2];
pid_t merge_base_pid;
char line[PATH_MAX + 20];
unsigned char merge_sha1[20];
int verified = 0;

if (pipe(pipe_fd) < 0)
die("Verify merge base: pipe failed");

merge_base_pid = fork();
if (!merge_base_pid) {
static const char *args[] = {
"merge-base",
"-a",
NULL,
NULL,
NULL
};
args[2] = strdup(sha1_to_hex(head_sha1));
args[3] = sha1_to_hex(branch_sha1);

dup2(pipe_fd[1], 1);
close(pipe_fd[0]);
close(pipe_fd[1]);
execv_git_cmd(args);
die("merge-base setup failed");
}
if (merge_base_pid < 0)
die("merge-base fork failed");

dup2(pipe_fd[0], 0);
close(pipe_fd[0]);
close(pipe_fd[1]);
while (fgets(line, sizeof(line), stdin) != NULL) {
if (get_sha1_hex(line, merge_sha1))
die("expected sha1, got garbage:\n %s", line);
if (!memcmp(branch_sha1, merge_sha1, 20)) {
verified = 1;
break;
}
}
struct commit *head = lookup_commit(head_sha1);
struct commit *branch = lookup_commit(branch_sha1);
struct commit_list *merge_bases = get_merge_bases(head, branch, 1);

return verified;
if (merge_bases && !merge_bases->next && merge_bases->item == branch)
return 1;

return 0;
}

static int delete_remote_branch(char *pattern, int force)

Loading…
Cancel
Save