summaryrefslogtreecommitdiff
path: root/http-push.c
diff options
context:
space:
mode:
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>2006-08-04 17:50:41 +0200
committerJunio C Hamano <junkio@cox.net>2006-08-04 17:40:50 -0700
commit61ffbcb988046dfaf8266569f78a31483be026f6 (patch)
treeab195ec121e45c95f7b226af0f655522c76e642f /http-push.c
parent07efc6a6b6e5098ccd2dcce853be421b7dd1e244 (diff)
downloadgit-61ffbcb988046dfaf8266569f78a31483be026f6.tar.gz
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>
Diffstat (limited to 'http-push.c')
-rw-r--r--http-push.c49
1 files changed, 7 insertions, 42 deletions
diff --git a/http-push.c b/http-push.c
index 4021e7d927..dc82657830 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)