Merge branch 'en/merge-recursive-icase-removal'
authorJunio C Hamano <gitster@pobox.com>
Tue, 19 Dec 2017 19:33:55 +0000 (11:33 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Dec 2017 19:33:55 +0000 (11:33 -0800)
The code internal to the recursive merge strategy was not fully
prepared to see a path that is renamed to try overwriting another
path that is only different in case on case insensitive systems.
This does not matter in the current code, but will start to matter
once the rename detection logic starts taking hints from nearby
paths moving to some directory and moves a new path along with them.

* en/merge-recursive-icase-removal:
merge-recursive: ignore_case shouldn't reject intentional removals

1  2 
merge-recursive.c
diff --combined merge-recursive.c
index a4c280dfc78e943ec541f83ccb0b39921ccdf2b2,aa6ae7ec8241bef5a4bc4a73ca4f16017636012a..2ecf495cc2a4a6d4544b92db1d2a8c3c0cc36f87
@@@ -540,8 -540,8 +540,8 @@@ static struct string_list *get_renames(
                return renames;
  
        diff_setup(&opts);
 -      DIFF_OPT_SET(&opts, RECURSIVE);
 -      DIFF_OPT_CLR(&opts, RENAME_EMPTY);
 +      opts.flags.recursive = 1;
 +      opts.flags.rename_empty = 0;
        opts.detect_rename = DIFF_DETECT_RENAME;
        opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit :
                            o->diff_rename_limit >= 0 ? o->diff_rename_limit :
@@@ -646,7 -646,7 +646,7 @@@ static int remove_file(struct merge_opt
                if (ignore_case) {
                        struct cache_entry *ce;
                        ce = cache_file_exists(path, strlen(path), ignore_case);
-                       if (ce && ce_stage(ce) == 0)
+                       if (ce && ce_stage(ce) == 0 && strcmp(path, ce->name))
                                return 0;
                }
                if (remove_path(path))
@@@ -1901,9 -1901,8 +1901,9 @@@ static int process_entry(struct merge_o
                        oid = b_oid;
                        conf = _("directory/file");
                }
 -              if (dir_in_way(path, !o->call_depth,
 -                             S_ISGITLINK(a_mode))) {
 +              if (dir_in_way(path,
 +                             !o->call_depth && !S_ISGITLINK(a_mode),
 +                             0)) {
                        char *new_path = unique_path(o, path, add_branch);
                        clean_merge = 0;
                        output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
@@@ -2082,7 -2081,7 +2082,7 @@@ int merge_recursive(struct merge_option
                /* if there is no common ancestor, use an empty tree */
                struct tree *tree;
  
 -              tree = lookup_tree(&empty_tree_oid);
 +              tree = lookup_tree(the_hash_algo->empty_tree);
                merged_common_ancestors = make_virtual_commit(tree, "ancestor");
        }
  
@@@ -2163,7 -2162,7 +2163,7 @@@ int merge_recursive_generic(struct merg
                            struct commit **result)
  {
        int clean;
 -      struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
 +      struct lock_file lock = LOCK_INIT;
        struct commit *head_commit = get_ref(head, o->branch1);
        struct commit *next_commit = get_ref(merge, o->branch2);
        struct commit_list *ca = NULL;
                }
        }
  
 -      hold_locked_index(lock, LOCK_DIE_ON_ERROR);
 +      hold_locked_index(&lock, LOCK_DIE_ON_ERROR);
        clean = merge_recursive(o, head_commit, next_commit, ca,
                        result);
        if (clean < 0)
                return clean;
  
        if (active_cache_changed &&
 -          write_locked_index(&the_index, lock, COMMIT_LOCK))
 +          write_locked_index(&the_index, &lock, COMMIT_LOCK))
                return err(o, _("Unable to write index."));
  
        return clean ? 0 : 1;
@@@ -2202,7 -2201,6 +2202,7 @@@ static void merge_recursive_config(stru
  
  void init_merge_options(struct merge_options *o)
  {
 +      const char *merge_verbosity;
        memset(o, 0, sizeof(struct merge_options));
        o->verbosity = 2;
        o->buffer_output = 1;
        o->renormalize = 0;
        o->detect_rename = 1;
        merge_recursive_config(o);
 -      if (getenv("GIT_MERGE_VERBOSITY"))
 -              o->verbosity =
 -                      strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10);
 +      merge_verbosity = getenv("GIT_MERGE_VERBOSITY");
 +      if (merge_verbosity)
 +              o->verbosity = strtol(merge_verbosity, NULL, 10);
        if (o->verbosity >= 5)
                o->buffer_output = 0;
        strbuf_init(&o->obuf, 0);
@@@ -2253,8 -2251,6 +2253,8 @@@ int parse_merge_opt(struct merge_option
                DIFF_XDL_SET(o, IGNORE_WHITESPACE);
        else if (!strcmp(s, "ignore-space-at-eol"))
                DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);
 +      else if (!strcmp(s, "ignore-cr-at-eol"))
 +              DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);
        else if (!strcmp(s, "renormalize"))
                o->renormalize = 1;
        else if (!strcmp(s, "no-renormalize"))