From: Johannes Schindelin Date: Fri, 4 Aug 2006 15:50:41 +0000 (+0200) Subject: http-push: avoid fork() by calling merge_bases() directly X-Git-Tag: v1.4.3-rc1~272^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=61ffbcb988046dfaf8266569f78a31483be026f6;p=git.git http-push: avoid fork() by calling merge_bases() directly Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- diff --git a/http-push.c b/http-push.c index 4021e7d92..dc8265783 100644 --- a/http-push.c +++ b/http-push.c @@ -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)