From: Junio C Hamano <gitster@pobox.com>
To: Meet Soni <meetsoni3017@gmail.com>
Cc: git@vger.kernel.org, shubham.kanodia10@gmail.com,
Pavel Rappo <pavel.rappo@gmail.com>, Jeff King <peff@peff.net>,
Jacob Keller <jacob.e.keller@intel.com>,
Patrick Steinhardt <ps@pks.im>,
Matthew Rogers <mattr94@gmail.com>,
Jacob Keller <jacob.keller@gmail.com>
Subject: Re: [PATCH v2 1/3] refspec: relocate omit_name_by_refspec and related functions
Date: Mon, 27 Jan 2025 09:21:54 -0800 [thread overview]
Message-ID: <xmqqa5bctbnx.fsf@gitster.g> (raw)
In-Reply-To: <20250127103644.36627-2-meetsoni3017@gmail.com> (Meet Soni's message of "Mon, 27 Jan 2025 16:06:42 +0530")
Meet Soni <meetsoni3017@gmail.com> writes:
> Move the functions `omit_name_by_refspec()`, `refspec_match()`, and
> `match_name_with_pattern()` from `remote.c` to `refspec.c`. These
> functions focus on refspec matching, so placing them in `refspec.c`
> aligns with the separation of concerns. Keep refspec-related logic in
> `refspec.c` and remote-specific logic in `remote.c` for better code
> organization.
>
> Signed-off-by: Meet Soni <meetsoni3017@gmail.com>
> ---
> ...
> diff --git a/refspec.h b/refspec.h
> index 69d693c87d..891d50b159 100644
> --- a/refspec.h
> +++ b/refspec.h
> @@ -71,4 +71,17 @@ struct strvec;
> void refspec_ref_prefixes(const struct refspec *rs,
> struct strvec *ref_prefixes);
Back when these functions were mere local helper functions in
remote.c, their name being less descriptive of what they do may have
been OK (because readers have more context to understand them), but
when we make it a part of a public API, we should re-evaluate if
their names are good enough.
> +/*
> + * Check whether a name matches any negative refspec in rs. Returns 1 if the
> + * name matches at least one negative refspec, and 0 otherwise.
> + */
> +int omit_name_by_refspec(const char *name, struct refspec *rs);
Imagine you found this description in the header file and are trying
to figure out if it helps you writing the feature you are adding to
Git. Are the above description and the name of the function useful
enough to you?
The first question that came to my mind was "what is exactly a 'name'?"
In the context of the original, the caller iterates over a list of
"struct ref" and feeds the "name" member of the struct, but this
caller does not even have to know it is getting a part of "struct
ref"; it only cares about its parameter being a character string.
In that context, is "name" the best identifer you can give to this
parameter? At least calling it "refname" might boost the signal the
name gives to the reader a bit better (and it is in line with how
refs.h calls these things).
Another thing to consider is if the comment describes the purpose of
the function well, instead of just rephrasing what its
implementation does. What does it mean to return true iff there is
even one negative refspec that matches? What is the conceivable use
a caller would want to use such a function?
As I said, calling it "omit" was probably OK in the context of the
original file, but it was already sloppy. This function merely
provides one bit of information (i.e. "does it match any nagative
refspec---Yes or No?"), and it is up to its caller how to use that
piece of information form.
One of its callers, apply_negative_refspecs(), happens to use it to
filter a list of "struct ref" it received from its caller to drop
the refs from the list that match any negative refspec, but the
other existing caller does not even filter or omit anything from a
collection it has.
My personal preference is to do this kind of change in two separate
patches:
(1) as a preliminary clean-up, we rename functions and their
parameters in the original place; if needed, add clarifying
comments.
(2) move the resulting functions with the comments to their new
home.
If these two step conversions results in
extern int refname_matches_negative_refspec_item
(const char *refname, struct refspec *refspec);
I suspect that it is clear enough that there is no need for any
extra comment to explain what it does.
> +/*
> + * Checks whether a name matches a pattern and optionally generates a result.
> + * Returns 1 if the name matches the pattern, 0 otherwise.
> + */
> +int match_name_with_pattern(const char *key, const char *name,
> + const char *value, char **result);
> +
As this is merely moved from an existing header, I am tempted to say
I'll leave it as an exercise to the readers to improve this one, as
improving it is outside the scope of this work.
Some hints for those who want to tackle the clean-up for extra
points, perhaps after the dust settles from this series.
The "pattern" in the name refers to the src side of a globbing
refspec and is passed in the parameter "key", so we are calling the
same thing in three different names, which is already triply bad.
"optionally generates a result" does not convey any meaning outside
the context of the original, as it does not even talk about what
computation is creating the result. It does not even say what
controls the optionality---without reading the implementation, it is
likely your readers would assume passing NULL to result is all it
takes to skip that optional feature, but that is not the case.
If I understand correctly, here is what this one does.
It takes the source side of a globbing refspec item (e.g.
"refs/heads/*" in "refs/heads/*:refs/remotes/origin/*"), a
refname that might match the glob pattern, the destination side
of the refspec item (e.g. "refs/remotes/origin/*" in the same
example), and a pointer that points at a variable to receive the
result. If the source pattern matches the given refname, apply
the source-to-destination mapping rule to compute the resulting
destination refname and store it in the result.
The destination side is optional; if you do not need to map the
refname to another refname, but are merely interested if the
refname matches the glob pattern, you can pass NULL and result
location is not touched.
In either case, returns true iff the source side of the globbing
refspec item matches the given refname.
So "name" in the function name should probably become a bit
narrower, like "refname". Also the names of its parameters need to
be better thought out.
next prev parent reply other threads:[~2025-01-27 17:21 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-27 10:36 [PATCH v2 0/3] refspec: centralize refspec-related logic Meet Soni
2025-01-27 10:36 ` [PATCH v2 1/3] refspec: relocate omit_name_by_refspec and related functions Meet Soni
2025-01-27 17:21 ` Junio C Hamano [this message]
2025-01-29 5:15 ` Meet Soni
2025-01-27 10:36 ` [PATCH v2 2/3] refspec: relocate query " Meet Soni
2025-01-27 19:25 ` Junio C Hamano
2025-01-29 6:32 ` Meet Soni
2025-01-27 10:36 ` [PATCH v2 3/3] refspec: relocate apply_refspecs and related funtions Meet Soni
2025-01-27 20:14 ` Junio C Hamano
2025-01-29 7:03 ` Meet Soni
2025-01-27 11:00 ` [PATCH v2 0/3] refspec: centralize refspec-related logic Meet Soni
2025-01-27 18:10 ` Junio C Hamano
2025-01-29 5:18 ` Meet Soni
2025-02-01 6:41 ` [PATCH v3 0/5] " Meet Soni
2025-02-01 6:41 ` [PATCH v3 1/5] refactor(remote): rename function omit_name_by_refspec Meet Soni
2025-02-03 6:45 ` Patrick Steinhardt
2025-02-01 6:41 ` [PATCH v3 2/5] refspec: relocate refname_matches_negative_refspec_item Meet Soni
2025-02-01 6:42 ` [PATCH v3 3/5] refactor(remote): rename query_refspecs functions Meet Soni
2025-02-03 6:46 ` Patrick Steinhardt
2025-02-04 3:39 ` Meet Soni
2025-02-04 13:58 ` Junio C Hamano
2025-02-01 6:42 ` [PATCH v3 4/5] refspec: relocate matching related functions Meet Soni
2025-02-01 6:42 ` [PATCH v3 5/5] refspec: relocate apply_refspecs and related funtions Meet Soni
2025-02-04 4:05 ` [GSoC][PATCH v4 0/5] refspec: centralize refspec-related logic Meet Soni
2025-02-04 4:05 ` [GSoC][PATCH v4 1/5] remote: rename function omit_name_by_refspec Meet Soni
2025-02-04 9:00 ` Karthik Nayak
2025-02-04 13:58 ` Meet Soni
2025-02-06 10:13 ` Karthik Nayak
2025-02-04 4:05 ` [GSoC][PATCH v4 2/5] refspec: relocate refname_matches_negative_refspec_item Meet Soni
2025-02-04 4:05 ` [GSoC][PATCH v4 3/5] remote: rename query_refspecs functions Meet Soni
2025-02-04 4:05 ` [GSoC][PATCH v4 4/5] refspec: relocate matching related functions Meet Soni
2025-02-04 4:05 ` [GSoC][PATCH v4 5/5] refspec: relocate apply_refspecs and related funtions Meet Soni
2025-02-04 7:16 ` [GSoC][PATCH v4 0/5] refspec: centralize refspec-related logic Patrick Steinhardt
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=xmqqa5bctbnx.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jacob.e.keller@intel.com \
--cc=jacob.keller@gmail.com \
--cc=mattr94@gmail.com \
--cc=meetsoni3017@gmail.com \
--cc=pavel.rappo@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=shubham.kanodia10@gmail.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).