Re: [PATCH] Support precise tracking of file modes
From: Peter Baumann <hidden>
Date: 2016-06-15 22:42:17
2006/1/19, Petr Baudis [off-list ref]:
quoted hunk ↗ jump to hunk
It seems that this is mostly an artificial imposition and it's annoying. Hey, I need to leave for an exam in 15 minutes and I have few urgent items in my Cogito TODO (sorry, Pavel!), but I couldn't resist. Taking "quick'n'dirty" to the extreme _and_ combining it with Linus' attitude to testing and documentation... ;-)diff --git a/cache.h b/cache.h index 29c9e81..0311066 100644 --- a/cache.h +++ b/cache.h@@ -94,7 +94,9 @@ struct cache_entry { #define ce_size(ce) cache_entry_size(ce_namelen(ce)) #define ce_stage(ce) ((CE_STAGEMASK & ntohs((ce)->ce_flags)) >> CE_STAGESHIFT) -#define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644) +extern int track_filemode; + +#define ce_permissions(mode) (track_filemode ? (mode) : (((mode) & 0100) ? 0755 : 0644)) static inline unsigned int create_ce_mode(unsigned int mode) { if (S_ISLNK(mode))diff --git a/checkout-index.c b/checkout-index.c index 53dd8cb..b073baa 100644 --- a/checkout-index.c +++ b/checkout-index.c@@ -115,6 +115,8 @@ int main(int argc, char **argv) int newfd = -1; int all = 0; + git_config(git_default_config); + prefix = setup_git_directory(); prefix_length = prefix ? strlen(prefix) : 0;diff --git a/config.c b/config.c index 8355224..a92ee0f 100644 --- a/config.c +++ b/config.c@@ -222,6 +222,11 @@ int git_default_config(const char *var, return 0; } + if (!strcmp(var, "core.trackallfilemodes")) { + track_filemode = git_config_bool(var, value); + return 0; + } + if (!strcmp(var, "core.symrefsonly")) { only_use_symrefs = git_config_bool(var, value); return 0;diff --git a/entry.c b/entry.c index 410b758..493f2b9 100644 --- a/entry.c +++ b/entry.c@@ -87,6 +87,11 @@ static int write_entry(struct cache_entr return error("git-checkout-index: unable to create file %s (%s)", path, strerror(errno)); } + if (track_filemode) { + if (fchmod(fd, ntohl(ce->ce_mode)) < 0) + return error("git-checkout-index: unable to chmod file %s (%s)", + path, strerror(errno)); + } wrote = write(fd, new, size); close(fd); free(new);diff --git a/environment.c b/environment.c index 0596fc6..53248ec 100644 --- a/environment.c +++ b/environment.c@@ -12,6 +12,7 @@ char git_default_email[MAX_GITNAME]; char git_default_name[MAX_GITNAME]; int trust_executable_bit = 1; +int track_filemode = 0; int only_use_symrefs = 0; int repository_format_version = 0; char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";diff --git a/fsck-objects.c b/fsck-objects.c index 90e638e..719add2 100644 --- a/fsck-objects.c +++ b/fsck-objects.c@@ -174,7 +174,8 @@ static int fsck_tree(struct tree *item) if (!check_strict) break; default: - has_bad_modes = 1; + if (!track_filemode || (entry->mode & ~(S_IFREG|0777))) + has_bad_modes = 1; } if (last) {diff --git a/read-cache.c b/read-cache.c index c5474d4..624d2c3 100644 --- a/read-cache.c +++ b/read-cache.c@@ -98,7 +98,7 @@ static int ce_match_stat_basic(struct ca * "mode changes" */ if (trust_executable_bit && - (0100 & (ntohl(ce->ce_mode) ^ st->st_mode))) + ((track_filemode ? 0777 : 0100) & (ntohl(ce->ce_mode) ^ st->st_mode))) changed |= MODE_CHANGED; break; case S_IFLNK: -- Petr "Pasky" Baudis
I didn't test the patch, but the feature the patch tries to implement is really something I'm missing from git (or any other scm I know of). Ideally, this will be combined with exact owner tracking, but exact permission and/or owner handling should be activated independently per repository. Peter Baumann