I will send a new updated patch that I think will fix most of the minor
issues, but I am not exactly sure what you mean by the last note.
On 08/24/2016 03:23 PM, John Keeping wrote:
+int cgit_map_user(struct string_list *map, char **email, char **name)
+{
+ char *map_email, *map_name;
+ size_t emaillen, namelen;
+ int ret;
+
+ emaillen = strlen(*email);
+ namelen = strlen(*name);
+ map_email = xmalloc(emaillen + 1);
+ map_name = xmalloc(namelen + 1);
+ strncpy(map_email, *email, emaillen + 1);
+ strncpy(map_name, *name, namelen + 1);
+ memmove(map_email, map_email+1, emaillen-2);
+ map_email[emaillen-2] = '\0';
+ emaillen = emaillen - 2;
+ ret = map_user(map, (const char**)&map_email, &emaillen,
+ (const char**)&map_name, &namelen);
+ if (ret) {
+ *email = xmalloc(strlen("<") + emaillen + strlen(">") + 1);
+ sprintf(*email, "<%.*s>", (int)emaillen, map_email);
+ *name = xmalloc(namelen + 1);
+ strncpy(*name, map_name, namelen + 1);
+ } else {
+ /* When a mapping is found they are pointing to the
+ actual mailmap list entry and cannot be freed. */
+
+ free(map_email);
+ free(map_name);
+ }
+
+ return ret;
+}
I think we can do a log better than this if we step back and think about
the call sites below. There's no need to modify the author and
committer fields in struct commitinfo if we first refactor to introduce
local variables:
const char *author = info->author;
const char *author_email = info->author_email;
Then we can almost use map_user() directly if not for the pesky angle
brackets, but looking at the use sites, ui-atom.c is already prepared
for the email address not to have them and there are a few HTML sites
that are trivial to change. The only difficult case is the email filter
and we could create a new cgit_print_ident() function to wrap all of
that up nicely.
It's a bigger change and will turn this single patch into a series, but
the end result will be much cleaner.
First a little explanation. I created the wrapper around git's map_user
for 2 reasons. First, because of the angle brackets that wrap the email
address in the cgit code. Second, to make copies of the name & email
address because when map_user finds a match it changes the char pointers
to point to the appropriate mailmap list entry, and in the call sites,
at the end of the function, it was freeing the info struct which would
break subsequent map lookups. This seemed to be the simplest solution,
to fix both of these problems in one function.
Are you proposing to remove the angle brackets around the email address
everywhere in cgit strings, to match git, which I think is done in the
parse_user function? Then use git's map_user directly and create a
cgit_print_ident function that inserts the angle brackets when printed?
Then also making local copies of the pointers so freeing the info
structure doesn't break the mailmap? I think this would be a much larger
change beyond just supporting the mailmap.
~Jason
_______________________________________________
CGit mailing list
[email protected]
http://lists.zx2c4.com/mailman/listinfo/cgit