{"thread":{"id":"19388","subject":"[PATCH 1/3] show-branch: Fix die message in parse_reflog_param()","startedAt":"2009-05-17T10:47:02Z","lastAt":"2009-05-19T05:09:03Z","messageCount":9,"participants":["Stephen Boyd","Junio C Hamano","Jakub Narebski","Sverre Rabbelier"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"114126","messageId":"1242557224-8411-1-git-send-email-bebarino@gmail.com","threadId":"19388","inReplyTo":null,"subject":"[PATCH 1/3] show-branch: Fix die message in parse_reflog_param()","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-05-17T10:47:02Z","receivedAt":"2009-05-17T10:47:02Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"Commit 76a44c5 (show-branch --reflog: show the reflog message at the\ntop, 2007-01-19) introduced parse_reflog_param(). The die() call was\nincorrectly passed arg + 9, when it should have been passed arg.\n\nSigned-off-by: Stephen Boyd <bebarino@gmail.com>\n---\n builtin-show-branch.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/builtin-show-branch.c b/builtin-show-branch.c\nindex 828e6f8..c3afabb 100644\n--- a/builtin-show-branch.c\n+++ b/builtin-show-branch.c\n@@ -576,7 +576,7 @@ static void parse_reflog_param(const char *arg, int *cnt, const char **base)\n \tif (*ep == ',')\n \t\t*base = ep + 1;\n \telse if (*ep)\n-\t\tdie(\"unrecognized reflog param '%s'\", arg + 9);\n+\t\tdie(\"unrecognized reflog param '%s'\", arg);\n \telse\n \t\t*base = NULL;\n \tif (*cnt <= 0)\n-- \n1.6.3.1.30.g55524\n"},{"id":"114127","messageId":"1242557224-8411-2-git-send-email-bebarino@gmail.com","threadId":"19388","inReplyTo":"1242557224-8411-1-git-send-email-bebarino@gmail.com","subject":"[PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-05-17T10:47:03Z","receivedAt":"2009-05-17T10:47:03Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"If argh is complicated, i.e. the option takes more than one argument,\ndon't add the brackets around argh in the usage message.\n\nSigned-off-by: Stephen Boyd <bebarino@gmail.com>\n---\n\n    This is used in the next patch to for --reflog[=<n>[,<base>]]\n\n    Maybe someone can think of a better name?\n\n parse-options.c |   26 +++++++++++++++++---------\n parse-options.h |    4 ++++\n 2 files changed, 21 insertions(+), 9 deletions(-)\n\ndiff --git a/parse-options.c b/parse-options.c\nindex cf71bcf..cd9ab4f 100644\n--- a/parse-options.c\n+++ b/parse-options.c\n@@ -361,6 +361,20 @@ int parse_options(int argc, const char **argv, const struct option *options,\n \treturn parse_options_end(&ctx);\n }\n \n+static int usage_argh(const struct option *opts, int pos)\n+{\n+\tconst char *s;\n+\tint custom = opts->flags & PARSE_OPT_CUSTOM_ARGH;\n+\tif (opts->flags & PARSE_OPT_OPTARG)\n+\t\tif (opts->long_name)\n+\t\t\ts = custom ? \"[=%s]\" : \"[=<%s>]\";\n+\t\telse\n+\t\t\ts = custom ? \"[%s]\" : \"[<%s>]\";\n+\telse\n+\t\ts = custom ? \" %s\" : \" <%s>\";\n+\treturn pos + fprintf(stderr, s, opts->argh);\n+}\n+\n #define USAGE_OPTS_WIDTH 24\n #define USAGE_GAP         2\n \n@@ -421,15 +435,9 @@ int usage_with_options_internal(const char * const *usagestr,\n \t\t\t\tbreak;\n \t\t\t/* FALLTHROUGH */\n \t\tcase OPTION_STRING:\n-\t\t\tif (opts->argh) {\n-\t\t\t\tif (opts->flags & PARSE_OPT_OPTARG)\n-\t\t\t\t\tif (opts->long_name)\n-\t\t\t\t\t\tpos += fprintf(stderr, \"[=<%s>]\", opts->argh);\n-\t\t\t\t\telse\n-\t\t\t\t\t\tpos += fprintf(stderr, \"[<%s>]\", opts->argh);\n-\t\t\t\telse\n-\t\t\t\t\tpos += fprintf(stderr, \" <%s>\", opts->argh);\n-\t\t\t} else {\n+\t\t\tif (opts->argh)\n+\t\t\t\tpos += usage_argh(opts, pos);\n+\t\t\telse {\n \t\t\t\tif (opts->flags & PARSE_OPT_OPTARG)\n \t\t\t\t\tif (opts->long_name)\n \t\t\t\t\t\tpos += fprintf(stderr, \"[=...]\");\ndiff --git a/parse-options.h b/parse-options.h\nindex b54eec1..671a635 100644\n--- a/parse-options.h\n+++ b/parse-options.h\n@@ -31,6 +31,7 @@ enum parse_opt_option_flags {\n \tPARSE_OPT_NONEG   = 4,\n \tPARSE_OPT_HIDDEN  = 8,\n \tPARSE_OPT_LASTARG_DEFAULT = 16,\n+\tPARSE_OPT_CUSTOM_ARGH = 64,\n };\n \n struct option;\n@@ -66,6 +67,9 @@ typedef int parse_opt_cb(const struct option *, const char *arg, int unset);\n  *   PARSE_OPT_NONEG: says that this option cannot be negated\n  *   PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in\n  *                    the long one.\n+ *   PARSE_OPT_CUSTOM_ARGH: says that argh shouldn't be enclosed in brackets\n+ *\t\t\t    (i.e. '<argh>') in the help message.\n+ *\t\t\t    Useful for options with multiple parameters.\n  *\n  * `callback`::\n  *   pointer to the callback to use for OPTION_CALLBACK.\n-- \n1.6.3.1.30.g55524\n"},{"id":"114128","messageId":"1242557224-8411-3-git-send-email-bebarino@gmail.com","threadId":"19388","inReplyTo":"1242557224-8411-2-git-send-email-bebarino@gmail.com","subject":"[PATCH 3/3] show-branch: migrate to parse-options API","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-05-17T10:47:04Z","receivedAt":"2009-05-17T10:47:04Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"Also die instead of calling usage with an error string.\n\nSigned-off-by: Stephen Boyd <bebarino@gmail.com>\n---\n builtin-show-branch.c |  117 +++++++++++++++++++++++++------------------------\n 1 files changed, 60 insertions(+), 57 deletions(-)\n\ndiff --git a/builtin-show-branch.c b/builtin-show-branch.c\nindex c3afabb..e9acd4c 100644\n--- a/builtin-show-branch.c\n+++ b/builtin-show-branch.c\n@@ -2,11 +2,13 @@\n #include \"commit.h\"\n #include \"refs.h\"\n #include \"builtin.h\"\n+#include \"parse-options.h\"\n \n-static const char show_branch_usage[] =\n-\"git show-branch [--sparse] [--current] [--all] [--remotes] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...] | --reflog[=n[,b]] <branch>\";\n-static const char show_branch_usage_reflog[] =\n-\"--reflog is incompatible with --all, --remotes, --independent or --merge-base\";\n+static const char* show_branch_usage[] = {\n+    \"git show-branch [--sparse] [--current] [--all] [--remotes] [--topo-order] [--more=count | --list | --independent | --merge-base] [--topics] [<refs>...]\",\n+    \"--reflog[=n[,b]] [--list] <branch>\",\n+    NULL\n+};\n \n static int default_num;\n static int default_alloc;\n@@ -569,18 +571,25 @@ static int omit_in_dense(struct commit *commit, struct commit **rev, int n)\n \treturn 0;\n }\n \n-static void parse_reflog_param(const char *arg, int *cnt, const char **base)\n+static int reflog = 0;\n+\n+static int parse_reflog_param(const struct option *opt, const char *arg,\n+\t\t\t      int unset)\n {\n \tchar *ep;\n-\t*cnt = strtoul(arg, &ep, 10);\n+\tconst char **base = (const char **)opt->value;\n+\tif (!arg)\n+\t\targ = \"\";\n+\treflog = strtoul(arg, &ep, 10);\n \tif (*ep == ',')\n \t\t*base = ep + 1;\n \telse if (*ep)\n \t\tdie(\"unrecognized reflog param '%s'\", arg);\n \telse\n \t\t*base = NULL;\n-\tif (*cnt <= 0)\n-\t\t*cnt = DEFAULT_REFLOG;\n+\tif (reflog <= 0)\n+\t\treflog = DEFAULT_REFLOG;\n+\treturn 0;\n }\n \n int cmd_show_branch(int ac, const char **av, const char *prefix)\n@@ -606,8 +615,42 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \tint head_at = -1;\n \tint topics = 0;\n \tint dense = 1;\n-\tint reflog = 0;\n \tconst char *reflog_base = NULL;\n+\tstruct option builtin_show_branch_options[] = {\n+\t\tOPT_BOOLEAN('a', \"all\", &all_heads,\n+\t\t\t    \"show remote-tracking and local branches\"),\n+\t\tOPT_BOOLEAN('r', \"remotes\", &all_remotes,\n+\t\t\t    \"show remote-tracking branches\"),\n+\t\t{ OPTION_INTEGER, 0, \"more\", &extra, \"n\",\n+\t\t\t    \"show <n> more commits after the common ancestor\",\n+\t\t\t    PARSE_OPT_OPTARG | PARSE_OPT_LASTARG_DEFAULT,\n+\t\t\t    NULL, (intptr_t)1 },\n+\t\tOPT_SET_INT(0, \"list\", &extra, \"synonym to more=-1\", -1),\n+\t\tOPT_BOOLEAN(0, \"no-name\", &no_name, \"suppress naming strings\"),\n+\t\tOPT_BOOLEAN(0, \"current\", &with_current_branch,\n+\t\t\t    \"include the current branch\"),\n+\t\tOPT_BOOLEAN(0, \"sha1-name\", &sha1_name,\n+\t\t\t    \"name commits with their object names\"),\n+\t\tOPT_BOOLEAN(0, \"merge-base\", &merge_base,\n+\t\t\t    \"act like git merge-base -a\"),\n+\t\tOPT_BOOLEAN(0, \"independent\", &independent,\n+\t\t\t    \"show refs unreachable from any other ref\"),\n+\t\tOPT_BOOLEAN(0, \"topo-order\", &lifo,\n+\t\t\t    \"show commits in topological order\"),\n+\t\tOPT_BOOLEAN(0, \"topics\", &topics,\n+\t\t\t    \"show only commits not on the first branch\"),\n+\t\tOPT_SET_INT(0, \"sparse\", &dense,\n+\t\t\t    \"show merges reachable from only one tip\", 0),\n+\t\tOPT_SET_INT(0, \"date-order\", &lifo,\n+\t\t\t    \"show commits where no parent comes before its \"\n+\t\t\t    \"children\", 0),\n+\t\t{ OPTION_CALLBACK, 'g', \"reflog\", &reflog_base, \"<n>[,<base>]\",\n+\t\t\t    \"show <n> most recent ref-log entries starting at \"\n+\t\t\t    \"base\",\n+\t\t\t    PARSE_OPT_OPTARG | PARSE_OPT_CUSTOM_ARGH,\n+\t\t\t    parse_reflog_param },\n+\t\tOPT_END()\n+\t};\n \n \tgit_config(git_show_branch_config, NULL);\n \n@@ -617,59 +660,18 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \t\tav = default_arg - 1; /* ick; we would not address av[0] */\n \t}\n \n-\twhile (1 < ac && av[1][0] == '-') {\n-\t\tconst char *arg = av[1];\n-\t\tif (!strcmp(arg, \"--\")) {\n-\t\t\tac--; av++;\n-\t\t\tbreak;\n-\t\t}\n-\t\telse if (!strcmp(arg, \"--all\") || !strcmp(arg, \"-a\"))\n-\t\t\tall_heads = all_remotes = 1;\n-\t\telse if (!strcmp(arg, \"--remotes\") || !strcmp(arg, \"-r\"))\n-\t\t\tall_remotes = 1;\n-\t\telse if (!strcmp(arg, \"--more\"))\n-\t\t\textra = 1;\n-\t\telse if (!strcmp(arg, \"--list\"))\n-\t\t\textra = -1;\n-\t\telse if (!strcmp(arg, \"--no-name\"))\n-\t\t\tno_name = 1;\n-\t\telse if (!strcmp(arg, \"--current\"))\n-\t\t\twith_current_branch = 1;\n-\t\telse if (!strcmp(arg, \"--sha1-name\"))\n-\t\t\tsha1_name = 1;\n-\t\telse if (!prefixcmp(arg, \"--more=\"))\n-\t\t\textra = atoi(arg + 7);\n-\t\telse if (!strcmp(arg, \"--merge-base\"))\n-\t\t\tmerge_base = 1;\n-\t\telse if (!strcmp(arg, \"--independent\"))\n-\t\t\tindependent = 1;\n-\t\telse if (!strcmp(arg, \"--topo-order\"))\n-\t\t\tlifo = 1;\n-\t\telse if (!strcmp(arg, \"--topics\"))\n-\t\t\ttopics = 1;\n-\t\telse if (!strcmp(arg, \"--sparse\"))\n-\t\t\tdense = 0;\n-\t\telse if (!strcmp(arg, \"--date-order\"))\n-\t\t\tlifo = 0;\n-\t\telse if (!strcmp(arg, \"--reflog\") || !strcmp(arg, \"-g\")) {\n-\t\t\treflog = DEFAULT_REFLOG;\n-\t\t}\n-\t\telse if (!prefixcmp(arg, \"--reflog=\"))\n-\t\t\tparse_reflog_param(arg + 9, &reflog, &reflog_base);\n-\t\telse if (!prefixcmp(arg, \"-g=\"))\n-\t\t\tparse_reflog_param(arg + 3, &reflog, &reflog_base);\n-\t\telse\n-\t\t\tusage(show_branch_usage);\n-\t\tac--; av++;\n-\t}\n-\tac--; av++;\n+\tac = parse_options(ac, av, builtin_show_branch_options,\n+\t\t\t   show_branch_usage, PARSE_OPT_STOP_AT_NON_OPTION);\n+\tif (all_heads)\n+\t\tall_remotes = 1;\n \n \tif (extra || reflog) {\n \t\t/* \"listing\" mode is incompatible with\n \t\t * independent nor merge-base modes.\n \t\t */\n \t\tif (independent || merge_base)\n-\t\t\tusage(show_branch_usage);\n+\t\t\tusage_with_options(show_branch_usage,\n+\t\t\t\t\t   builtin_show_branch_options);\n \t\tif (reflog && ((0 < extra) || all_heads || all_remotes))\n \t\t\t/*\n \t\t\t * Asking for --more in reflog mode does not\n@@ -677,7 +679,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \t\t\t *\n \t\t\t * Also --all and --remotes do not make sense either.\n \t\t\t */\n-\t\t\tusage(show_branch_usage_reflog);\n+\t\t\tdie(\"--reflog is incompatible with --all, --remotes, \"\n+\t\t\t    \"--independent or --merge-base\");\n \t}\n \n \t/* If nothing is specified, show all branches by default */\n-- \n1.6.3.1.30.g55524\n"},{"id":"114155","messageId":"7vd4a7ey4h.fsf@alter.siamese.dyndns.org","threadId":"19388","inReplyTo":"1242557224-8411-2-git-send-email-bebarino@gmail.com","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-05-18T06:14:22Z","receivedAt":"2009-05-18T06:14:22Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Stephen Boyd <bebarino@gmail.com> writes:\n\n> If argh is complicated, i.e. the option takes more than one argument,\n> don't add the brackets around argh in the usage message.\n\nI think later user wants a bit more descriptive explanation, like...\n\n\tUsually, argh element in struct option points at a placeholder\n\tvalue (e.g. \"val\"), and this is used to show\n\n\t    --option=<val>\n\n\tby enclosing the string inside of angle brackets.\n\n\tWhen the option takes something more complex (e.g. optional part\n\tseparated by comma), you would want to produce a help that looks\n\tlike\n\n\t    --option=<val1>[,<val2>]\n\n\tIn such a case, the caller can pass a string to argh with\n\tplaceholders already enclosed in necessary angle brackets\n\t(e.g. \"<val1>[,<val2>]\") and set this option.\n\nPlease update Documentation/technical/api-parse-options.txt as well.\n"},{"id":"114158","messageId":"4A11096B.8020208@gmail.com","threadId":"19388","inReplyTo":"7vd4a7ey4h.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-05-18T07:08:27Z","receivedAt":"2009-05-18T07:08:27Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"Junio C Hamano wrote:\n> Stephen Boyd <bebarino@gmail.com> writes:\n>> If argh is complicated, i.e. the option takes more than one argument,\n>> don't add the brackets around argh in the usage message.\n>\n> I think later user wants a bit more descriptive explanation, like...\n>\n> \tUsually, argh element in struct option points at a placeholder\n> \tvalue (e.g. \"val\"), and this is used to show\n>\n> \t    --option=<val>\n>\n> \tby enclosing the string inside of angle brackets.\n>\n> \tWhen the option takes something more complex (e.g. optional part\n> \tseparated by comma), you would want to produce a help that looks\n> \tlike\n>\n> \t    --option=<val1>[,<val2>]\n>\n> \tIn such a case, the caller can pass a string to argh with\n> \tplaceholders already enclosed in necessary angle brackets\n> \t(e.g. \"<val1>[,<val2>]\") and set this option.\n\nThis description sounds nice ;) Is PARSE_OPT_CUSTOM_ARGH a good name? I\nwas thinking maybe PARSE_OPT_MULTARGS is better?\n\n> Please update Documentation/technical/api-parse-options.txt as well.\n\nThere's no documentation on the flags yet, but I suppose I could add that.\n"},{"id":"114160","messageId":"7vmy9aetc8.fsf@alter.siamese.dyndns.org","threadId":"19388","inReplyTo":"4A11096B.8020208@gmail.com","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2009-05-18T07:57:43Z","receivedAt":"2009-05-18T07:57:43Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Stephen Boyd <bebarino@gmail.com> writes:\n\n> This description sounds nice ;) Is PARSE_OPT_CUSTOM_ARGH a good name? I\n> was thinking maybe PARSE_OPT_MULTARGS is better?\n\nYou are asking a wrong person.  I am terrible at naming things; think\n\"rerere\" ;-).\n\nBut I think custom-arghelp is much better than multargs.  You are asking\n\"use this help for argument value _literally_\", so another possibility\nperhaps is PARSE_OPT_ARGHELP_LITERAL.\n\nAfter all, there probably are many other valid reasons why you may not\nwant \"s/.*/<&>/\" blindly applied to your string.  One reason may be\nbecause the string describes multiple arguments, but I suspect that it is\nnot the only one.  It is better to name the option after what it does,\nthan naming it after one sample reason why you might want to use that\noption.\n\n>> Please update Documentation/technical/api-parse-options.txt as well.\n>\n> There's no documentation on the flags yet, but I suppose I could add that.\n\nThanks.\n"},{"id":"114162","messageId":"4A1116FF.8030008@gmail.com","threadId":"19388","inReplyTo":"7vmy9aetc8.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Stephen Boyd","fromEmail":"bebarino@gmail.com","sentAt":"2009-05-18T08:06:23Z","receivedAt":"2009-05-18T08:06:23Z","isPatch":true,"sender":{"key":"bebarino@gmail.com","avatar":"https://avatars.githubusercontent.com/u/38832?v=4"},"body":"Junio C Hamano wrote:\n> You are asking a wrong person.  I am terrible at naming things; think\n> \"rerere\" ;-).\n>\n> But I think custom-arghelp is much better than multargs.  You are asking\n> \"use this help for argument value _literally_\", so another possibility\n> perhaps is PARSE_OPT_ARGHELP_LITERAL.\n>\n> After all, there probably are many other valid reasons why you may not\n> want \"s/.*/<&>/\" blindly applied to your string.  One reason may be\n> because the string describes multiple arguments, but I suspect that it is\n> not the only one.  It is better to name the option after what it does,\n> than naming it after one sample reason why you might want to use that\n> option.\n\nOk. I think PARSE_OPT_LITERAL_ARGH might be good; until someone comes up\nwith a better one of course.\n"},{"id":"114205","messageId":"m3vdnyja8i.fsf@localhost.localdomain","threadId":"19388","inReplyTo":"4A1116FF.8030008@gmail.com","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2009-05-18T22:52:21Z","receivedAt":"2009-05-18T22:52:21Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Stephen Boyd <bebarino@gmail.com> writes:\n> Junio C Hamano wrote:\n\n> > You are asking a wrong person.  I am terrible at naming things; think\n> > \"rerere\" ;-).\n> >\n> > But I think custom-arghelp is much better than multargs.  You are asking\n> > \"use this help for argument value _literally_\", so another possibility\n> > perhaps is PARSE_OPT_ARGHELP_LITERAL.\n> >\n> > After all, there probably are many other valid reasons why you may not\n> > want \"s/.*/<&>/\" blindly applied to your string.  One reason may be\n> > because the string describes multiple arguments, but I suspect that it is\n> > not the only one.  It is better to name the option after what it does,\n> > than naming it after one sample reason why you might want to use that\n> > option.\n> \n> Ok. I think PARSE_OPT_LITERAL_ARGH might be good; until someone comes up\n> with a better one of course.\n\nWell, 'ARGH' sounds a bit strange. I think I'd prefer ARGHELP. :-)\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"114227","messageId":"fabb9a1e0905182209r2c6ae99fh491a35337abbe548@mail.gmail.com","threadId":"19388","inReplyTo":"m3vdnyja8i.fsf@localhost.localdomain","subject":"Re: [PATCH 2/3] parse-options: add PARSE_OPT_CUSTOM_ARGH for complicated argh's","fromName":"Sverre Rabbelier","fromEmail":"srabbelier@gmail.com","sentAt":"2009-05-19T05:09:03Z","receivedAt":"2009-05-19T05:09:03Z","isPatch":true,"sender":{"key":"srabbelier@gmail.com","avatar":"https://avatars.githubusercontent.com/u/3098?v=4"},"body":"Heya,\n\nOn Tue, May 19, 2009 at 00:52, Jakub Narebski <jnareb@gmail.com> wrote:\n> Well, 'ARGH' sounds a bit strange. I think I'd prefer ARGHELP. :-)\n\nYarr, it be reminding me of a patch from ye ol' mentor summit!\n\n-- \nCheers,\n\nSverre Rabbelier\n"}]}