]> granicus.if.org Git - git/commitdiff
safe_create_leading_directories(): introduce enum for return values
authorMichael Haggerty <mhagger@alum.mit.edu>
Mon, 6 Jan 2014 13:45:25 +0000 (14:45 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 6 Jan 2014 17:34:21 +0000 (09:34 -0800)
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>
builtin/init-db.c
cache.h
merge-recursive.c
sha1_file.c

index 78aa3872dddbba8988b61c49996f9e63719bac75..0bc14f3c817e94a45494eec88ef7bc4bce0a6e14 100644 (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:
diff --git a/cache.h b/cache.h
index ce377e1354a4d0fd719b50edb32124110956467f..c6a41575ca83b5ff747ee16c3a71d09b9543abf7 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -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);
index dbb7104c043b14f2a43d67e1ca87ce88f4a55408..021e1fc4532758d8c9577bf493d23a8e23ddc96e 100644 (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;
index 60d6fce07410fcfd550ab50c83b7fc370f825dd8..2a86912e1410536ab9681b0655c14e495df8ddc0 100644 (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;
 }