summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <vicent@github.com>2014-03-05 21:07:20 +0100
committerVicent Marti <vicent@github.com>2014-03-05 21:07:20 +0100
commita62ad3c353380fb95d0f482859b445d430018aa9 (patch)
treec96ad9be5d46001adce3ca7542572b028c18ceb4
parent967d3f2e3e81b2f21d2b3dee12c58de35572cecb (diff)
parenta213a7bfa82b7171b90c415cbdb44d469e747ece (diff)
downloadlibgit2-a62ad3c353380fb95d0f482859b445d430018aa9.tar.gz
Merge pull request #2164 from libgit2/cmn/refs-delete-iteration
refdb: catch a directory disappearing
-rw-r--r--src/path.c3
-rw-r--r--src/refdb_fs.c12
2 files changed, 13 insertions, 2 deletions
diff --git a/src/path.c b/src/path.c
index 89409eae4..fa800b74c 100644
--- a/src/path.c
+++ b/src/path.c
@@ -853,6 +853,9 @@ int git_path_direach(
if ((dir = opendir(path->ptr)) == NULL) {
giterr_set(GITERR_OS, "Failed to open directory '%s'", path->ptr);
+ if (errno == ENOENT)
+ return GIT_ENOTFOUND;
+
return -1;
}
diff --git a/src/refdb_fs.c b/src/refdb_fs.c
index 43682f40e..3219b0519 100644
--- a/src/refdb_fs.c
+++ b/src/refdb_fs.c
@@ -272,9 +272,17 @@ static int _dirent_loose_load(void *payload, git_buf *full_path)
if (git__suffixcmp(full_path->ptr, ".lock") == 0)
return 0;
- if (git_path_isdir(full_path->ptr))
- return git_path_direach(
+ if (git_path_isdir(full_path->ptr)) {
+ int error = git_path_direach(
full_path, backend->direach_flags, _dirent_loose_load, backend);
+ /* Race with the filesystem, ignore it */
+ if (error == GIT_ENOTFOUND) {
+ giterr_clear();
+ return 0;
+ }
+
+ return error;
+ }
file_path = full_path->ptr + strlen(backend->path);