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>
This commit is contained in:
Johannes Schindelin 2005-12-22 23:13:56 +01:00 коммит произвёл Junio C Hamano
Родитель 2414721b19
Коммит 457f06d68e
4 изменённых файлов: 36 добавлений и 1 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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;