Skip to content

Commit

Permalink
safe_create_leading_directories(): introduce enum for return values
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Haggerty authored and Junio C Hamano committed Jan 6, 2014
1 parent 9e6f885 commit 0be0521
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 13 deletions.
4 changes: 2 additions & 2 deletions builtin/init-db.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
17 changes: 15 additions & 2 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
16 changes: 8 additions & 8 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, '/');

Expand All @@ -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;
}
Expand Down

0 comments on commit 0be0521

Please sign in to comment.