diff options
-rw-r--r-- | cache.h | 2 | ||||
-rw-r--r-- | environment.c | 1 | ||||
-rw-r--r-- | setup.c | 2 | ||||
-rw-r--r-- | sha1_file.c | 32 |
4 files changed, 36 insertions, 1 deletions
@@ -159,6 +159,7 @@ extern void rollback_index_file(struct cache_file *); extern int trust_executable_bit; extern int only_use_symrefs; extern int diff_rename_limit_default; +extern int shared_repository; #define GIT_REPO_VERSION 0 extern int repository_format_version; @@ -183,6 +184,7 @@ extern const unsigned char null_sha1[20]; int git_mkstemp(char *path, size_t n, const char *template); +int adjust_shared_perm(const char *path); int safe_create_leading_directories(char *path); char *safe_strncpy(char *, const char *, size_t); char *enter_repo(char *path, int strict); diff --git a/environment.c b/environment.c index 0886ad38f9..0596fc647b 100644 --- a/environment.c +++ b/environment.c @@ -15,6 +15,7 @@ int trust_executable_bit = 1; int only_use_symrefs = 0; int repository_format_version = 0; char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8"; +int shared_repository = 0; static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file; @@ -180,6 +180,8 @@ int check_repository_format_version(const char *var, const char *value) { if (strcmp(var, "core.repositoryformatversion") == 0) repository_format_version = git_config_int(var, value); + else if (strcmp(var, "core.sharedrepository") == 0) + shared_repository = git_config_bool(var, value); return 0; } diff --git a/sha1_file.c b/sha1_file.c index 6b7577dbc4..8bebbb255f 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -48,6 +48,29 @@ int get_sha1_hex(const char *hex, unsigned char *sha1) return 0; } +int adjust_shared_perm(const char *path) +{ + struct stat st; + int mode; + + if (!shared_repository) + return 0; + if (lstat(path, &st) < 0) + return -1; + mode = st.st_mode; + if (mode & S_IRUSR) + mode |= S_IRGRP; + if (mode & S_IWUSR) + mode |= S_IWGRP; + if (mode & S_IXUSR) + mode |= S_IXGRP; + if (S_ISDIR(mode)) + mode |= S_ISGID; + if (chmod(path, mode) < 0) + return -2; + return 0; +} + int safe_create_leading_directories(char *path) { char *pos = path; @@ -59,11 +82,16 @@ int safe_create_leading_directories(char *path) if (!pos) break; *pos = 0; - if (mkdir(path, 0777) < 0) + if (mkdir(path, 0777) < 0) { if (errno != EEXIST) { *pos = '/'; return -1; } + } + else if (adjust_shared_perm(path)) { + *pos = '/'; + return -2; + } *pos++ = '/'; } return 0; @@ -1255,6 +1283,8 @@ static int link_temp_to_file(const char *tmpfile, char *filename) if (dir) { *dir = 0; mkdir(filename, 0777); + if (adjust_shared_perm(filename)) + return -2; *dir = '/'; if (!link(tmpfile, filename)) return 0; |