diff options
| author | Russell Belfer <rb@github.com> | 2012-05-08 10:40:01 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2012-05-08 10:40:01 -0700 |
| commit | 2c0cdc3a86acd917087937f6348062b3951217b5 (patch) | |
| tree | a3a13fd8950e2176ce52b3491741fdde64b602f3 /src | |
| parent | 65ca81a63e596f7c8bdfccd15a7bcbf6cfb96cd4 (diff) | |
| parent | 722c08afecfc2a9cb737e711a2bcc5f1a64c2b08 (diff) | |
| download | libgit2-2c0cdc3a86acd917087937f6348062b3951217b5.tar.gz | |
Merge pull request #674 from nulltoken/topic/GIT_ENOTFOUND
Improve the interop with bindings
Diffstat (limited to 'src')
| -rw-r--r-- | src/object.c | 4 | ||||
| -rw-r--r-- | src/path.c | 6 | ||||
| -rw-r--r-- | src/remote.c | 26 | ||||
| -rw-r--r-- | src/repository.c | 5 | ||||
| -rw-r--r-- | src/status.c | 8 | ||||
| -rw-r--r-- | src/win32/posix_w32.c | 21 |
6 files changed, 47 insertions, 23 deletions
diff --git a/src/object.c b/src/object.c index e02bd69ba..02be5dac8 100644 --- a/src/object.c +++ b/src/object.c @@ -150,8 +150,8 @@ int git_object_lookup_prefix( if (type != GIT_OBJ_ANY && type != odb_obj->raw.type) { git_odb_object_free(odb_obj); - giterr_set(GITERR_INVALID, "The given type does not match the type on the ODB"); - return -1; + giterr_set(GITERR_ODB, "The given type does not match the type on the ODB"); + return GIT_ENOTFOUND; } type = odb_obj->raw.type; diff --git a/src/path.c b/src/path.c index 703f43af1..9f31676b1 100644 --- a/src/path.c +++ b/src/path.c @@ -205,9 +205,13 @@ int git_path_prettify(git_buf *path_out, const char *path, const char *base) } if (p_realpath(path, buf) == NULL) { + /* giterr_set resets the errno when dealing with a GITERR_OS kind of error */ + int error = (errno == ENOENT || errno == ENOTDIR) ? GIT_ENOTFOUND : -1; giterr_set(GITERR_OS, "Failed to resolve path '%s'", path); + git_buf_clear(path_out); - return (errno == ENOENT) ? GIT_ENOTFOUND : -1; + + return error; } return git_buf_sets(path_out, buf); diff --git a/src/remote.c b/src/remote.c index 98c256929..6a1390dba 100644 --- a/src/remote.c +++ b/src/remote.c @@ -102,24 +102,28 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name) remote->name = git__strdup(name); GITERR_CHECK_ALLOC(remote->name); - if (git_vector_init(&remote->refs, 32, NULL) < 0) - return -1; - - if (git_buf_printf(&buf, "remote.%s.url", name) < 0) - return -1; + if (git_vector_init(&remote->refs, 32, NULL) < 0) { + error = -1; + goto cleanup; + } - if (git_config_get_string(config, git_buf_cstr(&buf), &val) < 0) { + if (git_buf_printf(&buf, "remote.%s.url", name) < 0) { error = -1; goto cleanup; } + if ((error = git_config_get_string(config, git_buf_cstr(&buf), &val)) < 0) + goto cleanup; + remote->repo = repo; remote->url = git__strdup(val); GITERR_CHECK_ALLOC(remote->url); git_buf_clear(&buf); - if (git_buf_printf(&buf, "remote.%s.fetch", name) < 0) - return -1; + if (git_buf_printf(&buf, "remote.%s.fetch", name) < 0) { + error = -1; + goto cleanup; + } error = parse_remote_refspec(config, &remote->fetch, git_buf_cstr(&buf)); if (error == GIT_ENOTFOUND) @@ -131,8 +135,10 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name) } git_buf_clear(&buf); - if (git_buf_printf(&buf, "remote.%s.push", name) < 0) - return -1; + if (git_buf_printf(&buf, "remote.%s.push", name) < 0) { + error = -1; + goto cleanup; + } error = parse_remote_refspec(config, &remote->push, git_buf_cstr(&buf)); if (error == GIT_ENOTFOUND) diff --git a/src/repository.c b/src/repository.c index d4de38104..ea9673731 100644 --- a/src/repository.c +++ b/src/repository.c @@ -397,13 +397,14 @@ int git_repository_discover( { git_buf path = GIT_BUF_INIT; uint32_t flags = across_fs ? GIT_REPOSITORY_OPEN_CROSS_FS : 0; + int error; assert(start_path && repository_path && size > 0); *repository_path = '\0'; - if (find_repo(&path, NULL, start_path, flags, ceiling_dirs) < 0) - return -1; + if ((error = find_repo(&path, NULL, start_path, flags, ceiling_dirs)) < 0) + return error != GIT_ENOTFOUND ? -1 : error; if (size < (size_t)(path.size + 1)) { giterr_set(GITERR_REPOSITORY, diff --git a/src/status.c b/src/status.c index ff8535c66..546dc863d 100644 --- a/src/status.c +++ b/src/status.c @@ -340,17 +340,17 @@ int git_status_file( assert(status_flags && repo && path); if ((workdir = git_repository_workdir(repo)) == NULL) { - giterr_set(GITERR_OS, "Cannot get file status from bare repo"); - return GIT_ENOTFOUND; + giterr_set(GITERR_INVALID, "Cannot get file status from bare repo"); + return -1; } if (git_buf_joinpath(&temp_path, workdir, path) < 0) return -1; if (git_path_isdir(temp_path.ptr)) { - giterr_set(GITERR_OS, "Cannot get file status for directory '%s'", temp_path.ptr); + giterr_set(GITERR_INVALID, "Cannot get file status for directory '%s'", temp_path.ptr); git_buf_free(&temp_path); - return GIT_ENOTFOUND; + return -1; } e = status_entry_new(NULL, path); diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 617291899..10de70da8 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -326,7 +326,7 @@ int p_hide_directory__w32(const char *path) char *p_realpath(const char *orig_path, char *buffer) { - int ret; + int ret, buffer_sz = 0; wchar_t* orig_path_w = gitwin_to_utf16(orig_path); wchar_t* buffer_w = (wchar_t*)git__malloc(GIT_PATH_MAX * sizeof(wchar_t)); @@ -336,13 +336,14 @@ char *p_realpath(const char *orig_path, char *buffer) ret = GetFullPathNameW(orig_path_w, GIT_PATH_MAX, buffer_w, NULL); git__free(orig_path_w); - if (!ret || ret > GIT_PATH_MAX) { + /* According to MSDN, a return value equals to zero means a failure. */ + if (ret == 0 || ret > GIT_PATH_MAX) { buffer = NULL; goto done; } if (buffer == NULL) { - int buffer_sz = WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, NULL, 0, NULL, NULL); + buffer_sz = WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, NULL, 0, NULL, NULL); if (!buffer_sz || !(buffer = (char *)git__malloc(buffer_sz)) || @@ -350,10 +351,22 @@ char *p_realpath(const char *orig_path, char *buffer) { git__free(buffer); buffer = NULL; + goto done; } } else { - if (!WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, buffer, GIT_PATH_MAX, NULL, NULL)) + if (!WideCharToMultiByte(CP_UTF8, 0, buffer_w, -1, buffer, GIT_PATH_MAX, NULL, NULL)) { buffer = NULL; + goto done; + } + } + + if (!git_path_exists(buffer)) + { + if (buffer_sz > 0) + git__free(buffer); + + buffer = NULL; + errno = ENOENT; } done: |
