pull: Fix parsing of -X<option>
[gitweb.git] / merge-recursive.c
index baabe2c35647d65716d1b82473846e80cc02957b..82f24ac16ed68e7838151710f76cb4f186b69df5 100644 (file)
@@ -3,6 +3,7 @@
  * Fredrik Kuivinen.
  * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006
  */
+#include "advice.h"
 #include "cache.h"
 #include "cache-tree.h"
 #include "commit.h"
@@ -171,7 +172,7 @@ static int git_merge_trees(int index_only,
        int rc;
        struct tree_desc t[3];
        struct unpack_trees_options opts;
-       static const struct unpack_trees_error_msgs msgs = {
+       struct unpack_trees_error_msgs msgs = {
                /* would_overwrite */
                "Your local changes to '%s' would be overwritten by merge.  Aborting.",
                /* not_uptodate_file */
@@ -183,6 +184,11 @@ static int git_merge_trees(int index_only,
                /* bind_overlap -- will not happen here */
                NULL,
        };
+       if (advice_commit_before_merge) {
+               msgs.would_overwrite = msgs.not_uptodate_file =
+                       "Your local changes to '%s' would be overwritten by merge.  Aborting.\n"
+                       "Please, commit your changes or stash them before you can merge.";
+       }
 
        memset(&opts, 0, sizeof(opts));
        if (index_only)
@@ -636,6 +642,23 @@ static int merge_3way(struct merge_options *o,
        mmfile_t orig, src1, src2;
        char *name1, *name2;
        int merge_status;
+       int favor;
+
+       if (o->call_depth)
+               favor = 0;
+       else {
+               switch (o->recursive_variant) {
+               case MERGE_RECURSIVE_OURS:
+                       favor = XDL_MERGE_FAVOR_OURS;
+                       break;
+               case MERGE_RECURSIVE_THEIRS:
+                       favor = XDL_MERGE_FAVOR_THEIRS;
+                       break;
+               default:
+                       favor = 0;
+                       break;
+               }
+       }
 
        if (strcmp(a->path, b->path)) {
                name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
@@ -651,7 +674,7 @@ static int merge_3way(struct merge_options *o,
 
        merge_status = ll_merge(result_buf, a->path, &orig,
                                &src1, name1, &src2, name2,
-                               o->call_depth);
+                               (!!o->call_depth) | (favor << 1));
 
        free(name1);
        free(name2);
@@ -1190,7 +1213,7 @@ int merge_trees(struct merge_options *o,
 {
        int code, clean;
 
-       if (o->subtree_merge) {
+       if (o->recursive_variant == MERGE_RECURSIVE_SUBTREE) {
                merge = shift_tree_object(head, merge);
                common = shift_tree_object(head, common);
        }