git-shortlog: make common repository prefix configurable with .mailmap
authorJunio C Hamano <junkio@cox.net>
Sat, 25 Nov 2006 08:07:54 +0000 (00:07 -0800)
committerJunio C Hamano <junkio@cox.net>
Sat, 25 Nov 2006 08:07:54 +0000 (00:07 -0800)
The code had "/pub/scm/linux/kernel/git/" hardcoded which was
too specific to the kernel project.

With this, a line in the .mailmap file:

# repo-abbrev: /pub/scm/linux/kernel/git/

can be used to cause the substring to be abbreviated to /.../
on the title line of the commit message.

Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-shortlog.c
contrib/mailmap.linux

index bdd952c2524140f35f788f5e0cd906c3b390dbe4..b5b13dee3b3a5fe5877762817af9de7dd22d5c4c 100644 (file)
@@ -9,6 +9,8 @@
 static const char shortlog_usage[] =
 "git-shortlog [-n] [-s] [<commit-id>... ]";
 
+static char *common_repo_prefix;
+
 static int compare_by_number(const void *a1, const void *a2)
 {
        const struct path_list_item *i1 = a1, *i2 = a2;
@@ -35,8 +37,26 @@ static int read_mailmap(const char *filename)
                char *end_of_name, *left_bracket, *right_bracket;
                char *name, *email;
                int i;
-               if (buffer[0] == '#')
+               if (buffer[0] == '#') {
+                       static const char abbrev[] = "# repo-abbrev:";
+                       int abblen = sizeof(abbrev) - 1;
+                       int len = strlen(buffer);
+
+                       if (len && buffer[len - 1] == '\n')
+                               buffer[--len] = 0;
+                       if (!strncmp(buffer, abbrev, abblen)) {
+                               char *cp;
+
+                               if (common_repo_prefix)
+                                       free(common_repo_prefix);
+                               common_repo_prefix = xmalloc(len);
+
+                               for (cp = buffer + abblen; isspace(*cp); cp++)
+                                       ; /* nothing */
+                               strcpy(common_repo_prefix, cp);
+                       }
                        continue;
+               }
                if ((left_bracket = strchr(buffer, '<')) == NULL)
                        continue;
                if ((right_bracket = strchr(left_bracket + 1, '>')) == NULL)
@@ -87,7 +107,7 @@ static void insert_author_oneline(struct path_list *list,
                const char *author, int authorlen,
                const char *oneline, int onelinelen)
 {
-       const char *dot3 = "/pub/scm/linux/kernel/git/";
+       const char *dot3 = common_repo_prefix;
        char *buffer, *p;
        struct path_list_item *item;
        struct path_list *onelines;
index 83927c94eef6858fe26a289765a315dece057c43..e4907f80f1500e15cd447bdfa4805d56fcf5db7c 100644 (file)
@@ -3,6 +3,8 @@
 # So have an email->real name table to translate the
 # (hopefully few) missing names
 #
+# repo-abbrev: /pub/scm/linux/kernel/git/
+#
 Adrian Bunk <bunk@stusta.de>
 Andreas Herrmann <aherrman@de.ibm.com>
 Andrew Morton <akpm@osdl.org>