hooks-pre-commit: use \t, rather than a literal TAB in regexp
[gitweb.git] / read-cache.c
index d82a99a9158f46cbf81d5dda8de1a28228ac16cb..056b322fb0c83aeda378f548e13f84d4a65c1e29 100644 (file)
@@ -149,6 +149,8 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
                else if (ce_compare_gitlink(ce))
                        changed |= DATA_CHANGED;
                return changed;
+       case 0: /* Special case: unmerged file in index */
+               return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;
        default:
                die("internal error: ce_mode is %o", ntohl(ce->ce_mode));
        }
@@ -434,6 +436,31 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose)
        return 0;
 }
 
+struct cache_entry *make_cache_entry(unsigned int mode,
+               const unsigned char *sha1, const char *path, int stage,
+               int refresh)
+{
+       int size, len;
+       struct cache_entry *ce;
+
+       if (!verify_path(path))
+               return NULL;
+
+       len = strlen(path);
+       size = cache_entry_size(len);
+       ce = xcalloc(1, size);
+
+       hashcpy(ce->sha1, sha1);
+       memcpy(ce->name, path, len);
+       ce->ce_flags = create_ce_flags(len, stage);
+       ce->ce_mode = create_ce_mode(mode);
+
+       if (refresh)
+               return refresh_cache_entry(ce, 0);
+
+       return ce;
+}
+
 int ce_same_name(struct cache_entry *a, struct cache_entry *b)
 {
        int len = ce_namelen(a);
@@ -1111,7 +1138,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;
 
@@ -1140,16 +1167,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);
 }