]>
Commit | Line | Data |
---|---|---|
7c1c6782 | 1 | #include "cache.h" |
c455c87c | 2 | #include "string-list.h" |
fe5d30b6 | 3 | #include "mailmap.h" |
7c1c6782 | 4 | |
c455c87c | 5 | int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev) |
7c1c6782 JH |
6 | { |
7 | char buffer[1024]; | |
8 | FILE *f = fopen(filename, "r"); | |
9 | ||
10 | if (f == NULL) | |
11 | return 1; | |
12 | while (fgets(buffer, sizeof(buffer), f) != NULL) { | |
13 | char *end_of_name, *left_bracket, *right_bracket; | |
14 | char *name, *email; | |
15 | int i; | |
16 | if (buffer[0] == '#') { | |
17 | static const char abbrev[] = "# repo-abbrev:"; | |
18 | int abblen = sizeof(abbrev) - 1; | |
19 | int len = strlen(buffer); | |
20 | ||
8503ee43 AR |
21 | if (!repo_abbrev) |
22 | continue; | |
23 | ||
7c1c6782 JH |
24 | if (len && buffer[len - 1] == '\n') |
25 | buffer[--len] = 0; | |
26 | if (!strncmp(buffer, abbrev, abblen)) { | |
27 | char *cp; | |
28 | ||
29 | if (repo_abbrev) | |
30 | free(*repo_abbrev); | |
31 | *repo_abbrev = xmalloc(len); | |
32 | ||
33 | for (cp = buffer + abblen; isspace(*cp); cp++) | |
34 | ; /* nothing */ | |
35 | strcpy(*repo_abbrev, cp); | |
36 | } | |
37 | continue; | |
38 | } | |
39 | if ((left_bracket = strchr(buffer, '<')) == NULL) | |
40 | continue; | |
41 | if ((right_bracket = strchr(left_bracket + 1, '>')) == NULL) | |
42 | continue; | |
43 | if (right_bracket == left_bracket + 1) | |
44 | continue; | |
fd99b361 JH |
45 | for (end_of_name = left_bracket; |
46 | end_of_name != buffer && isspace(end_of_name[-1]); | |
47 | end_of_name--) | |
48 | ; /* keep on looking */ | |
7c1c6782 JH |
49 | if (end_of_name == buffer) |
50 | continue; | |
51 | name = xmalloc(end_of_name - buffer + 1); | |
52 | strlcpy(name, buffer, end_of_name - buffer + 1); | |
53 | email = xmalloc(right_bracket - left_bracket); | |
54 | for (i = 0; i < right_bracket - left_bracket - 1; i++) | |
55 | email[i] = tolower(left_bracket[i + 1]); | |
56 | email[right_bracket - left_bracket - 1] = '\0'; | |
c455c87c | 57 | string_list_insert(email, map)->util = name; |
7c1c6782 JH |
58 | } |
59 | fclose(f); | |
60 | return 0; | |
61 | } | |
62 | ||
c455c87c | 63 | int map_email(struct string_list *map, const char *email, char *name, int maxlen) |
7c1c6782 JH |
64 | { |
65 | char *p; | |
c455c87c | 66 | struct string_list_item *item; |
7c1c6782 JH |
67 | char buf[1024], *mailbuf; |
68 | int i; | |
69 | ||
70 | /* autocomplete common developers */ | |
71 | p = strchr(email, '>'); | |
72 | if (!p) | |
73 | return 0; | |
74 | if (p - email + 1 < sizeof(buf)) | |
75 | mailbuf = buf; | |
76 | else | |
77 | mailbuf = xmalloc(p - email + 1); | |
78 | ||
79 | /* downcase the email address */ | |
80 | for (i = 0; i < p - email; i++) | |
81 | mailbuf[i] = tolower(email[i]); | |
82 | mailbuf[i] = 0; | |
c455c87c | 83 | item = string_list_lookup(mailbuf, map); |
7c1c6782 JH |
84 | if (mailbuf != buf) |
85 | free(mailbuf); | |
86 | if (item != NULL) { | |
87 | const char *realname = (const char *)item->util; | |
600682aa | 88 | strlcpy(name, realname, maxlen); |
7c1c6782 JH |
89 | return 1; |
90 | } | |
91 | return 0; | |
92 | } |