Code

http-push: avoid fork() by calling merge_bases() directly
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Fri, 4 Aug 2006 15:50:41 +0000 (17:50 +0200)
committerJunio C Hamano <junkio@cox.net>
Sat, 5 Aug 2006 00:40:50 +0000 (17:40 -0700)
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
http-push.c

index 4021e7d9274b713a7b5c48d66f9ddf21ddc07094..dc82657830d22d7e66575e9fcf47685e80b21fd4 100644 (file)
@@ -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)