[PATCH v2 1/4] Add log.mailmap as configurational option for mailmap location

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This allows us to override a repo mailmap file, or to use
mailmap files elsewhere than the repository root.

Should the log.mailmap file not be found, it falls back to ".mailmap".

Signed-off-by: Marius Storm-Olsen <marius@xxxxxxxxxxxxx>
---
 Documentation/config.txt       |    9 +++++++
 Documentation/git-shortlog.txt |    3 +-
 builtin-blame.c                |    2 +-
 builtin-shortlog.c             |    3 +-
 cache.h                        |    1 +
 config.c                       |   10 +++++++
 mailmap.c                      |    9 ++++++-
 t/t4203-mailmap.sh             |   53 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 86 insertions(+), 4 deletions(-)
 create mode 100755 t/t4203-mailmap.sh

diff --git a/Documentation/config.txt b/Documentation/config.txt
index e2b8775..02c7b4c 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1012,6 +1012,15 @@ 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.
 
+log.mailmap::
+	Overrides the default location of the mailmap file. The default
+	mailmap location is .mailmap in the root of the repository.
+	The new location of the mailmap file may be in a repository
+	subdirectory, or somewhere outside of the repository itself.
+	If git can't find the file, it will try to load the default
+	mailmap location instead.
+	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].
diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt
index 8f7c0e2..cacbeea 100644
--- a/Documentation/git-shortlog.txt
+++ b/Documentation/git-shortlog.txt
@@ -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
diff --git a/builtin-blame.c b/builtin-blame.c
index aae14ef..4b63775 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -2394,7 +2394,7 @@ parse_done:
 		die("reading graft file %s failed: %s",
 		    revs_file, strerror(errno));
 
-	read_mailmap(&mailmap, ".mailmap", NULL);
+	read_mailmap(&mailmap, NULL, NULL);
 
 	if (!incremental)
 		setup_pager();
diff --git a/builtin-shortlog.c b/builtin-shortlog.c
index 5f9f3f0..04832a8 100644
--- a/builtin-shortlog.c
+++ b/builtin-shortlog.c
@@ -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, NULL, &log->common_repo_prefix);
 
 	log->list.strdup_strings = 1;
 	log->wrap = DEFAULT_WRAPLEN;
@@ -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 |
diff --git a/cache.h b/cache.h
index 45e713e..3eef7ea 100644
--- a/cache.h
+++ b/cache.h
@@ -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_log_mailmap;
 
 /* IO helper functions */
 extern void maybe_flush_or_die(FILE *, const char *);
diff --git a/config.c b/config.c
index 790405a..9ebcbbe 100644
--- a/config.c
+++ b/config.c
@@ -565,6 +565,13 @@ static int git_default_branch_config(const char *var, const char *value)
 	return 0;
 }
 
+static int git_default_log_config(const char *var, const char *value)
+{
+	if (!strcmp(var, "log.mailmap"))
+		return git_config_string(&git_log_mailmap, var, value);
+	return 0;
+}
+
 int git_default_config(const char *var, const char *value, void *dummy)
 {
 	if (!prefixcmp(var, "core."))
@@ -579,6 +586,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, "log."))
+		return git_default_log_config(var, value);
+
 	if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
 		pager_use_color = git_config_bool(var,value);
 		return 0;
diff --git a/mailmap.c b/mailmap.c
index 88fc6f3..32eab6c 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -2,11 +2,18 @@
 #include "string-list.h"
 #include "mailmap.h"
 
+const char *git_log_mailmap;
 int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev)
 {
 	char buffer[1024];
-	FILE *f = fopen(filename, "r");
+	FILE *f = NULL;
 
+	if (filename)
+		f = fopen(filename, "r");
+	if (f == NULL && git_log_mailmap)
+		f = fopen(git_log_mailmap, "r");
+	if (f == NULL)
+		f = fopen(".mailmap", "r");
 	if (f == NULL)
 		return 1;
 	while (fgets(buffer, sizeof(buffer), f) != NULL) {
diff --git a/t/t4203-mailmap.sh b/t/t4203-mailmap.sh
new file mode 100755
index 0000000..57fd88e
--- /dev/null
+++ b/t/t4203-mailmap.sh
@@ -0,0 +1,53 @@
+#!/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
+'
+
+test_expect_success 'No mailmap' '
+	git shortlog >actual &&
+	echo "A U Thor (1):" >expect; echo "      initial" >>expect; echo >>expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'default .mailmap' '
+	echo "Repo Guy <author@xxxxxxxxxxx>" > .mailmap &&
+	git shortlog >actual &&
+	echo "Repo Guy (1):" >expect; echo "      initial" >>expect; echo >>expect &&
+	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
+test_expect_success 'log.mailmap set' '
+	mkdir internal_mailmap &&
+	echo "Internal Guy <author@xxxxxxxxxxx>" > internal_mailmap/.mailmap &&
+	git config log.mailmap internal_mailmap/.mailmap &&
+	git shortlog >actual &&
+	echo "Internal Guy (1):" >expect; echo "      initial" >>expect; echo >>expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log.mailmap file non-existant' '
+	rm internal_mailmap/.mailmap &&
+	rmdir internal_mailmap &&
+	git shortlog >actual &&
+	echo "Repo Guy (1):" >expect; echo "      initial" >>expect; echo >>expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'No mailmap files, but configured' '
+	rm .mailmap &&
+	git shortlog >actual &&
+	echo "A U Thor (1):" >expect; echo "      initial" >>expect; echo >>expect &&
+	test_cmp expect actual
+'
+
+test_done
-- 
1.6.1.2.257.g34f62

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux