X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=read-tree.c;h=0d938724e594b1bc3c573280cfb9affdd136f104;hb=bd2afde8a38b97391b22afebf15c583fb0fffacb;hp=a46c6fe2f5d3234abe5dce0b7a9d44da07b6dae9;hpb=e5f5219a4f1faf3b4e1816fad3a6296a1d39b878;p=git.git diff --git a/read-tree.c b/read-tree.c index a46c6fe2..0d938724 100644 --- a/read-tree.c +++ b/read-tree.c @@ -15,6 +15,7 @@ static int update = 0; static int index_only = 0; static int nontrivial_merge = 0; static int trivial_merges_only = 0; +static int aggressive = 0; static int head_idx = -1; static int merge_size = 0; @@ -424,11 +425,14 @@ static int threeway_merge(struct cache_entry **stages) int df_conflict_remote = 0; int any_anc_missing = 0; + int no_anc_exists = 1; int i; for (i = 1; i < head_idx; i++) { if (!stages[i]) any_anc_missing = 1; + else + no_anc_exists = 0; } index = stages[0]; @@ -489,6 +493,29 @@ static int threeway_merge(struct cache_entry **stages) if (!head && !remote && any_anc_missing) return 0; + /* Under the new "aggressive" rule, we resolve mostly trivial + * cases that we historically had git-merge-one-file resolve. + */ + if (aggressive) { + int head_deleted = !head && !df_conflict_head; + int remote_deleted = !remote && !df_conflict_remote; + /* + * Deleted in both. + * Deleted in one and unchanged in the other. + */ + if ((head_deleted && remote_deleted) || + (head_deleted && remote && remote_match) || + (remote_deleted && head && head_match)) + return 0; + + /* + * Added in both, identically. + */ + if (no_anc_exists && head && remote && same(head, remote)) + return merged_entry(head, index); + + } + /* Below are "no merge" cases, which require that the index be * up-to-date to avoid the files getting overwritten with * conflict resolution files. @@ -537,7 +564,7 @@ static int twoway_merge(struct cache_entry **src) struct cache_entry *oldtree = src[1], *newtree = src[2]; if (merge_size != 2) - return error("Cannot do a twoway merge of %d trees\n", + return error("Cannot do a twoway merge of %d trees", merge_size); if (current) { @@ -589,7 +616,7 @@ static int oneway_merge(struct cache_entry **src) struct cache_entry *a = src[1]; if (merge_size != 1) - return error("Cannot do a oneway merge of %d trees\n", + return error("Cannot do a oneway merge of %d trees", merge_size); if (!a) @@ -677,6 +704,11 @@ int main(int argc, char **argv) continue; } + if (!strcmp(arg, "--aggressive")) { + aggressive = 1; + continue; + } + /* "-m" stands for "merge", meaning we start in stage 1 */ if (!strcmp(arg, "-m")) { if (stage || merge)