Fix add_files_to_cache() to take pathspec, not user specified list of files
[gitweb.git] / read-cache.c
index 9e4d4a913670a15ce0978a6f9a4ee02d609f0616..7db55883d65fd28c2eaa291b5688273532988d88 100644 (file)
@@ -350,6 +350,7 @@ int remove_file_from_index(struct index_state *istate, const char *path)
        int pos = index_name_pos(istate, path, strlen(path));
        if (pos < 0)
                pos = -pos-1;
+       cache_tree_invalidate_path(istate->cache_tree, path);
        while (pos < istate->cache_nr && !strcmp(istate->cache[pos]->name, path))
                remove_index_entry_at(istate, pos);
        return 0;
@@ -388,6 +389,7 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
        int size, namelen, pos;
        struct stat st;
        struct cache_entry *ce;
+       unsigned ce_option = CE_MATCH_IGNORE_VALID|CE_MATCH_RACY_IS_DIRTY;
 
        if (lstat(path, &st))
                die("%s: unable to stat (%s)", path, strerror(errno));
@@ -422,7 +424,7 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
        pos = index_name_pos(istate, ce->name, namelen);
        if (0 <= pos &&
            !ce_stage(istate->cache[pos]) &&
-           !ie_modified(istate, istate->cache[pos], &st, CE_MATCH_IGNORE_VALID)) {
+           !ie_match_stat(istate, istate->cache[pos], &st, ce_option)) {
                /* Nothing changed, really */
                free(ce);
                return 0;
@@ -434,7 +436,6 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
                die("unable to add %s to index",path);
        if (verbose)
                printf("add '%s'\n", path);
-       cache_tree_invalidate_path(istate->cache_tree, path);
        return 0;
 }
 
@@ -702,6 +703,7 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
        int ok_to_replace = option & ADD_CACHE_OK_TO_REPLACE;
        int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
 
+       cache_tree_invalidate_path(istate->cache_tree, ce->name);
        pos = index_name_pos(istate, ce->name, ntohs(ce->ce_flags));
 
        /* existing match? Just replace it. */
@@ -1150,7 +1152,7 @@ int write_index(struct index_state *istate, int newfd)
 {
        SHA_CTX c;
        struct cache_header hdr;
-       int i, removed;
+       int i, err, removed;
        struct cache_entry **cache = istate->cache;
        int entries = istate->cache_nr;
 
@@ -1179,16 +1181,15 @@ int write_index(struct index_state *istate, int newfd)
 
        /* Write extension data here */
        if (istate->cache_tree) {
-               unsigned long sz;
-               void *data = cache_tree_write(istate->cache_tree, &sz);
-               if (data &&
-                   !write_index_ext_header(&c, newfd, CACHE_EXT_TREE, sz) &&
-                   !ce_write(&c, newfd, data, sz))
-                       free(data);
-               else {
-                       free(data);
+               struct strbuf sb;
+
+               strbuf_init(&sb, 0);
+               cache_tree_write(&sb, istate->cache_tree);
+               err = write_index_ext_header(&c, newfd, CACHE_EXT_TREE, sb.len) < 0
+                       || ce_write(&c, newfd, sb.buf, sb.len) < 0;
+               strbuf_release(&sb);
+               if (err)
                        return -1;
-               }
        }
        return ce_flush(&c, newfd);
 }