[PATCH] Add support for git's mailmap.

John Keeping john at keeping.me.uk
Thu Aug 25 00:30:30 CEST 2016


On Wed, Aug 24, 2016 at 05:27:31PM -0400, Jason A. Smith wrote:
> 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.

Yes, pretty much exactly this.  There's only a small number of sites
that actually use author_email and committer_email, most of which are
already printing something, so the fallout shouldn't be too bad.

The only other cases are opening the email filter, which is why I
suggested wrapping at least part of that process in a new function.


More information about the CGit mailing list