{"thread":{"id":"57393","subject":"[PATCH 1/3] log: fix memory leak if --graph is passed multiple times","startedAt":"2022-02-09T16:24:06Z","lastAt":"2022-02-10T20:15:47Z","messageCount":9,"participants":["Alex Henrie","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"448050","messageId":"20220209162350.169971-1-alexhenrie24@gmail.com","threadId":"57393","inReplyTo":null,"subject":"[PATCH 1/3] log: fix memory leak if --graph is passed multiple times","fromName":"Alex Henrie","fromEmail":"alexhenrie24@gmail.com","sentAt":"2022-02-09T16:23:47Z","receivedAt":"2022-02-09T16:24:06Z","isPatch":true,"sender":{"key":"alexhenrie24@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5951993?v=4"},"body":"Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>\n---\n revision.c | 8 +++++---\n 1 file changed, 5 insertions(+), 3 deletions(-)\n\ndiff --git a/revision.c b/revision.c\nindex ad4286fbdd..c03c387edd 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -2424,9 +2424,11 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg\n \t\trevs->pretty_given = 1;\n \t\trevs->abbrev_commit = 1;\n \t} else if (!strcmp(arg, \"--graph\")) {\n-\t\trevs->topo_order = 1;\n-\t\trevs->rewrite_parents = 1;\n-\t\trevs->graph = graph_init(revs);\n+\t\tif (!revs->graph) {\n+\t\t\trevs->topo_order = 1;\n+\t\t\trevs->rewrite_parents = 1;\n+\t\t\trevs->graph = graph_init(revs);\n+\t\t}\n \t} else if (!strcmp(arg, \"--encode-email-headers\")) {\n \t\trevs->encode_email_headers = 1;\n \t} else if (!strcmp(arg, \"--no-encode-email-headers\")) {\n-- \n2.32.0.2645.gc109162a1f\n\n"},{"id":"448051","messageId":"20220209162350.169971-2-alexhenrie24@gmail.com","threadId":"57393","inReplyTo":"20220209162350.169971-1-alexhenrie24@gmail.com","subject":"[PATCH 2/3] log: add a config option for --graph","fromName":"Alex Henrie","fromEmail":"alexhenrie24@gmail.com","sentAt":"2022-02-09T16:23:48Z","receivedAt":"2022-02-09T16:24:10Z","isPatch":true,"sender":{"key":"alexhenrie24@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5951993?v=4"},"body":"A coworker recently asked me how to turn on --graph by default in\n`git log`. I googled it and found that several people have asked that\nbefore on Stack Overflow, with no good solution:\nhttps://stackoverflow.com/questions/43555256/how-do-i-make-git-log-graph-the-default\n\nAdd a log.graph option to turn on graph mode in the absence of any\nincompatible options.\n\nIt would be nice to have a --no-graph command line option to countermand\nlog.graph=true, but it's not clear how that would work with topo_order\nand rewrite_parents, which can be set by other options. In any case, it\nis still possible to countermand log.graph=true per invocation with\n`git -c log.graph=false log`.\n\nSigned-off-by: Alex Henrie <alexhenrie24@gmail.com>\n---\n Documentation/config/log.txt |  5 +++++\n Documentation/git-log.txt    |  5 +++++\n builtin/log.c                | 17 +++++++++++++++++\n t/t4202-log.sh               | 35 +++++++++++++++++++++++++++++++++++\n 4 files changed, 62 insertions(+)\n\ndiff --git a/Documentation/config/log.txt b/Documentation/config/log.txt\nindex 456eb07800..3e356cfce6 100644\n--- a/Documentation/config/log.txt\n+++ b/Documentation/config/log.txt\n@@ -35,6 +35,11 @@ log.follow::\n \ti.e. it cannot be used to follow multiple files and does not work well\n \ton non-linear history.\n \n+log.graph::\n+\tIf true, makes linkgit:git-log[1], linkgit:git-show[1], and\n+\tlinkgit:git-whatchanged[1] assume `--graph` unless an incompatible\n+\toption is also specified.\n+\n log.graphColors::\n \tA list of colors, separated by commas, that can be used to draw\n \thistory lines in `git log --graph`.\ndiff --git a/Documentation/git-log.txt b/Documentation/git-log.txt\nindex 20e87cecf4..7e9e0f8afe 100644\n--- a/Documentation/git-log.txt\n+++ b/Documentation/git-log.txt\n@@ -214,6 +214,11 @@ log.follow::\n \ti.e. it cannot be used to follow multiple files and does not work well\n \ton non-linear history.\n \n+log.graph::\n+\tIf `true`, `git log` and related commands will act as if the\n+\t`--graph` option was passed to them unless an incompatible option is\n+\talso specified.\n+\n log.showRoot::\n \tIf `false`, `git log` and related commands will not treat the\n \tinitial commit as a big creation event.  Any root commits in\ndiff --git a/builtin/log.c b/builtin/log.c\nindex 4b493408cc..1f0db54c84 100644\n--- a/builtin/log.c\n+++ b/builtin/log.c\n@@ -35,6 +35,7 @@\n #include \"repository.h\"\n #include \"commit-reach.h\"\n #include \"range-diff.h\"\n+#include \"graph.h\"\n \n #define MAIL_DEFAULT_WRAP 72\n #define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100\n@@ -48,6 +49,7 @@ static int default_show_root = 1;\n static int default_follow;\n static int default_show_signature;\n static int default_encode_email_headers = 1;\n+static int default_graph;\n static int decoration_style;\n static int decoration_given;\n static int use_mailmap_config = 1;\n@@ -234,6 +236,17 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,\n \t\tread_mailmap(rev->mailmap);\n \t}\n \n+\tif (default_graph &&\n+\t    !rev->graph &&\n+\t    !rev->track_linear &&\n+\t    !rev->reverse &&\n+\t    !rev->reflog_info &&\n+\t    !rev->no_walk) {\n+\t\trev->topo_order = 1;\n+\t\trev->rewrite_parents = 1;\n+\t\trev->graph = graph_init(rev);\n+\t}\n+\n \tif (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {\n \t\t/*\n \t\t * \"log --pretty=raw\" is special; ignore UI oriented\n@@ -519,6 +532,10 @@ static int git_log_config(const char *var, const char *value, void *cb)\n \t\tdefault_show_signature = git_config_bool(var, value);\n \t\treturn 0;\n \t}\n+\tif (!strcmp(var, \"log.graph\")) {\n+\t\tdefault_graph = git_config_bool(var, value);\n+\t\treturn 0;\n+\t}\n \n \tif (grep_config(var, value, cb) < 0)\n \t\treturn -1;\ndiff --git a/t/t4202-log.sh b/t/t4202-log.sh\nindex 5049559861..3b6f7aff23 100755\n--- a/t/t4202-log.sh\n+++ b/t/t4202-log.sh\n@@ -1671,6 +1671,41 @@ test_expect_success 'log --graph with --name-only' '\n \ttest_cmp_graph --name-only tangle..reach\n '\n \n+test_expect_success 'log.graph=true behaves like --graph' '\n+\tgit log --graph >expect &&\n+\ttest_config log.graph true &&\n+\tgit log >actual &&\n+\ttest_cmp expect actual\n+'\n+\n+test_expect_success '--show-linear-break ignores log.graph' '\n+\tgit log --show-linear-break >expect &&\n+\ttest_config log.graph true &&\n+\tgit log --show-linear-break >actual &&\n+\ttest_cmp expect actual\n+'\n+\n+test_expect_success '--reverse ignores log.graph' '\n+\tgit log --reverse >expect &&\n+\ttest_config log.graph true &&\n+\tgit log --reverse >actual &&\n+\ttest_cmp expect actual\n+'\n+\n+test_expect_success '--walk-reflogs ignores log.graph' '\n+\tgit log --walk-reflogs >expect &&\n+\ttest_config log.graph true &&\n+\tgit log --walk-reflogs >actual &&\n+\ttest_cmp expect actual\n+'\n+\n+test_expect_success '--no-walk ignores log.graph' '\n+\tgit log --no-walk >expect &&\n+\ttest_config log.graph true &&\n+\tgit log --no-walk >actual &&\n+\ttest_cmp expect actual\n+'\n+\n test_expect_success 'dotdot is a parent directory' '\n \tmkdir -p a/b &&\n \t( echo sixth && echo fifth ) >expect &&\n-- \n2.32.0.2645.gc109162a1f\n\n"},{"id":"448052","messageId":"20220209162350.169971-3-alexhenrie24@gmail.com","threadId":"57393","inReplyTo":"20220209162350.169971-1-alexhenrie24@gmail.com","subject":"[PATCH 3/3] gitk: set log.graph=false when running `git log`","fromName":"Alex Henrie","fromEmail":"alexhenrie24@gmail.com","sentAt":"2022-02-09T16:23:49Z","receivedAt":"2022-02-09T16:24:13Z","isPatch":true,"sender":{"key":"alexhenrie24@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5951993?v=4"},"body":"Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>\n---\n gitk-git/gitk | 10 ++++++----\n 1 file changed, 6 insertions(+), 4 deletions(-)\n\ndiff --git a/gitk-git/gitk b/gitk-git/gitk\nindex 23d9dd1fe0..1d8a5ff622 100755\n--- a/gitk-git/gitk\n+++ b/gitk-git/gitk\n@@ -411,8 +411,9 @@ proc start_rev_list {view} {\n     }\n \n     if {[catch {\n-        set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \\\n-                        --parents --boundary $args \"--\" $files] r]\n+        set fd [open [concat | git -c log.graph=false log --no-color -z \\\n+                        --pretty=raw $show_notes --parents --boundary $args \\\n+                        \"--\" $files] r]\n     } err]} {\n         error_popup \"[mc \"Error executing git log:\"] $err\"\n         return 0\n@@ -559,8 +560,9 @@ proc updatecommits {} {\n         set args $vorigargs($view)\n     }\n     if {[catch {\n-        set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \\\n-                        --parents --boundary $args \"--\" $vfilelimit($view)] r]\n+        set fd [open [concat | git -c log.graph=false log --no-color -z \\\n+                        --pretty=raw $show_notes --parents --boundary $args \\\n+                        \"--\" $vfilelimit($view)] r]\n     } err]} {\n         error_popup \"[mc \"Error executing git log:\"] $err\"\n         return\n-- \n2.32.0.2645.gc109162a1f\n\n"},{"id":"448063","messageId":"xmqqh7979a8r.fsf@gitster.g","threadId":"57393","inReplyTo":"20220209162350.169971-1-alexhenrie24@gmail.com","subject":"Re: [PATCH 1/3] log: fix memory leak if --graph is passed multiple times","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-02-09T18:16:04Z","receivedAt":"2022-02-09T18:19:03Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alex Henrie <alexhenrie24@gmail.com> writes:\n\n> Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>\n> ---\n>  revision.c | 8 +++++---\n>  1 file changed, 5 insertions(+), 3 deletions(-)\n>\n> diff --git a/revision.c b/revision.c\n> index ad4286fbdd..c03c387edd 100644\n> --- a/revision.c\n> +++ b/revision.c\n> @@ -2424,9 +2424,11 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg\n>  \t\trevs->pretty_given = 1;\n>  \t\trevs->abbrev_commit = 1;\n>  \t} else if (!strcmp(arg, \"--graph\")) {\n> -\t\trevs->topo_order = 1;\n> -\t\trevs->rewrite_parents = 1;\n> -\t\trevs->graph = graph_init(revs);\n> +\t\tif (!revs->graph) {\n> +\t\t\trevs->topo_order = 1;\n> +\t\t\trevs->rewrite_parents = 1;\n> +\t\t\trevs->graph = graph_init(revs);\n> +\t\t}\n\nI understand the refs->graph part but are there ways to turn off\ntopo_order or rewrite_parents with _other_ options?  I.e.\n\n    git log --graph --another-option --graph\n\nif --another-option flips either bits off, would make the graph\ncode misbehave because it requires both of these bits set.\n\nI think this is safe in the corrent code, simply because there do\nnot seem to be a way to unset these bits once they are set, but\nI am not sure if that is something we want to rely on.\n\nI think an ideal endgame should look more like\n\n\t} else if (!strcmp(arg, \"--graph\")) {\n\t\trevs->topo_order = 1;\n\t\trevs->rewrite_parents = 1;\n+\t\tgraph_clear(revs->graph);\n\t\trevs->graph = graph_init(revs);\n\nwhere graph_clear() is to release the resource held by the git_graph\nstruct that was previously prepared (and possibly used), and becomes\na no-op when given NULL (just like free(NULL) is OK).\n\nBut if we want to punt on introducing graph_clear(), perhaps\n\n\t} else if (!strcmp(arg, \"--graph\")) {\n\t\trevs->topo_order = 1;\n\t\trevs->rewrite_parents = 1;\n\t\tif (!revs->graph)\n\t\t\trevs->graph = graph_init(revs);\n\nwould be closer to the ideal endgame (and have an in-code comment to\nhint future developers that (1) we are aware that this is not ideal,\nand that (2) the right way is to clear the previously allocated one\nbefore doing another init).\n\nThanks.\n\n>  \t} else if (!strcmp(arg, \"--encode-email-headers\")) {\n>  \t\trevs->encode_email_headers = 1;\n>  \t} else if (!strcmp(arg, \"--no-encode-email-headers\")) {\n"},{"id":"448064","messageId":"xmqq4k5799sf.fsf@gitster.g","threadId":"57393","inReplyTo":"20220209162350.169971-2-alexhenrie24@gmail.com","subject":"Re: [PATCH 2/3] log: add a config option for --graph","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-02-09T18:25:52Z","receivedAt":"2022-02-09T18:26:03Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alex Henrie <alexhenrie24@gmail.com> writes:\n\n> +\tif (default_graph &&\n> +\t    !rev->graph &&\n\nThis part I can see why we want to check ;-)\n\n> +\t    !rev->track_linear &&\n> +\t    !rev->reverse &&\n> +\t    !rev->reflog_info &&\n> +\t    !rev->no_walk) {\n\nBut this makes me wonder how we plan to keep this list of \"if the\nuser asked for any of these options, we shouldn't turn graph on by\ndefault\" up-to-date.  The scheme looks brittle.\n\nAlso, what would happen when a developer wants to add, say\nlog.reverse, configuration variable in the future?  I can see the\nblock to do the equivalent of this for .log.reverse begins with\n\n\tif (default_reverse &&\n\t    !rev->reverse &&\n\nbut I am not sure what other conditions need to be checked,\nespecially with 'graph'---should it check for !rev->graph or\ndefault_graph of both?  Are we playing with a potential\ncombinatorial explosion?\n\n> +\t\trev->topo_order = 1;\n> +\t\trev->rewrite_parents = 1;\n> +\t\trev->graph = graph_init(rev);\n\nIn any case, it probably makes sense to encapsulate these three\nlines in a small helper function \"when --graph is asked for on a\nrev, call this function\" in the PREVIOUS step of the series, and\nchange this patch to read more like\n\n\tif (default_graph &&\n\t    /* check for incompatible options */\n\t    !rev->track_linear && !rev->reverse && ...)\n\t\trev_add_graph_option(rev);\n\nMost importantly, the helper should be one that handles \"wow, we see\nthat rev->graph is already populated, what should we do?\", and not\nthis caller.  And that helper can be called unconditionally by the\ncommand line parser when it finds !strcmp(arg, \"--graph\") yields\ntrue.\n\nThanks.\n"},{"id":"448065","messageId":"xmqqzgmz7v6k.fsf@gitster.g","threadId":"57393","inReplyTo":"20220209162350.169971-3-alexhenrie24@gmail.com","subject":"Re: [PATCH 3/3] gitk: set log.graph=false when running `git log`","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-02-09T18:26:43Z","receivedAt":"2022-02-09T18:26:54Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alex Henrie <alexhenrie24@gmail.com> writes:\n\n> Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>\n> ---\n>  gitk-git/gitk | 10 ++++++----\n>  1 file changed, 6 insertions(+), 4 deletions(-)\n\nThis may handle \"gitk\", but what about thousands other scripts\npeople have developed around \"git log\", I have to wonder.\n\n\n\n> diff --git a/gitk-git/gitk b/gitk-git/gitk\n> index 23d9dd1fe0..1d8a5ff622 100755\n> --- a/gitk-git/gitk\n> +++ b/gitk-git/gitk\n> @@ -411,8 +411,9 @@ proc start_rev_list {view} {\n>      }\n>  \n>      if {[catch {\n> -        set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \\\n> -                        --parents --boundary $args \"--\" $files] r]\n> +        set fd [open [concat | git -c log.graph=false log --no-color -z \\\n> +                        --pretty=raw $show_notes --parents --boundary $args \\\n> +                        \"--\" $files] r]\n>      } err]} {\n>          error_popup \"[mc \"Error executing git log:\"] $err\"\n>          return 0\n> @@ -559,8 +560,9 @@ proc updatecommits {} {\n>          set args $vorigargs($view)\n>      }\n>      if {[catch {\n> -        set fd [open [concat | git log --no-color -z --pretty=raw $show_notes \\\n> -                        --parents --boundary $args \"--\" $vfilelimit($view)] r]\n> +        set fd [open [concat | git -c log.graph=false log --no-color -z \\\n> +                        --pretty=raw $show_notes --parents --boundary $args \\\n> +                        \"--\" $vfilelimit($view)] r]\n>      } err]} {\n>          error_popup \"[mc \"Error executing git log:\"] $err\"\n>          return\n"},{"id":"448165","messageId":"CAMMLpeS9MrHdq4bNwDYUJ0ctAafsjLskXStcsO_vBnfngwor-A@mail.gmail.com","threadId":"57393","inReplyTo":"xmqq4k5799sf.fsf@gitster.g","subject":"Re: [PATCH 2/3] log: add a config option for --graph","fromName":"Alex Henrie","fromEmail":"alexhenrie24@gmail.com","sentAt":"2022-02-10T16:49:55Z","receivedAt":"2022-02-10T16:50:13Z","isPatch":true,"sender":{"key":"alexhenrie24@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5951993?v=4"},"body":"On Wed, Feb 9, 2022 at 11:25 AM Junio C Hamano <gitster@pobox.com> wrote:\n>\n> Alex Henrie <alexhenrie24@gmail.com> writes:\n>\n> > +     if (default_graph &&\n> > +         !rev->graph &&\n>\n> This part I can see why we want to check ;-)\n>\n> > +         !rev->track_linear &&\n> > +         !rev->reverse &&\n> > +         !rev->reflog_info &&\n> > +         !rev->no_walk) {\n>\n> But this makes me wonder how we plan to keep this list of \"if the\n> user asked for any of these options, we shouldn't turn graph on by\n> default\" up-to-date.  The scheme looks brittle.\n>\n> Also, what would happen when a developer wants to add, say\n> log.reverse, configuration variable in the future?  I can see the\n> block to do the equivalent of this for .log.reverse begins with\n>\n>         if (default_reverse &&\n>             !rev->reverse &&\n>\n> but I am not sure what other conditions need to be checked,\n> especially with 'graph'---should it check for !rev->graph or\n> default_graph of both?  Are we playing with a potential\n> combinatorial explosion?\n\nIn principle there's no reason why --graph and --reverse can't be\ncompatible. However, if both log.graph and log.reverse config options\nare added while they are still incompatible, I think using them\ntogether should trigger the existing option compatibility error in the\nsetup_revisions function:\n\n        if (revs->reverse && revs->graph)\n                die(_(\"options '%s' and '%s' cannot be used\ntogether\"), \"--reverse\", \"--graph\");\n\nThat said, we should make sure that --graph on the command line\noverrides log.reverse in the config file (instead of dying), and the\nsame for --reverse overriding log.graph. How about this:\n\n1. In git_log_config, initialize default_graph and default_reverse by\nparsing log.graph and log.reverse.\n\n2. In cmd_log_init_defaults, initialize rev->graph_default to\ndefault_graph and rev->reverse_default to default_reverse.\n\n3. In handle_revision_opt, set revs->graph if --graph is given, clear\nrevs->graph if --no-graph is given, and in either case clear\nrevs->graph_default. Set revs->reverse and revs->reverse_default\nlikewise.\n\n4. In setup_revisions, if revs->graph_default is still true, set\nrevs->graph based on revs->reverse and revs->reverse_default. Set\nrevs->reverse likewise.\n\n5. In setup_revisions, call a new revision_opts_finish function that\nsets revs->topo_order and revs->rewrite_parents if necessary based on\nthe final value of revs->graph.\n\nI think that would ensure that command line options interact correctly\nwith config options, plus it would allow adding a --no-graph command\nline option, and the logic to handle defaults would be clearly linked\nto the existing incompatible option checks. I realize that it will\ntake a bit of refactoring though. I'll send new patches shortly to\nmake it more clear.\n\nPlease let me know if any of your other feedback is still relevant in v2.\n\n-Alex\n"},{"id":"448166","messageId":"CAMMLpeRf=BV3y2AF7AssOw3tOFn-hawsyhFaxLhCrz28kbq+NA@mail.gmail.com","threadId":"57393","inReplyTo":"xmqqzgmz7v6k.fsf@gitster.g","subject":"Re: [PATCH 3/3] gitk: set log.graph=false when running `git log`","fromName":"Alex Henrie","fromEmail":"alexhenrie24@gmail.com","sentAt":"2022-02-10T16:50:16Z","receivedAt":"2022-02-10T16:50:32Z","isPatch":true,"sender":{"key":"alexhenrie24@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5951993?v=4"},"body":"On Wed, Feb 9, 2022 at 11:26 AM Junio C Hamano <gitster@pobox.com> wrote:\n>\n> This may handle \"gitk\", but what about thousands other scripts\n> people have developed around \"git log\", I have to wonder.\n\nThat's true, but every new preference carries that risk, and there's\nnot much we can do about it. Users who set log.graph=true will just\nhave to accept that it won't be compatible with every tool in the\nwild.\n\n-Alex\n"},{"id":"448189","messageId":"xmqqfsoqfpg3.fsf@gitster.g","threadId":"57393","inReplyTo":"CAMMLpeRf=BV3y2AF7AssOw3tOFn-hawsyhFaxLhCrz28kbq+NA@mail.gmail.com","subject":"Re: [PATCH 3/3] gitk: set log.graph=false when running `git log`","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-02-10T20:15:40Z","receivedAt":"2022-02-10T20:15:47Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alex Henrie <alexhenrie24@gmail.com> writes:\n\n> On Wed, Feb 9, 2022 at 11:26 AM Junio C Hamano <gitster@pobox.com> wrote:\n>>\n>> This may handle \"gitk\", but what about thousands other scripts\n>> people have developed around \"git log\", I have to wonder.\n>\n> That's true, but every new preference carries that risk, and there's\n> not much we can do about it. Users who set log.graph=true will just\n> have to accept that it won't be compatible with every tool in the\n> wild.\n\nI wouldn't call something that is known to break people before it is\nreleased to the wild a \"risk\", though.\n"}]}