aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cache.h2
-rw-r--r--environment.c1
-rw-r--r--setup.c2
-rw-r--r--sha1_file.c32
4 files changed, 36 insertions, 1 deletions
diff --git a/cache.h b/cache.h
index cb87becb3..a99fb3ce7 100644
--- a/cache.h
+++ b/cache.h
@@ -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 0886ad38f..0596fc647 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;
diff --git a/setup.c b/setup.c
index d3556edf1..36ede3d87 100644
--- a/setup.c
+++ b/setup.c
@@ -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 6b7577dbc..8bebbb255 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;