Merge git://git.kernel.org/pub/scm/gitk/gitk
[gitweb.git] / unpack-trees.c
index cb8f84796862ba7f3aee42981585441085e9060a..1ab28fda45be940b300b504ae029f3fba2c28fa9 100644 (file)
@@ -8,21 +8,30 @@
 #include "progress.h"
 #include "refs.h"
 
-static inline void remove_entry(int remove, struct unpack_trees_options *o)
+static void add_entry(struct unpack_trees_options *o, struct cache_entry *ce,
+       unsigned int set, unsigned int clear)
 {
-       if (remove >= 0)
-               remove_index_entry_at(o->index, remove);
+       unsigned int size = ce_size(ce);
+       struct cache_entry *new = xmalloc(size);
+
+       clear |= CE_HASHED | CE_UNHASHED;
+
+       memcpy(new, ce, size);
+       new->next = NULL;
+       new->ce_flags = (new->ce_flags & ~clear) | set;
+       add_index_entry(&o->result, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|ADD_CACHE_SKIP_DFCHECK);
 }
 
 /* Unlink the last component and attempt to remove leading
  * directories, in case this unlink is the removal of the
  * last entry in the directory -- empty directories are removed.
  */
-static void unlink_entry(char *name, char *last_symlink)
+static void unlink_entry(struct cache_entry *ce)
 {
        char *cp, *prev;
+       char *name = ce->name;
 
-       if (has_symlink_leading_path(name, last_symlink))
+       if (has_symlink_leading_path(ce_namelen(ce), ce->name))
                return;
        if (unlink(name))
                return;
@@ -46,16 +55,17 @@ static void unlink_entry(char *name, char *last_symlink)
 }
 
 static struct checkout state;
-static void check_updates(struct unpack_trees_options *o)
+static int check_updates(struct unpack_trees_options *o)
 {
        unsigned cnt = 0, total = 0;
        struct progress *progress = NULL;
-       char last_symlink[PATH_MAX];
+       struct index_state *index = &o->result;
        int i;
+       int errs = 0;
 
        if (o->update && o->verbose_update) {
-               for (total = cnt = 0; cnt < o->index->cache_nr; cnt++) {
-                       struct cache_entry *ce = o->index->cache[cnt];
+               for (total = cnt = 0; cnt < index->cache_nr; cnt++) {
+                       struct cache_entry *ce = index->cache[cnt];
                        if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
                                total++;
                }
@@ -65,58 +75,60 @@ static void check_updates(struct unpack_trees_options *o)
                cnt = 0;
        }
 
-       *last_symlink = '\0';
-       for (i = 0; i < o->index->cache_nr; i++) {
-               struct cache_entry *ce = o->index->cache[i];
+       for (i = 0; i < index->cache_nr; i++) {
+               struct cache_entry *ce = index->cache[i];
 
-               if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
-                       display_progress(progress, ++cnt);
                if (ce->ce_flags & CE_REMOVE) {
+                       display_progress(progress, ++cnt);
                        if (o->update)
-                               unlink_entry(ce->name, last_symlink);
-                       remove_index_entry_at(o->index, i);
+                               unlink_entry(ce);
+                       remove_index_entry_at(&o->result, i);
                        i--;
                        continue;
                }
+       }
+
+       for (i = 0; i < index->cache_nr; i++) {
+               struct cache_entry *ce = index->cache[i];
+
                if (ce->ce_flags & CE_UPDATE) {
+                       display_progress(progress, ++cnt);
                        ce->ce_flags &= ~CE_UPDATE;
                        if (o->update) {
-                               checkout_entry(ce, &state, NULL);
-                               *last_symlink = '\0';
+                               errs |= checkout_entry(ce, &state, NULL);
                        }
                }
        }
        stop_progress(&progress);
+       return errs != 0;
 }
 
-static inline int call_unpack_fn(struct cache_entry **src, struct unpack_trees_options *o, int remove)
+static inline int call_unpack_fn(struct cache_entry **src, struct unpack_trees_options *o)
 {
-       int ret = o->fn(src, o, remove);
-       if (ret > 0) {
-               o->pos += ret;
+       int ret = o->fn(src, o);
+       if (ret > 0)
                ret = 0;
-       }
        return ret;
 }
 
 static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_options *o)
 {
        struct cache_entry *src[5] = { ce, };
+
+       o->pos++;
        if (ce_stage(ce)) {
                if (o->skip_unmerged) {
-                       o->pos++;
-               } else {
-                       remove_entry(o->pos, o);
+                       add_entry(o, ce, 0, 0);
+                       return 0;
                }
-               return 0;
        }
-       return call_unpack_fn(src, o, o->pos);
+       return call_unpack_fn(src, o);
 }
 
 int traverse_trees_recursive(int n, unsigned long dirmask, unsigned long df_conflicts, struct name_entry *names, struct traverse_info *info)
 {
        int i;
-       struct tree_desc t[3];
+       struct tree_desc t[MAX_UNPACK_TREES];
        struct traverse_info newinfo;
        struct name_entry *p;
 
@@ -136,8 +148,7 @@ int traverse_trees_recursive(int n, unsigned long dirmask, unsigned long df_conf
                        sha1 = names[i].sha1;
                fill_tree_descriptor(t+i, sha1);
        }
-       traverse_trees(n, t, &newinfo);
-       return 0;
+       return traverse_trees(n, t, &newinfo);
 }
 
 /*
@@ -200,7 +211,7 @@ static struct cache_entry *create_ce_entry(const struct traverse_info *info, con
 }
 
 static int unpack_nondirectories(int n, unsigned long mask, unsigned long dirmask, struct cache_entry *src[5],
-       const struct name_entry *names, const struct traverse_info *info, int remove)
+       const struct name_entry *names, const struct traverse_info *info)
 {
        int i;
        struct unpack_trees_options *o = info->data;
@@ -240,12 +251,11 @@ static int unpack_nondirectories(int n, unsigned long mask, unsigned long dirmas
        }
 
        if (o->merge)
-               return call_unpack_fn(src, o, remove);
+               return call_unpack_fn(src, o);
 
        n += o->merge;
-       remove_entry(remove, o);
        for (i = 0; i < n; i++)
-               add_index_entry(o->index, src[i], ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
+               add_entry(o, src[i], 0, 0);
        return 0;
 }
 
@@ -253,7 +263,6 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
 {
        struct cache_entry *src[5] = { NULL, };
        struct unpack_trees_options *o = info->data;
-       int remove = -1;
        const struct name_entry *p = names;
 
        /* Find first entry with a real name (we could use "mask" too) */
@@ -262,8 +271,8 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
 
        /* Are we supposed to look at the index too? */
        if (o->merge) {
-               while (o->pos < o->index->cache_nr) {
-                       struct cache_entry *ce = o->index->cache[o->pos];
+               while (o->pos < o->src_index->cache_nr) {
+                       struct cache_entry *ce = o->src_index->cache[o->pos];
                        int cmp = compare_entry(ce, info, p);
                        if (cmp < 0) {
                                if (unpack_index_entry(ce, o) < 0)
@@ -271,24 +280,24 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
                                continue;
                        }
                        if (!cmp) {
+                               o->pos++;
                                if (ce_stage(ce)) {
                                        /*
                                         * If we skip unmerged index entries, we'll skip this
                                         * entry *and* the tree entries associated with it!
                                         */
-                                       if (o->skip_unmerged)
+                                       if (o->skip_unmerged) {
+                                               add_entry(o, ce, 0, 0);
                                                return mask;
-                                       remove_entry(o->pos, o);
-                                       continue;
+                                       }
                                }
                                src[0] = ce;
-                               remove = o->pos;
                        }
                        break;
                }
        }
 
-       if (unpack_nondirectories(n, mask, dirmask, src, names, info, remove) < 0)
+       if (unpack_nondirectories(n, mask, dirmask, src, names, info) < 0)
                return -1;
 
        /* Now handle any directories.. */
@@ -299,7 +308,9 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
                        if (src[0])
                                conflicts |= 1;
                }
-               traverse_trees_recursive(n, dirmask, conflicts, names, info);
+               if (traverse_trees_recursive(n, dirmask, conflicts,
+                                            names, info) < 0)
+                       return -1;
                return mask;
        }
 
@@ -308,13 +319,12 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
 
 static int unpack_failed(struct unpack_trees_options *o, const char *message)
 {
+       discard_index(&o->result);
        if (!o->gently) {
                if (message)
                        return error(message);
                return -1;
        }
-       discard_index(o->index);
-       read_index(o->index);
        return -1;
 }
 
@@ -322,14 +332,17 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 {
        static struct cache_entry *dfc;
 
-       if (len > 4)
-               die("unpack_trees takes at most four trees");
+       if (len > MAX_UNPACK_TREES)
+               die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES);
        memset(&state, 0, sizeof(state));
        state.base_dir = "";
        state.force = 1;
        state.quiet = 1;
        state.refresh_cache = 1;
 
+       memset(&o->result, 0, sizeof(o->result));
+       if (o->src_index)
+               o->result.timestamp = o->src_index->timestamp;
        o->merge_size = len;
 
        if (!dfc)
@@ -350,8 +363,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 
        /* Any left-over entries in the index? */
        if (o->merge) {
-               while (o->pos < o->index->cache_nr) {
-                       struct cache_entry *ce = o->index->cache[o->pos];
+               while (o->pos < o->src_index->cache_nr) {
+                       struct cache_entry *ce = o->src_index->cache[o->pos];
                        if (unpack_index_entry(ce, o) < 0)
                                return unpack_failed(o, NULL);
                }
@@ -360,7 +373,11 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        if (o->trivial_merges_only && o->nontrivial_merge)
                return unpack_failed(o, "Merge requires file-level merging");
 
-       check_updates(o);
+       o->src_index = NULL;
+       if (check_updates(o))
+               return -1;
+       if (o->dst_index)
+               *o->dst_index = o->result;
        return 0;
 }
 
@@ -396,7 +413,7 @@ static int verify_uptodate(struct cache_entry *ce,
                return 0;
 
        if (!lstat(ce->name, &st)) {
-               unsigned changed = ie_match_stat(o->index, ce, &st, CE_MATCH_IGNORE_VALID);
+               unsigned changed = ie_match_stat(o->src_index, ce, &st, CE_MATCH_IGNORE_VALID);
                if (!changed)
                        return 0;
                /*
@@ -419,7 +436,7 @@ static int verify_uptodate(struct cache_entry *ce,
 static void invalidate_ce_path(struct cache_entry *ce, struct unpack_trees_options *o)
 {
        if (ce)
-               cache_tree_invalidate_path(o->index->cache_tree, ce->name);
+               cache_tree_invalidate_path(o->src_index->cache_tree, ce->name);
 }
 
 /*
@@ -464,12 +481,12 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
         * in that directory.
         */
        namelen = strlen(ce->name);
-       pos = index_name_pos(o->index, ce->name, namelen);
+       pos = index_name_pos(o->src_index, ce->name, namelen);
        if (0 <= pos)
                return cnt; /* we have it as nondirectory */
        pos = -pos - 1;
-       for (i = pos; i < o->index->cache_nr; i++) {
-               struct cache_entry *ce = o->index->cache[i];
+       for (i = pos; i < o->src_index->cache_nr; i++) {
+               struct cache_entry *ce = o->src_index->cache[i];
                int len = ce_namelen(ce);
                if (len < namelen ||
                    strncmp(ce->name, ce->name, namelen) ||
@@ -481,7 +498,7 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
                if (!ce_stage(ce)) {
                        if (verify_uptodate(ce, o))
                                return -1;
-                       ce->ce_flags |= CE_REMOVE;
+                       add_entry(o, ce, CE_REMOVE, 0);
                }
                cnt++;
        }
@@ -506,6 +523,22 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
        return cnt;
 }
 
+/*
+ * This gets called when there was no index entry for the tree entry 'dst',
+ * but we found a file in the working tree that 'lstat()' said was fine,
+ * and we're on a case-insensitive filesystem.
+ *
+ * See if we can find a case-insensitive match in the index that also
+ * matches the stat information, and assume it's that other file!
+ */
+static int icase_exists(struct unpack_trees_options *o, struct cache_entry *dst, struct stat *st)
+{
+       struct cache_entry *src;
+
+       src = index_name_exists(o->src_index, dst->name, ce_namelen(dst), 1);
+       return src && !ie_match_stat(o->src_index, src, st, CE_MATCH_IGNORE_VALID);
+}
+
 /*
  * We do not want to remove or overwrite a working tree file that
  * is not tracked, unless it is ignored.
@@ -518,12 +551,23 @@ static int verify_absent(struct cache_entry *ce, const char *action,
        if (o->index_only || o->reset || !o->update)
                return 0;
 
-       if (has_symlink_leading_path(ce->name, NULL))
+       if (has_symlink_leading_path(ce_namelen(ce), ce->name))
                return 0;
 
        if (!lstat(ce->name, &st)) {
                int cnt;
                int dtype = ce_to_dtype(ce);
+               struct cache_entry *result;
+
+               /*
+                * It may be that the 'lstat()' succeeded even though
+                * target 'ce' was absent, because there is an old
+                * entry that is different only in case..
+                *
+                * Ignore that lstat() if it matches.
+                */
+               if (ignore_case && icase_exists(o, ce, &st))
+                       return 0;
 
                if (o->dir && excluded(o->dir, ce->name, &dtype))
                        /*
@@ -567,10 +611,9 @@ static int verify_absent(struct cache_entry *ce, const char *action,
                 * delete this path, which is in a subdirectory that
                 * is being replaced with a blob.
                 */
-               cnt = index_name_pos(o->index, ce->name, strlen(ce->name));
-               if (0 <= cnt) {
-                       struct cache_entry *ce = o->index->cache[cnt];
-                       if (ce->ce_flags & CE_REMOVE)
+               result = index_name_exists(&o->result, ce->name, ce_namelen(ce), 0);
+               if (result) {
+                       if (result->ce_flags & CE_REMOVE)
                                return 0;
                }
 
@@ -584,17 +627,19 @@ static int verify_absent(struct cache_entry *ce, const char *action,
 static int merged_entry(struct cache_entry *merge, struct cache_entry *old,
                struct unpack_trees_options *o)
 {
-       merge->ce_flags |= CE_UPDATE;
+       int update = CE_UPDATE;
+
        if (old) {
                /*
                 * See if we can re-use the old CE directly?
                 * That way we get the uptodate stat info.
                 *
-                * This also removes the UPDATE flag on
-                * a match.
+                * This also removes the UPDATE flag on a match; otherwise
+                * we will end up overwriting local changes in the work tree.
                 */
                if (same(old, merge)) {
                        copy_cache_entry(merge, old);
+                       update = 0;
                } else {
                        if (verify_uptodate(old, o))
                                return -1;
@@ -607,29 +652,29 @@ static int merged_entry(struct cache_entry *merge, struct cache_entry *old,
                invalidate_ce_path(merge, o);
        }
 
-       merge->ce_flags &= ~CE_STAGEMASK;
-       add_index_entry(o->index, merge, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
+       add_entry(o, merge, update, CE_STAGEMASK);
        return 1;
 }
 
 static int deleted_entry(struct cache_entry *ce, struct cache_entry *old,
                struct unpack_trees_options *o)
 {
-       if (old) {
-               if (verify_uptodate(old, o))
-                       return -1;
-       } else
+       /* Did it exist in the index? */
+       if (!old) {
                if (verify_absent(ce, "removed", o))
                        return -1;
-       ce->ce_flags |= CE_REMOVE;
-       add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
+               return 0;
+       }
+       if (verify_uptodate(old, o))
+               return -1;
+       add_entry(o, ce, CE_REMOVE, 0);
        invalidate_ce_path(ce, o);
        return 1;
 }
 
 static int keep_entry(struct cache_entry *ce, struct unpack_trees_options *o)
 {
-       add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD);
+       add_entry(o, ce, 0, 0);
        return 1;
 }
 
@@ -649,9 +694,7 @@ static void show_stage_entry(FILE *o,
 }
 #endif
 
-int threeway_merge(struct cache_entry **stages,
-               struct unpack_trees_options *o,
-               int remove)
+int threeway_merge(struct cache_entry **stages, struct unpack_trees_options *o)
 {
        struct cache_entry *index;
        struct cache_entry *head;
@@ -728,10 +771,8 @@ int threeway_merge(struct cache_entry **stages,
        }
 
        /* #1 */
-       if (!head && !remote && any_anc_missing) {
-               remove_entry(remove, o);
+       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.
@@ -763,10 +804,9 @@ int threeway_merge(struct cache_entry **stages,
                if ((head_deleted && remote_deleted) ||
                    (head_deleted && remote && remote_match) ||
                    (remote_deleted && head && head_match)) {
-                       remove_entry(remove, o);
                        if (index)
                                return deleted_entry(index, index, o);
-                       else if (ce && !head_deleted) {
+                       if (ce && !head_deleted) {
                                if (verify_absent(ce, "removed", o))
                                        return -1;
                        }
@@ -789,7 +829,6 @@ int threeway_merge(struct cache_entry **stages,
                        return -1;
        }
 
-       remove_entry(remove, o);
        o->nontrivial_merge = 1;
 
        /* #2, #3, #4, #6, #7, #9, #10, #11. */
@@ -824,9 +863,7 @@ int threeway_merge(struct cache_entry **stages,
  * "carry forward" rule, please see <Documentation/git-read-tree.txt>.
  *
  */
-int twoway_merge(struct cache_entry **src,
-               struct unpack_trees_options *o,
-               int remove)
+int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o)
 {
        struct cache_entry *current = src[0];
        struct cache_entry *oldtree = src[1];
@@ -854,7 +891,6 @@ int twoway_merge(struct cache_entry **src,
                }
                else if (oldtree && !newtree && same(current, oldtree)) {
                        /* 10 or 11 */
-                       remove_entry(remove, o);
                        return deleted_entry(oldtree, current, o);
                }
                else if (oldtree && newtree &&
@@ -864,7 +900,6 @@ int twoway_merge(struct cache_entry **src,
                }
                else {
                        /* all other failures */
-                       remove_entry(remove, o);
                        if (oldtree)
                                return o->gently ? -1 : reject_merge(oldtree);
                        if (current)
@@ -876,7 +911,6 @@ int twoway_merge(struct cache_entry **src,
        }
        else if (newtree)
                return merged_entry(newtree, current, o);
-       remove_entry(remove, o);
        return deleted_entry(oldtree, current, o);
 }
 
@@ -887,8 +921,7 @@ int twoway_merge(struct cache_entry **src,
  * stage0 does not have anything there.
  */
 int bind_merge(struct cache_entry **src,
-               struct unpack_trees_options *o,
-               int remove)
+               struct unpack_trees_options *o)
 {
        struct cache_entry *old = src[0];
        struct cache_entry *a = src[1];
@@ -898,7 +931,7 @@ int bind_merge(struct cache_entry **src,
                             o->merge_size);
        if (a && old)
                return o->gently ? -1 :
-                       error("Entry '%s' overlaps.  Cannot bind.", a->name);
+                       error("Entry '%s' overlaps with '%s'.  Cannot bind.", a->name, old->name);
        if (!a)
                return keep_entry(old, o);
        else
@@ -911,9 +944,7 @@ int bind_merge(struct cache_entry **src,
  * The rule is:
  * - take the stat information from stage0, take the data from stage1
  */
-int oneway_merge(struct cache_entry **src,
-               struct unpack_trees_options *o,
-               int remove)
+int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o)
 {
        struct cache_entry *old = src[0];
        struct cache_entry *a = src[1];
@@ -922,18 +953,19 @@ int oneway_merge(struct cache_entry **src,
                return error("Cannot do a oneway merge of %d trees",
                             o->merge_size);
 
-       if (!a) {
-               remove_entry(remove, o);
+       if (!a)
                return deleted_entry(old, old, o);
-       }
+
        if (old && same(old, a)) {
+               int update = 0;
                if (o->reset) {
                        struct stat st;
                        if (lstat(old->name, &st) ||
-                           ie_match_stat(o->index, old, &st, CE_MATCH_IGNORE_VALID))
-                               old->ce_flags |= CE_UPDATE;
+                           ie_match_stat(o->src_index, old, &st, CE_MATCH_IGNORE_VALID))
+                               update |= CE_UPDATE;
                }
-               return keep_entry(old, o);
+               add_entry(o, old, update, 0);
+               return 0;
        }
        return merged_entry(a, old, o);
 }