diff options
author | Edward Thomson <ethomson@microsoft.com> | 2015-01-12 16:16:27 -0600 |
---|---|---|
committer | Edward Thomson <ethomson@microsoft.com> | 2015-01-20 17:12:23 -0600 |
commit | 1d50b3649d578f12918b7996ad7b98a438bc0616 (patch) | |
tree | 57ee1b06924739f57a3c3b98cffd58ee7d02740d /src/fileops.c | |
parent | 93b4a50de1b124bf1808dbe55b9b5352274622e1 (diff) | |
download | libgit2-1d50b3649d578f12918b7996ad7b98a438bc0616.tar.gz |
checkout: introduce git_checkout_perfdata
Checkout can now provide performance data about the number of (some)
syscalls performed using an optional callback.
Diffstat (limited to 'src/fileops.c')
-rw-r--r-- | src/fileops.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/src/fileops.c b/src/fileops.c index bd9d27c7a..926813f5e 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -279,11 +279,12 @@ void git_futils_mmap_free(git_map *out) p_munmap(out); } -int git_futils_mkdir( +int git_futils_mkdir_withperf( const char *path, const char *base, mode_t mode, - uint32_t flags) + uint32_t flags, + struct git_futils_mkdir_perfdata *perfdata) { int error = -1; git_buf make_path = GIT_BUF_INIT; @@ -352,15 +353,20 @@ int git_futils_mkdir( st.st_mode = 0; /* make directory */ + perfdata->mkdir_calls++; + if (p_mkdir(make_path.ptr, mode) < 0) { int tmp_errno = giterr_system_last(); /* ignore error if not at end or if directory already exists */ - if (lastch == '\0' && - (p_stat(make_path.ptr, &st) < 0 || !S_ISDIR(st.st_mode))) { - giterr_system_set(tmp_errno); - giterr_set(GITERR_OS, "Failed to make directory '%s'", make_path.ptr); - goto done; + if (lastch == '\0') { + perfdata->stat_calls++; + + if (p_stat(make_path.ptr, &st) < 0 || !S_ISDIR(st.st_mode)) { + giterr_system_set(tmp_errno); + giterr_set(GITERR_OS, "Failed to make directory '%s'", make_path.ptr); + goto done; + } } /* with exclusive create, existing dir is an error */ @@ -374,11 +380,15 @@ int git_futils_mkdir( /* chmod if requested and necessary */ if (((flags & GIT_MKDIR_CHMOD_PATH) != 0 || (lastch == '\0' && (flags & GIT_MKDIR_CHMOD) != 0)) && - st.st_mode != mode && - (error = p_chmod(make_path.ptr, mode)) < 0 && - lastch == '\0') { - giterr_set(GITERR_OS, "Failed to set permissions on '%s'", make_path.ptr); - goto done; + st.st_mode != mode) { + + perfdata->chmod_calls++; + + if ((error = p_chmod(make_path.ptr, mode)) < 0 && + lastch == '\0') { + giterr_set(GITERR_OS, "Failed to set permissions on '%s'", make_path.ptr); + goto done; + } } } @@ -386,10 +396,13 @@ int git_futils_mkdir( /* check that full path really is a directory if requested & needed */ if ((flags & GIT_MKDIR_VERIFY_DIR) != 0 && - lastch != '\0' && - (p_stat(make_path.ptr, &st) < 0 || !S_ISDIR(st.st_mode))) { - giterr_set(GITERR_OS, "Path is not a directory '%s'", make_path.ptr); - error = GIT_ENOTFOUND; + lastch != '\0') { + perfdata->stat_calls++; + + if (p_stat(make_path.ptr, &st) < 0 || !S_ISDIR(st.st_mode)) { + giterr_set(GITERR_OS, "Path is not a directory '%s'", make_path.ptr); + error = GIT_ENOTFOUND; + } } done: @@ -397,6 +410,16 @@ done: return error; } +int git_futils_mkdir( + const char *path, + const char *base, + mode_t mode, + uint32_t flags) +{ + struct git_futils_mkdir_perfdata perfdata = {0}; + return git_futils_mkdir_withperf(path, base, mode, flags, &perfdata); +} + int git_futils_mkdir_r(const char *path, const char *base, const mode_t mode) { return git_futils_mkdir(path, base, mode, GIT_MKDIR_PATH); |