Browse Source

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>
maint
Michael Haggerty 11 years ago committed by Junio C Hamano
parent
commit
0be0521b23
  1. 4
      builtin/init-db.c
  2. 17
      cache.h
  3. 2
      merge-recursive.c
  4. 16
      sha1_file.c

4
builtin/init-db.c

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

17
cache.h

@ -736,8 +736,21 @@ enum sharedrepo {
}; };
int git_config_perm(const char *var, const char *value); int git_config_perm(const char *var, const char *value);
int adjust_shared_perm(const char *path); 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); int mkdir_in_gitdir(const char *path);
extern void home_config_paths(char **global, char **xdg, char *file); extern void home_config_paths(char **global, char **xdg, char *file);
extern char *expand_user_path(const char *path); extern char *expand_user_path(const char *path);

2
merge-recursive.c

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

16
sha1_file.c

@ -105,12 +105,12 @@ int mkdir_in_gitdir(const char *path)
return adjust_shared_perm(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); 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; struct stat st;
char *slash = strchr(next_component, '/'); char *slash = strchr(next_component, '/');


@ -127,26 +127,26 @@ int safe_create_leading_directories(char *path)
if (!stat(path, &st)) { if (!stat(path, &st)) {
/* path exists */ /* path exists */
if (!S_ISDIR(st.st_mode)) if (!S_ISDIR(st.st_mode))
ret = -3; ret = SCLD_EXISTS;
} else if (mkdir(path, 0777)) { } else if (mkdir(path, 0777)) {
if (errno == EEXIST && if (errno == EEXIST &&
!stat(path, &st) && S_ISDIR(st.st_mode)) !stat(path, &st) && S_ISDIR(st.st_mode))
; /* somebody created it since we checked */ ; /* somebody created it since we checked */
else else
ret = -1; ret = SCLD_FAILED;
} else if (adjust_shared_perm(path)) { } else if (adjust_shared_perm(path)) {
ret = -2; ret = SCLD_PERMS;
} }
*slash = '/'; *slash = '/';
} }
return ret; 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 */ /* path points to cache entries, so xstrdup before messing with it */
char *buf = xstrdup(path); char *buf = xstrdup(path);
int result = safe_create_leading_directories(buf); enum scld_error result = safe_create_leading_directories(buf);
free(buf); free(buf);
return result; return result;
} }

Loading…
Cancel
Save