summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>2005-12-22 22:13:56 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-12-24 08:21:10 (GMT)
commit457f06d68e427bbf4f1a921877441a622a05e5c4 (patch)
treef99c40b9328464d6f1ae4f5a386c64e8b5a0d51d /sha1_file.c
parent2414721b194453f058079d897d13c4e377f92dc6 (diff)
downloadgit-457f06d68e427bbf4f1a921877441a622a05e5c4.zip
git-457f06d68e427bbf4f1a921877441a622a05e5c4.tar.gz
git-457f06d68e427bbf4f1a921877441a622a05e5c4.tar.bz2
Introduce core.sharedrepository
If the config variable 'core.sharedrepository' is set, the directories $GIT_DIR/objects/ $GIT_DIR/objects/?? $GIT_DIR/objects/pack $GIT_DIR/refs $GIT_DIR/refs/heads $GIT_DIR/refs/heads/tags are set group writable (and g+s, since the git group may be not the primary group of all users). Since all files are written as lock files first, and then moved to their destination, they do not have to be group writable. Indeed, if this leads to problems you found a bug. Note that -- as in my first attempt -- the config variable is set in the function which checks the repository format. If this were done in git_default_config instead, a lot of programs would need to be modified to call git_config(git_default_config) first. [jc: git variables should be in environment.c unless there is a compelling reason to do otherwise.] Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 6b7577d..8bebbb2 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;