зеркало из https://github.com/microsoft/git.git
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:
Коммит
4a164d48df
1
Makefile
1
Makefile
|
@ -291,6 +291,7 @@ BUILTIN_OBJS = \
|
|||
builtin-ls-tree.o \
|
||||
builtin-mailinfo.o \
|
||||
builtin-mailsplit.o \
|
||||
builtin-merge-base.o \
|
||||
builtin-merge-file.o \
|
||||
builtin-mv.o \
|
||||
builtin-name-rev.o \
|
||||
|
|
|
@ -134,7 +134,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds)
|
|||
*/
|
||||
|
||||
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 "
|
||||
"your current HEAD.\n"
|
||||
"If you are sure you want to delete it, "
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
|
||||
static int show_all;
|
||||
|
||||
static int merge_base(struct commit *rev1, struct commit *rev2)
|
||||
static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_all)
|
||||
{
|
||||
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[] =
|
||||
"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;
|
||||
unsigned char rev1key[20], rev2key[20];
|
||||
int show_all = 0;
|
||||
|
||||
setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
|
||||
while (1 < argc && argv[1][0] == '-') {
|
||||
char *arg = argv[1];
|
||||
const char *arg = argv[1];
|
||||
if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))
|
||||
show_all = 1;
|
||||
else
|
||||
|
@ -49,5 +47,5 @@ int main(int argc, char **argv)
|
|||
rev2 = lookup_commit_reference(rev2key);
|
||||
if (!rev1 || !rev2)
|
||||
return 1;
|
||||
return merge_base(rev1, rev2);
|
||||
return show_merge_base(rev1, rev2, show_all);
|
||||
}
|
|
@ -215,8 +215,8 @@ static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
|
|||
old = lookup_commit_reference_gently(osha1, 1);
|
||||
if (!new && !is_null_sha1(nsha1))
|
||||
new = lookup_commit_reference_gently(nsha1, 1);
|
||||
if ((old && !in_merge_bases(old, cb->ref_commit)) ||
|
||||
(new && !in_merge_bases(new, cb->ref_commit)))
|
||||
if ((old && !in_merge_bases(old, &cb->ref_commit, 1)) ||
|
||||
(new && !in_merge_bases(new, &cb->ref_commit, 1)))
|
||||
goto prune;
|
||||
}
|
||||
|
||||
|
|
|
@ -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_mailinfo(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_mv(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
|
||||
|
|
9
commit.c
9
commit.c
|
@ -1187,14 +1187,17 @@ struct commit_list *get_merge_bases(struct commit *one,
|
|||
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;
|
||||
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) {
|
||||
if (!hashcmp(rev1->object.sha1, b->item->object.sha1)) {
|
||||
if (!hashcmp(commit->object.sha1, b->item->object.sha1)) {
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
|
|
2
commit.h
2
commit.h
|
@ -114,5 +114,5 @@ extern int is_repository_shallow(void);
|
|||
extern struct commit_list *get_shallow_commits(struct object_array *heads,
|
||||
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 */
|
||||
|
|
|
@ -1308,7 +1308,7 @@ static int update_branch(struct branch *b)
|
|||
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);
|
||||
warn("Not updating %s"
|
||||
" (new tip %s does not contain %s)",
|
||||
|
|
1
git.c
1
git.c
|
@ -256,6 +256,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
|||
{ "ls-tree", cmd_ls_tree, RUN_SETUP },
|
||||
{ "mailinfo", cmd_mailinfo },
|
||||
{ "mailsplit", cmd_mailsplit },
|
||||
{ "merge-base", cmd_merge_base, RUN_SETUP },
|
||||
{ "merge-file", cmd_merge_file },
|
||||
{ "mv", cmd_mv, RUN_SETUP | NOT_BARE },
|
||||
{ "name-rev", cmd_name_rev, RUN_SETUP },
|
||||
|
|
Загрузка…
Ссылка в новой задаче