diff options
| author | Junio C Hamano <gitster@pobox.com> | 2008-04-25 12:17:45 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2008-04-25 12:17:45 -0700 |
| commit | 36c79d2bf893b9957688a6c8c13cc0bf0589e596 (patch) | |
| tree | 39c9815e82d5fffdb537ea9bfd6cf71359dec845 /setup.c | |
| parent | 049a226fa14fb25c03d2146c2f8f184cfea5e5bf (diff) | |
| parent | 06cbe8550324e0fd2290839bf3b9a92aa53b70ab (diff) | |
| download | git-36c79d2bf893b9957688a6c8c13cc0bf0589e596.tar.xz | |
Merge branch 'ho/shared'
* ho/shared:
Make core.sharedRepository more generic
Diffstat (limited to 'setup.c')
| -rw-r--r-- | setup.c | 60 |
1 files changed, 46 insertions, 14 deletions
@@ -428,21 +428,53 @@ const char *setup_git_directory_gently(int *nongit_ok) int git_config_perm(const char *var, const char *value) { - if (value) { - int i; - if (!strcmp(value, "umask")) - return PERM_UMASK; - if (!strcmp(value, "group")) - return PERM_GROUP; - if (!strcmp(value, "all") || - !strcmp(value, "world") || - !strcmp(value, "everybody")) - return PERM_EVERYBODY; - i = atoi(value); - if (i > 1) - return i; + int i; + char *endptr; + + if (value == NULL) + return PERM_GROUP; + + if (!strcmp(value, "umask")) + return PERM_UMASK; + if (!strcmp(value, "group")) + return PERM_GROUP; + if (!strcmp(value, "all") || + !strcmp(value, "world") || + !strcmp(value, "everybody")) + return PERM_EVERYBODY; + + /* Parse octal numbers */ + i = strtol(value, &endptr, 8); + + /* If not an octal number, maybe true/false? */ + if (*endptr != 0) + return git_config_bool(var, value) ? PERM_GROUP : PERM_UMASK; + + /* + * Treat values 0, 1 and 2 as compatibility cases, otherwise it is + * a chmod value. + */ + switch (i) { + case PERM_UMASK: /* 0 */ + return PERM_UMASK; + case OLD_PERM_GROUP: /* 1 */ + return PERM_GROUP; + case OLD_PERM_EVERYBODY: /* 2 */ + return PERM_EVERYBODY; } - return git_config_bool(var, value); + + /* A filemode value was given: 0xxx */ + + if ((i & 0600) != 0600) + die("Problem with core.sharedRepository filemode value " + "(0%.3o).\nThe owner of files must always have " + "read and write permissions.", i); + + /* + * Mask filemode value. Others can not get write permission. + * x flags for directories are handled separately. + */ + return i & 0666; } int check_repository_format_version(const char *var, const char *value) |
