Merge branch 'jc/merge-base' (early part)

This contains an evil merge to fast-import, in order to
resolve in_merge_bases() update.
This commit is contained in:
Junio C Hamano 2007-02-13 16:50:32 -08:00
commit 4a164d48df
9 changed files with 19 additions and 15 deletions

View File

@ -291,6 +291,7 @@ BUILTIN_OBJS = \
builtin-ls-tree.o \ builtin-ls-tree.o \
builtin-mailinfo.o \ builtin-mailinfo.o \
builtin-mailsplit.o \ builtin-mailsplit.o \
builtin-merge-base.o \
builtin-merge-file.o \ builtin-merge-file.o \
builtin-mv.o \ builtin-mv.o \
builtin-name-rev.o \ builtin-name-rev.o \

View File

@ -134,7 +134,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds)
*/ */
if (!force && if (!force &&
!in_merge_bases(rev, head_rev)) { !in_merge_bases(rev, &head_rev, 1)) {
error("The branch '%s' is not a strict subset of " error("The branch '%s' is not a strict subset of "
"your current HEAD.\n" "your current HEAD.\n"
"If you are sure you want to delete it, " "If you are sure you want to delete it, "

View File

@ -1,9 +1,7 @@
#include "cache.h" #include "cache.h"
#include "commit.h" #include "commit.h"
static int show_all; static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_all)
static int merge_base(struct commit *rev1, struct commit *rev2)
{ {
struct commit_list *result = get_merge_bases(rev1, rev2, 0); struct commit_list *result = get_merge_bases(rev1, rev2, 0);
@ -23,16 +21,16 @@ static int merge_base(struct commit *rev1, struct commit *rev2)
static const char merge_base_usage[] = static const char merge_base_usage[] =
"git-merge-base [--all] <commit-id> <commit-id>"; "git-merge-base [--all] <commit-id> <commit-id>";
int main(int argc, char **argv) int cmd_merge_base(int argc, const char **argv, const char *prefix)
{ {
struct commit *rev1, *rev2; struct commit *rev1, *rev2;
unsigned char rev1key[20], rev2key[20]; unsigned char rev1key[20], rev2key[20];
int show_all = 0;
setup_git_directory();
git_config(git_default_config); git_config(git_default_config);
while (1 < argc && argv[1][0] == '-') { while (1 < argc && argv[1][0] == '-') {
char *arg = argv[1]; const char *arg = argv[1];
if (!strcmp(arg, "-a") || !strcmp(arg, "--all")) if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))
show_all = 1; show_all = 1;
else else
@ -49,5 +47,5 @@ int main(int argc, char **argv)
rev2 = lookup_commit_reference(rev2key); rev2 = lookup_commit_reference(rev2key);
if (!rev1 || !rev2) if (!rev1 || !rev2)
return 1; return 1;
return merge_base(rev1, rev2); return show_merge_base(rev1, rev2, show_all);
} }

View File

@ -215,8 +215,8 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
old = lookup_commit_reference_gently(osha1, 1); old = lookup_commit_reference_gently(osha1, 1);
if (!new && !is_null_sha1(nsha1)) if (!new && !is_null_sha1(nsha1))
new = lookup_commit_reference_gently(nsha1, 1); new = lookup_commit_reference_gently(nsha1, 1);
if ((old && !in_merge_bases(old, cb->ref_commit)) || if ((old && !in_merge_bases(old, &cb->ref_commit, 1)) ||
(new && !in_merge_bases(new, cb->ref_commit))) (new && !in_merge_bases(new, &cb->ref_commit, 1)))
goto prune; goto prune;
} }

View File

@ -44,6 +44,7 @@ extern int cmd_ls_files(int argc, const char **argv, const char *prefix);
extern int cmd_ls_tree(int argc, const char **argv, const char *prefix); extern int cmd_ls_tree(int argc, const char **argv, const char *prefix);
extern int cmd_mailinfo(int argc, const char **argv, const char *prefix); extern int cmd_mailinfo(int argc, const char **argv, const char *prefix);
extern int cmd_mailsplit(int argc, const char **argv, const char *prefix); extern int cmd_mailsplit(int argc, const char **argv, const char *prefix);
extern int cmd_merge_base(int argc, const char **argv, const char *prefix);
extern int cmd_merge_file(int argc, const char **argv, const char *prefix); extern int cmd_merge_file(int argc, const char **argv, const char *prefix);
extern int cmd_mv(int argc, const char **argv, const char *prefix); extern int cmd_mv(int argc, const char **argv, const char *prefix);
extern int cmd_name_rev(int argc, const char **argv, const char *prefix); extern int cmd_name_rev(int argc, const char **argv, const char *prefix);

View File

@ -1187,14 +1187,17 @@ struct commit_list *get_merge_bases(struct commit *one,
return result; return result;
} }
int in_merge_bases(struct commit *rev1, struct commit *rev2) int in_merge_bases(struct commit *commit, struct commit **reference, int num)
{ {
struct commit_list *bases, *b; struct commit_list *bases, *b;
int ret = 0; int ret = 0;
bases = get_merge_bases(rev1, rev2, 1); if (num == 1)
bases = get_merge_bases(commit, *reference, 1);
else
die("not yet");
for (b = bases; b; b = b->next) { for (b = bases; b; b = b->next) {
if (!hashcmp(rev1->object.sha1, b->item->object.sha1)) { if (!hashcmp(commit->object.sha1, b->item->object.sha1)) {
ret = 1; ret = 1;
break; break;
} }

View File

@ -114,5 +114,5 @@ extern int is_repository_shallow(void);
extern struct commit_list *get_shallow_commits(struct object_array *heads, extern struct commit_list *get_shallow_commits(struct object_array *heads,
int depth, int shallow_flag, int not_shallow_flag); int depth, int shallow_flag, int not_shallow_flag);
int in_merge_bases(struct commit *rev1, struct commit *rev2); int in_merge_bases(struct commit *, struct commit **, int);
#endif /* COMMIT_H */ #endif /* COMMIT_H */

View File

@ -1308,7 +1308,7 @@ static int update_branch(struct branch *b)
return error("Branch %s is missing commits.", b->name); return error("Branch %s is missing commits.", b->name);
} }
if (!in_merge_bases(old_cmit, new_cmit)) { if (!in_merge_bases(old_cmit, &new_cmit, 1)) {
unlock_ref(lock); unlock_ref(lock);
warn("Not updating %s" warn("Not updating %s"
" (new tip %s does not contain %s)", " (new tip %s does not contain %s)",

1
git.c
View File

@ -256,6 +256,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
{ "ls-tree", cmd_ls_tree, RUN_SETUP }, { "ls-tree", cmd_ls_tree, RUN_SETUP },
{ "mailinfo", cmd_mailinfo }, { "mailinfo", cmd_mailinfo },
{ "mailsplit", cmd_mailsplit }, { "mailsplit", cmd_mailsplit },
{ "merge-base", cmd_merge_base, RUN_SETUP },
{ "merge-file", cmd_merge_file }, { "merge-file", cmd_merge_file },
{ "mv", cmd_mv, RUN_SETUP | NOT_BARE }, { "mv", cmd_mv, RUN_SETUP | NOT_BARE },
{ "name-rev", cmd_name_rev, RUN_SETUP }, { "name-rev", cmd_name_rev, RUN_SETUP },