Browse Source

read-tree --aggressive

A new flag --aggressive resolves what we traditionally resolved
with external git-merge-one-file inside index while read-tree
3-way merge works.

git-merge-octopus and git-merge-resolve use this flag before
running git-merge-index with git-merge-one-file.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
1b1fdf8c2f
  1. 2
      git-merge-octopus.sh
  2. 2
      git-merge-resolve.sh
  3. 32
      read-tree.c

2
git-merge-octopus.sh

@ -90,7 +90,7 @@ do @@ -90,7 +90,7 @@ do
NON_FF_MERGE=1

echo "Trying simple merge with $SHA1"
git-read-tree -u -m $common $MRT $SHA1 || exit 2
git-read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2
next=$(git-write-tree 2>/dev/null)
if test $? -ne 0
then

2
git-merge-resolve.sh

@ -38,7 +38,7 @@ then @@ -38,7 +38,7 @@ then
fi

git-update-index --refresh 2>/dev/null
git-read-tree -u -m $bases $head $remotes || exit 2
git-read-tree -u -m --aggressive $bases $head $remotes || exit 2
echo "Trying simple merge."
if result_tree=$(git-write-tree 2>/dev/null)
then

32
read-tree.c

@ -15,6 +15,7 @@ static int update = 0; @@ -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) @@ -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) @@ -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.
@ -677,6 +704,11 @@ int main(int argc, char **argv) @@ -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)

Loading…
Cancel
Save