]> git.ipfire.org Git - thirdparty/git.git/blobdiff - unpack-trees.c
The sixth batch for 2.26
[thirdparty/git.git] / unpack-trees.c
index 78425ce74b5da2cbf9280770ec415e1b15ef7db4..1ecdab330408a1cca7f703b6f2dc8d9b11ae0261 100644 (file)
@@ -275,9 +275,9 @@ static int check_submodule_move_head(const struct cache_entry *ce,
 }
 
 /*
- * Preform the loading of the repository's gitmodules file.  This function is
+ * Perform the loading of the repository's gitmodules file.  This function is
  * used by 'check_update()' to perform loading of the gitmodules file in two
- * differnt situations:
+ * different situations:
  * (1) before removing entries from the working tree if the gitmodules file has
  *     been marked for removal.  This situation is specified by 'state' == NULL.
  * (2) before checking out entries to the working tree if the gitmodules file
@@ -291,11 +291,11 @@ static void load_gitmodules_file(struct index_state *index,
        if (pos >= 0) {
                struct cache_entry *ce = index->cache[pos];
                if (!state && ce->ce_flags & CE_WT_REMOVE) {
-                       repo_read_gitmodules(the_repository);
+                       repo_read_gitmodules(the_repository, 0);
                } else if (state && (ce->ce_flags & CE_UPDATE)) {
                        submodule_free(the_repository);
                        checkout_entry(ce, state, NULL, NULL);
-                       repo_read_gitmodules(the_repository);
+                       repo_read_gitmodules(the_repository, 0);
                }
        }
 }
@@ -372,15 +372,20 @@ static int check_updates(struct unpack_trees_options *o)
        state.refresh_cache = 1;
        state.istate = index;
 
+       if (!o->update || o->dry_run) {
+               remove_marked_cache_entries(index, 0);
+               trace_performance_leave("check_updates");
+               return 0;
+       }
+
        if (o->clone)
                setup_collided_checkout_detection(&state, index);
 
        progress = get_progress(o);
 
-       if (o->update)
-               git_attr_set_direction(GIT_ATTR_CHECKOUT);
+       git_attr_set_direction(GIT_ATTR_CHECKOUT);
 
-       if (should_update_submodules() && o->update && !o->dry_run)
+       if (should_update_submodules())
                load_gitmodules_file(index, NULL);
 
        for (i = 0; i < index->cache_nr; i++) {
@@ -388,18 +393,18 @@ static int check_updates(struct unpack_trees_options *o)
 
                if (ce->ce_flags & CE_WT_REMOVE) {
                        display_progress(progress, ++cnt);
-                       if (o->update && !o->dry_run)
-                               unlink_entry(ce);
+                       unlink_entry(ce);
                }
        }
+
        remove_marked_cache_entries(index, 0);
        remove_scheduled_dirs();
 
-       if (should_update_submodules() && o->update && !o->dry_run)
+       if (should_update_submodules())
                load_gitmodules_file(index, &state);
 
        enable_delayed_checkout(&state);
-       if (has_promisor_remote() && o->update && !o->dry_run) {
+       if (has_promisor_remote()) {
                /*
                 * Prefetch the objects that are to be checked out in the loop
                 * below.
@@ -431,15 +436,12 @@ static int check_updates(struct unpack_trees_options *o)
                                    ce->name);
                        display_progress(progress, ++cnt);
                        ce->ce_flags &= ~CE_UPDATE;
-                       if (o->update && !o->dry_run) {
-                               errs |= checkout_entry(ce, &state, NULL, NULL);
-                       }
+                       errs |= checkout_entry(ce, &state, NULL, NULL);
                }
        }
        stop_progress(&progress);
        errs |= finish_delayed_checkout(&state, NULL);
-       if (o->update)
-               git_attr_set_direction(GIT_ATTR_CHECKIN);
+       git_attr_set_direction(GIT_ATTR_CHECKIN);
 
        if (o->clone)
                report_collided_checkout(index);
@@ -694,9 +696,11 @@ static int index_pos_by_traverse_info(struct name_entry *names,
        if (pos >= 0)
                BUG("This is a directory and should not exist in index");
        pos = -pos - 1;
-       if (!starts_with(o->src_index->cache[pos]->name, name.buf) ||
+       if (pos >= o->src_index->cache_nr ||
+           !starts_with(o->src_index->cache[pos]->name, name.buf) ||
            (pos > 0 && starts_with(o->src_index->cache[pos-1]->name, name.buf)))
-               BUG("pos must point at the first entry in this directory");
+               BUG("pos %d doesn't point to the first entry of %s in index",
+                   pos, name.buf);
        strbuf_release(&name);
        return pos;
 }
@@ -1305,14 +1309,14 @@ static int clear_ce_flags_dir(struct index_state *istate,
 
        if (pl->use_cone_patterns && orig_ret == MATCHED_RECURSIVE) {
                struct cache_entry **ce = cache;
-               rc = (cache_end - cache) / sizeof(struct cache_entry *);
+               rc = cache_end - cache;
 
                while (ce < cache_end) {
                        (*ce)->ce_flags &= ~clear_mask;
                        ce++;
                }
        } else if (pl->use_cone_patterns && orig_ret == NOT_MATCHED) {
-               rc = (cache_end - cache) / sizeof(struct cache_entry *);
+               rc = cache_end - cache;
        } else {
                rc = clear_ce_flags_1(istate, cache, cache_end - cache,
                                      prefix,
@@ -1348,7 +1352,7 @@ static int clear_ce_flags_1(struct index_state *istate,
                            enum pattern_match_result default_match,
                            int progress_nr)
 {
-       struct cache_entry **cache_end = cache + nr;
+       struct cache_entry **cache_end = nr ? cache + nr : cache;
 
        /*
         * Process all entries that have the given prefix and meet
@@ -1544,6 +1548,9 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
        o->merge_size = len;
        mark_all_ce_unused(o->src_index);
 
+       if (o->src_index->fsmonitor_last_update)
+               o->result.fsmonitor_last_update = o->src_index->fsmonitor_last_update;
+
        /*
         * Sparse checkout loop #1: set NEW_SKIP_WORKTREE on existing entries
         */
@@ -2104,7 +2111,8 @@ static int merged_entry(const struct cache_entry *ce,
                invalidate_ce_path(old, o);
        }
 
-       do_add_entry(o, merge, update, CE_STAGEMASK);
+       if (do_add_entry(o, merge, update, CE_STAGEMASK) < 0)
+               return -1;
        return 1;
 }
 
@@ -2428,7 +2436,8 @@ int oneway_merge(const struct cache_entry * const *src,
 
        if (old && same(old, a)) {
                int update = 0;
-               if (o->reset && o->update && !ce_uptodate(old) && !ce_skip_worktree(old)) {
+               if (o->reset && o->update && !ce_uptodate(old) && !ce_skip_worktree(old) &&
+                       !(old->ce_flags & CE_FSMONITOR_VALID)) {
                        struct stat st;
                        if (lstat(old->name, &st) ||
                            ie_match_stat(o->src_index, old, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE))