git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 34/44] shortlog: split builtin from common code

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Sep 28, 2013, 22:03 UTC
Message-ID
<1380405849-13000-35-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1380405849-13000-1-git-send-email-felipe.contreras@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
Notes:
    Somebody forgot to do this.
 Makefile           |   1 +
 builtin/shortlog.c | 184 +----------------------------------------------------
 shortlog.c         | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 shortlog.h         |   6 ++
 4 files changed, 189 insertions(+), 183 deletions(-)
 create mode 100644 shortlog.c
diff --git a/Makefile b/Makefile
index 44b4cd5..709c087 100644
--- a/Makefile
+++ b/Makefile
@@ -880,6 +880,7 @@ LIB_OBJS += sha1-lookup.o
 LIB_OBJS += sha1_file.o
 LIB_OBJS += sha1_name.o
 LIB_OBJS += shallow.o
+LIB_OBJS += shortlog.o
 LIB_OBJS += sideband.o
 LIB_OBJS += sigchain.o
 LIB_OBJS += strbuf.o
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 1434f8f..f84c6f8 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -1,11 +1,8 @@
 #include "builtin.h"
 #include "cache.h"
 #include "commit.h"
-#include "diff.h"
 #include "string-list.h"
 #include "revision.h"
-#include "utf8.h"
-#include "mailmap.h"
 #include "shortlog.h"
 #include "parse-options.h"
 
@@ -14,81 +11,6 @@ static char const * const shortlog_usage[] = {
 	NULL
 };
 
-static int compare_by_number(const void *a1, const void *a2)
-{
-	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;
-	else if (l1->nr == l2->nr)
-		return 0;
-	else
-		return -1;
-}
-
-static void insert_one_record(struct shortlog *log,
-			      const char *author,
-			      const char *oneline)
-{
-	const char *dot3 = log->common_repo_prefix;
-	char *buffer, *p;
-	struct string_list_item *item;
-	const char *mailbuf, *namebuf;
-	size_t namelen, maillen;
-	const char *eol;
-	struct strbuf subject = STRBUF_INIT;
-	struct strbuf namemailbuf = STRBUF_INIT;
-	struct ident_split ident;
-
-	if (split_ident_line(&ident, author, strlen(author)))
-		return;
-
-	namebuf = ident.name_begin;
-	mailbuf = ident.mail_begin;
-	namelen = ident.name_end - ident.name_begin;
-	maillen = ident.mail_end - ident.mail_begin;
-
-	map_user(&log->mailmap, &mailbuf, &maillen, &namebuf, &namelen);
-	strbuf_add(&namemailbuf, namebuf, namelen);
-
-	if (log->email)
-		strbuf_addf(&namemailbuf, " <%.*s>", (int)maillen, mailbuf);
-
-	item = string_list_insert(&log->list, namemailbuf.buf);
-	if (item->util == NULL)
-		item->util = xcalloc(1, sizeof(struct string_list));
-
-	/* Skip any leading whitespace, including any blank lines. */
-	while (*oneline && isspace(*oneline))
-		oneline++;
-	eol = strchr(oneline, '\n');
-	if (!eol)
-		eol = oneline + strlen(oneline);
-	if (!prefixcmp(oneline, "[PATCH")) {
-		char *eob = strchr(oneline, ']');
-		if (eob && (!eol || eob < eol))
-			oneline = eob + 1;
-	}
-	while (*oneline && isspace(*oneline) && *oneline != '\n')
-		oneline++;
-	format_subject(&subject, oneline, " ");
-	buffer = strbuf_detach(&subject, NULL);
-
-	if (dot3) {
-		int dot3len = strlen(dot3);
-		if (dot3len > 5) {
-			while ((p = strstr(buffer, dot3)) != NULL) {
-				int taillen = strlen(p) - dot3len;
-				memcpy(p, "/.../", 5);
-				memmove(p + 5, p + dot3len, taillen + 1);
-			}
-		}
-	}
-
-	string_list_append(item->util, buffer);
-}
-
 static void read_from_stdin(struct shortlog *log)
 {
 	char author[1024], oneline[1024];
@@ -103,51 +25,10 @@ static void read_from_stdin(struct shortlog *log)
 		while (fgets(oneline, sizeof(oneline), stdin) &&
 		       oneline[0] == '\n')
 			; /* discard blanks */
-		insert_one_record(log, author + 8, oneline);
+		shortlog_insert_one_record(log, author + 8, oneline);
 	}
 }
 
-void shortlog_add_commit(struct shortlog *log, struct commit *commit)
-{
-	const char *author = NULL, *buffer;
-	struct strbuf buf = STRBUF_INIT;
-	struct strbuf ufbuf = STRBUF_INIT;
-
-	pp_commit_easy(CMIT_FMT_RAW, commit, &buf);
-	buffer = buf.buf;
-	while (*buffer && *buffer != '\n') {
-		const char *eol = strchr(buffer, '\n');
-
-		if (eol == NULL)
-			eol = buffer + strlen(buffer);
-		else
-			eol++;
-
-		if (!prefixcmp(buffer, "author "))
-			author = buffer + 7;
-		buffer = eol;
-	}
-	if (!author)
-		die(_("Missing author: %s"),
-		    sha1_to_hex(commit->object.sha1));
-	if (log->user_format) {
-		struct pretty_print_context ctx = {0};
-		ctx.fmt = CMIT_FMT_USERFORMAT;
-		ctx.abbrev = log->abbrev;
-		ctx.subject = "";
-		ctx.after_subject = "";
-		ctx.date_mode = DATE_NORMAL;
-		ctx.output_encoding = get_log_output_encoding();
-		pretty_print_commit(&ctx, commit, &ufbuf);
-		buffer = ufbuf.buf;
-	} else if (*buffer) {
-		buffer++;
-	}
-	insert_one_record(log, author, !*buffer ? "<none>" : buffer);
-	strbuf_release(&ufbuf);
-	strbuf_release(&buf);
-}
-
 static void get_from_rev(struct rev_info *rev, struct shortlog *log)
 {
 	struct commit *commit;
@@ -175,9 +56,6 @@ static int parse_uint(char const **arg, int comma, int defval)
 }
 
 static const char wrap_arg_usage[] = "-w[<width>[,<indent1>[,<indent2>]]]";
-#define DEFAULT_WRAPLEN 76
-#define DEFAULT_INDENT1 6
-#define DEFAULT_INDENT2 9
 
 static int parse_wrap_args(const struct option *opt, const char *arg, int unset)
 {
@@ -205,18 +83,6 @@ static int parse_wrap_args(const struct option *opt, const char *arg, int unset)
 	return 0;
 }
 
-void shortlog_init(struct shortlog *log)
-{
-	memset(log, 0, sizeof(*log));
-
-	read_mailmap(&log->mailmap, &log->common_repo_prefix);
-
-	log->list.strdup_strings = 1;
-	log->wrap = DEFAULT_WRAPLEN;
-	log->in1 = DEFAULT_INDENT1;
-	log->in2 = DEFAULT_INDENT2;
-}
-
 int cmd_shortlog(int argc, const char **argv, const char *prefix)
 {
 	static struct shortlog log;
@@ -277,51 +143,3 @@ parse_done:
 	shortlog_output(&log);
 	return 0;
 }
-
-static void add_wrapped_shortlog_msg(struct strbuf *sb, const char *s,
-				     const struct shortlog *log)
-{
-	strbuf_add_wrapped_text(sb, s, log->in1, log->in2, log->wrap);
-	strbuf_addch(sb, '\n');
-}
-
-void shortlog_output(struct shortlog *log)
-{
-	int i, j;
-	struct strbuf sb = STRBUF_INIT;
-
-	if (log->sort_by_number)
-		qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
-			compare_by_number);
-	for (i = 0; i < log->list.nr; i++) {
-		struct string_list *onelines = log->list.items[i].util;
-
-		if (log->summary) {
-			printf("%6d\t%s\n", onelines->nr, log->list.items[i].string);
-		} else {
-			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].string;
-
-				if (log->wrap_lines) {
-					strbuf_reset(&sb);
-					add_wrapped_shortlog_msg(&sb, msg, log);
-					fwrite(sb.buf, sb.len, 1, stdout);
-				}
-				else
-					printf("      %s\n", msg);
-			}
-			putchar('\n');
-		}
-
-		onelines->strdup_strings = 1;
-		string_list_clear(onelines, 0);
-		free(onelines);
-		log->list.items[i].util = NULL;
-	}
-
-	strbuf_release(&sb);
-	log->list.strdup_strings = 1;
-	string_list_clear(&log->list, 1);
-	clear_mailmap(&log->mailmap);
-}
diff --git a/shortlog.c b/shortlog.c
new file mode 100644
index 0000000..89a839f
--- /dev/null
+++ b/shortlog.c
@@ -0,0 +1,181 @@
+#include "cache.h"
+#include "shortlog.h"
+#include "commit.h"
+#include "mailmap.h"
+#include "utf8.h"
+
+void shortlog_init(struct shortlog *log)
+{
+	memset(log, 0, sizeof(*log));
+
+	read_mailmap(&log->mailmap, &log->common_repo_prefix);
+
+	log->list.strdup_strings = 1;
+	log->wrap = DEFAULT_WRAPLEN;
+	log->in1 = DEFAULT_INDENT1;
+	log->in2 = DEFAULT_INDENT2;
+}
+
+void shortlog_insert_one_record(struct shortlog *log,
+		const char *author,
+		const char *oneline)
+{
+	const char *dot3 = log->common_repo_prefix;
+	char *buffer, *p;
+	struct string_list_item *item;
+	const char *mailbuf, *namebuf;
+	size_t namelen, maillen;
+	const char *eol;
+	struct strbuf subject = STRBUF_INIT;
+	struct strbuf namemailbuf = STRBUF_INIT;
+	struct ident_split ident;
+
+	if (split_ident_line(&ident, author, strlen(author)))
+		return;
+
+	namebuf = ident.name_begin;
+	mailbuf = ident.mail_begin;
+	namelen = ident.name_end - ident.name_begin;
+	maillen = ident.mail_end - ident.mail_begin;
+
+	map_user(&log->mailmap, &mailbuf, &maillen, &namebuf, &namelen);
+	strbuf_add(&namemailbuf, namebuf, namelen);
+
+	if (log->email)
+		strbuf_addf(&namemailbuf, " <%.*s>", (int)maillen, mailbuf);
+
+	item = string_list_insert(&log->list, namemailbuf.buf);
+	if (item->util == NULL)
+		item->util = xcalloc(1, sizeof(struct string_list));
+
+	/* Skip any leading whitespace, including any blank lines. */
+	while (*oneline && isspace(*oneline))
+		oneline++;
+	eol = strchr(oneline, '\n');
+	if (!eol)
+		eol = oneline + strlen(oneline);
+	if (!prefixcmp(oneline, "[PATCH")) {
+		char *eob = strchr(oneline, ']');
+		if (eob && (!eol || eob < eol))
+			oneline = eob + 1;
+	}
+	while (*oneline && isspace(*oneline) && *oneline != '\n')
+		oneline++;
+	format_subject(&subject, oneline, " ");
+	buffer = strbuf_detach(&subject, NULL);
+
+	if (dot3) {
+		int dot3len = strlen(dot3);
+		if (dot3len > 5) {
+			while ((p = strstr(buffer, dot3)) != NULL) {
+				int taillen = strlen(p) - dot3len;
+				memcpy(p, "/.../", 5);
+				memmove(p + 5, p + dot3len, taillen + 1);
+			}
+		}
+	}
+
+	string_list_append(item->util, buffer);
+}
+
+void shortlog_add_commit(struct shortlog *log, struct commit *commit)
+{
+	const char *author = NULL, *buffer;
+	struct strbuf buf = STRBUF_INIT;
+	struct strbuf ufbuf = STRBUF_INIT;
+
+	pp_commit_easy(CMIT_FMT_RAW, commit, &buf);
+	buffer = buf.buf;
+	while (*buffer && *buffer != '\n') {
+		const char *eol = strchr(buffer, '\n');
+
+		if (eol == NULL)
+			eol = buffer + strlen(buffer);
+		else
+			eol++;
+
+		if (!prefixcmp(buffer, "author "))
+			author = buffer + 7;
+		buffer = eol;
+	}
+	if (!author)
+		die(_("Missing author: %s"),
+		    sha1_to_hex(commit->object.sha1));
+	if (log->user_format) {
+		struct pretty_print_context ctx = {0};
+		ctx.fmt = CMIT_FMT_USERFORMAT;
+		ctx.abbrev = log->abbrev;
+		ctx.subject = "";
+		ctx.after_subject = "";
+		ctx.date_mode = DATE_NORMAL;
+		ctx.output_encoding = get_log_output_encoding();
+		pretty_print_commit(&ctx, commit, &ufbuf);
+		buffer = ufbuf.buf;
+	} else if (*buffer) {
+		buffer++;
+	}
+	shortlog_insert_one_record(log, author, !*buffer ? "<none>" : buffer);
+	strbuf_release(&ufbuf);
+	strbuf_release(&buf);
+}
+
+static int compare_by_number(const void *a1, const void *a2)
+{
+	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;
+	else if (l1->nr == l2->nr)
+		return 0;
+	else
+		return -1;
+}
+
+static void add_wrapped_shortlog_msg(struct strbuf *sb, const char *s,
+				     const struct shortlog *log)
+{
+	strbuf_add_wrapped_text(sb, s, log->in1, log->in2, log->wrap);
+	strbuf_addch(sb, '\n');
+}
+
+void shortlog_output(struct shortlog *log)
+{
+	int i, j;
+	struct strbuf sb = STRBUF_INIT;
+
+	if (log->sort_by_number)
+		qsort(log->list.items, log->list.nr, sizeof(struct string_list_item),
+			compare_by_number);
+	for (i = 0; i < log->list.nr; i++) {
+		struct string_list *onelines = log->list.items[i].util;
+
+		if (log->summary) {
+			printf("%6d\t%s\n", onelines->nr, log->list.items[i].string);
+		} else {
+			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].string;
+
+				if (log->wrap_lines) {
+					strbuf_reset(&sb);
+					add_wrapped_shortlog_msg(&sb, msg, log);
+					fwrite(sb.buf, sb.len, 1, stdout);
+				}
+				else
+					printf("      %s\n", msg);
+			}
+			putchar('\n');
+		}
+
+		onelines->strdup_strings = 1;
+		string_list_clear(onelines, 0);
+		free(onelines);
+		log->list.items[i].util = NULL;
+	}
+
+	strbuf_release(&sb);
+	log->list.strdup_strings = 1;
+	string_list_clear(&log->list, 1);
+	clear_mailmap(&log->mailmap);
+}
diff --git a/shortlog.h b/shortlog.h
index 54bc07c..cf14d8b 100644
--- a/shortlog.h
+++ b/shortlog.h
@@ -3,6 +3,10 @@
 
 #include "string-list.h"
 
+#define DEFAULT_WRAPLEN 76
+#define DEFAULT_INDENT1 6
+#define DEFAULT_INDENT2 9
+
 struct shortlog {
 	struct string_list list;
 	int summary;
@@ -25,6 +29,8 @@ void shortlog_init(struct shortlog *log);
 
 void shortlog_add_commit(struct shortlog *log, struct commit *commit);
 
+void shortlog_insert_one_record(struct shortlog *log, const char *author, const char *oneline);
+
 void shortlog_output(struct shortlog *log);
 
 #endif
-- 
1.8.4-fc
Previous: Felipe ContrerasNext: Felipe Contreras
Message 47 of 62 in “Ruby support”
  1. 00/44 Ruby supportFelipe Contreras, Sep 28, 2013
  2. 01/44 Add support for ruby commandsFelipe Contreras, Sep 28, 2013
  3. Ramkumar RamachandraSep 29, 2013
  4. Felipe ContrerasSep 29, 2013
  5. 02/44 ruby: add support for internal ruby programsFelipe Contreras, Sep 28, 2013
  6. Ramkumar RamachandraSep 29, 2013
  7. Felipe ContrerasSep 29, 2013
  8. Felipe ContrerasSep 29, 2013
  9. 03/44 request-pull: fix annotated tag checkFelipe Contreras, Sep 28, 2013
  10. Ramkumar RamachandraSep 29, 2013
  11. 04/44 request-pull: fix for specific branchFelipe Contreras, Sep 28, 2013
  12. 05/44 request-pull: use appropriate refFelipe Contreras, Sep 28, 2013
  13. 06/44 request-pull: fix exact match checkingFelipe Contreras, Sep 28, 2013
  14. 07/44 request-pull: trivial simplificationFelipe Contreras, Sep 28, 2013
  15. 08/44 request-pull: t: trivial whitespace style fixesFelipe Contreras, Sep 28, 2013
  16. 09/44 request-pull: t: add missing catFelipe Contreras, Sep 28, 2013
  17. 10/44 ruby: rewrite 'request-pull'Felipe Contreras, Sep 28, 2013
  18. Ramkumar RamachandraSep 29, 2013
  19. 11/44 ruby: request-pull: rewrite perl scriptFelipe Contreras, Sep 28, 2013
  20. Ramkumar RamachandraSep 29, 2013
  21. 12/44 ruby: request-pull: trivial simplificationsFelipe Contreras, Sep 28, 2013
  22. 13/44 ruby: bind setup_git_directory()Felipe Contreras, Sep 28, 2013
  23. Ramkumar RamachandraSep 29, 2013
  24. Felipe ContrerasSep 29, 2013
  25. 14/44 ruby: bind dwim_ref()Felipe Contreras, Sep 28, 2013
  26. Ramkumar RamachandraSep 29, 2013
  27. Felipe ContrerasSep 29, 2013
  28. 15/44 ruby: request-pull: use native dwim_ref()Felipe Contreras, Sep 28, 2013
  29. 16/44 ruby: bind git_config()Felipe Contreras, Sep 28, 2013
  30. 17/44 ruby: request-pull: use native git_config()Felipe Contreras, Sep 28, 2013
  31. 18/44 ruby: bind read_ref()/peel_ref()Felipe Contreras, Sep 28, 2013
  32. 19/44 ruby: bind get_sha1()Felipe Contreras, Sep 28, 2013
  33. 20/44 ruby: request-pull: simplify tag fetchingFelipe Contreras, Sep 28, 2013
  34. 21/44 ruby: request-pull: use get_sha1()Felipe Contreras, Sep 28, 2013
  35. 22/44 ruby: add Commit classFelipe Contreras, Sep 28, 2013
  36. 23/44 ruby: bind get_merge_bases()Felipe Contreras, Sep 28, 2013
  37. 24/44 ruby: request-pull: use get_merge_bases()Felipe Contreras, Sep 28, 2013
  38. 25/44 ruby: request-pull: trivial cleanupsFelipe Contreras, Sep 28, 2013
  39. 26/44 ruby: bind remote and transport stuffFelipe Contreras, Sep 28, 2013
  40. 27/44 ruby: request-pull: use native remote and transportFelipe Contreras, Sep 28, 2013
  41. 28/44 ruby: bind find_unique_abbrev()Felipe Contreras, Sep 28, 2013
  42. 29/44 ruby: request-pull: use native commit infoFelipe Contreras, Sep 28, 2013
  43. 30/44 ruby: bind read_sha1_file()Felipe Contreras, Sep 28, 2013
  44. 31/44 ruby: request-pull: use read_sha1_file()Felipe Contreras, Sep 28, 2013
  45. 32/44 revision: add missing includeFelipe Contreras, Sep 28, 2013
  46. 33/44 shortlog: add missing declarationFelipe Contreras, Sep 28, 2013
  47. 34/44 shortlog: split builtin from common codeFelipe Contreras, Sep 28, 2013
  48. 35/44 ruby: add RevInfo and DiffOptionsFelipe Contreras, Sep 28, 2013
  49. 36/44 ruby: bind shortlog()Felipe Contreras, Sep 28, 2013
  50. 37/44 ruby: request-pull: use shortlog()Felipe Contreras, Sep 28, 2013
  51. 38/44 ruby: bind diff_tree_sha1()Felipe Contreras, Sep 28, 2013
  52. 39/44 ruby: bind log_tree_diff_flush()Felipe Contreras, Sep 28, 2013
  53. 40/44 ruby: request-pull: use native diff_tree stuffFelipe Contreras, Sep 28, 2013
  54. 41/44 ruby: request-pull: remove rescue blockFelipe Contreras, Sep 28, 2013
  55. 42/44 ruby: remove GIT_PAGER from environmentFelipe Contreras, Sep 28, 2013
  56. Stefan BellerSep 28, 2013
  57. Felipe ContrerasSep 28, 2013
  58. 43/44 ruby: add simpler option parserFelipe Contreras, Sep 28, 2013
  59. 44/44 request-pull: rewrite to CFelipe Contreras, Sep 28, 2013
  60. Ramkumar RamachandraSep 29, 2013
  61. Ramkumar RamachandraSep 29, 2013
  62. Felipe ContrerasSep 29, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.