]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: move 'protect_hfs' and 'protect_ntfs' into 'repo_config_values'
authorTian Yuchen <cat@malon.dev>
Wed, 10 Jun 2026 12:43:52 +0000 (20:43 +0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 12 Jun 2026 12:45:09 +0000 (05:45 -0700)
Move the global 'protect_hfs' and 'protect_ntfs' configurations
into the repository-specific 'repo_config_values' struct.
This will help with the elimination of 'the_repository'

To ensure code readability, the getter functions
'repo_protect_hfs()' and 'repo_protect_ntfs()'
have been introduced.

For now, associated functions access this configuration by
explicitly falling back to 'the_repository', which needs to
be addressed in the future.

Note: In 't/helper/test-path-utils.c', there is a function
'protect_ntfs_hfs_benchmark()' where these two global
variables are used as loop iterators. New local variables
have been created to replace them.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Ayush Chandekar <ayu.chandekar@gmail.com>
Mentored-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Tian Yuchen <cat@malon.dev>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
environment.c
environment.h
read-cache.c
t/helper/test-path-utils.c

index aa7525f419cb642d5b3a28f93c55d09517af8e2c..af87df77fd082fa6536dc51ecb45b4aedd838d5f 100644 (file)
@@ -3392,7 +3392,7 @@ int is_valid_win32_path(const char *path, int allow_literal_nul)
        const char *p = path;
        int preceding_space_or_period = 0, i = 0, periods = 0;
 
-       if (!protect_ntfs)
+       if (!repo_protect_ntfs(the_repository))
                return 1;
 
        skip_dos_drive_prefix((char **)&path);
index fc3ed8bb1c7a66ae9be342c04700478a9af7f19d..683fe1b4d35257f6dd209dc2c8cbf816b9f8cb79 100644 (file)
@@ -82,12 +82,10 @@ unsigned long pack_size_limit_cfg;
 #ifndef PROTECT_HFS_DEFAULT
 #define PROTECT_HFS_DEFAULT 0
 #endif
-int protect_hfs = PROTECT_HFS_DEFAULT;
 
 #ifndef PROTECT_NTFS_DEFAULT
 #define PROTECT_NTFS_DEFAULT 1
 #endif
-int protect_ntfs = PROTECT_NTFS_DEFAULT;
 
 /*
  * The character that begins a commented line in user-editable file
@@ -142,6 +140,20 @@ int is_bare_repository(void)
        return is_bare_repository_cfg && !repo_get_work_tree(the_repository);
 }
 
+int repo_protect_ntfs(struct repository *repo)
+{
+       return repo->gitdir ?
+               repo_config_values(repo)->protect_ntfs :
+               PROTECT_NTFS_DEFAULT;
+}
+
+int repo_protect_hfs(struct repository *repo)
+{
+       return repo->gitdir ?
+               repo_config_values(repo)->protect_hfs :
+               PROTECT_HFS_DEFAULT;
+}
+
 int have_git_dir(void)
 {
        return startup_info->have_repository
@@ -541,12 +553,12 @@ int git_default_core_config(const char *var, const char *value,
        }
 
        if (!strcmp(var, "core.protecthfs")) {
-               protect_hfs = git_config_bool(var, value);
+               cfg->protect_hfs = git_config_bool(var, value);
                return 0;
        }
 
        if (!strcmp(var, "core.protectntfs")) {
-               protect_ntfs = git_config_bool(var, value);
+               cfg->protect_ntfs = git_config_bool(var, value);
                return 0;
        }
 
@@ -720,5 +732,7 @@ void repo_config_values_init(struct repo_config_values *cfg)
 {
        cfg->attributes_file = NULL;
        cfg->apply_sparse_checkout = 0;
+       cfg->protect_hfs = PROTECT_HFS_DEFAULT;
+       cfg->protect_ntfs = PROTECT_NTFS_DEFAULT;
        cfg->branch_track = BRANCH_TRACK_REMOTE;
 }
index 9eb97b3869c9b1bf9624042dc9435e585aaf11af..fdd9775900701d9b2c26a2c78f60ec8c852ba88c 100644 (file)
@@ -91,6 +91,8 @@ struct repo_config_values {
        /* section "core" config values */
        char *attributes_file;
        int apply_sparse_checkout;
+       int protect_hfs;
+       int protect_ntfs;
 
        /* section "branch" config values */
        enum branch_track branch_track;
@@ -123,6 +125,14 @@ int git_default_config(const char *, const char *,
 int git_default_core_config(const char *var, const char *value,
                            const struct config_context *ctx, void *cb);
 
+/*
+ * Getters for the `protect_hfs` and `protect_ntfs` fields of `struct repo_config_values`.
+ * They check `repo->gitdir` to prevent calling repo_config_values()
+ * before the configuration is loaded or in bare environments.
+ */
+int repo_protect_hfs(struct repository *repo);
+int repo_protect_ntfs(struct repository *repo);
+
 void repo_config_values_init(struct repo_config_values *cfg);
 
 /*
@@ -173,8 +183,6 @@ extern int pack_compression_level;
 extern unsigned long pack_size_limit_cfg;
 
 extern int precomposed_unicode;
-extern int protect_hfs;
-extern int protect_ntfs;
 
 extern int core_sparse_checkout_cone;
 extern int sparse_expect_files_outside_of_patterns;
index 21829102ae275e124eb7b94550bc7ccf16993bac..2c6a60c7564a5b6b3b9acab5821706722efc50db 100644 (file)
@@ -1002,7 +1002,7 @@ static enum verify_path_result verify_path_internal(const char *path,
                        return PATH_OK;
                if (is_dir_sep(c)) {
 inside:
-                       if (protect_hfs) {
+                       if (repo_protect_hfs(the_repository)) {
 
                                if (is_hfs_dotgit(path))
                                        return PATH_INVALID;
@@ -1011,7 +1011,7 @@ inside:
                                                return PATH_INVALID;
                                }
                        }
-                       if (protect_ntfs) {
+                       if (repo_protect_ntfs(the_repository)) {
 #if defined GIT_WINDOWS_NATIVE || defined __CYGWIN__
                                if (c == '\\')
                                        return PATH_INVALID;
@@ -1035,7 +1035,8 @@ inside:
                        if (c == '\0')
                                return S_ISDIR(mode) ? PATH_DIR_WITH_SEP :
                                                       PATH_INVALID;
-               } else if (c == '\\' && protect_ntfs) {
+               } else if (c == '\\' &&
+                          repo_protect_ntfs(the_repository)) {
                        if (is_ntfs_dotgit(path))
                                return PATH_INVALID;
                        if (S_ISLNK(mode)) {
index 15eb44485cda3d51e615f3a83aadccc11716e173..f77b3f9d70fe0d97f94398270098c7b97535af45 100644 (file)
@@ -250,6 +250,7 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)
        double m[3][2], v[3][2];
        uint64_t cumul;
        double cumul2;
+       int ntfs, hfs;
 
        if (argc > 1 && !strcmp(argv[1], "--with-symlink-mode")) {
                file_mode = 0120000;
@@ -276,8 +277,13 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)
                        names[i][--len] = (char)(' ' + (my_random() % ('\x7f' - ' ')));
        }
 
-       for (protect_ntfs = 0; protect_ntfs < 2; protect_ntfs++)
-               for (protect_hfs = 0; protect_hfs < 2; protect_hfs++) {
+       if (!the_repository->gitdir)
+               the_repository->gitdir = xstrdup(".git");
+
+       for (ntfs = 0; ntfs < 2; ntfs++)
+               for (hfs = 0; hfs < 2; hfs++) {
+                       repo_config_values(the_repository)->protect_ntfs = ntfs;
+                       repo_config_values(the_repository)->protect_hfs = hfs;
                        cumul = 0;
                        cumul2 = 0;
                        for (i = 0; i < repetitions; i++) {
@@ -285,18 +291,18 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)
                                for (j = 0; j < nr; j++)
                                        verify_path(names[j], file_mode);
                                end = getnanotime();
-                               printf("protect_ntfs = %d, protect_hfs = %d: %lfms\n", protect_ntfs, protect_hfs, (end-begin) / (double)1e6);
+                               printf("protect_ntfs = %d, protect_hfs = %d: %lfms\n", ntfs, hfs, (end-begin) / (double)1e6);
                                cumul += end - begin;
                                cumul2 += (end - begin) * (end - begin);
                        }
-                       m[protect_ntfs][protect_hfs] = cumul / (double)repetitions;
-                       v[protect_ntfs][protect_hfs] = my_sqrt(cumul2 / (double)repetitions - m[protect_ntfs][protect_hfs] * m[protect_ntfs][protect_hfs]);
-                       printf("mean: %lfms, stddev: %lfms\n", m[protect_ntfs][protect_hfs] / (double)1e6, v[protect_ntfs][protect_hfs] / (double)1e6);
+                       m[ntfs][hfs] = cumul / (double)repetitions;
+                       v[ntfs][hfs] = my_sqrt(cumul2 / (double)repetitions - m[ntfs][hfs] * m[ntfs][hfs]);
+                       printf("mean: %lfms, stddev: %lfms\n", m[ntfs][hfs] / (double)1e6, v[ntfs][hfs] / (double)1e6);
                }
 
-       for (protect_ntfs = 0; protect_ntfs < 2; protect_ntfs++)
-               for (protect_hfs = 0; protect_hfs < 2; protect_hfs++)
-                       printf("ntfs=%d/hfs=%d: %lf%% slower\n", protect_ntfs, protect_hfs, (m[protect_ntfs][protect_hfs] - m[0][0]) * 100 / m[0][0]);
+       for (ntfs = 0; ntfs < 2; ntfs++)
+               for (hfs = 0; hfs < 2; hfs++)
+                       printf("ntfs=%d/hfs=%d: %lf%% slower\n", ntfs, hfs, (m[ntfs][hfs] - m[0][0]) * 100 / m[0][0]);
 
        return 0;
 }