aboutsummaryrefslogtreecommitdiffstats
path: root/mailmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mailmap.c')
-rw-r--r--mailmap.c89
1 files changed, 42 insertions, 47 deletions
diff --git a/mailmap.c b/mailmap.c
index 962fd86d6d..da2589b082 100644
--- a/mailmap.c
+++ b/mailmap.c
@@ -8,6 +8,7 @@
#define debug_mm(...) fprintf(stderr, __VA_ARGS__)
#define debug_str(X) ((X) ? (X) : "(none)")
#else
+__attribute__((format (printf, 1, 2)))
static inline void debug_mm(const char *format, ...) {}
static inline const char *debug_str(const char *s) { return s; }
#endif
@@ -36,13 +37,14 @@ static void free_mailmap_info(void *p, const char *s)
s, debug_str(mi->name), debug_str(mi->email));
free(mi->name);
free(mi->email);
+ free(mi);
}
static void free_mailmap_entry(void *p, const char *s)
{
struct mailmap_entry *me = (struct mailmap_entry *)p;
- debug_mm("mailmap: removing entries for <%s>, with %d sub-entries\n",
- s, me->namemap.nr);
+ debug_mm("mailmap: removing entries for <%s>, with %"PRIuMAX" sub-entries\n",
+ s, (uintmax_t)me->namemap.nr);
debug_mm("mailmap: - simple: '%s' <%s>\n",
debug_str(me->name), debug_str(me->email));
@@ -51,6 +53,7 @@ static void free_mailmap_entry(void *p, const char *s)
me->namemap.strdup_strings = 1;
string_list_clear_func(&me->namemap, free_mailmap_info);
+ free(me);
}
/*
@@ -74,7 +77,7 @@ static void add_mapping(struct string_list *map,
struct mailmap_entry *me;
struct string_list_item *item;
- if (old_email == NULL) {
+ if (!old_email) {
old_email = new_email;
new_email = NULL;
}
@@ -83,13 +86,13 @@ static void add_mapping(struct string_list *map,
if (item->util) {
me = (struct mailmap_entry *)item->util;
} else {
- me = xcalloc(1, sizeof(struct mailmap_entry));
+ CALLOC_ARRAY(me, 1);
me->namemap.strdup_strings = 1;
me->namemap.cmp = namemap_cmp;
item->util = me;
}
- if (old_name == NULL) {
+ if (!old_name) {
debug_mm("mailmap: adding (simple) entry for '%s'\n", old_email);
/* Replace current name and new email for simple entry */
@@ -120,9 +123,9 @@ static char *parse_name_and_email(char *buffer, char **name,
char *left, *right, *nstart, *nend;
*name = *email = NULL;
- if ((left = strchr(buffer, '<')) == NULL)
+ if (!(left = strchr(buffer, '<')))
return NULL;
- if ((right = strchr(left+1, '>')) == NULL)
+ if (!(right = strchr(left + 1, '>')))
return NULL;
if (!allow_empty_email && (left+1 == right))
return NULL;
@@ -143,62 +146,52 @@ static char *parse_name_and_email(char *buffer, char **name,
return (*right == '\0' ? NULL : right);
}
-static void read_mailmap_line(struct string_list *map, char *buffer,
- char **repo_abbrev)
+static void read_mailmap_line(struct string_list *map, char *buffer)
{
char *name1 = NULL, *email1 = NULL, *name2 = NULL, *email2 = NULL;
- if (buffer[0] == '#') {
- static const char abbrev[] = "# repo-abbrev:";
- int abblen = sizeof(abbrev) - 1;
- int len = strlen(buffer);
- if (!repo_abbrev)
- return;
-
- if (len && buffer[len - 1] == '\n')
- buffer[--len] = 0;
- if (!strncmp(buffer, abbrev, abblen)) {
- char *cp;
-
- free(*repo_abbrev);
-
- for (cp = buffer + abblen; isspace(*cp); cp++)
- ; /* nothing */
- *repo_abbrev = xstrdup(cp);
- }
+ if (buffer[0] == '#')
return;
- }
- if ((name2 = parse_name_and_email(buffer, &name1, &email1, 0)) != NULL)
+
+ if ((name2 = parse_name_and_email(buffer, &name1, &email1, 0)))
parse_name_and_email(name2, &name2, &email2, 1);
if (email1)
add_mapping(map, name1, email1, name2, email2);
}
+/* Flags for read_mailmap_file() */
+#define MAILMAP_NOFOLLOW (1<<0)
+
static int read_mailmap_file(struct string_list *map, const char *filename,
- char **repo_abbrev)
+ unsigned flags)
{
char buffer[1024];
FILE *f;
+ int fd;
if (!filename)
return 0;
- f = fopen(filename, "r");
- if (!f) {
+ if (flags & MAILMAP_NOFOLLOW)
+ fd = open_nofollow(filename, O_RDONLY);
+ else
+ fd = open(filename, O_RDONLY);
+
+ if (fd < 0) {
if (errno == ENOENT)
return 0;
return error_errno("unable to open mailmap at %s", filename);
}
+ f = xfdopen(fd, "r");
while (fgets(buffer, sizeof(buffer), f) != NULL)
- read_mailmap_line(map, buffer, repo_abbrev);
+ read_mailmap_line(map, buffer);
fclose(f);
return 0;
}
-static void read_mailmap_string(struct string_list *map, char *buf,
- char **repo_abbrev)
+static void read_mailmap_string(struct string_list *map, char *buf)
{
while (*buf) {
char *end = strchrnul(buf, '\n');
@@ -206,14 +199,12 @@ static void read_mailmap_string(struct string_list *map, char *buf,
if (*end)
*end++ = '\0';
- read_mailmap_line(map, buf, repo_abbrev);
+ read_mailmap_line(map, buf);
buf = end;
}
}
-static int read_mailmap_blob(struct string_list *map,
- const char *name,
- char **repo_abbrev)
+static int read_mailmap_blob(struct string_list *map, const char *name)
{
struct object_id oid;
char *buf;
@@ -231,13 +222,13 @@ static int read_mailmap_blob(struct string_list *map,
if (type != OBJ_BLOB)
return error("mailmap is not a blob: %s", name);
- read_mailmap_string(map, buf, repo_abbrev);
+ read_mailmap_string(map, buf);
free(buf);
return 0;
}
-int read_mailmap(struct string_list *map, char **repo_abbrev)
+int read_mailmap(struct string_list *map)
{
int err = 0;
@@ -247,16 +238,20 @@ int read_mailmap(struct string_list *map, char **repo_abbrev)
if (!git_mailmap_blob && is_bare_repository())
git_mailmap_blob = "HEAD:.mailmap";
- err |= read_mailmap_file(map, ".mailmap", repo_abbrev);
+ if (!startup_info->have_repository || !is_bare_repository())
+ err |= read_mailmap_file(map, ".mailmap",
+ startup_info->have_repository ?
+ MAILMAP_NOFOLLOW : 0);
if (startup_info->have_repository)
- err |= read_mailmap_blob(map, git_mailmap_blob, repo_abbrev);
- err |= read_mailmap_file(map, git_mailmap_file, repo_abbrev);
+ err |= read_mailmap_blob(map, git_mailmap_blob);
+ err |= read_mailmap_file(map, git_mailmap_file, 0);
return err;
}
void clear_mailmap(struct string_list *map)
{
- debug_mm("mailmap: clearing %d entries...\n", map->nr);
+ debug_mm("mailmap: clearing %"PRIuMAX" entries...\n",
+ (uintmax_t)map->nr);
map->strdup_strings = 1;
string_list_clear_func(map, free_mailmap_entry);
debug_mm("mailmap: cleared\n");
@@ -325,7 +320,7 @@ int map_user(struct string_list *map,
(int)*emaillen, debug_str(*email));
item = lookup_prefix(map, *email, *emaillen);
- if (item != NULL) {
+ if (item) {
me = (struct mailmap_entry *)item->util;
if (me->namemap.nr) {
/*
@@ -339,7 +334,7 @@ int map_user(struct string_list *map,
item = subitem;
}
}
- if (item != NULL) {
+ if (item) {
struct mailmap_info *mi = (struct mailmap_info *)item->util;
if (mi->name == NULL && mi->email == NULL) {
debug_mm("map_user: -- (no simple mapping)\n");