{"thread":{"id":"5826","subject":"[PATCH 5/6] git-blame --porcelain","startedAt":"2006-10-05T21:07:42Z","lastAt":"2006-10-06T09:59:36Z","messageCount":3,"participants":["Junio C Hamano","Luben Tuikov"],"isPatch":true,"patchVersion":1,"patchTotal":6},"messages":[{"id":"28252","messageId":"7v4puicvz5.fsf@assigned-by-dhcp.cox.net","threadId":"5826","inReplyTo":null,"subject":"[PATCH 5/6] git-blame --porcelain","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-10-05T21:07:42Z","receivedAt":"2006-10-05T21:07:42Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"The new option makes the command's native output format to emit\noutput that is easier to handle by Porcelain.\n\nEach line is output after a header.  The header at the minimum\nhas the first line which has:\n\n - 40-byte SHA-1 of the commit the line is attributed to;\n\n - the line number of the line in the final file;\n\n - the line number of the line in the original file;\n\n - on a line that starts a group of line from a different commit\n   than the previous one, the number of lines in this group.  On\n   subsequent lines this field is absent.\n\nThis header line is followed by the following information once\nfor each commit:\n\n - author name (\"author\"), email (\"author-mail\"), time\n   (\"author-time\"), and timezone (\"author-tz\"); similarly for\n   committer.\n\n - filename in the commit the line is attributed to.\n\n - the first line of the commit log message (\"summary\").\n\nThe contents of the actual line is output after the above\nheader, prefixed by a TAB. This is to allow adding more header\nelements later.\n\nSigned-off-by: Junio C Hamano <junkio@cox.net>\n---\n\n * By now, Luben would have guessed where this series is leading\n   to...\n\n blame.c |  149 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------\n 1 files changed, 127 insertions(+), 22 deletions(-)\n\ndiff --git a/blame.c b/blame.c\nindex 47471e8..8189318 100644\n--- a/blame.c\n+++ b/blame.c\n@@ -17,6 +17,7 @@ #include \"diff.h\"\n #include \"diffcore.h\"\n #include \"revision.h\"\n #include \"xdiff-interface.h\"\n+#include \"quote.h\"\n \n #define DEBUG 0\n \n@@ -40,6 +41,7 @@ struct util_info {\n \tunsigned long size;\n \tint num_lines;\n \tconst char *pathname;\n+\tunsigned meta_given:1;\n \n \tvoid *topo_data;\n };\n@@ -332,12 +334,8 @@ static struct util_info *get_util(struct\n \tif (util)\n \t\treturn util;\n \n-\tutil = xmalloc(sizeof(struct util_info));\n-\tutil->buf = NULL;\n-\tutil->size = 0;\n-\tutil->line_map = NULL;\n+\tutil = xcalloc(1, sizeof(struct util_info));\n \tutil->num_lines = -1;\n-\tutil->pathname = NULL;\n \tcommit->util = util;\n \treturn util;\n }\n@@ -642,39 +640,99 @@ struct commit_info\n \tchar *author_mail;\n \tunsigned long author_time;\n \tchar *author_tz;\n+\n+\t/* filled only when asked for details */\n+\tchar *committer;\n+\tchar *committer_mail;\n+\tunsigned long committer_time;\n+\tchar *committer_tz;\n+\n+\tchar *summary;\n };\n \n-static void get_commit_info(struct commit *commit, struct commit_info *ret)\n+static void get_ac_line(const char *inbuf, const char *what,\n+\t\t\tint bufsz, char *person, char **mail,\n+\t\t\tunsigned long *time, char **tz)\n {\n \tint len;\n-\tchar *tmp;\n-\tstatic char author_buf[1024];\n-\n-\ttmp = strstr(commit->buffer, \"\\nauthor \") + 8;\n-\tlen = strchr(tmp, '\\n') - tmp;\n-\tret->author = author_buf;\n-\tmemcpy(ret->author, tmp, len);\n+\tchar *tmp, *endp;\n+\n+\ttmp = strstr(inbuf, what);\n+\tif (!tmp)\n+\t\tgoto error_out;\n+\ttmp += strlen(what);\n+\tendp = strchr(tmp, '\\n');\n+\tif (!endp)\n+\t\tlen = strlen(tmp);\n+\telse\n+\t\tlen = endp - tmp;\n+\tif (bufsz <= len) {\n+\terror_out:\n+\t\t/* Ugh */\n+\t\tperson = *mail = *tz = \"(unknown)\";\n+\t\t*time = 0;\n+\t\treturn;\n+\t}\n+\tmemcpy(person, tmp, len);\n \n-\ttmp = ret->author;\n+\ttmp = person;\n \ttmp += len;\n \t*tmp = 0;\n \twhile (*tmp != ' ')\n \t\ttmp--;\n-\tret->author_tz = tmp+1;\n+\t*tz = tmp+1;\n \n \t*tmp = 0;\n \twhile (*tmp != ' ')\n \t\ttmp--;\n-\tret->author_time = strtoul(tmp, NULL, 10);\n+\t*time = strtoul(tmp, NULL, 10);\n \n \t*tmp = 0;\n \twhile (*tmp != ' ')\n \t\ttmp--;\n-\tret->author_mail = tmp + 1;\n-\n+\t*mail = tmp + 1;\n \t*tmp = 0;\n }\n \n+static void get_commit_info(struct commit *commit, struct commit_info *ret, int detailed)\n+{\n+\tint len;\n+\tchar *tmp, *endp;\n+\tstatic char author_buf[1024];\n+\tstatic char committer_buf[1024];\n+\tstatic char summary_buf[1024];\n+\n+\tret->author = author_buf;\n+\tget_ac_line(commit->buffer, \"\\nauthor \",\n+\t\t    sizeof(author_buf), author_buf, &ret->author_mail,\n+\t\t    &ret->author_time, &ret->author_tz);\n+\n+\tif (!detailed)\n+\t\treturn;\n+\n+\tret->committer = committer_buf;\n+\tget_ac_line(commit->buffer, \"\\ncommitter \",\n+\t\t    sizeof(committer_buf), committer_buf, &ret->committer_mail,\n+\t\t    &ret->committer_time, &ret->committer_tz);\n+\n+\tret->summary = summary_buf;\n+\ttmp = strstr(commit->buffer, \"\\n\\n\");\n+\tif (!tmp) {\n+\terror_out:\n+\t\tsprintf(summary_buf, \"(%s)\", sha1_to_hex(commit->object.sha1));\n+\t\treturn;\n+\t}\n+\ttmp += 2;\n+\tendp = strchr(tmp, '\\n');\n+\tif (!endp)\n+\t\tgoto error_out;\n+\tlen = endp - tmp;\n+\tif (len >= sizeof(summary_buf))\n+\t\tgoto error_out;\n+\tmemcpy(summary_buf, tmp, len);\n+\tsummary_buf[len] = 0;\n+}\n+\n static const char *format_time(unsigned long time, const char *tz_str,\n \t\t\t       int show_raw_time)\n {\n@@ -751,7 +809,7 @@ static int find_orig_linenum(struct util\n }\n \n static void emit_meta(struct commit *c, int lno,\n-\t\t      int sha1_len, int compatibility,\n+\t\t      int sha1_len, int compatibility, int porcelain,\n \t\t      int show_name, int show_number, int show_raw_time,\n \t\t      int longest_file, int longest_author,\n \t\t      int max_digits, int max_orig_digits)\n@@ -763,7 +821,47 @@ static void emit_meta(struct commit *c, \n \tu = c->util;\n \tlineno = find_orig_linenum(u, lno);\n \n-\tget_commit_info(c, &ci);\n+\tif (porcelain) {\n+\t\tint group_size = -1;\n+\t\tstruct commit *cc = (lno == 0) ? NULL : blame_lines[lno-1];\n+\t\tif (cc != c) {\n+\t\t\t/* This is the beginning of this group */\n+\t\t\tint i;\n+\t\t\tfor (i = lno + 1; i < num_blame_lines; i++)\n+\t\t\t\tif (blame_lines[i] != c)\n+\t\t\t\t\tbreak;\n+\t\t\tgroup_size = i - lno;\n+\t\t}\n+\t\tif (0 < group_size)\n+\t\t\tprintf(\"%s %d %d %d\\n\", sha1_to_hex(c->object.sha1),\n+\t\t\t       lno + 1, lineno, group_size);\n+\t\telse\n+\t\t\tprintf(\"%s %d %d\\n\", sha1_to_hex(c->object.sha1),\n+\t\t\t       lno + 1, lineno);\n+\t\tif (!u->meta_given) {\n+\t\t\tget_commit_info(c, &ci, 1);\n+\t\t\tprintf(\"author %s\\n\", ci.author);\n+\t\t\tprintf(\"author-mail %s\\n\", ci.author_mail);\n+\t\t\tprintf(\"author-time %lu\\n\", ci.author_time);\n+\t\t\tprintf(\"author-tz %s\\n\", ci.author_tz);\n+\t\t\tprintf(\"committer %s\\n\", ci.committer);\n+\t\t\tprintf(\"committer-mail %s\\n\", ci.committer_mail);\n+\t\t\tprintf(\"committer-time %lu\\n\", ci.committer_time);\n+\t\t\tprintf(\"committer-tz %s\\n\", ci.committer_tz);\n+\t\t\tprintf(\"filename \");\n+\t\t\tif (quote_c_style(u->pathname, NULL, NULL, 0))\n+\t\t\t\tquote_c_style(u->pathname, NULL, stdout, 0);\n+\t\t\telse\n+\t\t\t\tfputs(u->pathname, stdout);\n+\t\t\tprintf(\"\\nsummary %s\\n\", ci.summary);\n+\n+\t\t\tu->meta_given = 1;\n+\t\t}\n+\t\tputchar('\\t');\n+\t\treturn;\n+\t}\n+\n+\tget_commit_info(c, &ci, 0);\n \tfwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);\n \tif (compatibility) {\n \t\tprintf(\"\\t(%10s\\t%10s\\t%d)\", ci.author,\n@@ -809,6 +907,7 @@ int main(int argc, const char **argv)\n \tint longest_file, longest_author, longest_file_lines;\n \tint show_name = 0;\n \tint show_number = 0;\n+\tint porcelain = 0;\n \n \tconst char *prefix = setup_git_directory();\n \tgit_config(git_default_config);\n@@ -852,6 +951,12 @@ int main(int argc, const char **argv)\n \t\t\t\tshow_number = 1;\n \t\t\t\tcontinue;\n \t\t\t}\n+\t\t\tif (!strcmp(argv[i], \"--porcelain\")) {\n+\t\t\t\tporcelain = 1;\n+\t\t\t\tsha1_len = 40;\n+\t\t\t\tshow_raw_time = 1;\n+\t\t\t\tcontinue;\n+\t\t\t}\n \t\t\tif (!strcmp(argv[i], \"--\")) {\n \t\t\t\toptions = 0;\n \t\t\t\tcontinue;\n@@ -934,7 +1039,7 @@ int main(int argc, const char **argv)\n \t\t\tlongest_file = strlen(u->pathname);\n \t\tif (longest_file_lines < u->num_lines)\n \t\t\tlongest_file_lines = u->num_lines;\n-\t\tget_commit_info(c, &ci);\n+\t\tget_commit_info(c, &ci, 0);\n \t\tif (longest_author < strlen(ci.author))\n \t\t\tlongest_author = strlen(ci.author);\n \t}\n@@ -943,7 +1048,7 @@ int main(int argc, const char **argv)\n \n \tfor (i = 0; i < num_blame_lines; i++) {\n \t\temit_meta(blame_lines[i], i,\n-\t\t\t  sha1_len, compatibility,\n+\t\t\t  sha1_len, compatibility, porcelain,\n \t\t\t  show_name, show_number, show_raw_time,\n \t\t\t  longest_file, longest_author,\n \t\t\t  max_digits, max_orig_digits);\n-- \n1.4.2.3.g866f3\n"},{"id":"28263","messageId":"20061006002904.24024.qmail@web31814.mail.mud.yahoo.com","threadId":"5826","inReplyTo":"7v4puicvz5.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH 5/6] git-blame --porcelain","fromName":"Luben Tuikov","fromEmail":"ltuikov@yahoo.com","sentAt":"2006-10-06T00:29:04Z","receivedAt":"2006-10-06T00:29:04Z","isPatch":true,"sender":{"key":"ltuikov@yahoo.com","avatar":null},"body":"--- Junio C Hamano <junkio@cox.net> wrote:\n> The new option makes the command's native output format to emit\n> output that is easier to handle by Porcelain.\n> \n> Each line is output after a header.  The header at the minimum\n> has the first line which has:\n> \n>  - 40-byte SHA-1 of the commit the line is attributed to;\n> \n>  - the line number of the line in the final file;\n> \n>  - the line number of the line in the original file;\n> \n>  - on a line that starts a group of line from a different commit\n>    than the previous one, the number of lines in this group.  On\n>    subsequent lines this field is absent.\n\nGood stuff!  ACK.\n\nBTW, I would've chosen to print the line number of the original file\nfirst, followed by the line number of the final (this) file followed\nby the number of lines in this group of the final (this) file:\n\n<SHA-1> <orig_line_no> <this_line_no> <this_num_lines>\n\\t<this_line_data>\n\nNot that it matters that much, but is more consistent with other\ntools which print \"old new new_something_else\".\n\n    Luben\n\n> \n> This header line is followed by the following information once\n> for each commit:\n> \n>  - author name (\"author\"), email (\"author-mail\"), time\n>    (\"author-time\"), and timezone (\"author-tz\"); similarly for\n>    committer.\n> \n>  - filename in the commit the line is attributed to.\n> \n>  - the first line of the commit log message (\"summary\").\n> \n> The contents of the actual line is output after the above\n> header, prefixed by a TAB. This is to allow adding more header\n> elements later.\n> \n> Signed-off-by: Junio C Hamano <junkio@cox.net>\n> ---\n> \n>  * By now, Luben would have guessed where this series is leading\n>    to...\n> \n>  blame.c |  149 +++++++++++++++++++++++++++++++++++++++++++++++++++++---------\n>  1 files changed, 127 insertions(+), 22 deletions(-)\n> \n> diff --git a/blame.c b/blame.c\n> index 47471e8..8189318 100644\n> --- a/blame.c\n> +++ b/blame.c\n> @@ -17,6 +17,7 @@ #include \"diff.h\"\n>  #include \"diffcore.h\"\n>  #include \"revision.h\"\n>  #include \"xdiff-interface.h\"\n> +#include \"quote.h\"\n>  \n>  #define DEBUG 0\n>  \n> @@ -40,6 +41,7 @@ struct util_info {\n>  \tunsigned long size;\n>  \tint num_lines;\n>  \tconst char *pathname;\n> +\tunsigned meta_given:1;\n>  \n>  \tvoid *topo_data;\n>  };\n> @@ -332,12 +334,8 @@ static struct util_info *get_util(struct\n>  \tif (util)\n>  \t\treturn util;\n>  \n> -\tutil = xmalloc(sizeof(struct util_info));\n> -\tutil->buf = NULL;\n> -\tutil->size = 0;\n> -\tutil->line_map = NULL;\n> +\tutil = xcalloc(1, sizeof(struct util_info));\n>  \tutil->num_lines = -1;\n> -\tutil->pathname = NULL;\n>  \tcommit->util = util;\n>  \treturn util;\n>  }\n> @@ -642,39 +640,99 @@ struct commit_info\n>  \tchar *author_mail;\n>  \tunsigned long author_time;\n>  \tchar *author_tz;\n> +\n> +\t/* filled only when asked for details */\n> +\tchar *committer;\n> +\tchar *committer_mail;\n> +\tunsigned long committer_time;\n> +\tchar *committer_tz;\n> +\n> +\tchar *summary;\n>  };\n>  \n> -static void get_commit_info(struct commit *commit, struct commit_info *ret)\n> +static void get_ac_line(const char *inbuf, const char *what,\n> +\t\t\tint bufsz, char *person, char **mail,\n> +\t\t\tunsigned long *time, char **tz)\n>  {\n>  \tint len;\n> -\tchar *tmp;\n> -\tstatic char author_buf[1024];\n> -\n> -\ttmp = strstr(commit->buffer, \"\\nauthor \") + 8;\n> -\tlen = strchr(tmp, '\\n') - tmp;\n> -\tret->author = author_buf;\n> -\tmemcpy(ret->author, tmp, len);\n> +\tchar *tmp, *endp;\n> +\n> +\ttmp = strstr(inbuf, what);\n> +\tif (!tmp)\n> +\t\tgoto error_out;\n> +\ttmp += strlen(what);\n> +\tendp = strchr(tmp, '\\n');\n> +\tif (!endp)\n> +\t\tlen = strlen(tmp);\n> +\telse\n> +\t\tlen = endp - tmp;\n> +\tif (bufsz <= len) {\n> +\terror_out:\n> +\t\t/* Ugh */\n> +\t\tperson = *mail = *tz = \"(unknown)\";\n> +\t\t*time = 0;\n> +\t\treturn;\n> +\t}\n> +\tmemcpy(person, tmp, len);\n>  \n> -\ttmp = ret->author;\n> +\ttmp = person;\n>  \ttmp += len;\n>  \t*tmp = 0;\n>  \twhile (*tmp != ' ')\n>  \t\ttmp--;\n> -\tret->author_tz = tmp+1;\n> +\t*tz = tmp+1;\n>  \n>  \t*tmp = 0;\n>  \twhile (*tmp != ' ')\n>  \t\ttmp--;\n> -\tret->author_time = strtoul(tmp, NULL, 10);\n> +\t*time = strtoul(tmp, NULL, 10);\n>  \n>  \t*tmp = 0;\n>  \twhile (*tmp != ' ')\n>  \t\ttmp--;\n> -\tret->author_mail = tmp + 1;\n> -\n> +\t*mail = tmp + 1;\n>  \t*tmp = 0;\n>  }\n>  \n> +static void get_commit_info(struct commit *commit, struct commit_info *ret, int detailed)\n> +{\n> +\tint len;\n> +\tchar *tmp, *endp;\n> +\tstatic char author_buf[1024];\n> +\tstatic char committer_buf[1024];\n> +\tstatic char summary_buf[1024];\n> +\n> +\tret->author = author_buf;\n> +\tget_ac_line(commit->buffer, \"\\nauthor \",\n> +\t\t    sizeof(author_buf), author_buf, &ret->author_mail,\n> +\t\t    &ret->author_time, &ret->author_tz);\n> +\n> +\tif (!detailed)\n> +\t\treturn;\n> +\n> +\tret->committer = committer_buf;\n> +\tget_ac_line(commit->buffer, \"\\ncommitter \",\n> +\t\t    sizeof(committer_buf), committer_buf, &ret->committer_mail,\n> +\t\t    &ret->committer_time, &ret->committer_tz);\n> +\n> +\tret->summary = summary_buf;\n> +\ttmp = strstr(commit->buffer, \"\\n\\n\");\n> +\tif (!tmp) {\n> +\terror_out:\n> +\t\tsprintf(summary_buf, \"(%s)\", sha1_to_hex(commit->object.sha1));\n> +\t\treturn;\n> +\t}\n> +\ttmp += 2;\n> +\tendp = strchr(tmp, '\\n');\n> +\tif (!endp)\n> +\t\tgoto error_out;\n> +\tlen = endp - tmp;\n> +\tif (len >= sizeof(summary_buf))\n> +\t\tgoto error_out;\n> +\tmemcpy(summary_buf, tmp, len);\n> +\tsummary_buf[len] = 0;\n> +}\n> +\n>  static const char *format_time(unsigned long time, const char *tz_str,\n>  \t\t\t       int show_raw_time)\n>  {\n> @@ -751,7 +809,7 @@ static int find_orig_linenum(struct util\n>  }\n>  \n>  static void emit_meta(struct commit *c, int lno,\n> -\t\t      int sha1_len, int compatibility,\n> +\t\t      int sha1_len, int compatibility, int porcelain,\n>  \t\t      int show_name, int show_number, int show_raw_time,\n>  \t\t      int longest_file, int longest_author,\n>  \t\t      int max_digits, int max_orig_digits)\n> @@ -763,7 +821,47 @@ static void emit_meta(struct commit *c, \n>  \tu = c->util;\n>  \tlineno = find_orig_linenum(u, lno);\n>  \n> -\tget_commit_info(c, &ci);\n> +\tif (porcelain) {\n> +\t\tint group_size = -1;\n> +\t\tstruct commit *cc = (lno == 0) ? NULL : blame_lines[lno-1];\n> +\t\tif (cc != c) {\n> +\t\t\t/* This is the beginning of this group */\n> +\t\t\tint i;\n> +\t\t\tfor (i = lno + 1; i < num_blame_lines; i++)\n> +\t\t\t\tif (blame_lines[i] != c)\n> +\t\t\t\t\tbreak;\n> +\t\t\tgroup_size = i - lno;\n> +\t\t}\n> +\t\tif (0 < group_size)\n> +\t\t\tprintf(\"%s %d %d %d\\n\", sha1_to_hex(c->object.sha1),\n> +\t\t\t       lno + 1, lineno, group_size);\n> +\t\telse\n> +\t\t\tprintf(\"%s %d %d\\n\", sha1_to_hex(c->object.sha1),\n> +\t\t\t       lno + 1, lineno);\n> +\t\tif (!u->meta_given) {\n> +\t\t\tget_commit_info(c, &ci, 1);\n> +\t\t\tprintf(\"author %s\\n\", ci.author);\n> +\t\t\tprintf(\"author-mail %s\\n\", ci.author_mail);\n> +\t\t\tprintf(\"author-time %lu\\n\", ci.author_time);\n> +\t\t\tprintf(\"author-tz %s\\n\", ci.author_tz);\n> +\t\t\tprintf(\"committer %s\\n\", ci.committer);\n> +\t\t\tprintf(\"committer-mail %s\\n\", ci.committer_mail);\n> +\t\t\tprintf(\"committer-time %lu\\n\", ci.committer_time);\n> +\t\t\tprintf(\"committer-tz %s\\n\", ci.committer_tz);\n> +\t\t\tprintf(\"filename \");\n> +\t\t\tif (quote_c_style(u->pathname, NULL, NULL, 0))\n> +\t\t\t\tquote_c_style(u->pathname, NULL, stdout, 0);\n> +\t\t\telse\n> +\t\t\t\tfputs(u->pathname, stdout);\n> +\t\t\tprintf(\"\\nsummary %s\\n\", ci.summary);\n> +\n> +\t\t\tu->meta_given = 1;\n> +\t\t}\n> +\t\tputchar('\\t');\n> +\t\treturn;\n> +\t}\n> +\n> +\tget_commit_info(c, &ci, 0);\n>  \tfwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);\n>  \tif (compatibility) {\n>  \t\tprintf(\"\\t(%10s\\t%10s\\t%d)\", ci.author,\n> @@ -809,6 +907,7 @@ int main(int argc, const char **argv)\n>  \tint longest_file, longest_author, longest_file_lines;\n>  \tint show_name = 0;\n>  \tint show_number = 0;\n> +\tint porcelain = 0;\n>  \n>  \tconst char *prefix = setup_git_directory();\n>  \tgit_config(git_default_config);\n> @@ -852,6 +951,12 @@ int main(int argc, const char **argv)\n>  \t\t\t\tshow_number = 1;\n>  \t\t\t\tcontinue;\n>  \t\t\t}\n> +\t\t\tif (!strcmp(argv[i], \"--porcelain\")) {\n> +\t\t\t\tporcelain = 1;\n> +\t\t\t\tsha1_len = 40;\n> +\t\t\t\tshow_raw_time = 1;\n> +\t\t\t\tcontinue;\n> +\t\t\t}\n>  \t\t\tif (!strcmp(argv[i], \"--\")) {\n>  \t\t\t\toptions = 0;\n>  \t\t\t\tcontinue;\n> @@ -934,7 +1039,7 @@ int main(int argc, const char **argv)\n>  \t\t\tlongest_file = strlen(u->pathname);\n>  \t\tif (longest_file_lines < u->num_lines)\n>  \t\t\tlongest_file_lines = u->num_lines;\n> -\t\tget_commit_info(c, &ci);\n> +\t\tget_commit_info(c, &ci, 0);\n>  \t\tif (longest_author < strlen(ci.author))\n>  \t\t\tlongest_author = strlen(ci.author);\n>  \t}\n> @@ -943,7 +1048,7 @@ int main(int argc, const char **argv)\n>  \n>  \tfor (i = 0; i < num_blame_lines; i++) {\n>  \t\temit_meta(blame_lines[i], i,\n> -\t\t\t  sha1_len, compatibility,\n> +\t\t\t  sha1_len, compatibility, porcelain,\n>  \t\t\t  show_name, show_number, show_raw_time,\n>  \t\t\t  longest_file, longest_author,\n>  \t\t\t  max_digits, max_orig_digits);\n> -- \n> 1.4.2.3.g866f3\n> \n> \n> -\n> To unsubscribe from this list: send the line \"unsubscribe git\" in\n> the body of a message to majordomo@vger.kernel.org\n> More majordomo info at  http://vger.kernel.org/majordomo-info.html\n> \n"},{"id":"28279","messageId":"7v1wpl229j.fsf@assigned-by-dhcp.cox.net","threadId":"5826","inReplyTo":"20061006002904.24024.qmail@web31814.mail.mud.yahoo.com","subject":"Re: [PATCH 5/6] git-blame --porcelain","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-10-06T09:59:36Z","receivedAt":"2006-10-06T09:59:36Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Luben Tuikov <ltuikov@yahoo.com> writes:\n\n> BTW, I would've chosen to print the line number of the original file\n> first, followed by the line number of the final (this) file followed\n> by the number of lines in this group of the final (this) file:\n\nSwapped them and trivially adjusted [6/6] for this change.  The\nresult is found in \"pu\".\n"}]}