Skip to content

Commit

Permalink
Add mailmap.file as configurational option for mailmap location
Browse files Browse the repository at this point in the history
This allows us to augment the repo mailmap file, and to use
mailmap files elsewhere than the repository root. Meaning
that the entries in mailmap.file will override the entries
in "./.mailmap", should they match.

Signed-off-by: Marius Storm-Olsen <marius@trolltech.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Marius Storm-Olsen authored and Junio C Hamano committed Feb 8, 2009
1 parent 88ccb9f commit d551a48
Show file tree
Hide file tree
Showing 10 changed files with 147 additions and 7 deletions.
8 changes: 8 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1012,6 +1012,14 @@ log.showroot::
Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which
normally hide the root commit will now show it. True by default.

mailmap.file::
The location of an augmenting mailmap file. The default
mailmap, located in the root of the repository, is loaded
first, then the mailmap file pointed to by this variable.
The location of the mailmap file may be in a repository
subdirectory, or somewhere outside of the repository itself.
See linkgit:git-shortlog[1] and linkgit:git-blame[1].

man.viewer::
Specify the programs that may be used to display help in the
'man' format. See linkgit:git-help[1].
Expand Down
3 changes: 2 additions & 1 deletion Documentation/git-shortlog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ OPTIONS
FILES
-----

If a file `.mailmap` exists at the toplevel of the repository,
If a file `.mailmap` exists at the toplevel of the repository, or at the
location pointed to by the log.mailmap configuration option,
it is used to map an author email address to a canonical real name. This
can be used to coalesce together commits by the same person where their
name was spelled differently (whether with the same email address or
Expand Down
2 changes: 1 addition & 1 deletion builtin-blame.c
Original file line number Diff line number Diff line change
Expand Up @@ -2394,7 +2394,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
die("reading graft file %s failed: %s",
revs_file, strerror(errno));

read_mailmap(&mailmap, ".mailmap", NULL);
read_mailmap(&mailmap, NULL);

if (!incremental)
setup_pager();
Expand Down
3 changes: 2 additions & 1 deletion builtin-shortlog.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ void shortlog_init(struct shortlog *log)
{
memset(log, 0, sizeof(*log));

read_mailmap(&log->mailmap, ".mailmap", &log->common_repo_prefix);
read_mailmap(&log->mailmap, &log->common_repo_prefix);

log->list.strdup_strings = 1;
log->wrap = DEFAULT_WRAPLEN;
Expand Down Expand Up @@ -248,6 +248,7 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
struct parse_opt_ctx_t ctx;

prefix = setup_git_directory_gently(&nongit);
git_config(git_default_config, NULL);
shortlog_init(&log);
init_revisions(&rev, prefix);
parse_options_start(&ctx, argc, argv, PARSE_OPT_KEEP_DASHDASH |
Expand Down
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,7 @@ extern int user_ident_explicitly_given;

extern const char *git_commit_encoding;
extern const char *git_log_output_encoding;
extern const char *git_mailmap_file;

/* IO helper functions */
extern void maybe_flush_or_die(FILE *, const char *);
Expand Down
12 changes: 12 additions & 0 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,15 @@ static int git_default_branch_config(const char *var, const char *value)
return 0;
}

static int git_default_mailmap_config(const char *var, const char *value)
{
if (!strcmp(var, "mailmap.file"))
return git_config_string(&git_mailmap_file, var, value);

/* Add other config variables here and to Documentation/config.txt. */
return 0;
}

int git_default_config(const char *var, const char *value, void *dummy)
{
if (!prefixcmp(var, "core."))
Expand All @@ -579,6 +588,9 @@ int git_default_config(const char *var, const char *value, void *dummy)
if (!prefixcmp(var, "branch."))
return git_default_branch_config(var, value);

if (!prefixcmp(var, "mailmap."))
return git_default_mailmap_config(var, value);

if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
pager_use_color = git_config_bool(var,value);
return 0;
Expand Down
12 changes: 10 additions & 2 deletions mailmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
#include "string-list.h"
#include "mailmap.h"

int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev)
const char *git_mailmap_file;
static int read_single_mailmap(struct string_list *map, const char *filename, char **repo_abbrev)
{
char buffer[1024];
FILE *f = fopen(filename, "r");
FILE *f = (filename == NULL ? NULL : fopen(filename, "r"));

if (f == NULL)
return 1;
Expand Down Expand Up @@ -60,6 +61,13 @@ int read_mailmap(struct string_list *map, const char *filename, char **repo_abbr
return 0;
}

int read_mailmap(struct string_list *map, char **repo_abbrev)
{
/* each failure returns 1, so >1 means both calls failed */
return read_single_mailmap(map, ".mailmap", repo_abbrev) +
read_single_mailmap(map, git_mailmap_file, repo_abbrev) > 1;
}

int map_email(struct string_list *map, const char *email, char *name, int maxlen)
{
char *p;
Expand Down
2 changes: 1 addition & 1 deletion mailmap.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef MAILMAP_H
#define MAILMAP_H

int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev);
int read_mailmap(struct string_list *map, char **repo_abbrev);
int map_email(struct string_list *mailmap, const char *email, char *name, int maxlen);

#endif
2 changes: 1 addition & 1 deletion pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ static int mailmap_name(struct strbuf *sb, const char *email)

if (!mail_map) {
mail_map = xcalloc(1, sizeof(*mail_map));
read_mailmap(mail_map, ".mailmap", NULL);
read_mailmap(mail_map, NULL);
}

if (!mail_map->nr)
Expand Down
109 changes: 109 additions & 0 deletions t/t4203-mailmap.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
#!/bin/sh

test_description='.mailmap configurations'

. ./test-lib.sh

test_expect_success setup '
echo one >one &&
git add one &&
test_tick &&
git commit -m initial &&
echo two >>one &&
git add one &&
git commit --author "nick1 <bugs@company.xx>" -m second
'

cat >expect <<\EOF
A U Thor (1):
initial
nick1 (1):
second
EOF

test_expect_success 'No mailmap' '
git shortlog HEAD >actual &&
test_cmp expect actual
'

cat >expect <<\EOF
Repo Guy (1):
initial
nick1 (1):
second
EOF

test_expect_success 'default .mailmap' '
echo "Repo Guy <author@example.com>" > .mailmap &&
git shortlog HEAD >actual &&
test_cmp expect actual
'

# Using a mailmap file in a subdirectory of the repo here, but
# could just as well have been a file outside of the repository
cat >expect <<\EOF
Internal Guy (1):
second
Repo Guy (1):
initial
EOF
test_expect_success 'mailmap.file set' '
mkdir internal_mailmap &&
echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap &&
git config mailmap.file internal_mailmap/.mailmap &&
git shortlog HEAD >actual &&
test_cmp expect actual
'

cat >expect <<\EOF
External Guy (1):
initial
Internal Guy (1):
second
EOF
test_expect_success 'mailmap.file override' '
echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap &&
git config mailmap.file internal_mailmap/.mailmap &&
git shortlog HEAD >actual &&
test_cmp expect actual
'

cat >expect <<\EOF
Repo Guy (1):
initial
nick1 (1):
second
EOF

test_expect_success 'mailmap.file non-existant' '
rm internal_mailmap/.mailmap &&
rmdir internal_mailmap &&
git shortlog HEAD >actual &&
test_cmp expect actual
'

cat >expect <<\EOF
A U Thor (1):
initial
nick1 (1):
second
EOF
test_expect_success 'No mailmap files, but configured' '
rm .mailmap &&
git shortlog HEAD >actual &&
test_cmp expect actual
'

test_done

0 comments on commit d551a48

Please sign in to comment.