summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornulltoken <emeric.fermas@gmail.com>2013-09-08 18:22:28 +0200
committernulltoken <emeric.fermas@gmail.com>2013-09-10 22:36:10 +0200
commitd0cd6c427a35b257373c7178d1e17d82001e125f (patch)
tree12c22e3a8b979d586391ccb410fd2bc1e985d710 /src
parent38859f293720a960acaf7f426c683ab1a71b18c6 (diff)
downloadlibgit2-d0cd6c427a35b257373c7178d1e17d82001e125f.tar.gz
path: Make direach() return EUSER on callback error
Diffstat (limited to 'src')
-rw-r--r--src/fileops.c30
-rw-r--r--src/odb_pack.c2
-rw-r--r--src/path.c4
-rw-r--r--src/refdb_fs.c2
4 files changed, 25 insertions, 13 deletions
diff --git a/src/fileops.c b/src/fileops.c
index 92cda82e7..126d45f26 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -869,6 +869,7 @@ typedef struct {
uint32_t flags;
uint32_t mkdir_flags;
mode_t dirmode;
+ int error;
} cp_r_info;
#define GIT_CPDIR__MKDIR_DONE_FOR_TO_ROOT (1u << 10)
@@ -907,20 +908,23 @@ static int _cp_r_callback(void *ref, git_buf *from)
return 0;
if (git_buf_joinpath(
- &info->to, info->to_root, from->ptr + info->from_prefix) < 0)
- return -1;
+ &info->to, info->to_root, from->ptr + info->from_prefix) < 0) {
+ error = -1;
+ goto exit;
+ }
if (p_lstat(info->to.ptr, &to_st) < 0) {
if (errno != ENOENT && errno != ENOTDIR) {
giterr_set(GITERR_OS,
"Could not access %s while copying files", info->to.ptr);
- return -1;
+ error = -1;
+ goto exit;
}
} else
exists = true;
if ((error = git_path_lstat(from->ptr, &from_st)) < 0)
- return error;
+ goto exit;
if (S_ISDIR(from_st.st_mode)) {
mode_t oldmode = info->dirmode;
@@ -934,13 +938,14 @@ static int _cp_r_callback(void *ref, git_buf *from)
error = _cp_r_mkdir(info, from);
/* recurse onto target directory */
- if (!error && (!exists || S_ISDIR(to_st.st_mode)))
- error = git_path_direach(from, _cp_r_callback, info);
+ if (!error && (!exists || S_ISDIR(to_st.st_mode)) &&
+ ((error = git_path_direach(from, _cp_r_callback, info)) == GIT_EUSER))
+ error = info->error;
if (oldmode != 0)
info->dirmode = oldmode;
- return error;
+ goto exit;
}
if (exists) {
@@ -950,7 +955,8 @@ static int _cp_r_callback(void *ref, git_buf *from)
if (p_unlink(info->to.ptr) < 0) {
giterr_set(GITERR_OS, "Cannot overwrite existing file '%s'",
info->to.ptr);
- return -1;
+ error = -1;
+ goto exit;
}
}
@@ -963,7 +969,7 @@ static int _cp_r_callback(void *ref, git_buf *from)
/* Make container directory on demand if needed */
if ((info->flags & GIT_CPDIR_CREATE_EMPTY_DIRS) == 0 &&
(error = _cp_r_mkdir(info, from)) < 0)
- return error;
+ goto exit;
/* make symlink or regular file */
if (S_ISLNK(from_st.st_mode))
@@ -977,6 +983,8 @@ static int _cp_r_callback(void *ref, git_buf *from)
error = git_futils_cp(from->ptr, info->to.ptr, usemode);
}
+exit:
+ info->error = error;
return error;
}
@@ -997,6 +1005,7 @@ int git_futils_cp_r(
info.flags = flags;
info.dirmode = dirmode;
info.from_prefix = path.size;
+ info.error = 0;
git_buf_init(&info.to, 0);
/* precalculate mkdir flags */
@@ -1018,6 +1027,9 @@ int git_futils_cp_r(
git_buf_free(&path);
git_buf_free(&info.to);
+ if (error == GIT_EUSER)
+ error = info.error;
+
return error;
}
diff --git a/src/odb_pack.c b/src/odb_pack.c
index d24b4aa99..cadc93a65 100644
--- a/src/odb_pack.c
+++ b/src/odb_pack.c
@@ -336,7 +336,7 @@ static int pack_backend__refresh(git_odb_backend *_backend)
git_buf_free(&path);
if (error < 0)
- return error;
+ return -1;
git_vector_sort(&backend->packs);
return 0;
diff --git a/src/path.c b/src/path.c
index 7c1ec2cd0..56b0b49ca 100644
--- a/src/path.c
+++ b/src/path.c
@@ -765,10 +765,10 @@ int git_path_direach(
git_buf_truncate(path, wd_len); /* restore path */
- if (result < 0) {
+ if (result) {
closedir(dir);
git__free(de_buf);
- return -1;
+ return GIT_EUSER;
}
}
diff --git a/src/refdb_fs.c b/src/refdb_fs.c
index 04516a5b0..894ff7c84 100644
--- a/src/refdb_fs.c
+++ b/src/refdb_fs.c
@@ -299,7 +299,7 @@ static int packed_loadloose(refdb_fs_backend *backend)
git_buf_free(&refs_path);
- return error;
+ return (error == GIT_EUSER) ? -1 : error;
}
static int refdb_fs_backend__exists(