From: Heikki Orsila <heikki.orsila@iki.fi>
To: git@vger.kernel.org
Subject: [PATCH] Add two core.sharedRepository options: group-readable and world-readable
Date: Fri, 11 Apr 2008 17:09:16 +0300 [thread overview]
Message-ID: <20080411140916.GA30667@zakalwe.fi> (raw)
* 'group-readable': Make the repository group-readable (and g+sx for
directories), even if the user's umask forbids it.
* 'world-readable': Make the repository readable for anyone, including
the group (implies group-readable), even if the user's umask forbids
it.
* Add a warning to cache.h that "enum sharedrepo" item order should
not be changed because it would break backwards compatibility.
Signed-off-by: Heikki Orsila <heikki.orsila@iki.fi>
---
Documentation/config.txt | 13 ++++++++---
Documentation/git-init.txt | 8 ++++++-
cache.h | 6 ++++-
path.c | 48 +++++++++++++++++++++++++++++--------------
setup.c | 4 +++
5 files changed, 57 insertions(+), 22 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index fe43b12..ee13b2b 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -258,10 +258,15 @@ core.repositoryFormatVersion::
core.sharedRepository::
When 'group' (or 'true'), the repository is made shareable between
several users in a group (making sure all the files and objects are
- group-writable). When 'all' (or 'world' or 'everybody'), the
- repository will be readable by all users, additionally to being
- group-shareable. When 'umask' (or 'false'), git will use permissions
- reported by umask(2). See linkgit:git-init[1]. False by default.
+ group-writable). When 'group-readable', the repository will be
+ readable, but not writable, for users in the same group, even if the
+ user's umask forbids it. When 'all' (or 'world' or 'everybody'),
+ the repository will be readable by all users, additionally to being
+ group-shareable. When 'world-readable', the repository will be
+ readable for anyone, even if the user's umask forbids it. This option
+ implies 'group-readable'. When 'umask' (or 'false'), git will use
+ permissions reported by umask(2). See linkgit:git-init[1].
+ False by default.
core.warnAmbiguousRefs::
If true, git will warn you if the ref name you passed it is ambiguous
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 62914da..6bbc09c 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -31,7 +31,7 @@ structure, some suggested "exclude patterns", and copies of non-executing
"hook" files. The suggested patterns and hook files are all modifiable and
extensible.
---shared[={false|true|umask|group|all|world|everybody}]::
+--shared[={false|true|umask|group|group-readable|all|world|world-readable|everybody}]::
Specify that the git repository is to be shared amongst several users. This
allows users belonging to the same group to push into that
@@ -49,6 +49,12 @@ is given:
- 'group' (or 'true'): Make the repository group-writable, (and g+sx, since
the git group may be not the primary group of all users).
+ - 'group-readable': Make the repository group-readable (and g+sx for
+ directories), even if the user's umask forbids it.
+
+ - 'world-readable': Make the repository readable for anyone, including
+ the group (implies group-readable), even if the user's umask forbids it.
+
- 'all' (or 'world' or 'everybody'): Same as 'group', but make the repository
readable by all users.
diff --git a/cache.h b/cache.h
index 2a1e7ec..4af6d62 100644
--- a/cache.h
+++ b/cache.h
@@ -474,10 +474,14 @@ static inline void hashclr(unsigned char *hash)
int git_mkstemp(char *path, size_t n, const char *template);
+/* Warning: enum sharedrepo item order should not be changed since it will
+ * break backwards compatibility. */
enum sharedrepo {
PERM_UMASK = 0,
PERM_GROUP,
- PERM_EVERYBODY
+ PERM_EVERYBODY,
+ PERM_GROUP_READABLE,
+ PERM_WORLD_READABLE,
};
int git_config_perm(const char *var, const char *value);
int adjust_shared_perm(const char *path);
diff --git a/path.c b/path.c
index f4ed979..b900f62 100644
--- a/path.c
+++ b/path.c
@@ -266,22 +266,38 @@ int adjust_shared_perm(const char *path)
if (lstat(path, &st) < 0)
return -1;
mode = st.st_mode;
- if (mode & S_IRUSR)
- mode |= (shared_repository == PERM_GROUP
- ? S_IRGRP
- : (shared_repository == PERM_EVERYBODY
- ? (S_IRGRP|S_IROTH)
- : 0));
-
- if (mode & S_IWUSR)
- mode |= S_IWGRP;
-
- if (mode & S_IXUSR)
- mode |= (shared_repository == PERM_GROUP
- ? S_IXGRP
- : (shared_repository == PERM_EVERYBODY
- ? (S_IXGRP|S_IXOTH)
- : 0));
+
+ /* PERM_GROUP_READABLE: g+r
+ * PERM_GROUP: g+rw
+ * PERM_WORLD_READABLE: g+r, o+r
+ * PERM_EVERYBODY: g+rw, o+r
+ */
+ if (mode & S_IRUSR) {
+ if (shared_repository == PERM_GROUP ||
+ shared_repository == PERM_GROUP_READABLE) {
+ mode |= S_IRGRP;
+ } else if (shared_repository == PERM_EVERYBODY ||
+ shared_repository == PERM_WORLD_READABLE) {
+ mode |= S_IRGRP | S_IROTH;
+ }
+ }
+
+ if (mode & S_IWUSR) {
+ if (shared_repository != PERM_GROUP_READABLE &&
+ shared_repository != PERM_WORLD_READABLE)
+ mode |= S_IWGRP;
+ }
+
+ if (mode & S_IXUSR) {
+ if (shared_repository == PERM_GROUP ||
+ shared_repository == PERM_GROUP_READABLE) {
+ mode |= S_IXGRP;
+ } else if (shared_repository == PERM_EVERYBODY ||
+ shared_repository == PERM_WORLD_READABLE) {
+ mode |= S_IXGRP | S_IXOTH;
+ }
+ }
+
if (S_ISDIR(mode))
mode |= FORCE_DIR_SET_GID;
if ((mode & st.st_mode) != mode && chmod(path, mode) < 0)
diff --git a/setup.c b/setup.c
index 3d2d958..a33ae9d 100644
--- a/setup.c
+++ b/setup.c
@@ -434,10 +434,14 @@ int git_config_perm(const char *var, const char *value)
return PERM_UMASK;
if (!strcmp(value, "group"))
return PERM_GROUP;
+ if (!strcmp(value, "group-readable"))
+ return PERM_GROUP_READABLE;
if (!strcmp(value, "all") ||
!strcmp(value, "world") ||
!strcmp(value, "everybody"))
return PERM_EVERYBODY;
+ if (!strcmp(value, "world-readable"))
+ return PERM_WORLD_READABLE;
i = atoi(value);
if (i > 1)
return i;
--
1.5.4.4
next reply other threads:[~2008-04-11 14:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-11 14:09 Heikki Orsila [this message]
2008-04-12 0:53 ` [PATCH] Add two core.sharedRepository options: group-readable and world-readable Junio C Hamano
2008-04-12 3:00 ` Heikki Orsila
2008-04-12 4:48 ` Junio C Hamano
2008-04-12 9:17 ` Björn Steinbrink
2008-04-12 10:03 ` Junio C Hamano
2008-04-12 18:52 ` Heikki Orsila
2008-04-12 12:01 ` Heikki Orsila
2008-04-12 12:05 ` Heikki Orsila
-- strict thread matches above, loose matches on Subject: below --
2008-04-11 14:41 Heikki Orsila
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080411140916.GA30667@zakalwe.fi \
--to=heikki.orsila@iki.fi \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).