]> git.ipfire.org Git - thirdparty/git.git/blobdiff - read-cache.c
Merge branch 'vd/sparse-sparsity-fix-on-read'
[thirdparty/git.git] / read-cache.c
index b3772ba70a13664c36b024b7acb51aaaf4d88c8f..d999fff9e46fc1ab2d0f6a2c6f6c002662e1251b 100644 (file)
@@ -738,7 +738,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
        int intent_only = flags & ADD_CACHE_INTENT;
        int add_option = (ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|
                          (intent_only ? ADD_CACHE_NEW_ONLY : 0));
-       int hash_flags = HASH_WRITE_OBJECT;
+       unsigned hash_flags = pretend ? 0 : HASH_WRITE_OBJECT;
        struct object_id oid;
 
        if (flags & ADD_CACHE_RENORMALIZE)
@@ -849,6 +849,19 @@ struct cache_entry *make_empty_transient_cache_entry(size_t len,
        return xcalloc(1, cache_entry_size(len));
 }
 
+enum verify_path_result {
+       PATH_OK,
+       PATH_INVALID,
+       PATH_DIR_WITH_SEP,
+};
+
+static enum verify_path_result verify_path_internal(const char *, unsigned);
+
+int verify_path(const char *path, unsigned mode)
+{
+       return verify_path_internal(path, mode) == PATH_OK;
+}
+
 struct cache_entry *make_cache_entry(struct index_state *istate,
                                     unsigned int mode,
                                     const struct object_id *oid,
@@ -859,7 +872,7 @@ struct cache_entry *make_cache_entry(struct index_state *istate,
        struct cache_entry *ce, *ret;
        int len;
 
-       if (!verify_path(path, mode)) {
+       if (verify_path_internal(path, mode) == PATH_INVALID) {
                error(_("invalid path '%s'"), path);
                return NULL;
        }
@@ -993,60 +1006,62 @@ static int verify_dotfile(const char *rest, unsigned mode)
        return 1;
 }
 
-int verify_path(const char *path, unsigned mode)
+static enum verify_path_result verify_path_internal(const char *path,
+                                                   unsigned mode)
 {
        char c = 0;
 
        if (has_dos_drive_prefix(path))
-               return 0;
+               return PATH_INVALID;
 
        if (!is_valid_path(path))
-               return 0;
+               return PATH_INVALID;
 
        goto inside;
        for (;;) {
                if (!c)
-                       return 1;
+                       return PATH_OK;
                if (is_dir_sep(c)) {
 inside:
                        if (protect_hfs) {
 
                                if (is_hfs_dotgit(path))
-                                       return 0;
+                                       return PATH_INVALID;
                                if (S_ISLNK(mode)) {
                                        if (is_hfs_dotgitmodules(path))
-                                               return 0;
+                                               return PATH_INVALID;
                                }
                        }
                        if (protect_ntfs) {
 #if defined GIT_WINDOWS_NATIVE || defined __CYGWIN__
                                if (c == '\\')
-                                       return 0;
+                                       return PATH_INVALID;
 #endif
                                if (is_ntfs_dotgit(path))
-                                       return 0;
+                                       return PATH_INVALID;
                                if (S_ISLNK(mode)) {
                                        if (is_ntfs_dotgitmodules(path))
-                                               return 0;
+                                               return PATH_INVALID;
                                }
                        }
 
                        c = *path++;
                        if ((c == '.' && !verify_dotfile(path, mode)) ||
                            is_dir_sep(c))
-                               return 0;
+                               return PATH_INVALID;
                        /*
                         * allow terminating directory separators for
                         * sparse directory entries.
                         */
                        if (c == '\0')
-                               return S_ISDIR(mode);
+                               return S_ISDIR(mode) ? PATH_DIR_WITH_SEP :
+                                                      PATH_INVALID;
                } else if (c == '\\' && protect_ntfs) {
                        if (is_ntfs_dotgit(path))
-                               return 0;
+                               return PATH_INVALID;
                        if (S_ISLNK(mode)) {
                                if (is_ntfs_dotgitmodules(path))
-                                       return 0;
+                                       return PATH_INVALID;
                        }
                }
 
@@ -1349,7 +1364,7 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
 
        if (!ok_to_add)
                return -1;
-       if (!verify_path(ce->name, ce->ce_mode))
+       if (verify_path_internal(ce->name, ce->ce_mode) == PATH_INVALID)
                return error(_("invalid path '%s'"), ce->name);
 
        if (!skip_df_check &&