diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/blame.c | 14 | ||||
| -rw-r--r-- | src/blame.h | 2 | ||||
| -rw-r--r-- | src/commit.c | 12 | ||||
| -rw-r--r-- | src/signature.c | 39 |
4 files changed, 63 insertions, 4 deletions
diff --git a/src/blame.c b/src/blame.c index a923bf003..967530b7e 100644 --- a/src/blame.c +++ b/src/blame.c @@ -132,6 +132,9 @@ git_blame* git_blame__alloc( return NULL; } + if (opts.flags & GIT_BLAME_USE_MAILMAP) + git_mailmap_from_repo(&gbr->mailmap, repo); + return gbr; } @@ -150,6 +153,8 @@ void git_blame_free(git_blame *blame) git_array_clear(blame->line_index); + git_mailmap_free(blame->mailmap); + git__free(blame->path); git_blob_free(blame->final_blob); git__free(blame); @@ -279,7 +284,7 @@ static int index_blob_lines(git_blame *blame) return blame->num_lines; } -static git_blame_hunk* hunk_from_entry(git_blame__entry *e) +static git_blame_hunk* hunk_from_entry(git_blame__entry *e, git_blame *blame) { git_blame_hunk *h = new_hunk( e->lno+1, e->num_lines, e->s_lno+1, e->suspect->path); @@ -289,8 +294,9 @@ static git_blame_hunk* hunk_from_entry(git_blame__entry *e) git_oid_cpy(&h->final_commit_id, git_commit_id(e->suspect->commit)); git_oid_cpy(&h->orig_commit_id, git_commit_id(e->suspect->commit)); - git_signature_dup(&h->final_signature, git_commit_author(e->suspect->commit)); - git_signature_dup(&h->orig_signature, git_commit_author(e->suspect->commit)); + git_commit_author_with_mailmap( + &h->final_signature, e->suspect->commit, blame->mailmap); + git_signature_dup(&h->orig_signature, h->final_signature); h->boundary = e->is_boundary ? 1 : 0; return h; } @@ -341,7 +347,7 @@ static int blame_internal(git_blame *blame) cleanup: for (ent = blame->ent; ent; ) { git_blame__entry *e = ent->next; - git_blame_hunk *h = hunk_from_entry(ent); + git_blame_hunk *h = hunk_from_entry(ent, blame); git_vector_insert(&blame->hunks, h); diff --git a/src/blame.h b/src/blame.h index 8fd3ee5b1..057413274 100644 --- a/src/blame.h +++ b/src/blame.h @@ -84,6 +84,8 @@ struct git_blame { int num_lines; const char *final_buf; git_off_t final_buf_size; + + git_mailmap *mailmap; }; git_blame *git_blame__alloc( diff --git a/src/commit.c b/src/commit.c index e0c090aa8..03ecea8e8 100644 --- a/src/commit.c +++ b/src/commit.c @@ -889,3 +889,15 @@ cleanup: git_buf_dispose(&commit); return error; } + +int git_commit_committer_with_mailmap( + git_signature **out, const git_commit *commit, const git_mailmap *mailmap) +{ + return git_signature_with_mailmap(out, commit->committer, mailmap); +} + +int git_commit_author_with_mailmap( + git_signature **out, const git_commit *commit, const git_mailmap *mailmap) +{ + return git_signature_with_mailmap(out, commit->author, mailmap); +} diff --git a/src/signature.c b/src/signature.c index cd6852326..a93ba1019 100644 --- a/src/signature.c +++ b/src/signature.c @@ -9,6 +9,7 @@ #include "repository.h" #include "git2/common.h" +#include "git2/mailmap.h" #include "posix.h" void git_signature_free(git_signature *sig) @@ -121,6 +122,44 @@ int git_signature_dup(git_signature **dest, const git_signature *source) return 0; } +int git_signature_with_mailmap( + git_signature **dest, + const git_signature *source, + const git_mailmap *mailmap) +{ + git_signature *signature = NULL; + const char *name = NULL; + const char *email = NULL; + + if (source == NULL) + goto on_error; + + git_mailmap_resolve(&name, &email, mailmap, source->name, source->email); + + signature = git__calloc(1, sizeof(git_signature)); + if (!signature) + goto on_error; + + signature->name = git__strdup(name); + if (!signature->name) + goto on_error; + + signature->email = git__strdup(email); + if (!signature->email) + goto on_error; + + signature->when.time = source->when.time; + signature->when.offset = source->when.offset; + signature->when.sign = source->when.sign; + + *dest = signature; + return 0; + +on_error: + git_signature_free(signature); + return -1; +} + int git_signature__pdup(git_signature **dest, const git_signature *source, git_pool *pool) { git_signature *signature; |
