]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: move 'trust_executable_bit' into repo_config_values
authorTian Yuchen <cat@malon.dev>
Sat, 30 May 2026 16:05:18 +0000 (00:05 +0800)
committerJunio C Hamano <gitster@pobox.com>
Sat, 30 May 2026 22:53:39 +0000 (07:53 +0900)
Move the global 'trust_executable_bit' configuration into the
repository-specific 'repo_config_values' struct.

For now, associated functions in read-cache.c access this configuration
by explicitly falling back to 'the_repository'.

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>
apply.c
environment.c
environment.h
read-cache.c

diff --git a/apply.c b/apply.c
index 249248d4f205ca5f5121487573d30f4ed0011b9d..73ca9907f8c87ad13182d7780936933d6335161f 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -3890,10 +3890,12 @@ static int check_preimage(struct apply_state *state,
        }
 
        if (!state->cached && !previous) {
+               struct repo_config_values *cfg = repo_config_values(the_repository);
+
                if (*ce && !(*ce)->ce_mode)
                        BUG("ce_mode == 0 for path '%s'", old_name);
 
-               if (trust_executable_bit || !S_ISREG(st->st_mode))
+               if (cfg->trust_executable_bit || !S_ISREG(st->st_mode))
                        st_mode = ce_mode_from_stat(*ce, st->st_mode);
                else if (*ce)
                        st_mode = (*ce)->ce_mode;
index fc3ed8bb1c7a66ae9be342c04700478a9af7f19d..94f74f39e6a8e89fc01b8c44f245255863f96203 100644 (file)
@@ -41,7 +41,6 @@
 static int pack_compression_seen;
 static int zlib_compression_seen;
 
-int trust_executable_bit = 1;
 int trust_ctime = 1;
 int check_stat = 1;
 int has_symlinks = 1;
@@ -305,7 +304,7 @@ int git_default_core_config(const char *var, const char *value,
 
        /* This needs a better name */
        if (!strcmp(var, "core.filemode")) {
-               trust_executable_bit = git_config_bool(var, value);
+               cfg->trust_executable_bit = git_config_bool(var, value);
                return 0;
        }
        if (!strcmp(var, "core.trustctime")) {
@@ -720,5 +719,6 @@ void repo_config_values_init(struct repo_config_values *cfg)
 {
        cfg->attributes_file = NULL;
        cfg->apply_sparse_checkout = 0;
+       cfg->trust_executable_bit = 1;
        cfg->branch_track = BRANCH_TRACK_REMOTE;
 }
index 9eb97b3869c9b1bf9624042dc9435e585aaf11af..217d3d4d40bfb42dd64c7b24ec8dee79e4943abf 100644 (file)
@@ -90,6 +90,7 @@ struct repository;
 struct repo_config_values {
        /* section "core" config values */
        char *attributes_file;
+       int trust_executable_bit;
        int apply_sparse_checkout;
 
        /* section "branch" config values */
@@ -158,7 +159,6 @@ int is_bare_repository(void);
 extern char *git_work_tree_cfg;
 
 /* Environment bits from configuration mechanism */
-extern int trust_executable_bit;
 extern int trust_ctime;
 extern int check_stat;
 extern int has_symlinks;
index 3c71c7d182c8c078de72ae407ef8fd4a93089910..113dc20c970502eac614c1f03d2f1ccdd0121d13 100644 (file)
@@ -205,10 +205,12 @@ void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, st
 
 unsigned int ce_mode_from_stat(const struct cache_entry *ce, unsigned int mode)
 {
+       struct repo_config_values *cfg = repo_config_values(the_repository);
+
        if (!has_symlinks && S_ISREG(mode) &&
            ce && S_ISLNK(ce->ce_mode))
                return ce->ce_mode;
-       if (!trust_executable_bit && S_ISREG(mode)) {
+       if (!cfg->trust_executable_bit && S_ISREG(mode)) {
                if (ce && S_ISREG(ce->ce_mode))
                        return ce->ce_mode;
                return create_ce_mode(0666);
@@ -218,11 +220,13 @@ unsigned int ce_mode_from_stat(const struct cache_entry *ce, unsigned int mode)
 
 static unsigned int st_mode_from_ce(const struct cache_entry *ce)
 {
+       struct repo_config_values *cfg = repo_config_values(the_repository);
+
        switch (ce->ce_mode & S_IFMT) {
        case S_IFLNK:
                return has_symlinks ? S_IFLNK : (S_IFREG | 0644);
        case S_IFREG:
-               return (ce->ce_mode & (trust_executable_bit ? 0755 : 0644)) | S_IFREG;
+               return (ce->ce_mode & (cfg->trust_executable_bit ? 0755 : 0644)) | S_IFREG;
        case S_IFGITLINK:
                return S_IFDIR | 0755;
        case S_IFDIR:
@@ -322,6 +326,7 @@ static int ce_modified_check_fs(struct index_state *istate,
 static int ce_match_stat_basic(const struct cache_entry *ce, struct stat *st)
 {
        unsigned int changed = 0;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
        if (ce->ce_flags & CE_REMOVE)
                return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;
@@ -332,7 +337,7 @@ static int ce_match_stat_basic(const struct cache_entry *ce, struct stat *st)
                /* We consider only the owner x bit to be relevant for
                 * "mode changes"
                 */
-               if (trust_executable_bit &&
+               if (cfg->trust_executable_bit &&
                    (0100 & (ce->ce_mode ^ st->st_mode)))
                        changed |= MODE_CHANGED;
                break;
@@ -733,6 +738,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
                          (intent_only ? ADD_CACHE_NEW_ONLY : 0));
        unsigned hash_flags = pretend ? 0 : INDEX_WRITE_OBJECT;
 
+       struct repo_config_values *cfg = repo_config_values(the_repository);
+
        if (flags & ADD_CACHE_RENORMALIZE)
                hash_flags |= INDEX_RENORMALIZE;
 
@@ -753,7 +760,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
                ce->ce_flags |= CE_INTENT_TO_ADD;
 
 
-       if (trust_executable_bit && has_symlinks) {
+       if (cfg->trust_executable_bit && has_symlinks) {
                ce->ce_mode = create_ce_mode(st_mode);
        } else {
                /* If there is an existing entry, pick the mode bits and type