summaryrefslogtreecommitdiff
path: root/src/notes.c
diff options
context:
space:
mode:
authorVicent Martí <tanoku@gmail.com>2012-05-05 14:22:53 -0700
committerVicent Martí <tanoku@gmail.com>2012-05-05 14:22:53 -0700
commit48ecd122ea6fb8cf12fb4029974c314e5d9efb62 (patch)
tree88f90fa8c9d903f072a2b1c647c51a9899e520c7 /src/notes.c
parent2218fd57a50ceb851cb131939bf0747e072e40f6 (diff)
parent4ef14af93517b3842bc0dfa24147cf10dd029582 (diff)
downloadlibgit2-48ecd122ea6fb8cf12fb4029974c314e5d9efb62.tar.gz
Merge pull request #659 from libgit2/development-merge
New-error-handling
Diffstat (limited to 'src/notes.c')
-rw-r--r--src/notes.c218
1 files changed, 108 insertions, 110 deletions
diff --git a/src/notes.c b/src/notes.c
index 68554c36f..4afdac0bd 100644
--- a/src/notes.c
+++ b/src/notes.c
@@ -9,6 +9,7 @@
#include "git2.h"
#include "refs.h"
+#include "config.h"
static int find_subtree(git_tree **subtree, const git_oid *root,
git_repository *repo, const char *target, int *fanout)
@@ -21,11 +22,8 @@ static int find_subtree(git_tree **subtree, const git_oid *root,
*subtree = NULL;
error = git_tree_lookup(&tree, repo, root);
- if (error < GIT_SUCCESS) {
- if (error == GIT_ENOTFOUND)
- return error; /* notes tree doesn't exist yet */
- return git__rethrow(error, "Failed to open notes tree");
- }
+ if (error < 0)
+ return error;
for (i=0; i<git_tree_entrycount(tree); i++) {
entry = git_tree_entry_byindex(tree, i);
@@ -56,7 +54,7 @@ static int find_subtree(git_tree **subtree, const git_oid *root,
}
*subtree = tree;
- return GIT_SUCCESS;
+ return 0;
}
static int find_blob(git_oid *blob, git_tree *tree, const char *target)
@@ -71,7 +69,7 @@ static int find_blob(git_oid *blob, git_tree *tree, const char *target)
/* found matching note object - return */
git_oid_cpy(blob, git_tree_entry_id(entry));
- return GIT_SUCCESS;
+ return 0;
}
}
return GIT_ENOTFOUND;
@@ -93,18 +91,17 @@ static int note_write(git_oid *out, git_repository *repo,
if (tree_sha) {
error = find_subtree(&tree, tree_sha, repo, target, &fanout);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to lookup subtree");
+ if (error < 0)
+ return error;
error = find_blob(&oid, tree, target + fanout);
- if (error < GIT_SUCCESS && error != GIT_ENOTFOUND) {
+ if (error != GIT_ENOTFOUND) {
git_tree_free(tree);
- return git__throw(GIT_ENOTFOUND, "Failed to read subtree %s", target);
- }
-
- if (error == GIT_SUCCESS) {
- git_tree_free(tree);
- return git__throw(GIT_EEXISTS, "Note for `%s` exists already", target);
+ if (!error) {
+ giterr_set(GITERR_REPOSITORY, "Note for '%s' exists already", target);
+ error = GIT_EEXISTS;
+ }
+ return error;
}
}
@@ -113,8 +110,8 @@ static int note_write(git_oid *out, git_repository *repo,
error = git_treebuilder_create(&tb, tree);
git_tree_free(tree);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to create treebuilder");
+ if (error < 0)
+ return error;
if (!tree_sha)
/* no notes tree yet - create fanout */
@@ -122,18 +119,18 @@ static int note_write(git_oid *out, git_repository *repo,
/* create note object */
error = git_blob_create_frombuffer(&oid, repo, note, strlen(note));
- if (error < GIT_SUCCESS) {
+ if (error < 0) {
git_treebuilder_free(tb);
- return git__rethrow(error, "Failed to create note object");
+ return error;
}
error = git_treebuilder_insert(&entry, tb, target + fanout, &oid, 0100644);
- if (error < GIT_SUCCESS) {
+ if (error < 0) {
/* libgit2 doesn't support object removal (gc) yet */
/* we leave an orphaned blob object behind - TODO */
git_treebuilder_free(tb);
- return git__rethrow(error, "Failed to insert note object");
+ return error;
}
if (out)
@@ -142,8 +139,8 @@ static int note_write(git_oid *out, git_repository *repo,
error = git_treebuilder_write(&oid, repo, tb);
git_treebuilder_free(tb);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to write notes tree");
+ if (error < 0)
+ return 0;
if (!tree_sha) {
/* create fanout subtree */
@@ -153,27 +150,28 @@ static int note_write(git_oid *out, git_repository *repo,
subtree[2] = '\0';
error = git_treebuilder_create(&tb, NULL);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to create treebuilder");
+ if (error < 0)
+ return error;
error = git_treebuilder_insert(NULL, tb, subtree, &oid, 0040000);
- if (error < GIT_SUCCESS) {
+ if (error < 0) {
git_treebuilder_free(tb);
- return git__rethrow(error, "Failed to insert note object");
+ return error;
}
error = git_treebuilder_write(&oid, repo, tb);
+
git_treebuilder_free(tb);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to write notes tree");
+ if (error < 0)
+ return error;
}
/* create new notes commit */
error = git_tree_lookup(&tree, repo, &oid);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to open new notes tree");
+ if (error < 0)
+ return error;
error = git_commit_create(&oid, repo, notes_ref, author, committer,
NULL, GIT_NOTES_DEFAULT_MSG_ADD,
@@ -181,10 +179,7 @@ static int note_write(git_oid *out, git_repository *repo,
git_tree_free(tree);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to create new notes commit");
-
- return GIT_SUCCESS;
+ return error;
}
static int note_lookup(git_note **out, git_repository *repo,
@@ -197,31 +192,25 @@ static int note_lookup(git_note **out, git_repository *repo,
git_note *note;
error = find_subtree(&tree, tree_sha, repo, target, &fanout);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to lookup subtree");
+ if (error < 0)
+ return error;
error = find_blob(&oid, tree, target + fanout);
- if (error < GIT_SUCCESS) {
- git_tree_free(tree);
- return git__throw(GIT_ENOTFOUND, "No note found for object %s",
- target);
- }
+
git_tree_free(tree);
+ if (error < 0)
+ return error;
error = git_blob_lookup(&blob, repo, &oid);
- if (error < GIT_SUCCESS)
- return git__throw(GIT_ERROR, "Failed to lookup note object");
+ if (error < 0)
+ return error;
note = git__malloc(sizeof(git_note));
- if (note == NULL) {
- git_blob_free(blob);
- return GIT_ENOMEM;
- }
+ GITERR_CHECK_ALLOC(note);
git_oid_cpy(&note->oid, &oid);
note->message = git__strdup(git_blob_rawcontent(blob));
- if (note->message == NULL)
- error = GIT_ENOMEM;
+ GITERR_CHECK_ALLOC(note->message);
*out = note;
@@ -240,39 +229,30 @@ static int note_remove(git_repository *repo,
git_treebuilder *tb;
error = find_subtree(&tree, tree_sha, repo, target, &fanout);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to lookup subtree");
+ if (error < 0)
+ return error;
error = find_blob(&oid, tree, target + fanout);
- if (error < GIT_SUCCESS) {
- git_tree_free(tree);
- return git__throw(GIT_ENOTFOUND, "No note found for object %s",
- target);
- }
+ if (!error)
+ error = git_treebuilder_create(&tb, tree);
- error = git_treebuilder_create(&tb, tree);
git_tree_free(tree);
-
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to create treebuilder");
+ if (error < 0)
+ return error;
error = git_treebuilder_remove(tb, target + fanout);
- if (error < GIT_SUCCESS) {
- git_treebuilder_free(tb);
- return git__rethrow(error, "Failed to remove entry from notes tree");
- }
+ if (!error)
+ error = git_treebuilder_write(&oid, repo, tb);
- error = git_treebuilder_write(&oid, repo, tb);
git_treebuilder_free(tb);
-
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to write notes tree");
+ if (error < 0)
+ return error;
/* create new notes commit */
error = git_tree_lookup(&tree, repo, &oid);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to open new notes tree");
+ if (error < 0)
+ return error;
error = git_commit_create(&oid, repo, notes_ref, author, committer,
NULL, GIT_NOTES_DEFAULT_MSG_RM,
@@ -280,12 +260,28 @@ static int note_remove(git_repository *repo,
git_tree_free(tree);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to create new notes commit");
-
return error;
}
+static int note_get_default_ref(const char **out, git_repository *repo)
+{
+ int ret;
+ git_config *cfg;
+
+ *out = NULL;
+
+ if (git_repository_config__weakptr(&cfg, repo) < 0)
+ return -1;
+
+ ret = git_config_get_string(cfg, "core.notesRef", out);
+ if (ret == GIT_ENOTFOUND) {
+ *out = GIT_NOTES_DEFAULT_REF;
+ return 0;
+ }
+
+ return ret;
+}
+
int git_note_read(git_note **out, git_repository *repo,
const char *notes_ref, const git_oid *oid)
{
@@ -297,12 +293,12 @@ int git_note_read(git_note **out, git_repository *repo,
*out = NULL;
- if (!notes_ref)
- notes_ref = GIT_NOTES_DEFAULT_REF;
+ if (!notes_ref && note_get_default_ref(&notes_ref, repo) < 0)
+ return -1;
error = git_reference_lookup(&ref, repo, notes_ref);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to lookup reference `%s`", notes_ref);
+ if (error < 0)
+ return error;
assert(git_reference_type(ref) == GIT_REF_OID);
@@ -311,27 +307,26 @@ int git_note_read(git_note **out, git_repository *repo,
git_reference_free(ref);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to find notes commit object");
+ if (error < 0)
+ return error;
sha = git_commit_tree_oid(commit);
git_commit_free(commit);
target = git_oid_allocfmt(oid);
- if (target == NULL)
- return GIT_ENOMEM;
+ GITERR_CHECK_ALLOC(target);
error = note_lookup(out, repo, sha, target);
git__free(target);
- return error == GIT_SUCCESS ? GIT_SUCCESS :
- git__rethrow(error, "Failed to read note");
+ return error;
}
-int git_note_create(git_oid *out, git_repository *repo,
- git_signature *author, git_signature *committer,
- const char *notes_ref, const git_oid *oid,
- const char *note)
+int git_note_create(
+ git_oid *out, git_repository *repo,
+ git_signature *author, git_signature *committer,
+ const char *notes_ref, const git_oid *oid,
+ const char *note)
{
int error, nparents = 0;
char *target;
@@ -339,14 +334,14 @@ int git_note_create(git_oid *out, git_repository *repo,
git_commit *commit = NULL;
git_reference *ref;
- if (!notes_ref)
- notes_ref = GIT_NOTES_DEFAULT_REF;
+ if (!notes_ref && note_get_default_ref(&notes_ref, repo) < 0)
+ return -1;
error = git_reference_lookup(&ref, repo, notes_ref);
- if (error < GIT_SUCCESS && error != GIT_ENOTFOUND)
- return git__rethrow(error, "Failed to lookup reference `%s`", notes_ref);
+ if (error < 0 && error != GIT_ENOTFOUND)
+ return error;
- if (error == GIT_SUCCESS) {
+ if (!error) {
assert(git_reference_type(ref) == GIT_REF_OID);
/* lookup existing notes tree oid */
@@ -355,16 +350,15 @@ int git_note_create(git_oid *out, git_repository *repo,
git_reference_free(ref);
error = git_commit_lookup(&commit, repo, &sha);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to find notes commit object");
+ if (error < 0)
+ return error;
git_oid_cpy(&sha, git_commit_tree_oid(commit));
nparents++;
}
target = git_oid_allocfmt(oid);
- if (target == NULL)
- return GIT_ENOMEM;
+ GITERR_CHECK_ALLOC(target);
error = note_write(out, repo, author, committer, notes_ref,
note, nparents ? &sha : NULL, target,
@@ -372,8 +366,7 @@ int git_note_create(git_oid *out, git_repository *repo,
git__free(target);
git_commit_free(commit);
- return error == GIT_SUCCESS ? GIT_SUCCESS :
- git__rethrow(error, "Failed to write note");
+ return error;
}
int git_note_remove(git_repository *repo, const char *notes_ref,
@@ -386,12 +379,13 @@ int git_note_remove(git_repository *repo, const char *notes_ref,
git_commit *commit;
git_reference *ref;
- if (!notes_ref)
- notes_ref = GIT_NOTES_DEFAULT_REF;
+
+ if (!notes_ref && note_get_default_ref(&notes_ref, repo) < 0)
+ return -1;
error = git_reference_lookup(&ref, repo, notes_ref);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to lookup reference `%s`", notes_ref);
+ if (error < 0)
+ return error;
assert(git_reference_type(ref) == GIT_REF_OID);
@@ -399,22 +393,26 @@ int git_note_remove(git_repository *repo, const char *notes_ref,
git_reference_free(ref);
error = git_commit_lookup(&commit, repo, &sha);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to find notes commit object");
+ if (error < 0)
+ return error;
git_oid_cpy(&sha, git_commit_tree_oid(commit));
target = git_oid_allocfmt(oid);
- if (target == NULL)
- return GIT_ENOMEM;
+ GITERR_CHECK_ALLOC(target);
error = note_remove(repo, author, committer, notes_ref,
&sha, target, 1, &commit);
git__free(target);
git_commit_free(commit);
- return error == GIT_SUCCESS ? GIT_SUCCESS :
- git__rethrow(error, "Failed to read note");
+ return error;
+}
+
+int git_note_default_ref(const char **out, git_repository *repo)
+{
+ assert(repo);
+ return note_get_default_ref(out, repo);
}
const char * git_note_message(git_note *note)