diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-03-07 15:17:08 +0100 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-03-07 16:03:10 +0100 |
commit | 7c1ee212b7fa1568a12a0a656b02cae01cb1cb6c (patch) | |
tree | 5752594e6c16fe5a0df52785b7a97c1f6736f1bf /src/commit.c | |
parent | 5187b609ba203b5a62e3e54c1a323cc0647deff9 (diff) | |
download | libgit2-7c1ee212b7fa1568a12a0a656b02cae01cb1cb6c.tar.gz |
commit: simplify and correct refcounting in nth_gen_ancestor
We can make use of git_object_dup to use refcounting instead of pointer
comparison to make sure we don't free the caller's object.
This also lets us simplify the case for '~0' which is now just an
assignment instead of looking up the object we have at hand.
Diffstat (limited to 'src/commit.c')
-rw-r--r-- | src/commit.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/src/commit.c b/src/commit.c index 2f5a5b51e..255debe82 100644 --- a/src/commit.c +++ b/src/commit.c @@ -455,19 +455,18 @@ int git_commit_nth_gen_ancestor( assert(ancestor && commit); - current = (git_commit *)commit; + if (git_object_dup((git_object **) ¤t, (git_object *) commit) < 0) + return -1; - if (n == 0) - return git_commit_lookup( - ancestor, - commit->object.repo, - git_object_id((const git_object *)commit)); + if (n == 0) { + *ancestor = current; + return 0; + } while (n--) { - error = git_commit_parent(&parent, (git_commit *)current, 0); + error = git_commit_parent(&parent, current, 0); - if (current != commit) - git_commit_free(current); + git_commit_free(current); if (error < 0) return error; |