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

[PATCH for "next"] pretty-formats: add 'format:<string>'

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Feb 23, 2007, 00:35 UTC
Message-ID
<Pine.LNX.4.63.0702230125270.22628@wbgn013.biozentrum.uni-wuerzburg.de>
In-Reply-To
<4566E512.4010405@xs4all.nl>
With this patch,
$ git show -s \
	--pretty=format:'  Ze komit %h woss%n  dunn buy ze great %an'
shows something like
  Ze komit 04c5c88 woss
  dunn buy ze great Junio C Hamano
The supported placeholders are:
	'%H': commit hash
	'%h': abbreviated commit hash
	'%T': tree hash
	'%t': abbreviated tree hash
	'%P': parent hashes
	'%p': abbreviated parent hashes
	'%an': author name
	'%ae': author email
	'%ad': author date
	'%aD': author date, RFC2822 style
	'%ar': author date, relative
	'%at': author date, UNIX timestamp
	'%cn': committer name
	'%ce': committer email
	'%cd': committer date
	'%cD': committer date, RFC2822 style
	'%cr': committer date, relative
	'%ct': committer date, UNIX timestamp
	'%e': encoding
	'%s': subject
	'%b': body
	'%Cred': switch color to red
	'%Cgreen': switch color to green
	'%Cblue': switch color to blue
	'%Creset': reset color
	'%n': newline
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
	On Fri, 24 Nov 2006, Han-Wen Nienhuys wrote:
	> The recently posted patch documenting is an improvement, but why 
	> not add an option so you can do
	> 
	>   --format 'committer %c\nauthor %a\n'
	>   
	> this catches all combinations, and is easier for scripting.
	So, I overcame my laziness after 91 days...
	Of course, this is not as efficient as it could be: it _will_ get 
	_all_ variables from the commit, even if not needed. However, I 
	don't think that it matters in reality.
	BTW I have not found any implementation of xstrndup(), so I let it 
	be static.
 Documentation/pretty-formats.txt |   44 +++++++++
 commit.c                         |  195 ++++++++++++++++++++++++++++++++++++++
 commit.h                         |    1 +
 log-tree.c                       |    2 +-
 4 files changed, 241 insertions(+), 1 deletions(-)
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index fb0b0b9..2fe6c31 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -77,9 +77,53 @@ displayed in full, regardless of whether --abbrev or
 true parent commits, without taking grafts nor history
 simplification into account.
 
+	* 'format:'
++
+The 'format:' format allows you to specify which information
+you want to show. It works a little bit like printf format,
+with the notable exception that you get a newline with '%n'
+instead of '\n'.
+
+E.g, 'format:"The author of %h was %an, %ar%nThe title was >>%s<<"'
+would show something like this:
+
+The author of fe6e0ee was Junio C Hamano, 23 hours ago
+The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<
+
+The placeholders are:
+
+- '%H': commit hash
+- '%h': abbreviated commit hash
+- '%T': tree hash
+- '%t': abbreviated tree hash
+- '%P': parent hashes
+- '%p': abbreviated parent hashes
+- '%an': author name
+- '%ae': author email
+- '%ad': author date
+- '%aD': author date, RFC2822 style
+- '%ar': author date, relative
+- '%at': author date, UNIX timestamp
+- '%cn': committer name
+- '%ce': committer email
+- '%cd': committer date
+- '%cD': committer date, RFC2822 style
+- '%cr': committer date, relative
+- '%ct': committer date, UNIX timestamp
+- '%e': encoding
+- '%s': subject
+- '%b': body
+- '%Cred': switch color to red
+- '%Cgreen': switch color to green
+- '%Cblue': switch color to blue
+- '%Creset': reset color
+- '%n': newline
+
+
 --encoding[=<encoding>]::
 	The commit objects record the encoding used for the log message
 	in their encoding header; this option can be used to tell the
 	command to re-code the commit log message in the encoding
 	preferred by the user.  For non plumbing commands this
 	defaults to UTF-8.
+
diff --git a/commit.c b/commit.c
index 8d279b0..a97aef3 100644
--- a/commit.c
+++ b/commit.c
@@ -3,6 +3,7 @@
 #include "commit.h"
 #include "pkt-line.h"
 #include "utf8.h"
+#include "interpolate.h"
 
 int save_commit_buffer = 1;
 
@@ -36,8 +37,11 @@ struct cmt_fmt_map {
 	{ "full",	5,	CMIT_FMT_FULL },
 	{ "fuller",	5,	CMIT_FMT_FULLER },
 	{ "oneline",	1,	CMIT_FMT_ONELINE },
+	{ "format:",	7,	CMIT_FMT_USERFORMAT},
 };
 
+static char *user_format;
+
 enum cmit_fmt get_commit_format(const char *arg)
 {
 	int i;
@@ -46,6 +50,12 @@ enum cmit_fmt get_commit_format(const char *arg)
 		return CMIT_FMT_DEFAULT;
 	if (*arg == '=')
 		arg++;
+	if (!prefixcmp(arg, "format:")) {
+		if (user_format)
+			free(user_format);
+		user_format = xstrdup(arg + 7);
+		return CMIT_FMT_USERFORMAT;
+	}
 	for (i = 0; i < ARRAY_SIZE(cmt_fmts); i++) {
 		if (!strncmp(arg, cmt_fmts[i].n, cmt_fmts[i].cmp_len) &&
 		    !strncmp(arg, cmt_fmts[i].n, strlen(arg)))
@@ -710,6 +720,188 @@ static char *logmsg_reencode(const struct commit *commit,
 	return out;
 }
 
+static char *xstrndup(const char *text, int len)
+{
+	char *result = xmalloc(len + 1);
+	memcpy(result, text, len);
+	result[len] = '\0';
+	return result;
+}
+
+static void fill_person(struct interp *table, const char *msg, int len)
+{
+	int start, end, tz = 0;
+	unsigned long date;
+	char *ep;
+
+	/* parse name */
+	for (end = 0; end < len && msg[end] != '<'; end++)
+		; /* do nothing */
+	start = end + 1;
+	while (end > 0 && isspace(msg[end - 1]))
+		end--;
+	table[0].value = xstrndup(msg, end);
+
+	if (start >= len)
+		return;
+
+	/* parse email */
+	for (end = start + 1; end < len && msg[end] != '>'; end++)
+		; /* do nothing */
+
+	if (end >= len)
+		return;
+
+	table[1].value = xstrndup(msg + start, end - start);
+
+	/* parse date */
+	for (start = end + 1; start < len && isspace(msg[start]); start++)
+		; /* do nothing */
+	if (start >= len)
+		return;
+	date = strtoul(msg + start, &ep, 10);
+	if (msg + start == ep)
+		return;
+
+	table[5].value = xstrndup(msg + start, ep - msg + start);
+
+	/* parse tz */
+	for (start = ep - msg + 1; start < len && isspace(msg[start]); start++)
+		; /* do nothing */
+	if (start + 1 < len) {
+		tz = strtoul(msg + start + 1, NULL, 10);
+		if (msg[start] == '-')
+			tz = -tz;
+	}
+
+	interp_set_entry(table, 2, show_date(date, tz, 0));
+	interp_set_entry(table, 3, show_rfc2822_date(date, tz));
+	interp_set_entry(table, 4, show_date(date, tz, 1));
+}
+
+static long format_commit_message(const struct commit *commit,
+		const char *msg, char *buf, unsigned long space)
+{
+	struct interp table[] = {
+		{ "%H" },	/* commit hash */
+		{ "%h" },	/* abbreviated commit hash */
+		{ "%T" },	/* tree hash */
+		{ "%t" },	/* abbreviated tree hash */
+		{ "%P" },	/* parent hashes */
+		{ "%p" },	/* abbreviated parent hashes */
+		{ "%an" },	/* author name */
+		{ "%ae" },	/* author email */
+		{ "%ad" },	/* author date */
+		{ "%aD" },	/* author date, RFC2822 style */
+		{ "%ar" },	/* author date, relative */
+		{ "%at" },	/* author date, UNIX timestamp */
+		{ "%cn" },	/* committer name */
+		{ "%ce" },	/* committer email */
+		{ "%cd" },	/* committer date */
+		{ "%cD" },	/* committer date, RFC2822 style */
+		{ "%cr" },	/* committer date, relative */
+		{ "%ct" },	/* committer date, UNIX timestamp */
+		{ "%e" },	/* encoding */
+		{ "%s" },	/* subject */
+		{ "%b" },	/* body */
+		{ "%Cred" },	/* red */
+		{ "%Cgreen" },	/* green */
+		{ "%Cblue" },	/* blue */
+		{ "%Creset" },	/* reset color */
+		{ "%n" }	/* newline */
+	};
+	enum interp_index {
+		IHASH = 0, IHASH_ABBREV,
+		ITREE, ITREE_ABBREV,
+		IPARENTS, IPARENTS_ABBREV,
+		IAUTHOR_NAME, IAUTHOR_EMAIL,
+		IAUTHOR_DATE, IAUTHOR_DATE_RFC2822, IAUTHOR_DATE_RELATIVE,
+		IAUTHOR_TIMESTAMP,
+		ICOMMITTER_NAME, ICOMMITTER_EMAIL,
+		ICOMMITTER_DATE, ICOMMITTER_DATE_RFC2822,
+		ICOMMITTER_DATE_RELATIVE, ICOMMITTER_TIMESTAMP,
+		IENCODING,
+		ISUBJECT,
+		IBODY,
+		IRED, IGREEN, IBLUE, IRESET_COLOR,
+		INEWLINE
+	};
+	struct commit_list *p;
+	char parents[1024];
+	int i;
+	enum { HEADER, SUBJECT, BODY } state;
+
+	if (INEWLINE + 1 != ARRAY_SIZE(table))
+		die("invalid interp table!");
+
+	/* these are independent of the commit */
+	interp_set_entry(table, IRED, "\033[31m");
+	interp_set_entry(table, IGREEN, "\033[32m");
+	interp_set_entry(table, IBLUE, "\033[34m");
+	interp_set_entry(table, IRESET_COLOR, "\033[m");
+	interp_set_entry(table, INEWLINE, "\n");
+
+	/* these depend on the commit */
+	if (!commit->object.parsed)
+		parse_object(commit->object.sha1);
+	interp_set_entry(table, IHASH, sha1_to_hex(commit->object.sha1));
+	interp_set_entry(table, IHASH_ABBREV,
+			find_unique_abbrev(commit->object.sha1,
+				DEFAULT_ABBREV));
+	interp_set_entry(table, ITREE, sha1_to_hex(commit->tree->object.sha1));
+	interp_set_entry(table, ITREE_ABBREV,
+			find_unique_abbrev(commit->tree->object.sha1,
+				DEFAULT_ABBREV));
+	for (i = 0, p = commit->parents;
+			p && i < sizeof(parents) - 1;
+			p = p->next)
+		i += snprintf(parents + i, sizeof(parents) - i - 1, "%s ",
+			sha1_to_hex(p->item->object.sha1));
+	interp_set_entry(table, IPARENTS, parents);
+	for (i = 0, p = commit->parents;
+			p && i < sizeof(parents) - 1;
+			p = p->next)
+		i += snprintf(parents + i, sizeof(parents) - i - 1, "%s ",
+			find_unique_abbrev(p->item->object.sha1,
+				DEFAULT_ABBREV));
+	interp_set_entry(table, IPARENTS_ABBREV, parents);
+
+	for (i = 0, state = HEADER; msg[i] && state < BODY; i++) {
+		int eol;
+		for (eol = i; msg[eol] && msg[eol] != '\n'; eol++)
+			; /* do nothing */
+
+		if (state == SUBJECT) {
+			table[ISUBJECT].value = xstrndup(msg + i, eol - i);
+			i = eol;
+		}
+		if (i == eol) {
+			state++;
+			/* strip empty lines */
+			while (msg[eol + 1] == '\n')
+				eol++;
+		} else if (!prefixcmp(msg + i, "author "))
+			fill_person(table + IAUTHOR_NAME,
+					msg + i + 7, eol - i - 7);
+		else if (!prefixcmp(msg + i, "committer "))
+			fill_person(table + ICOMMITTER_NAME,
+					msg + i + 10, eol - i - 10);
+		else if (!prefixcmp(msg + i, "encoding "))
+			table[IENCODING].value = xstrndup(msg + i, eol - i);
+		i = eol;
+	}
+	if (msg[i])
+		table[IBODY].value = xstrdup(msg + i);
+	for (i = 0; i < ARRAY_SIZE(table); i++)
+		if (!table[i].value)
+			interp_set_entry(table, i, "<unknown>");
+
+	interpolate(buf, space, user_format, table, ARRAY_SIZE(table));
+	interp_clear_table(table, ARRAY_SIZE(table));
+
+	return strlen(buf);
+}
+
 unsigned long pretty_print_commit(enum cmit_fmt fmt,
 				  const struct commit *commit,
 				  unsigned long len,
@@ -727,6 +919,9 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt,
 	char *reencoded;
 	char *encoding;
 
+	if (fmt == CMIT_FMT_USERFORMAT)
+		return format_commit_message(commit, msg, buf, space);
+
 	encoding = (git_log_output_encoding
 		    ? git_log_output_encoding
 		    : git_commit_encoding);
diff --git a/commit.h b/commit.h
index c737444..83507a0 100644
--- a/commit.h
+++ b/commit.h
@@ -47,6 +47,7 @@ enum cmit_fmt {
 	CMIT_FMT_FULLER,
 	CMIT_FMT_ONELINE,
 	CMIT_FMT_EMAIL,
+	CMIT_FMT_USERFORMAT,
 
 	CMIT_FMT_UNSPECIFIED,
 };
diff --git a/log-tree.c b/log-tree.c
index ac86194..6ce239d 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -211,7 +211,7 @@ void show_log(struct rev_info *opt, const char *sep)
 				 sha1, sha1);
 			opt->diffopt.stat_sep = buffer;
 		}
-	} else {
+	} else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
 		fputs(diff_get_color(opt->diffopt.color_diff, DIFF_COMMIT),
 		      stdout);
 		if (opt->commit_format != CMIT_FMT_ONELINE)
-- 
1.5.0.1.620.gac8f
Previous: Junio C HamanoNext: Han-Wen Nienhuys
Message 123 of 240 in “commit: Steer new users toward "git commit -a" rather than update-index”
  1. commit: Steer new users toward "git commit -a" rather than update-indexCarl Worth, Nov 14, 2006
  2. Andy WhitcroftNov 14, 2006
  3. Cleaning up git user-interface wartsCarl Worth, Nov 14, 2006
  4. Shawn PearceNov 14, 2006
  5. Carl WorthNov 14, 2006
  6. Petr BaudisNov 14, 2006
  7. Carl WorthNov 14, 2006
  8. Junio C HamanoNov 15, 2006
  9. Petr BaudisNov 15, 2006
  10. Junio C HamanoNov 15, 2006
  11. Nicolas PitreNov 15, 2006
  12. Jakub NarebskiNov 15, 2006
  13. Santi BéjarNov 15, 2006
  14. Jakub NarebskiNov 15, 2006
  15. Petr BaudisNov 16, 2006
  16. Nicolas PitreNov 15, 2006
  17. Petr BaudisNov 15, 2006
  18. Jakub NarebskiNov 15, 2006
  19. Karl HasselströmNov 15, 2006
  20. Carl WorthNov 15, 2006
  21. Jakub NarebskiNov 15, 2006
  22. Shawn PearceNov 15, 2006
  23. Carl WorthNov 15, 2006
  24. Steven GrimmNov 17, 2006
  25. Junio C HamanoNov 17, 2006
  26. Petr BaudisNov 17, 2006
  27. Karl HasselströmNov 14, 2006
  28. Nicolas PitreNov 14, 2006
  29. Jakub NarebskiNov 14, 2006
  30. Nicolas PitreNov 14, 2006
  31. Jakub NarebskiNov 14, 2006
  32. Nicolas PitreNov 14, 2006
  33. Carl WorthNov 14, 2006
  34. Jakub NarebskiNov 14, 2006
  35. Nicolas PitreNov 14, 2006
  36. Junio C HamanoNov 14, 2006
  37. Nicolas PitreNov 15, 2006
  38. Junio C HamanoNov 15, 2006
  39. Michael K. EdwardsNov 15, 2006
  40. Nicolas PitreNov 15, 2006
  41. Junio C HamanoNov 15, 2006
  42. Linus TorvaldsNov 15, 2006
  43. Jakub NarebskiNov 15, 2006
  44. Josef WeidendorferNov 15, 2006
  45. Petr BaudisNov 15, 2006
  46. Josef WeidendorferNov 15, 2006
  47. Linus TorvaldsNov 15, 2006
  48. Nicolas PitreNov 15, 2006
  49. Shawn PearceNov 15, 2006
  50. Marko MacekNov 15, 2006
  51. Junio C HamanoNov 15, 2006
  52. Shawn PearceNov 15, 2006
  53. Marko MacekNov 16, 2006
  54. Junio C HamanoNov 16, 2006
  55. Jakub NarebskiNov 17, 2006
  56. SeanNov 15, 2006
  57. Andy ParkinsNov 15, 2006
  58. Linus TorvaldsNov 15, 2006
  59. Michael K. EdwardsNov 15, 2006
  60. Linus TorvaldsNov 15, 2006
  61. Nicolas PitreNov 15, 2006
  62. Linus TorvaldsNov 15, 2006
  63. Carl WorthNov 15, 2006
  64. Junio C HamanoNov 15, 2006
  65. Nicolas PitreNov 15, 2006
  66. Junio C HamanoNov 15, 2006
  67. Nicolas PitreNov 15, 2006
  68. Karl HasselströmNov 17, 2006
  69. Linus TorvaldsNov 15, 2006
  70. Carl WorthNov 15, 2006
  71. Shawn PearceNov 15, 2006
  72. Linus TorvaldsNov 15, 2006
  73. Nicolas PitreNov 16, 2006
  74. Linus TorvaldsNov 16, 2006
  75. Nicolas PitreNov 16, 2006
  76. Michael K. EdwardsNov 16, 2006
  77. Andreas EricssonNov 16, 2006
  78. Carl WorthNov 16, 2006
  79. Michael K. EdwardsNov 16, 2006
  80. Carl WorthNov 16, 2006
  81. Junio C HamanoNov 17, 2006
  82. Carl WorthNov 17, 2006
  83. Johannes SchindelinNov 17, 2006
  84. Junio C HamanoNov 17, 2006
  85. Shawn PearceNov 17, 2006
  86. Junio C HamanoNov 17, 2006
  87. SeanNov 15, 2006
  88. Jerome LovyNov 21, 2006
  89. Theodore TsoNov 16, 2006
  90. Andreas EricssonNov 16, 2006
  91. Linus TorvaldsNov 16, 2006
  92. Carl WorthNov 16, 2006
  93. Linus TorvaldsNov 16, 2006
  94. SeanNov 16, 2006
  95. Anand KumriaNov 16, 2006
  96. Junio C HamanoNov 15, 2006
  97. Theodore TsoNov 16, 2006
  98. Junio C HamanoNov 16, 2006
  99. Alexandre JulliardNov 16, 2006
  100. Petr BaudisNov 16, 2006
  101. Alexandre JulliardNov 16, 2006
  102. Jakub NarebskiNov 17, 2006
  103. Alexandre JulliardNov 17, 2006
  104. Jakub NarebskiNov 17, 2006
  105. Han-Wen NienhuysNov 16, 2006
  106. Jakub NarebskiNov 16, 2006
  107. Junio C HamanoNov 16, 2006
  108. Han-Wen NienhuysNov 16, 2006
  109. Junio C HamanoNov 16, 2006
  110. Junio C HamanoNov 16, 2006
  111. Junio C HamanoNov 16, 2006
  112. Linus TorvaldsNov 16, 2006
  113. Junio C HamanoNov 16, 2006
  114. Han-Wen NienhuysNov 16, 2006
  115. Junio C HamanoNov 16, 2006
  116. Han-Wen NienhuysNov 16, 2006
  117. Han-Wen NienhuysNov 16, 2006
  118. Jakub NarebskiNov 17, 2006
  119. Han-Wen NienhuysNov 24, 2006
  120. Jakub NarebskiNov 24, 2006
  121. Johannes SchindelinDec 5, 2006
  122. Junio C HamanoDec 5, 2006
  123. pretty-formats: add 'format:<string>'Johannes Schindelin, Feb 23, 2007
  124. Han-Wen NienhuysFeb 23, 2007
  125. Johannes SchindelinFeb 23, 2007
  126. Robin RosenbergFeb 23, 2007
  127. Johannes SchindelinFeb 24, 2007
  128. Junio C HamanoFeb 23, 2007
  129. Johannes SchindelinFeb 23, 2007
  130. Junio C HamanoFeb 23, 2007
  131. Johannes SchindelinFeb 23, 2007
  132. Linus TorvaldsNov 16, 2006
  133. Han-Wen NienhuysNov 16, 2006
  134. Linus TorvaldsNov 16, 2006
  135. multi-project repos (was Re: Cleaning up git user-interface warts)Han-Wen Nienhuys, Nov 16, 2006
  136. Linus TorvaldsNov 16, 2006
  137. Junio C HamanoNov 16, 2006
  138. Linus TorvaldsNov 16, 2006
  139. Shawn PearceNov 17, 2006
  140. Linus TorvaldsNov 17, 2006
  141. Carl WorthNov 17, 2006
  142. Shawn PearceNov 17, 2006
  143. Carl WorthNov 17, 2006
  144. Shawn PearceNov 17, 2006
  145. Marko MacekNov 17, 2006
  146. Junio C HamanoNov 17, 2006
  147. Junio C HamanoNov 17, 2006
  148. Shawn PearceNov 18, 2006
  149. Junio C HamanoNov 18, 2006
  150. Shawn PearceNov 18, 2006
  151. Johannes SchindelinNov 16, 2006
  152. Junio C HamanoNov 16, 2006
  153. Johannes SchindelinNov 17, 2006
  154. Linus TorvaldsNov 16, 2006
  155. Linus TorvaldsNov 16, 2006
  156. Johannes SchindelinNov 16, 2006
  157. Linus TorvaldsNov 17, 2006
  158. Carl WorthNov 17, 2006
  159. Johannes SchindelinNov 17, 2006
  160. Petr BaudisNov 17, 2006
  161. Johannes SchindelinNov 17, 2006
  162. Han-Wen NienhuysNov 16, 2006
  163. Han-Wen NienhuysNov 16, 2006
  164. Jakub NarebskiNov 17, 2006
  165. Linus TorvaldsNov 16, 2006
  166. Junio C HamanoNov 16, 2006
  167. Linus TorvaldsNov 16, 2006
  168. Junio C HamanoNov 16, 2006
  169. Linus TorvaldsNov 16, 2006
  170. Carl WorthNov 16, 2006
  171. Johannes SchindelinNov 16, 2006
  172. Linus TorvaldsNov 16, 2006
  173. Han-Wen NienhuysNov 17, 2006
  174. Junio C HamanoNov 17, 2006
  175. Han-Wen NienhuysNov 17, 2006
  176. Petr BaudisNov 17, 2006
  177. Carl WorthNov 17, 2006
  178. Carl WorthNov 17, 2006
  179. Linus TorvaldsNov 17, 2006
  180. Han-Wen NienhuysNov 17, 2006
  181. Michael K. EdwardsNov 17, 2006
  182. Michael K. EdwardsNov 17, 2006
  183. Junio C HamanoNov 17, 2006
  184. Michael K. EdwardsNov 18, 2006
  185. Jakub NarebskiNov 17, 2006
  186. Petr BaudisNov 16, 2006
  187. Petr BaudisNov 15, 2006
  188. Nicolas PitreNov 15, 2006
  189. Linus TorvaldsNov 15, 2006
  190. Nicolas PitreNov 15, 2006
  191. Anand KumriaNov 16, 2006
  192. Junio C HamanoNov 14, 2006
  193. Junio C HamanoNov 14, 2006
  194. Nicolas PitreNov 15, 2006
  195. Junio C HamanoNov 15, 2006
  196. Shawn PearceNov 15, 2006
  197. Junio C HamanoNov 15, 2006
  198. Johannes SchindelinNov 15, 2006
  199. SeanNov 15, 2006
  200. Nicolas PitreNov 15, 2006
  201. Junio C HamanoNov 15, 2006
  202. Andy ParkinsNov 15, 2006
  203. Junio C HamanoNov 15, 2006
  204. Nicolas PitreNov 15, 2006
  205. Carl WorthNov 15, 2006
  206. Junio C HamanoNov 15, 2006
  207. Carl WorthNov 15, 2006
  208. Petr BaudisNov 16, 2006
  209. Robin RosenbergNov 16, 2006
  210. Petr BaudisNov 16, 2006
  211. Han-Wen NienhuysNov 16, 2006
  212. Andy ParkinsNov 15, 2006
  213. Jakub NarebskiNov 15, 2006
  214. Andy ParkinsNov 15, 2006
  215. Karl HasselströmNov 15, 2006
  216. Andy ParkinsNov 15, 2006
  217. Nicolas PitreNov 15, 2006
  218. Junio C HamanoNov 15, 2006
  219. Nicolas PitreNov 15, 2006
  220. Karl HasselströmNov 16, 2006
  221. Alan ChandlerNov 18, 2006
  222. Junio C HamanoNov 15, 2006
  223. Andy ParkinsNov 15, 2006
  224. Petr BaudisNov 16, 2006
  225. Andreas EricssonNov 15, 2006
  226. Jakub NarebskiNov 15, 2006
  227. Petr BaudisNov 16, 2006
  228. Petr BaudisNov 16, 2006
  229. Junio C HamanoNov 16, 2006
  230. Petr BaudisNov 16, 2006
  231. Junio C HamanoNov 16, 2006
  232. Petr BaudisNov 16, 2006
  233. Junio C HamanoNov 17, 2006
  234. Han-Wen NienhuysNov 17, 2006
  235. Alan ChandlerNov 18, 2006
  236. Junio C HamanoNov 14, 2006
  237. Shawn PearceNov 15, 2006
  238. Richard CURNOWNov 16, 2006
  239. Johannes SchindelinNov 16, 2006
  240. Petr BaudisNov 16, 2006

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.