]> git.ipfire.org Git - thirdparty/git.git/blobdiff - read-cache.c
The sixth batch
[thirdparty/git.git] / read-cache.c
index f546cf7875cbfefddbec2449e8303786e485a8dd..a6db25a16daf89caf4762c62810ab76416dd4c92 100644 (file)
@@ -1116,19 +1116,32 @@ static int has_dir_name(struct index_state *istate,
                        istate->cache[istate->cache_nr - 1]->name,
                        &len_eq_last);
                if (cmp_last > 0) {
-                       if (len_eq_last == 0) {
+                       if (name[len_eq_last] != '/') {
                                /*
                                 * The entry sorts AFTER the last one in the
-                                * index and their paths have no common prefix,
-                                * so there cannot be a F/D conflict.
+                                * index.
+                                *
+                                * If there were a conflict with "file", then our
+                                * name would start with "file/" and the last index
+                                * entry would start with "file" but not "file/".
+                                *
+                                * The next character after common prefix is
+                                * not '/', so there can be no conflict.
                                 */
                                return retval;
                        } else {
                                /*
                                 * The entry sorts AFTER the last one in the
-                                * index, but has a common prefix.  Fall through
-                                * to the loop below to disect the entry's path
-                                * and see where the difference is.
+                                * index, and the next character after common
+                                * prefix is '/'.
+                                *
+                                * Either the last index entry is a file in
+                                * conflict with this entry, or it has a name
+                                * which sorts between this entry and the
+                                * potential conflicting file.
+                                *
+                                * In both cases, we fall through to the loop
+                                * below and let the regular search code handle it.
                                 */
                        }
                } else if (cmp_last == 0) {
@@ -1152,53 +1165,6 @@ static int has_dir_name(struct index_state *istate,
                }
                len = slash - name;
 
-               if (cmp_last > 0) {
-                       /*
-                        * (len + 1) is a directory boundary (including
-                        * the trailing slash).  And since the loop is
-                        * decrementing "slash", the first iteration is
-                        * the longest directory prefix; subsequent
-                        * iterations consider parent directories.
-                        */
-
-                       if (len + 1 <= len_eq_last) {
-                               /*
-                                * The directory prefix (including the trailing
-                                * slash) also appears as a prefix in the last
-                                * entry, so the remainder cannot collide (because
-                                * strcmp said the whole path was greater).
-                                *
-                                * EQ: last: xxx/A
-                                *     this: xxx/B
-                                *
-                                * LT: last: xxx/file_A
-                                *     this: xxx/file_B
-                                */
-                               return retval;
-                       }
-
-                       if (len > len_eq_last) {
-                               /*
-                                * This part of the directory prefix (excluding
-                                * the trailing slash) is longer than the known
-                                * equal portions, so this sub-directory cannot
-                                * collide with a file.
-                                *
-                                * GT: last: xxxA
-                                *     this: xxxB/file
-                                */
-                               return retval;
-                       }
-
-                       /*
-                        * This is a possible collision. Fall through and
-                        * let the regular search code handle it.
-                        *
-                        * last: xxx
-                        * this: xxx/file
-                        */
-               }
-
                pos = index_name_stage_pos(istate, name, len, stage, EXPAND_SPARSE);
                if (pos >= 0) {
                        /*
@@ -3958,8 +3924,8 @@ static void update_callback(struct diff_queue_struct *q,
 }
 
 int add_files_to_cache(struct repository *repo, const char *prefix,
-                      const struct pathspec *pathspec, int include_sparse,
-                      int flags)
+                      const struct pathspec *pathspec, char *ps_matched,
+                      int include_sparse, int flags)
 {
        struct update_callback_data data;
        struct rev_info rev;
@@ -3971,8 +3937,10 @@ int add_files_to_cache(struct repository *repo, const char *prefix,
 
        repo_init_revisions(repo, &rev, prefix);
        setup_revisions(0, NULL, &rev, NULL);
-       if (pathspec)
+       if (pathspec) {
                copy_pathspec(&rev.prune_data, pathspec);
+               rev.ps_matched = ps_matched;
+       }
        rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
        rev.diffopt.format_callback = update_callback;
        rev.diffopt.format_callback_data = &data;