summaryrefslogtreecommitdiff
path: root/src/fileops.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2015-01-12 16:16:27 -0600
committerEdward Thomson <ethomson@microsoft.com>2015-01-20 17:12:23 -0600
commit1d50b3649d578f12918b7996ad7b98a438bc0616 (patch)
tree57ee1b06924739f57a3c3b98cffd58ee7d02740d /src/fileops.c
parent93b4a50de1b124bf1808dbe55b9b5352274622e1 (diff)
downloadlibgit2-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.c55
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);