1
0
mirror of https://github.com/git/git synced 2024-07-02 15:48:44 +00:00

safe_create_leading_directories(): introduce enum for return values

Instead of returning magic integer values (which a couple of callers
go to the trouble of distinguishing), return values from an enum.  Add
a docstring.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael Haggerty 2014-01-06 14:45:25 +01:00 committed by Junio C Hamano
parent 9e6f885d14
commit 0be0521b23
4 changed files with 26 additions and 13 deletions

View File

@ -515,10 +515,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
saved = shared_repository;
shared_repository = 0;
switch (safe_create_leading_directories_const(argv[0])) {
case -3:
case SCLD_EXISTS:
errno = EEXIST;
/* fallthru */
case -1:
case SCLD_FAILED:
die_errno(_("cannot mkdir %s"), argv[0]);
break;
default:

17
cache.h
View File

@ -736,8 +736,21 @@ enum sharedrepo {
};
int git_config_perm(const char *var, const char *value);
int adjust_shared_perm(const char *path);
int safe_create_leading_directories(char *path);
int safe_create_leading_directories_const(const char *path);
/*
* Create the directory containing the named path, using care to be
* somewhat safe against races. Return one of the scld_error values
* to indicate success/failure.
*/
enum scld_error {
SCLD_OK = 0,
SCLD_FAILED = -1,
SCLD_PERMS = -2,
SCLD_EXISTS = -3
};
enum scld_error safe_create_leading_directories(char *path);
enum scld_error safe_create_leading_directories_const(const char *path);
int mkdir_in_gitdir(const char *path);
extern void home_config_paths(char **global, char **xdg, char *file);
extern char *expand_user_path(const char *path);

View File

@ -693,7 +693,7 @@ static int make_room_for_path(struct merge_options *o, const char *path)
/* Make sure leading directories are created */
status = safe_create_leading_directories_const(path);
if (status) {
if (status == -3) {
if (status == SCLD_EXISTS) {
/* something else exists */
error(msg, path, _(": perhaps a D/F conflict?"));
return -1;

View File

@ -105,12 +105,12 @@ int mkdir_in_gitdir(const char *path)
return adjust_shared_perm(path);
}
int safe_create_leading_directories(char *path)
enum scld_error safe_create_leading_directories(char *path)
{
char *next_component = path + offset_1st_component(path);
int ret = 0;
enum scld_error ret = SCLD_OK;
while (!ret && next_component) {
while (ret == SCLD_OK && next_component) {
struct stat st;
char *slash = strchr(next_component, '/');
@ -127,26 +127,26 @@ int safe_create_leading_directories(char *path)
if (!stat(path, &st)) {
/* path exists */
if (!S_ISDIR(st.st_mode))
ret = -3;
ret = SCLD_EXISTS;
} else if (mkdir(path, 0777)) {
if (errno == EEXIST &&
!stat(path, &st) && S_ISDIR(st.st_mode))
; /* somebody created it since we checked */
else
ret = -1;
ret = SCLD_FAILED;
} else if (adjust_shared_perm(path)) {
ret = -2;
ret = SCLD_PERMS;
}
*slash = '/';
}
return ret;
}
int safe_create_leading_directories_const(const char *path)
enum scld_error safe_create_leading_directories_const(const char *path)
{
/* path points to cache entries, so xstrdup before messing with it */
char *buf = xstrdup(path);
int result = safe_create_leading_directories(buf);
enum scld_error result = safe_create_leading_directories(buf);
free(buf);
return result;
}