shortlog: code restructuring and clean-up

The code tried to parse and clean-up the author name and the one line
information in three places (two callers of insert_author_oneline() and
the called function itself), which was a mess.

This renames the callee to insert_one_record() and make it responsible
for cleaning up the author name and one line information.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2007-12-07 17:07:41 -08:00
parent fd99b36134
commit 1e931cb4d1

View File

@ -27,45 +27,60 @@ static int compare_by_number(const void *a1, const void *a2)
static struct path_list mailmap = {NULL, 0, 0, 0}; static struct path_list mailmap = {NULL, 0, 0, 0};
static void insert_author_oneline(struct path_list *list, static void insert_one_record(struct path_list *list,
const char *author, int authorlen, const char *author,
const char *oneline, int onelinelen) const char *oneline)
{ {
const char *dot3 = common_repo_prefix; const char *dot3 = common_repo_prefix;
char *buffer, *p; char *buffer, *p;
struct path_list_item *item; struct path_list_item *item;
struct path_list *onelines; struct path_list *onelines;
char namebuf[1024];
size_t len;
const char *eol;
const char *boemail, *eoemail;
while (authorlen > 0 && isspace(author[authorlen - 1])) boemail = strchr(author, '<');
authorlen--; if (!boemail)
return;
eoemail = strchr(boemail, '>');
if (!eoemail)
return;
if (!map_email(&mailmap, boemail+1, namebuf, sizeof(namebuf))) {
while (author < boemail && isspace(*author))
author++;
for (len = 0;
len < sizeof(namebuf) - 1 && author + len < boemail;
len++)
namebuf[len] = author[len];
while (0 < len && isspace(namebuf[len-1]))
len--;
namebuf[len] = '\0';
}
buffer = xmemdupz(author, authorlen); buffer = xstrdup(namebuf);
item = path_list_insert(buffer, list); item = path_list_insert(buffer, list);
if (item->util == NULL) if (item->util == NULL)
item->util = xcalloc(1, sizeof(struct path_list)); item->util = xcalloc(1, sizeof(struct path_list));
else else
free(buffer); free(buffer);
eol = strchr(oneline, '\n');
if (!eol)
eol = oneline + strlen(oneline);
while (*oneline && isspace(*oneline) && *oneline != '\n')
oneline++;
if (!prefixcmp(oneline, "[PATCH")) { if (!prefixcmp(oneline, "[PATCH")) {
char *eob = strchr(oneline, ']'); char *eob = strchr(oneline, ']');
if (eob && (!eol || eob < eol))
if (eob) { oneline = eob + 1;
while (isspace(eob[1]) && eob[1] != '\n')
eob++;
if (eob - oneline < onelinelen) {
onelinelen -= eob - oneline;
oneline = eob;
} }
} while (*oneline && isspace(*oneline) && *oneline != '\n')
}
while (onelinelen > 0 && isspace(oneline[0])) {
oneline++; oneline++;
onelinelen--; len = eol - oneline;
} while (len && isspace(oneline[len-1]))
while (onelinelen > 0 && isspace(oneline[onelinelen - 1])) len--;
onelinelen--; buffer = xmemdupz(oneline, len);
buffer = xmemdupz(oneline, onelinelen);
if (dot3) { if (dot3) {
int dot3len = strlen(dot3); int dot3len = strlen(dot3);
@ -92,55 +107,32 @@ static void insert_author_oneline(struct path_list *list,
static void read_from_stdin(struct path_list *list) static void read_from_stdin(struct path_list *list)
{ {
char buffer[1024]; char author[1024], oneline[1024];
while (fgets(buffer, sizeof(buffer), stdin) != NULL) { while (fgets(author, sizeof(author), stdin) != NULL) {
char *bob; if (!(author[0] == 'A' || author[0] == 'a') ||
if ((buffer[0] == 'A' || buffer[0] == 'a') && prefixcmp(author + 1, "uthor: "))
!prefixcmp(buffer + 1, "uthor: ") && continue;
(bob = strchr(buffer + 7, '<')) != NULL) { while (fgets(oneline, sizeof(oneline), stdin) &&
char buffer2[1024], offset = 0; oneline[0] != '\n')
; /* discard headers */
if (map_email(&mailmap, bob + 1, buffer, sizeof(buffer))) while (fgets(oneline, sizeof(oneline), stdin) &&
bob = buffer + strlen(buffer); oneline[0] == '\n')
else { ; /* discard blanks */
offset = 8; insert_one_record(list, author + 8, oneline);
while (buffer + offset < bob &&
isspace(bob[-1]))
bob--;
}
while (fgets(buffer2, sizeof(buffer2), stdin) &&
buffer2[0] != '\n')
; /* chomp input */
if (fgets(buffer2, sizeof(buffer2), stdin)) {
int l2 = strlen(buffer2);
int i;
for (i = 0; i < l2; i++)
if (!isspace(buffer2[i]))
break;
insert_author_oneline(list,
buffer + offset,
bob - buffer - offset,
buffer2 + i, l2 - i);
}
}
} }
} }
static void get_from_rev(struct rev_info *rev, struct path_list *list) static void get_from_rev(struct rev_info *rev, struct path_list *list)
{ {
char scratch[1024];
struct commit *commit; struct commit *commit;
prepare_revision_walk(rev); prepare_revision_walk(rev);
while ((commit = get_revision(rev)) != NULL) { while ((commit = get_revision(rev)) != NULL) {
const char *author = NULL, *oneline, *buffer; const char *author = NULL, *buffer;
int authorlen = authorlen, onelinelen;
/* get author and oneline */ buffer = commit->buffer;
for (buffer = commit->buffer; buffer && *buffer != '\0' && while (*buffer && *buffer != '\n') {
*buffer != '\n'; ) {
const char *eol = strchr(buffer, '\n'); const char *eol = strchr(buffer, '\n');
if (eol == NULL) if (eol == NULL)
@ -148,50 +140,17 @@ static void get_from_rev(struct rev_info *rev, struct path_list *list)
else else
eol++; eol++;
if (!prefixcmp(buffer, "author ")) { if (!prefixcmp(buffer, "author "))
char *bracket = strchr(buffer, '<');
if (bracket == NULL || bracket > eol)
die("Invalid commit buffer: %s",
sha1_to_hex(commit->object.sha1));
if (map_email(&mailmap, bracket + 1, scratch,
sizeof(scratch))) {
author = scratch;
authorlen = strlen(scratch);
} else {
if (bracket[-1] == ' ')
bracket--;
author = buffer + 7; author = buffer + 7;
authorlen = bracket - buffer - 7;
}
}
buffer = eol; buffer = eol;
} }
if (!author)
if (author == NULL)
die("Missing author: %s", die("Missing author: %s",
sha1_to_hex(commit->object.sha1)); sha1_to_hex(commit->object.sha1));
if (*buffer)
if (buffer == NULL || *buffer == '\0') { buffer++;
oneline = "<none>"; insert_one_record(list, author, !*buffer ? "<none>" : buffer);
onelinelen = sizeof(oneline) + 1;
} else {
char *eol;
oneline = buffer + 1;
eol = strchr(oneline, '\n');
if (eol == NULL)
onelinelen = strlen(oneline);
else
onelinelen = eol - oneline;
} }
insert_author_oneline(list,
author, authorlen, oneline, onelinelen);
}
} }
static int parse_uint(char const **arg, int comma) static int parse_uint(char const **arg, int comma)