summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-05-08 10:40:01 -0700
committerRussell Belfer <rb@github.com>2012-05-08 10:40:01 -0700
commit2c0cdc3a86acd917087937f6348062b3951217b5 (patch)
treea3a13fd8950e2176ce52b3491741fdde64b602f3 /src
parent65ca81a63e596f7c8bdfccd15a7bcbf6cfb96cd4 (diff)
parent722c08afecfc2a9cb737e711a2bcc5f1a64c2b08 (diff)
downloadlibgit2-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.c4
-rw-r--r--src/path.c6
-rw-r--r--src/remote.c26
-rw-r--r--src/repository.c5
-rw-r--r--src/status.c8
-rw-r--r--src/win32/posix_w32.c21
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: