OSDN Git Service

Merge branch 'jc/merge-symlink-ours-theirs'
authorJunio C Hamano <gitster@pobox.com>
Tue, 23 Jan 2018 21:16:37 +0000 (13:16 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 23 Jan 2018 21:16:37 +0000 (13:16 -0800)
"git merge -Xours/-Xtheirs" learned to use our/their version when
resolving a conflicting updates to a symbolic link.

* jc/merge-symlink-ours-theirs:
  merge: teach -Xours/-Xtheirs to symbolic link merge

merge-recursive.c
t/t6037-merge-ours-theirs.sh

index 0fc580d..cc5fa0a 100644 (file)
@@ -1026,10 +1026,19 @@ static int merge_file_1(struct merge_options *o,
                                                       &b->oid,
                                                       !o->call_depth);
                } else if (S_ISLNK(a->mode)) {
-                       oidcpy(&result->oid, &a->oid);
-
-                       if (!oid_eq(&a->oid, &b->oid))
-                               result->clean = 0;
+                       switch (o->recursive_variant) {
+                       case MERGE_RECURSIVE_NORMAL:
+                               oidcpy(&result->oid, &a->oid);
+                               if (!oid_eq(&a->oid, &b->oid))
+                                       result->clean = 0;
+                               break;
+                       case MERGE_RECURSIVE_OURS:
+                               oidcpy(&result->oid, &a->oid);
+                               break;
+                       case MERGE_RECURSIVE_THEIRS:
+                               oidcpy(&result->oid, &b->oid);
+                               break;
+                       }
                } else
                        die("BUG: unsupported object type in the tree");
        }
index 3889eca..0aebc6c 100755 (executable)
@@ -73,4 +73,36 @@ test_expect_success 'pull passes -X to underlying merge' '
        git reset --hard master && test_must_fail git pull -s recursive -X bork . side
 '
 
+test_expect_success SYMLINKS 'symlink with -Xours/-Xtheirs' '
+       git reset --hard master &&
+       git checkout -b two master &&
+       ln -s target-zero link &&
+       git add link &&
+       git commit -m "add link pointing to zero" &&
+
+       ln -f -s target-two link &&
+       git commit -m "add link pointing to two" link &&
+
+       git checkout -b one HEAD^ &&
+       ln -f -s target-one link &&
+       git commit -m "add link pointing to one" link &&
+
+       # we expect symbolic links not to resolve automatically, of course
+       git checkout one^0 &&
+       test_must_fail git merge -s recursive two &&
+
+       # favor theirs to resolve to target-two?
+       git reset --hard &&
+       git checkout one^0 &&
+       git merge -s recursive -X theirs two &&
+       git diff --exit-code two HEAD link &&
+
+       # favor ours to resolve to target-one?
+       git reset --hard &&
+       git checkout one^0 &&
+       git merge -s recursive -X ours two &&
+       git diff --exit-code one HEAD link
+
+'
+
 test_done