git-svn: handle our top-level path being deleted and later re-added
[gitweb.git] / entry.c
diff --git a/entry.c b/entry.c
index 0625112339deee7418571b5d513f923d6f00092b..257ab46e943f1f8b7445f01c10d949224c17112f 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -104,7 +104,8 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
        long wrote;
 
        switch (ntohl(ce->ce_mode) & S_IFMT) {
-               char *buf, *new;
+               char *new;
+               struct strbuf buf;
                unsigned long size;
 
        case S_IFREG:
@@ -112,6 +113,18 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
                if (!new)
                        return error("git-checkout-index: unable to read sha1 file of %s (%s)",
                                path, sha1_to_hex(ce->sha1));
+
+               /*
+                * Convert from git internal format to working tree format
+                */
+               strbuf_init(&buf, 0);
+               if (convert_to_working_tree(ce->name, new, size, &buf)) {
+                       size_t newsize = 0;
+                       free(new);
+                       new = strbuf_detach(&buf, &newsize);
+                       size = newsize;
+               }
+
                if (to_tempfile) {
                        strcpy(path, ".merge_file_XXXXXX");
                        fd = mkstemp(path);
@@ -123,15 +136,6 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
                                path, strerror(errno));
                }
 
-               /*
-                * Convert from git internal format to working tree format
-                */
-               buf = convert_to_working_tree(ce->name, new, &size);
-               if (buf) {
-                       free(new);
-                       new = buf;
-               }
-
                wrote = write_in_full(fd, new, size);
                close(fd);
                free(new);
@@ -199,7 +203,7 @@ int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *t
        strcpy(path + len, ce->name);
 
        if (!lstat(path, &st)) {
-               unsigned changed = ce_match_stat(ce, &st, 1);
+               unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID);
                if (!changed)
                        return 0;
                if (!state->force) {