{"thread":{"id":"60630","subject":"[PATCH] rebase: use strvec_pushf() for format-patch revisions","startedAt":"2023-12-19T07:42:20Z","lastAt":"2023-12-20T15:57:16Z","messageCount":6,"participants":["René Scharfe","Phillip Wood","Patrick Steinhardt","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"485797","messageId":"4ab7431c-6c1b-448c-b4d2-e8b9be0e4eef@web.de","threadId":"60630","inReplyTo":null,"subject":"[PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2023-12-19T07:42:18Z","receivedAt":"2023-12-19T07:42:20Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"In run_am(), a strbuf is used to create a revision argument that is then\nadded to the argument list for git format-patch using strvec_push().\nUse strvec_pushf() to add it directly instead, simplifying the code.\n\nSigned-off-by: René Scharfe <l.s.r@web.de>\n---\nFormatted with --inter-hunk-context=14 for easier review.\n\n builtin/rebase.c | 17 ++++++-----------\n 1 file changed, 6 insertions(+), 11 deletions(-)\n\ndiff --git a/builtin/rebase.c b/builtin/rebase.c\nindex 9f8192e0a5..ddde4cbb87 100644\n--- a/builtin/rebase.c\n+++ b/builtin/rebase.c\n@@ -582,7 +582,6 @@ static int run_am(struct rebase_options *opts)\n {\n \tstruct child_process am = CHILD_PROCESS_INIT;\n \tstruct child_process format_patch = CHILD_PROCESS_INIT;\n-\tstruct strbuf revisions = STRBUF_INIT;\n \tint status;\n \tchar *rebased_patches;\n\n@@ -615,34 +614,32 @@ static int run_am(struct rebase_options *opts)\n \t\treturn run_command(&am);\n \t}\n\n-\tstrbuf_addf(&revisions, \"%s...%s\",\n-\t\t    oid_to_hex(opts->root ?\n-\t\t\t       /* this is now equivalent to !opts->upstream */\n-\t\t\t       &opts->onto->object.oid :\n-\t\t\t       &opts->upstream->object.oid),\n-\t\t    oid_to_hex(&opts->orig_head->object.oid));\n-\n \trebased_patches = xstrdup(git_path(\"rebased-patches\"));\n \tformat_patch.out = open(rebased_patches,\n \t\t\t\tO_WRONLY | O_CREAT | O_TRUNC, 0666);\n \tif (format_patch.out < 0) {\n \t\tstatus = error_errno(_(\"could not open '%s' for writing\"),\n \t\t\t\t     rebased_patches);\n \t\tfree(rebased_patches);\n \t\tstrvec_clear(&am.args);\n \t\treturn status;\n \t}\n\n \tformat_patch.git_cmd = 1;\n \tstrvec_pushl(&format_patch.args, \"format-patch\", \"-k\", \"--stdout\",\n \t\t     \"--full-index\", \"--cherry-pick\", \"--right-only\",\n \t\t     \"--default-prefix\", \"--no-renames\",\n \t\t     \"--no-cover-letter\", \"--pretty=mboxrd\", \"--topo-order\",\n \t\t     \"--no-base\", NULL);\n \tif (opts->git_format_patch_opt.len)\n \t\tstrvec_split(&format_patch.args,\n \t\t\t     opts->git_format_patch_opt.buf);\n-\tstrvec_push(&format_patch.args, revisions.buf);\n+\tstrvec_pushf(&format_patch.args, \"%s...%s\",\n+\t\t     oid_to_hex(opts->root ?\n+\t\t\t\t/* this is now equivalent to !opts->upstream */\n+\t\t\t\t&opts->onto->object.oid :\n+\t\t\t\t&opts->upstream->object.oid),\n+\t\t     oid_to_hex(&opts->orig_head->object.oid));\n \tif (opts->restrict_revision)\n \t\tstrvec_pushf(&format_patch.args, \"^%s\",\n \t\t\t     oid_to_hex(&opts->restrict_revision->object.oid));\n@@ -665,10 +662,8 @@ static int run_am(struct rebase_options *opts)\n \t\t\t\"As a result, git cannot rebase them.\"),\n \t\t      opts->revisions);\n\n-\t\tstrbuf_release(&revisions);\n \t\treturn status;\n \t}\n-\tstrbuf_release(&revisions);\n\n \tam.in = open(rebased_patches, O_RDONLY);\n \tif (am.in < 0) {\n--\n2.43.0\n"},{"id":"485809","messageId":"d91f96aa-8320-4b6f-ae5e-54290a4c03ea@gmail.com","threadId":"60630","inReplyTo":"4ab7431c-6c1b-448c-b4d2-e8b9be0e4eef@web.de","subject":"Re: [PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"Phillip Wood","fromEmail":"phillip.wood123@gmail.com","sentAt":"2023-12-19T11:07:22Z","receivedAt":"2023-12-19T11:07:25Z","isPatch":true,"sender":{"key":"phillip.wood@dunelm.org.uk","avatar":null},"body":"Hi René\n\nOn 19/12/2023 07:42, René Scharfe wrote:\n> In run_am(), a strbuf is used to create a revision argument that is then\n> added to the argument list for git format-patch using strvec_push().\n> Use strvec_pushf() to add it directly instead, simplifying the code.\n\nThis looks like a nice simplification and the extra context lines in the \npatch are much appreciated\n\nThanks\n\nPhillip\n\n> Signed-off-by: René Scharfe <l.s.r@web.de>\n> ---\n> Formatted with --inter-hunk-context=14 for easier review.\n> \n>   builtin/rebase.c | 17 ++++++-----------\n>   1 file changed, 6 insertions(+), 11 deletions(-)\n> \n> diff --git a/builtin/rebase.c b/builtin/rebase.c\n> index 9f8192e0a5..ddde4cbb87 100644\n> --- a/builtin/rebase.c\n> +++ b/builtin/rebase.c\n> @@ -582,7 +582,6 @@ static int run_am(struct rebase_options *opts)\n>   {\n>   \tstruct child_process am = CHILD_PROCESS_INIT;\n>   \tstruct child_process format_patch = CHILD_PROCESS_INIT;\n> -\tstruct strbuf revisions = STRBUF_INIT;\n>   \tint status;\n>   \tchar *rebased_patches;\n> \n> @@ -615,34 +614,32 @@ static int run_am(struct rebase_options *opts)\n>   \t\treturn run_command(&am);\n>   \t}\n> \n> -\tstrbuf_addf(&revisions, \"%s...%s\",\n> -\t\t    oid_to_hex(opts->root ?\n> -\t\t\t       /* this is now equivalent to !opts->upstream */\n> -\t\t\t       &opts->onto->object.oid :\n> -\t\t\t       &opts->upstream->object.oid),\n> -\t\t    oid_to_hex(&opts->orig_head->object.oid));\n> -\n>   \trebased_patches = xstrdup(git_path(\"rebased-patches\"));\n>   \tformat_patch.out = open(rebased_patches,\n>   \t\t\t\tO_WRONLY | O_CREAT | O_TRUNC, 0666);\n>   \tif (format_patch.out < 0) {\n>   \t\tstatus = error_errno(_(\"could not open '%s' for writing\"),\n>   \t\t\t\t     rebased_patches);\n>   \t\tfree(rebased_patches);\n>   \t\tstrvec_clear(&am.args);\n>   \t\treturn status;\n>   \t}\n> \n>   \tformat_patch.git_cmd = 1;\n>   \tstrvec_pushl(&format_patch.args, \"format-patch\", \"-k\", \"--stdout\",\n>   \t\t     \"--full-index\", \"--cherry-pick\", \"--right-only\",\n>   \t\t     \"--default-prefix\", \"--no-renames\",\n>   \t\t     \"--no-cover-letter\", \"--pretty=mboxrd\", \"--topo-order\",\n>   \t\t     \"--no-base\", NULL);\n>   \tif (opts->git_format_patch_opt.len)\n>   \t\tstrvec_split(&format_patch.args,\n>   \t\t\t     opts->git_format_patch_opt.buf);\n> -\tstrvec_push(&format_patch.args, revisions.buf);\n> +\tstrvec_pushf(&format_patch.args, \"%s...%s\",\n> +\t\t     oid_to_hex(opts->root ?\n> +\t\t\t\t/* this is now equivalent to !opts->upstream */\n> +\t\t\t\t&opts->onto->object.oid :\n> +\t\t\t\t&opts->upstream->object.oid),\n> +\t\t     oid_to_hex(&opts->orig_head->object.oid));\n>   \tif (opts->restrict_revision)\n>   \t\tstrvec_pushf(&format_patch.args, \"^%s\",\n>   \t\t\t     oid_to_hex(&opts->restrict_revision->object.oid));\n> @@ -665,10 +662,8 @@ static int run_am(struct rebase_options *opts)\n>   \t\t\t\"As a result, git cannot rebase them.\"),\n>   \t\t      opts->revisions);\n> \n> -\t\tstrbuf_release(&revisions);\n>   \t\treturn status;\n>   \t}\n> -\tstrbuf_release(&revisions);\n> \n>   \tam.in = open(rebased_patches, O_RDONLY);\n>   \tif (am.in < 0) {\n> --\n> 2.43.0\n> \n"},{"id":"485811","messageId":"ZYGLvKYQe6DhP3Uf@tanuki","threadId":"60630","inReplyTo":"4ab7431c-6c1b-448c-b4d2-e8b9be0e4eef@web.de","subject":"Re: [PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2023-12-19T12:25:32Z","receivedAt":"2023-12-19T12:25:38Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Tue, Dec 19, 2023 at 08:42:18AM +0100, René Scharfe wrote:\n> In run_am(), a strbuf is used to create a revision argument that is then\n> added to the argument list for git format-patch using strvec_push().\n> Use strvec_pushf() to add it directly instead, simplifying the code.\n> \n> Signed-off-by: René Scharfe <l.s.r@web.de>\n\nThanks, this simplification looks good to me!\n\nPatrick\n\n> ---\n> Formatted with --inter-hunk-context=14 for easier review.\n> \n>  builtin/rebase.c | 17 ++++++-----------\n>  1 file changed, 6 insertions(+), 11 deletions(-)\n> \n> diff --git a/builtin/rebase.c b/builtin/rebase.c\n> index 9f8192e0a5..ddde4cbb87 100644\n> --- a/builtin/rebase.c\n> +++ b/builtin/rebase.c\n> @@ -582,7 +582,6 @@ static int run_am(struct rebase_options *opts)\n>  {\n>  \tstruct child_process am = CHILD_PROCESS_INIT;\n>  \tstruct child_process format_patch = CHILD_PROCESS_INIT;\n> -\tstruct strbuf revisions = STRBUF_INIT;\n>  \tint status;\n>  \tchar *rebased_patches;\n> \n> @@ -615,34 +614,32 @@ static int run_am(struct rebase_options *opts)\n>  \t\treturn run_command(&am);\n>  \t}\n> \n> -\tstrbuf_addf(&revisions, \"%s...%s\",\n> -\t\t    oid_to_hex(opts->root ?\n> -\t\t\t       /* this is now equivalent to !opts->upstream */\n> -\t\t\t       &opts->onto->object.oid :\n> -\t\t\t       &opts->upstream->object.oid),\n> -\t\t    oid_to_hex(&opts->orig_head->object.oid));\n> -\n>  \trebased_patches = xstrdup(git_path(\"rebased-patches\"));\n>  \tformat_patch.out = open(rebased_patches,\n>  \t\t\t\tO_WRONLY | O_CREAT | O_TRUNC, 0666);\n>  \tif (format_patch.out < 0) {\n>  \t\tstatus = error_errno(_(\"could not open '%s' for writing\"),\n>  \t\t\t\t     rebased_patches);\n>  \t\tfree(rebased_patches);\n>  \t\tstrvec_clear(&am.args);\n>  \t\treturn status;\n>  \t}\n> \n>  \tformat_patch.git_cmd = 1;\n>  \tstrvec_pushl(&format_patch.args, \"format-patch\", \"-k\", \"--stdout\",\n>  \t\t     \"--full-index\", \"--cherry-pick\", \"--right-only\",\n>  \t\t     \"--default-prefix\", \"--no-renames\",\n>  \t\t     \"--no-cover-letter\", \"--pretty=mboxrd\", \"--topo-order\",\n>  \t\t     \"--no-base\", NULL);\n>  \tif (opts->git_format_patch_opt.len)\n>  \t\tstrvec_split(&format_patch.args,\n>  \t\t\t     opts->git_format_patch_opt.buf);\n> -\tstrvec_push(&format_patch.args, revisions.buf);\n> +\tstrvec_pushf(&format_patch.args, \"%s...%s\",\n> +\t\t     oid_to_hex(opts->root ?\n> +\t\t\t\t/* this is now equivalent to !opts->upstream */\n> +\t\t\t\t&opts->onto->object.oid :\n> +\t\t\t\t&opts->upstream->object.oid),\n> +\t\t     oid_to_hex(&opts->orig_head->object.oid));\n>  \tif (opts->restrict_revision)\n>  \t\tstrvec_pushf(&format_patch.args, \"^%s\",\n>  \t\t\t     oid_to_hex(&opts->restrict_revision->object.oid));\n> @@ -665,10 +662,8 @@ static int run_am(struct rebase_options *opts)\n>  \t\t\t\"As a result, git cannot rebase them.\"),\n>  \t\t      opts->revisions);\n> \n> -\t\tstrbuf_release(&revisions);\n>  \t\treturn status;\n>  \t}\n> -\tstrbuf_release(&revisions);\n> \n>  \tam.in = open(rebased_patches, O_RDONLY);\n>  \tif (am.in < 0) {\n> --\n> 2.43.0\n> \n"},{"id":"485821","messageId":"xmqqmsu6ce0u.fsf@gitster.g","threadId":"60630","inReplyTo":"4ab7431c-6c1b-448c-b4d2-e8b9be0e4eef@web.de","subject":"Re: [PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2023-12-19T17:12:33Z","receivedAt":"2023-12-19T17:12:42Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"René Scharfe <l.s.r@web.de> writes:\n\n> In run_am(), a strbuf is used to create a revision argument that is then\n> added to the argument list for git format-patch using strvec_push().\n> Use strvec_pushf() to add it directly instead, simplifying the code.\n>\n> Signed-off-by: René Scharfe <l.s.r@web.de>\n> ---\n\nMakes sense.  Between the location of the original strbuf_addf()\ncall and the new strvec_pushf() call, nobody mucks with *opts so\nthis change won't affect the correctness.  We no longer use the\nextra strbuf, and upon failing to open the rebased-patches file,\nwe no longer leak the contents of it.  Good.\n\n> @@ -615,34 +614,32 @@ static int run_am(struct rebase_options *opts)\n>  \t\treturn run_command(&am);\n>  \t}\n>\n> -\tstrbuf_addf(&revisions, \"%s...%s\",\n> -\t\t    oid_to_hex(opts->root ?\n> -\t\t\t       /* this is now equivalent to !opts->upstream */\n> -\t\t\t       &opts->onto->object.oid :\n> -\t\t\t       &opts->upstream->object.oid),\n> -\t\t    oid_to_hex(&opts->orig_head->object.oid));\n> -\n>  \trebased_patches = xstrdup(git_path(\"rebased-patches\"));\n>  \tformat_patch.out = open(rebased_patches,\n>  \t\t\t\tO_WRONLY | O_CREAT | O_TRUNC, 0666);\n>  \tif (format_patch.out < 0) {\n>  \t\tstatus = error_errno(_(\"could not open '%s' for writing\"),\n>  \t\t\t\t     rebased_patches);\n>  \t\tfree(rebased_patches);\n>  \t\tstrvec_clear(&am.args);\n>  \t\treturn status;\n>  \t}\n>\n>  \tformat_patch.git_cmd = 1;\n>  \tstrvec_pushl(&format_patch.args, \"format-patch\", \"-k\", \"--stdout\",\n>  \t\t     \"--full-index\", \"--cherry-pick\", \"--right-only\",\n>  \t\t     \"--default-prefix\", \"--no-renames\",\n>  \t\t     \"--no-cover-letter\", \"--pretty=mboxrd\", \"--topo-order\",\n>  \t\t     \"--no-base\", NULL);\n>  \tif (opts->git_format_patch_opt.len)\n>  \t\tstrvec_split(&format_patch.args,\n>  \t\t\t     opts->git_format_patch_opt.buf);\n> -\tstrvec_push(&format_patch.args, revisions.buf);\n> +\tstrvec_pushf(&format_patch.args, \"%s...%s\",\n> +\t\t     oid_to_hex(opts->root ?\n> +\t\t\t\t/* this is now equivalent to !opts->upstream */\n> +\t\t\t\t&opts->onto->object.oid :\n> +\t\t\t\t&opts->upstream->object.oid),\n> +\t\t     oid_to_hex(&opts->orig_head->object.oid));\n>  \tif (opts->restrict_revision)\n>  \t\tstrvec_pushf(&format_patch.args, \"^%s\",\n>  \t\t\t     oid_to_hex(&opts->restrict_revision->object.oid));\n> @@ -665,10 +662,8 @@ static int run_am(struct rebase_options *opts)\n>  \t\t\t\"As a result, git cannot rebase them.\"),\n>  \t\t      opts->revisions);\n>\n> -\t\tstrbuf_release(&revisions);\n>  \t\treturn status;\n>  \t}\n> -\tstrbuf_release(&revisions);\n>\n>  \tam.in = open(rebased_patches, O_RDONLY);\n>  \tif (am.in < 0) {\n> --\n> 2.43.0\n"},{"id":"485837","messageId":"47089803-c45b-4f33-b542-146c313f0902@web.de","threadId":"60630","inReplyTo":"xmqqmsu6ce0u.fsf@gitster.g","subject":"Re: [PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2023-12-20T08:04:35Z","receivedAt":"2023-12-20T08:04:40Z","isPatch":true,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 19.12.23 um 18:12 schrieb Junio C Hamano:\n> René Scharfe <l.s.r@web.de> writes:\n>\n>> In run_am(), a strbuf is used to create a revision argument that is then\n>> added to the argument list for git format-patch using strvec_push().\n>> Use strvec_pushf() to add it directly instead, simplifying the code.\n>>\n>> Signed-off-by: René Scharfe <l.s.r@web.de>\n>> ---\n>\n> Makes sense.  Between the location of the original strbuf_addf()\n> call and the new strvec_pushf() call, nobody mucks with *opts so\n> this change won't affect the correctness.  We no longer use the\n> extra strbuf, and upon failing to open the rebased-patches file,\n> we no longer leak the contents of it.  Good.\n\nHa!  I didn't even notice that leak on error.  Perhaps the two release\ncalls at the end gave me the illusion of cleanliness?  Or more likely\nthe opportunity to use strvec_pushf() grabbed my full attention (tunnel\nvision).\n\n>\n>> @@ -615,34 +614,32 @@ static int run_am(struct rebase_options *opts)\n>>  \t\treturn run_command(&am);\n>>  \t}\n>>\n>> -\tstrbuf_addf(&revisions, \"%s...%s\",\n>> -\t\t    oid_to_hex(opts->root ?\n>> -\t\t\t       /* this is now equivalent to !opts->upstream */\n>> -\t\t\t       &opts->onto->object.oid :\n>> -\t\t\t       &opts->upstream->object.oid),\n>> -\t\t    oid_to_hex(&opts->orig_head->object.oid));\n>> -\n>>  \trebased_patches = xstrdup(git_path(\"rebased-patches\"));\n>>  \tformat_patch.out = open(rebased_patches,\n>>  \t\t\t\tO_WRONLY | O_CREAT | O_TRUNC, 0666);\n>>  \tif (format_patch.out < 0) {\n>>  \t\tstatus = error_errno(_(\"could not open '%s' for writing\"),\n>>  \t\t\t\t     rebased_patches);\n>>  \t\tfree(rebased_patches);\n>>  \t\tstrvec_clear(&am.args);\n>>  \t\treturn status;\n>>  \t}\n>>\n>>  \tformat_patch.git_cmd = 1;\n>>  \tstrvec_pushl(&format_patch.args, \"format-patch\", \"-k\", \"--stdout\",\n>>  \t\t     \"--full-index\", \"--cherry-pick\", \"--right-only\",\n>>  \t\t     \"--default-prefix\", \"--no-renames\",\n>>  \t\t     \"--no-cover-letter\", \"--pretty=mboxrd\", \"--topo-order\",\n>>  \t\t     \"--no-base\", NULL);\n>>  \tif (opts->git_format_patch_opt.len)\n>>  \t\tstrvec_split(&format_patch.args,\n>>  \t\t\t     opts->git_format_patch_opt.buf);\n>> -\tstrvec_push(&format_patch.args, revisions.buf);\n>> +\tstrvec_pushf(&format_patch.args, \"%s...%s\",\n>> +\t\t     oid_to_hex(opts->root ?\n>> +\t\t\t\t/* this is now equivalent to !opts->upstream */\n>> +\t\t\t\t&opts->onto->object.oid :\n>> +\t\t\t\t&opts->upstream->object.oid),\n>> +\t\t     oid_to_hex(&opts->orig_head->object.oid));\n>>  \tif (opts->restrict_revision)\n>>  \t\tstrvec_pushf(&format_patch.args, \"^%s\",\n>>  \t\t\t     oid_to_hex(&opts->restrict_revision->object.oid));\n>> @@ -665,10 +662,8 @@ static int run_am(struct rebase_options *opts)\n>>  \t\t\t\"As a result, git cannot rebase them.\"),\n>>  \t\t      opts->revisions);\n>>\n>> -\t\tstrbuf_release(&revisions);\n>>  \t\treturn status;\n>>  \t}\n>> -\tstrbuf_release(&revisions);\n>>\n>>  \tam.in = open(rebased_patches, O_RDONLY);\n>>  \tif (am.in < 0) {\n>> --\n>> 2.43.0\n"},{"id":"485869","messageId":"xmqqmsu4uasm.fsf@gitster.g","threadId":"60630","inReplyTo":"47089803-c45b-4f33-b542-146c313f0902@web.de","subject":"Re: [PATCH] rebase: use strvec_pushf() for format-patch revisions","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2023-12-20T15:57:13Z","receivedAt":"2023-12-20T15:57:16Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"René Scharfe <l.s.r@web.de> writes:\n\n> Am 19.12.23 um 18:12 schrieb Junio C Hamano:\n>> René Scharfe <l.s.r@web.de> writes:\n>>\n>>> In run_am(), a strbuf is used to create a revision argument that is then\n>>> added to the argument list for git format-patch using strvec_push().\n>>> Use strvec_pushf() to add it directly instead, simplifying the code.\n>>>\n>>> Signed-off-by: René Scharfe <l.s.r@web.de>\n>>> ---\n>>\n>> Makes sense.  Between the location of the original strbuf_addf()\n>> call and the new strvec_pushf() call, nobody mucks with *opts so\n>> this change won't affect the correctness.  We no longer use the\n>> extra strbuf, and upon failing to open the rebased-patches file,\n>> we no longer leak the contents of it.  Good.\n>\n> Ha!  I didn't even notice that leak on error.  Perhaps the two release\n> calls at the end gave me the illusion of cleanliness?  Or more likely\n> the opportunity to use strvec_pushf() grabbed my full attention (tunnel\n> vision).\n\nPerhaps I'll amend the end of the log message, like so, before\nmerging it down to 'next', then.\n\n    ..., simplifying the code and plugging a small leak on the error\n    codepath.\n\nThanks.\n"}]}