[PATCH 2/6] config: add trust_executable_bit to global config

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Derrick Stolee <derrickstolee@xxxxxxxxxx>

The 'trust_executable_bit' global represents the core.filemode config
value. It is loaded when git_default_config() is used to iterate over
the config keys (which includes several other similar iterators) during
the start of a Git process. The timing of this load depends on each
process, and happens even if the global is never used.

Instead, use the new global config system to load it on-demand, if
needed. Since this is the first use of the system, let's describe the
process:

 1. Create an enum value representing the value. This is named based on
    the fact that we expect an 'int' type.

 2. Update the default to 1 to match the existing global.

 3. Update the config name so we can load it from the config set.

 4. Replace uses of the global with get_int_config_global().

 5. Remove the global from environment.(c|h).

The "This needs a better name" comment has been around since 17712991a59
(Add ".git/config" file parser, 2005-10-10), and in that original
context it clearly mentions "core.filemode" as the bad name, not the
containing method. Now that we are removing this global assignment (and
not changing the name any time soon) we delete the comment, too.

Signed-off-by: Derrick Stolee <derrickstolee@xxxxxxxxxx>
---
 cache.h         | 7 ++++++-
 config.c        | 5 -----
 environment.c   | 1 -
 environment.h   | 1 -
 global-config.c | 2 ++
 global-config.h | 1 +
 read-cache.c    | 5 +++--
 7 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/cache.h b/cache.h
index 71e2fe74c4f..3e737d12ea8 100644
--- a/cache.h
+++ b/cache.h
@@ -9,6 +9,7 @@
 #include "pathspec.h"
 #include "object.h"
 #include "statinfo.h"
+#include "global-config.h"
 
 #if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT)
 #define DTYPE(de)	((de)->d_type)
@@ -160,10 +161,14 @@ static inline unsigned create_ce_flags(unsigned stage)
 static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce,
 					     unsigned int mode)
 {
-	extern int trust_executable_bit, has_symlinks;
+	extern int has_symlinks;
+	int trust_executable_bit;
+
 	if (!has_symlinks && S_ISREG(mode) &&
 	    ce && S_ISLNK(ce->ce_mode))
 		return ce->ce_mode;
+
+	trust_executable_bit = get_int_config_global(INT_CONFIG_TRUST_EXECUTABLE_BIT);
 	if (!trust_executable_bit && S_ISREG(mode)) {
 		if (ce && S_ISREG(ce->ce_mode))
 			return ce->ce_mode;
diff --git a/config.c b/config.c
index d0ce902af39..ffe6bea80a6 100644
--- a/config.c
+++ b/config.c
@@ -1561,11 +1561,6 @@ int git_config_color(char *dest, const char *var, const char *value)
 
 static int git_default_core_config(const char *var, const char *value, void *cb)
 {
-	/* This needs a better name */
-	if (!strcmp(var, "core.filemode")) {
-		trust_executable_bit = git_config_bool(var, value);
-		return 0;
-	}
 	if (!strcmp(var, "core.trustctime")) {
 		trust_ctime = git_config_bool(var, value);
 		return 0;
diff --git a/environment.c b/environment.c
index e198b48081a..890705f0f69 100644
--- a/environment.c
+++ b/environment.c
@@ -30,7 +30,6 @@
 #include "wrapper.h"
 #include "write-or-die.h"
 
-int trust_executable_bit = 1;
 int trust_ctime = 1;
 int check_stat = 1;
 int has_symlinks = 1;
diff --git a/environment.h b/environment.h
index a63f0c6a24f..66d88612085 100644
--- a/environment.h
+++ b/environment.h
@@ -111,7 +111,6 @@ void set_git_work_tree(const char *tree);
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
 /* Environment bits from configuration mechanism */
-extern int trust_executable_bit;
 extern int trust_ctime;
 extern int check_stat;
 extern int has_symlinks;
diff --git a/global-config.c b/global-config.c
index db9643afd7a..b6fd16b14f6 100644
--- a/global-config.c
+++ b/global-config.c
@@ -4,6 +4,7 @@
 
 static int global_ints[] = {
 	[INT_CONFIG_NONE] = 0, /* unused*/
+	[INT_CONFIG_TRUST_EXECUTABLE_BIT] = 1,
 };
 
 /* Bitmask for the enum. */
@@ -11,6 +12,7 @@ static uint64_t global_ints_initialized;
 
 static const char *global_int_names[] = {
 	[INT_CONFIG_NONE] = NULL, /* unused*/
+	[INT_CONFIG_TRUST_EXECUTABLE_BIT] = "core.filemode",
 };
 
 static int config_available;
diff --git a/global-config.h b/global-config.h
index 407dff19ee9..e66c3f4ac77 100644
--- a/global-config.h
+++ b/global-config.h
@@ -3,6 +3,7 @@
 
 enum int_config_key {
 	INT_CONFIG_NONE = 0,
+	INT_CONFIG_TRUST_EXECUTABLE_BIT,
 };
 
 /**
diff --git a/read-cache.c b/read-cache.c
index e919af3c77a..8d14a029ce4 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -336,7 +336,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 (get_int_config_global(INT_CONFIG_TRUST_EXECUTABLE_BIT) &&
 		    (0100 & (ce->ce_mode ^ st->st_mode)))
 			changed |= MODE_CHANGED;
 		break;
@@ -806,7 +806,8 @@ 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 (get_int_config_global(INT_CONFIG_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
-- 
gitgitgadget




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux