From: shejialuo <shejialuo@gmail.com>
To: Caleb White <cdwhite3@pm.me>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v3 1/3] worktree: refactor infer_backlink() to use *strbuf
Date: Fri, 11 Oct 2024 01:26:41 +0800 [thread overview]
Message-ID: <ZwgOURNkNhg8BsaU@ArchLinux> (raw)
In-Reply-To: <e1RptKNShhPZHXDhBkQBaCNCmKBKik4nQzRShqtgVfjcH7vBWpuLYV60PSHaJ0diX-oG3XiKHc7IebhIZM4eSkeYdQQZ_QYK2ixxsK-XwrE=@pm.me>
On Thu, Oct 10, 2024 at 04:41:03PM +0000, Caleb White wrote:
[snip]
> > > @@ -658,17 +657,18 @@ static char *infer_backlink(const char gitfile)
> > > id++; / advance past '/' to point at <id> */
> > > if (!*id)
> > > goto error;
> > > - strbuf_git_common_path(&inferred, the_repository, "worktrees/%s", id);
> > > - if (!is_directory(inferred.buf))
> > > + strbuf_reset(inferred);
> >
>
> >
>
> > Question here: should we use `strbuf_reset` here? I want to know the
> > reason why you design this. Is the caller's responsibility to clear the
> > "inferred" when calling this function?
>
> Yes we should, sure it is the caller's responsibility but this just helps
> prevent bugs. There's plenty of functions that reset the strbuf that's
> passed to the function before modifying it.
>
Yes, that make senses.
[snip]
> > We have two signals to indicate the success. I think it's a bad idea to
> > use "inferred.buf.len". Let me give you an example here:
>
> I don't see a problem with this---the two "signals" are guaranteed to
> always be in sync (either the return is 1 and len is > 0, or return is
> 0 and len is 0). Having the boolean return gives you flexibility in how
> you can call the function (if it can be placed inside an if condition).
>
Yes, there is nothing wrong with this. But we also introduce a burden here,
when we need to change/refactor `infer_backlink`, the developer should
have the knowledge "when the return is 1 and len is >0 or return is 0
and len is 0".
If so, why not just return "infer_backlink.len"?
> > struct strbuf inferred_backlink = STRBUF_INIT;
> > inferred_backlink = infer_backlink(realdotgit.buf);
> >
>
> > // What if I wrongly use the following statements?
> > strbuf_addstr(&inferred_backlink, "foo");
> >
>
> > if (inferred_backlink.buf.len) {
> >
>
> > }
>
> I'm sorry, but this example doesn't make sense. This will fail to compile
> for several reasons:
> - infer_backlink() requires two args
> - you cannot assign an `int` to a `struct strbuf`
> - even if inferred_backlink became an int then the strbuf_addstr()
> would fail because you can't pass an `int*` to a `struct strbuf*`
> - `inferred_backlink.buf.len` doesn't exist, it's `inferred_backlink.len`
> (probably just a typo)
>
I am sorry for this, I gave a wrong example here, it should be the
following (I copied the wrong line in the previous email):
struct strbuf inferred_backlink = STRBUF_INIT;
infer_backlink(realdotgit.buf, &inferred_backlink);
// What if I wronly use the following statements?
strbuf_addstr(&inferred_backlink, "foo");
if (inferred_backlink.len) {
...
}
Actually, I am not against your way. Instead, you should mention why you
choose "inferred_backlink.len" as the signal in the commit message.
That's the main reason why I think we may add some comments here. The
caller may do not know we should use "inferred_backlink.len" to indicate
that we have successfully found the inferred backlink especially there
is already a return code in the function.
> > If you insist using "inferred_backlink.buf.len" as the result, this
> > function should return `void`. And you should add some comments for this
> > function.
>
> I can add comments, and I can change the return type to `void` if there's
> consensus, but I really don't see any issue with leaving it as-is.
>
I agree with you that this function is NOT harmful. Actually, I do not
think using "void" as the return type is a good idea. If we decide to
use two signals, let's leave it as-is. Some comments should be enough.
> > > - if (inferred_backlink && fspathcmp(backlink, inferred_backlink)) {
> > > - free(backlink);
> > > - backlink = inferred_backlink;
> > > - inferred_backlink = NULL;
> > > + if (inferred_backlink.len && fspathcmp(backlink.buf, inferred_backlink.buf)) {
> > > + strbuf_swap(&backlink, &inferred_backlink);
> > > }
> >
>
> >
>
> > For single line statement after "if", we should not use `{`.
>
> The brackets were introduced by the patch that my series depends on.
> I can remove them, but perhaps it would be better to address that
> on the dependent patch?
>
The original patch has three lines. So it should use `{`. After your
change, it only has one line, isn't it?
You could refer to this to see the code style.
https://github.com/git/git/blob/master/Documentation/CodingGuidelines
> Best,
Thanks,
Jialuo
next prev parent reply other threads:[~2024-10-10 17:26 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-08 3:12 [PATCH v3 0/3] Link worktrees with relative paths Caleb White via B4 Relay
2024-10-08 3:12 ` [PATCH v3 1/3] worktree: refactor infer_backlink() to use *strbuf Caleb White via B4 Relay
2024-10-10 15:52 ` shejialuo
2024-10-10 16:41 ` Caleb White
2024-10-10 17:26 ` shejialuo [this message]
2024-10-10 17:52 ` Caleb White
2024-10-10 20:03 ` Junio C Hamano
2024-10-10 20:24 ` Caleb White
2024-10-10 19:14 ` Junio C Hamano
2024-10-08 3:12 ` [PATCH v3 2/3] worktree: link worktrees with relative paths Caleb White via B4 Relay
2024-10-08 23:09 ` Junio C Hamano
2024-10-09 18:34 ` Caleb White
2024-10-09 19:10 ` Junio C Hamano
2024-10-09 19:19 ` Caleb White
2024-10-09 23:37 ` Junio C Hamano
2024-10-10 17:30 ` Caleb White
2024-10-11 4:03 ` Caleb White
2024-10-22 4:32 ` Caleb White
2024-10-09 10:11 ` Phillip Wood
2024-10-09 18:49 ` Caleb White
2024-10-08 3:12 ` [PATCH v3 3/3] worktree: add test for path handling in linked worktrees Caleb White via B4 Relay
2024-10-08 4:48 ` [PATCH v3 0/3] Link worktrees with relative paths Caleb White
2024-10-08 19:00 ` Junio C Hamano
2024-10-08 21:55 ` Caleb White
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=ZwgOURNkNhg8BsaU@ArchLinux \
--to=shejialuo@gmail.com \
--cc=cdwhite3@pm.me \
--cc=git@vger.kernel.org \
/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).