diff options
author | Vicent Martà <tanoku@gmail.com> | 2012-05-05 14:22:53 -0700 |
---|---|---|
committer | Vicent Martà <tanoku@gmail.com> | 2012-05-05 14:22:53 -0700 |
commit | 48ecd122ea6fb8cf12fb4029974c314e5d9efb62 (patch) | |
tree | 88f90fa8c9d903f072a2b1c647c51a9899e520c7 /src/notes.c | |
parent | 2218fd57a50ceb851cb131939bf0747e072e40f6 (diff) | |
parent | 4ef14af93517b3842bc0dfa24147cf10dd029582 (diff) | |
download | libgit2-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.c | 218 |
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(¬e->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(¬es_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(¬es_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(¬es_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) |