From: Frantisek Hrbata <frantisek@hrbata.com>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: git@vger.kernel.org, "Josh Steadmon" <steadmon@google.com>,
"Jonathan Tan" <jonathantanmy@google.com>,
"Junio C Hamano" <gitster@pobox.com>,
"Brandon Williams" <bwilliams.eng@gmail.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: Re: [PATCH v2 1/2] transport: remove unnecessary indenting in transport_push()
Date: Fri, 20 May 2022 13:53:49 +0200 [thread overview]
Message-ID: <YoeBTeJOCbP449BW@fedora> (raw)
In-Reply-To: <220520.86y1yw1lxj.gmgdl@evledraar.gmail.com>
On Fri, May 20, 2022 at 01:24:28PM +0200, Ævar Arnfjörð Bjarmason wrote:
>
> On Fri, May 20 2022, Frantisek Hrbata wrote:
>
> > Remove the big indented block for push_refs() check in transport vtable
> > and let's just return error immediately. Hopefully this makes the code
> > more readable.
>
> s/push_refs/transport_push/, push_refs is the name of the field in the
> callback (and there's more than just this function).
uf, I will fix that, thank you for noticing.
>
> This looks good to me....
>
> > Is there a reason to return 1 instead of -1 when push_refs() is not
> > set in transport vtable? Looking at the code I think it might return
> > -1 also and make it more consistent.
>
> No, looking at it (I tried renaming the function) the only user is
> builtin/push.c, which we can easily see doesn't care about the 1 v.s. -1 here.
>
> Perhaps it's worthwhile to add this in-between the two patches you have:
>
> diff --git a/transport.c b/transport.c
> index 0b9c5a427d7..5348fac36ef 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -1283,22 +1283,23 @@ int transport_push(struct repository *r,
> int quiet = (transport->verbose < 0);
> int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
> int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
> - int push_ret, ret, err;
> + int push_ret, err;
> + int ret = -1;
> struct transport_ls_refs_options transport_options =
> TRANSPORT_LS_REFS_OPTIONS_INIT;
>
> *reject_reasons = 0;
>
> if (transport_color_config() < 0)
> - return -1;
> + goto done;
>
> if (!transport->vtable->push_refs)
> - return 1;
> + goto done;
>
> local_refs = get_local_heads();
>
> if (check_push_refs(local_refs, rs) < 0)
> - return -1;
> + goto done;
>
> refspec_ref_prefixes(rs, &transport_options.ref_prefixes);
>
> @@ -1319,7 +1320,7 @@ int transport_push(struct repository *r,
> match_flags |= MATCH_REFS_FOLLOW_TAGS;
>
> if (match_push_refs(local_refs, &remote_refs, rs, match_flags))
> - return -1;
> + goto done;
>
> if (transport->smart_options &&
> transport->smart_options->cas &&
> @@ -1333,7 +1334,7 @@ int transport_push(struct repository *r,
>
> if (!(flags & TRANSPORT_PUSH_NO_HOOK))
> if (run_pre_push_hook(transport, remote_refs))
> - return -1;
> + goto done;
>
> if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
> TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
> @@ -1417,6 +1418,7 @@ int transport_push(struct repository *r,
> else if (!quiet && !ret && !transport_refs_pushed(remote_refs))
> fprintf(stderr, "Everything up-to-date\n");
>
> +done:
> return ret;
> }
>
> Which would make your new 3/3 truly trivial, i.e. just adding the
> free_refs() for the two.
I was thinking about this too. Just use the done label as a single exit point.
Let me incorporate your suggestions in v3. I will add a 2/3 patch e.g.
"unify return values and exit point for transport_push()"
>
> *Maybe* (but probably not) it would then make sense to do this as that 3/3:
>
> diff --git a/transport.c b/transport.c
> index 5348fac36ef..d4952bf5f6a 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -1291,15 +1291,17 @@ int transport_push(struct repository *r,
> *reject_reasons = 0;
>
> if (transport_color_config() < 0)
> - goto done;
> + return ret;
>
> if (!transport->vtable->push_refs)
> - goto done;
> + return ret;
>
> local_refs = get_local_heads();
>
> - if (check_push_refs(local_refs, rs) < 0)
> + if (check_push_refs(local_refs, rs) < 0) {
> + remote_refs = NULL;
> goto done;
> + }
>
> refspec_ref_prefixes(rs, &transport_options.ref_prefixes);
>
> @@ -1419,6 +1421,8 @@ int transport_push(struct repository *r,
> fprintf(stderr, "Everything up-to-date\n");
>
> done:
> + free_refs(local_refs);
> + free_refs(remote_refs);
> return ret;
> }
>
> I.e. entirely skip the NULL assignment for the two, which helps the
> compiler catch if we don't init it before the later goto's, but because
> of that we'd need to "return" instead of "goto done" for the early ones,
> and set it for the check_push_refs() failure case.
>
> So nah, probably best just to keep it as you have it, i.e. always "goto
> done".
I agree. Let me prepare v3 and let's see what happens :)
Thank you for your input!
--
Frantisek Hrbata
next prev parent reply other threads:[~2022-05-20 11:53 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-20 8:17 [PATCH] transport: free local and remote refs in transport_push() Frantisek Hrbata
2022-05-20 8:40 ` Ævar Arnfjörð Bjarmason
2022-05-20 8:56 ` Frantisek Hrbata
2022-05-20 10:35 ` [PATCH v2 0/2] fix memory leaks " Frantisek Hrbata
2022-05-20 10:35 ` [PATCH v2 1/2] transport: remove unnecessary indenting " Frantisek Hrbata
2022-05-20 11:24 ` Ævar Arnfjörð Bjarmason
2022-05-20 11:53 ` Frantisek Hrbata [this message]
2022-05-20 10:35 ` [PATCH v2 2/2] transport: free local and remote refs " Frantisek Hrbata
2022-05-20 12:49 ` [PATCH v3 0/3] fix memory leaks " Frantisek Hrbata
2022-05-20 12:49 ` [PATCH v3 1/3] transport: remove unnecessary indenting " Frantisek Hrbata
2022-05-20 12:49 ` [PATCH v3 2/3] transport: unify return values and exit point from transport_push() Frantisek Hrbata
2022-05-20 12:49 ` [PATCH v3 3/3] transport: free local and remote refs in transport_push() Frantisek Hrbata
2022-05-27 20:22 ` [PATCH v3 0/3] fix memory leaks " Josh Steadmon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YoeBTeJOCbP449BW@fedora \
--to=frantisek@hrbata.com \
--cc=avarab@gmail.com \
--cc=bwilliams.eng@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=pclouds@gmail.com \
--cc=steadmon@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).