diff options
Diffstat (limited to 'src/fileops.c')
-rw-r--r-- | src/fileops.c | 181 |
1 files changed, 6 insertions, 175 deletions
diff --git a/src/fileops.c b/src/fileops.c index 3412a47e2..e2a6adf0b 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -23,7 +23,7 @@ int git_futils_mkpath2file(const char *file_path, const mode_t mode) } /* Does the containing folder exist? */ - if (git_futils_isdir(target_folder.ptr) != GIT_SUCCESS) + if (git_path_isdir(target_folder.ptr) != GIT_SUCCESS) /* Let's create the tree structure */ error = git_futils_mkdir_r(target_folder.ptr, NULL, mode); @@ -70,47 +70,6 @@ int git_futils_creat_locked_withpath(const char *path, const mode_t dirmode, con return git_futils_creat_locked(path, mode); } -int git_futils_isdir(const char *path) -{ -#ifdef GIT_WIN32 - DWORD attr = GetFileAttributes(path); - if (attr == INVALID_FILE_ATTRIBUTES) - return GIT_ERROR; - - return (attr & FILE_ATTRIBUTE_DIRECTORY) ? GIT_SUCCESS : GIT_ERROR; - -#else - struct stat st; - if (p_stat(path, &st) < GIT_SUCCESS) - return GIT_ERROR; - - return S_ISDIR(st.st_mode) ? GIT_SUCCESS : GIT_ERROR; -#endif -} - -int git_futils_isfile(const char *path) -{ - struct stat st; - int stat_error; - - assert(path); - stat_error = p_stat(path, &st); - - if (stat_error < GIT_SUCCESS) - return -1; - - if (!S_ISREG(st.st_mode)) - return -1; - - return 0; -} - -int git_futils_exists(const char *path) -{ - assert(path); - return p_access(path, F_OK); -} - git_off_t git_futils_filesize(git_file fd) { struct stat sb; @@ -219,54 +178,6 @@ void git_futils_mmap_free(git_map *out) p_munmap(out); } -/* Taken from git.git */ -GIT_INLINE(int) is_dot_or_dotdot(const char *name) -{ - return (name[0] == '.' && - (name[1] == '\0' || - (name[1] == '.' && name[2] == '\0'))); -} - -int git_futils_direach( - git_buf *path, - int (*fn)(void *, git_buf *), - void *arg) -{ - ssize_t wd_len; - DIR *dir; - struct dirent *de; - - if (git_path_to_dir(path) < GIT_SUCCESS) - return git_buf_lasterror(path); - - wd_len = path->size; - dir = opendir(path->ptr); - if (!dir) - return git__throw(GIT_EOSERR, "Failed to process `%s` tree structure. An error occured while opening the directory", path->ptr); - - while ((de = readdir(dir)) != NULL) { - int result; - - if (is_dot_or_dotdot(de->d_name)) - continue; - - if (git_buf_puts(path, de->d_name) < GIT_SUCCESS) - return git_buf_lasterror(path); - - result = fn(arg, path); - - git_buf_truncate(path, wd_len); /* restore path */ - - if (result != GIT_SUCCESS) { - closedir(dir); - return result; /* The callee is reponsible for setting the correct error message */ - } - } - - closedir(dir); - return GIT_SUCCESS; -} - int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode) { int error, root_path_offset; @@ -291,7 +202,7 @@ int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode) pp += root_path_offset; /* On Windows, will skip the drive name (eg. C: or D:) */ while (error == GIT_SUCCESS && (sp = strchr(pp, '/')) != NULL) { - if (sp != pp && git_futils_isdir(make_path.ptr) < GIT_SUCCESS) { + if (sp != pp && git_path_isdir(make_path.ptr) < GIT_SUCCESS) { *sp = 0; error = p_mkdir(make_path.ptr, mode); @@ -324,8 +235,8 @@ static int _rmdir_recurs_foreach(void *opaque, git_buf *path) int error = GIT_SUCCESS; int force = *(int *)opaque; - if (git_futils_isdir(path->ptr) == GIT_SUCCESS) { - error = git_futils_direach(path, _rmdir_recurs_foreach, opaque); + if (git_path_isdir(path->ptr) == GIT_SUCCESS) { + error = git_path_direach(path, _rmdir_recurs_foreach, opaque); if (error < GIT_SUCCESS) return git__rethrow(error, "Failed to remove directory `%s`", path->ptr); return p_rmdir(path->ptr); @@ -349,60 +260,6 @@ int git_futils_rmdir_r(const char *path, int force) return error; } -int git_futils_cmp_path(const char *name1, int len1, int isdir1, - const char *name2, int len2, int isdir2) -{ - int len = len1 < len2 ? len1 : len2; - int cmp; - - cmp = memcmp(name1, name2, len); - if (cmp) - return cmp; - if (len1 < len2) - return ((!isdir1 && !isdir2) ? -1 : - (isdir1 ? '/' - name2[len1] : name2[len1] - '/')); - if (len1 > len2) - return ((!isdir1 && !isdir2) ? 1 : - (isdir2 ? name1[len2] - '/' : '/' - name1[len2])); - return 0; -} - -static int _check_dir_contents( - git_buf *dir, - const char *sub, - int append_on_success, - int (*predicate)(const char *)) -{ - int error = GIT_SUCCESS; - size_t dir_size = dir->size; - size_t sub_size = strlen(sub); - - /* leave base valid even if we could not make space for subdir */ - if ((error = git_buf_try_grow(dir, dir_size + sub_size + 2)) < GIT_SUCCESS) - return error; - - /* save excursion */ - git_buf_joinpath(dir, dir->ptr, sub); - - error = (*predicate)(dir->ptr); - - /* restore excursion */ - if (!append_on_success || error != GIT_SUCCESS) - git_buf_truncate(dir, dir_size); - - return error; -} - -int git_futils_contains_dir(git_buf *base, const char *subdir, int append_if_exists) -{ - return _check_dir_contents(base, subdir, append_if_exists, &git_futils_isdir); -} - -int git_futils_contains_file(git_buf *base, const char *file, int append_if_exists) -{ - return _check_dir_contents(base, file, append_if_exists, &git_futils_isfile); -} - int git_futils_find_global_file(git_buf *path, const char *filename) { int error; @@ -420,7 +277,7 @@ int git_futils_find_global_file(git_buf *path, const char *filename) if ((error = git_buf_joinpath(path, home, filename)) < GIT_SUCCESS) return error; - if (git_futils_exists(path->ptr) < GIT_SUCCESS) { + if (git_path_exists(path->ptr) < GIT_SUCCESS) { git_buf_clear(path); return GIT_ENOTFOUND; } @@ -522,7 +379,7 @@ int git_futils_find_system_file(git_buf *path, const char *filename) if (git_buf_joinpath(path, "/etc", filename) < GIT_SUCCESS) return git_buf_lasterror(path); - if (git_futils_exists(path->ptr) == GIT_SUCCESS) + if (git_path_exists(path->ptr) == GIT_SUCCESS) return GIT_SUCCESS; git_buf_clear(path); @@ -533,29 +390,3 @@ int git_futils_find_system_file(git_buf *path, const char *filename) return GIT_ENOTFOUND; #endif } - -int git_futils_dir_for_path(git_buf *dir, const char *path, const char *base) -{ - int error = GIT_SUCCESS; - - if (base != NULL && git_path_root(path) < 0) - error = git_buf_joinpath(dir, base, path); - else - error = git_buf_sets(dir, path); - - if (error == GIT_SUCCESS) { - char buf[GIT_PATH_MAX]; - if (p_realpath(dir->ptr, buf) != NULL) - error = git_buf_sets(dir, buf); - } - - /* call dirname if this is not a directory */ - if (error == GIT_SUCCESS && git_futils_isdir(dir->ptr) != GIT_SUCCESS) - if (git_path_dirname_r(dir, dir->ptr) < GIT_SUCCESS) - error = git_buf_lasterror(dir); - - if (error == GIT_SUCCESS) - error = git_path_to_dir(dir); - - return error; -} |