diff options
author | Russell Belfer <arrbee@arrbee.com> | 2012-01-17 15:49:47 -0800 |
---|---|---|
committer | Russell Belfer <arrbee@arrbee.com> | 2012-01-17 15:49:47 -0800 |
commit | 1744fafec05d8fa3036a43f5e390c790810b05a5 (patch) | |
tree | b87f0616dd832ec66cc2450b5751b70d468a350e /src/fileops.c | |
parent | d1317f1b69cafb328ca9b263b2b71cddeb2290be (diff) | |
download | libgit2-1744fafec05d8fa3036a43f5e390c790810b05a5.tar.gz |
Move path related functions from fileops to path
This takes all of the functions that look up simple data about
paths (such as `git_futils_isdir`) and moves them over to path.h
(becoming `git_path_isdir`). This leaves fileops.h just with
functions that actually manipulate the filesystem or look at
the file contents in some way.
As part of this, the dir.h header which is really just for win32
support was moved into win32 (with some minor changes).
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; -} |