#include "cache.h"
#include "commit.h"
#include "diff.h"
-#include "path-list.h"
+#include "string-list.h"
#include "revision.h"
#include "utf8.h"
#include "mailmap.h"
#include "parse-options.h"
static char const * const shortlog_usage[] = {
- "git-shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]",
+ "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]",
"",
"[rev-opts] are documented in git-rev-list(1)",
NULL
static int compare_by_number(const void *a1, const void *a2)
{
- const struct path_list_item *i1 = a1, *i2 = a2;
- const struct path_list *l1 = i1->util, *l2 = i2->util;
+ const struct string_list_item *i1 = a1, *i2 = a2;
+ const struct string_list *l1 = i1->util, *l2 = i2->util;
if (l1->nr < l2->nr)
return 1;
{
const char *dot3 = log->common_repo_prefix;
char *buffer, *p;
- struct path_list_item *item;
- struct path_list *onelines;
+ struct string_list_item *item;
+ struct string_list *onelines;
char namebuf[1024];
size_t len;
const char *eol;
}
buffer = xstrdup(namebuf);
- item = path_list_insert(buffer, &log->list);
+ item = string_list_insert(buffer, &log->list);
if (item->util == NULL)
- item->util = xcalloc(1, sizeof(struct path_list));
+ item->util = xcalloc(1, sizeof(struct string_list));
else
free(buffer);
onelines->alloc = alloc_nr(onelines->nr);
onelines->items = xrealloc(onelines->items,
onelines->alloc
- * sizeof(struct path_list_item));
+ * sizeof(struct string_list_item));
}
onelines->items[onelines->nr].util = NULL;
- onelines->items[onelines->nr++].path = buffer;
+ onelines->items[onelines->nr++].string = buffer;
}
static void read_from_stdin(struct shortlog *log)
if (!author)
die("Missing author: %s",
sha1_to_hex(commit->object.sha1));
+ if (log->user_format) {
+ struct strbuf buf = STRBUF_INIT;
+
+ pretty_print_commit(CMIT_FMT_USERFORMAT, commit, &buf,
+ DEFAULT_ABBREV, "", "", DATE_NORMAL, 0);
+ insert_one_record(log, author, buf.buf);
+ strbuf_release(&buf);
+ return;
+ }
if (*buffer)
buffer++;
insert_one_record(log, author, !*buffer ? "<none>" : buffer);
read_mailmap(&log->mailmap, ".mailmap", &log->common_repo_prefix);
- log->list.strdup_paths = 1;
+ log->list.strdup_strings = 1;
log->wrap = DEFAULT_WRAPLEN;
log->in1 = DEFAULT_INDENT1;
log->in2 = DEFAULT_INDENT2;
PARSE_OPT_KEEP_ARGV0);
for (;;) {
- int n;
switch (parse_options_step(&ctx, options, shortlog_usage)) {
case PARSE_OPT_HELP:
exit(129);
case PARSE_OPT_DONE:
goto parse_done;
}
- n = handle_revision_opt(&rev, ctx.argc, ctx.argv,
- &ctx.cpidx, ctx.out);
- if (n <= 0) {
- error("unknown option `%s'", ctx.argv[0]);
- usage_with_options(shortlog_usage, options);
- }
- ctx.argv += n;
- ctx.argc -= n;
+ parse_revision_opt(&rev, &ctx, options, shortlog_usage);
}
parse_done:
argc = parse_options_end(&ctx);
usage_with_options(shortlog_usage, options);
}
+ log.user_format = rev.commit_format == CMIT_FMT_USERFORMAT;
+
/* assume HEAD if from a tty */
if (!nongit && !rev.pending.nr && isatty(0))
add_head_to_pending(&rev);
{
int i, j;
if (log->sort_by_number)
- qsort(log->list.items, log->list.nr, sizeof(struct path_list_item),
+ qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
compare_by_number);
for (i = 0; i < log->list.nr; i++) {
- struct path_list *onelines = log->list.items[i].util;
+ struct string_list *onelines = log->list.items[i].util;
if (log->summary) {
- printf("%6d\t%s\n", onelines->nr, log->list.items[i].path);
+ printf("%6d\t%s\n", onelines->nr, log->list.items[i].string);
} else {
- printf("%s (%d):\n", log->list.items[i].path, onelines->nr);
+ printf("%s (%d):\n", log->list.items[i].string, onelines->nr);
for (j = onelines->nr - 1; j >= 0; j--) {
- const char *msg = onelines->items[j].path;
+ const char *msg = onelines->items[j].string;
if (log->wrap_lines) {
int col = print_wrapped_text(msg, log->in1, log->in2, log->wrap);
putchar('\n');
}
- onelines->strdup_paths = 1;
- path_list_clear(onelines, 1);
+ onelines->strdup_strings = 1;
+ string_list_clear(onelines, 1);
free(onelines);
log->list.items[i].util = NULL;
}
- log->list.strdup_paths = 1;
- path_list_clear(&log->list, 1);
- log->mailmap.strdup_paths = 1;
- path_list_clear(&log->mailmap, 1);
+ log->list.strdup_strings = 1;
+ string_list_clear(&log->list, 1);
+ log->mailmap.strdup_strings = 1;
+ string_list_clear(&log->mailmap, 1);
}