From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com, me@ttaylorr.com,
newren@gmail.com, mjcheetham@outlook.com, steadmon@google.com,
chooglen@google.com, jonathantanmy@google.com,
dyroneteng@gmail.com, Derrick Stolee <derrickstolee@github.com>
Subject: Re: [PATCH v2 6/9] strbuf: introduce strbuf_strip_file_from_path()
Date: Fri, 02 Dec 2022 19:32:24 +0100 [thread overview]
Message-ID: <221202.86bkolfwzv.gmgdl@evledraar.gmail.com> (raw)
In-Reply-To: <7d86852c01513ee131bf993302416f4c881a0bc6.1668628303.git.gitgitgadget@gmail.com>
On Wed, Nov 16 2022, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <derrickstolee@github.com>
>
> The strbuf_parent_directory() method was added as a static method in
> contrib/scalar by d0feac4e8c0 (scalar: 'register' sets recommended
> config and starts maintenance, 2021-12-03) and then removed in
> 65f6a9eb0b9 (scalar: constrain enlistment search, 2022-08-18), but now
> there is a need for a similar method in the bundle URI feature.
>
> Re-add the method, this time in strbuf.c, but with a new name:
> strbuf_strip_file_from_path(). The method requirements are slightly
> modified to allow a trailing slash, in which case nothing is done, which
> makes the name change valuable. The return value is the number of bytes
> removed.
>
> Signed-off-by: Derrick Stolee <derrickstolee@github.com>
> ---
> strbuf.c | 9 +++++++++
> strbuf.h | 12 ++++++++++++
> 2 files changed, 21 insertions(+)
>
> diff --git a/strbuf.c b/strbuf.c
> index 0890b1405c5..8d1e2e8bb61 100644
> --- a/strbuf.c
> +++ b/strbuf.c
> @@ -1200,3 +1200,12 @@ int strbuf_edit_interactively(struct strbuf *buffer, const char *path,
> free(path2);
> return res;
> }
> +
> +size_t strbuf_strip_file_from_path(struct strbuf *buf)
Nit: Almost every function in this API calls its argument "sb", let's do
that for new functions.
> +{
> + size_t len = buf->len;
> + size_t offset = offset_1st_component(buf->buf);
Mm, isn't the return value of offset_1st_component() a boolean? it's
just an "is_dir_sep(buf->buf[0])".
So this works to....
> + char *path_sep = find_last_dir_sep(buf->buf + offset);
...find the last dir separator starting at either 0 or 1.
But anyway, what sort of string is this expecting to handle where the
last dir separator isn't >=1 offset into the string anyway? Shouldn't we
just exclude the string "/" here? Maybe I'm missing something....
> + strbuf_setlen(buf, path_sep ? path_sep - buf->buf + 1 : offset);
> + return len - buf->len;
> +}
Urm, so isn't this literally one-byte away from being equivalent to a
function that's already in the API?:
strbuf_trim_trailing_dir_sep. I.e. this seems to me to do the same as
this new function.
Context manually adjusted so we can see the only difference is the
"is_dir_sep" v.s. "!is_dir_sep".
There's a few strbuf functions like that, and we should probably
generalize the ctype-like test they share into some callback mechanism,
but in the meantime keeping with the pattern & naming of existing
functions seems better.
But again, I may be missing something.
I removed the comment because if it's the same then the new function is
self-documenting. It doesn't matter if the URI ends in a "/" or not, all
we need to get across is that we're stripping non-dirsep characters from
the URL, whether it ends in one or not.
In terms of correctness: The use of is_dir_sep() seems incorrect to me
here. On Windows won't that end up using is_xplatform_dir_sep(), so
bundle-uri's behavior will differ there, and we'll support \\-paths as
well as /-paths, but elsewhere only /-paths.
Shouldn't this just test "/", not "is_dir_sep()"?
At which point (if the above is correct) we could also call this
strbuf_rtrim_notchr(), and just call strbuf_rtrim_notchr(sb, '/') (but
even better would be a ctype-like callback).
diff --git a/bundle-uri.c b/bundle-uri.c
index 5914d220c43..c3ed04eae0f 100644
--- a/bundle-uri.c
+++ b/bundle-uri.c
@@ -192,20 +192,15 @@ int bundle_uri_parse_config_format(const char *uri,
.error_action = CONFIG_ERROR_ERROR,
};
if (!list->baseURI) {
struct strbuf baseURI = STRBUF_INIT;
strbuf_addstr(&baseURI, uri);
- /*
- * If the URI does not end with a trailing slash, then
- * remove the filename portion of the path. This is
- * important for relative URIs.
- */
- strbuf_strip_file_from_path(&baseURI);
+ strbuf_trim_trailing_not_dir_sep(&baseURI);
list->baseURI = strbuf_detach(&baseURI, NULL);
}
result = git_config_from_file_with_options(config_to_bundle_list,
filename, list,
&opts);
if (!result && list->mode == BUNDLE_MODE_NONE) {
diff --git a/strbuf.c b/strbuf.c
index 8d1e2e8bb61..3466552b854 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -117,14 +117,21 @@ void strbuf_rtrim(struct strbuf *sb)
void strbuf_trim_trailing_dir_sep(struct strbuf *sb)
{
while (sb->len > 0 && is_dir_sep((unsigned char)sb->buf[sb->len - 1]))
sb->len--;
sb->buf[sb->len] = '\0';
}
+void strbuf_trim_trailing_not_dir_sep(struct strbuf *sb)
+{
+ while (sb->len > 0 && !is_dir_sep((unsigned char)sb->buf[sb->len - 1]))
+ sb->len--;
+ sb->buf[sb->len] = '\0';
+}
+
void strbuf_trim_trailing_newline(struct strbuf *sb)
{
if (sb->len > 0 && sb->buf[sb->len - 1] == '\n') {
if (--sb->len > 0 && sb->buf[sb->len - 1] == '\r')
--sb->len;
sb->buf[sb->len] = '\0';
}
@@ -1196,16 +1203,7 @@ int strbuf_edit_interactively(struct strbuf *buffer, const char *path,
res = error_errno(_("could not edit '%s'"), path);
unlink(path);
}
free(path2);
return res;
}
-
-size_t strbuf_strip_file_from_path(struct strbuf *buf)
-{
- size_t len = buf->len;
- size_t offset = offset_1st_component(buf->buf);
- char *path_sep = find_last_dir_sep(buf->buf + offset);
- strbuf_setlen(buf, path_sep ? path_sep - buf->buf + 1 : offset);
- return len - buf->len;
-}
diff --git a/strbuf.h b/strbuf.h
index 4822b713786..b5929ecc8dd 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -185,14 +185,16 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len)
*/
void strbuf_trim(struct strbuf *sb);
void strbuf_rtrim(struct strbuf *sb);
void strbuf_ltrim(struct strbuf *sb);
/* Strip trailing directory separators */
void strbuf_trim_trailing_dir_sep(struct strbuf *sb);
+/* Strip trailing non-directory separators */
+void strbuf_trim_trailing_not_dir_sep(struct strbuf *sb);
/* Strip trailing LF or CR/LF */
void strbuf_trim_trailing_newline(struct strbuf *sb);
/**
* Replace the contents of the strbuf with a reencoded form. Returns -1
* on error, 0 on success.
next prev parent reply other threads:[~2022-12-02 19:04 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-01 1:07 [PATCH 0/9] Bundle URIs IV: advertise over protocol v2 Derrick Stolee via GitGitGadget
2022-11-01 1:07 ` [PATCH 1/9] protocol v2: add server-side "bundle-uri" skeleton Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-08 17:08 ` SZEDER Gábor
2022-11-11 1:59 ` Victoria Dye
2022-11-16 14:08 ` Derrick Stolee
2022-11-01 1:07 ` [PATCH 2/9] bundle-uri client: add minimal NOOP client Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-01 1:07 ` [PATCH 3/9] bundle-uri client: add helper for testing server Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-01 1:07 ` [PATCH 4/9] bundle-uri: serve bundle.* keys from config Derrick Stolee via GitGitGadget
2022-11-01 1:07 ` [PATCH 5/9] bundle-uri client: add boolean transfer.bundleURI setting Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-01 1:07 ` [PATCH 6/9] strbuf: reintroduce strbuf_parent_directory() Derrick Stolee via GitGitGadget
2022-11-03 9:28 ` Phillip Wood
2022-11-03 9:49 ` Ævar Arnfjörð Bjarmason
2022-11-01 1:07 ` [PATCH 7/9] bundle-uri: allow relative URLs in bundle lists Derrick Stolee via GitGitGadget
2022-11-01 1:07 ` [PATCH 8/9] bundle-uri: download bundles from an advertised list Derrick Stolee via GitGitGadget
2022-11-01 1:07 ` [PATCH 9/9] clone: unbundle the advertised bundles Derrick Stolee via GitGitGadget
2022-11-16 19:51 ` [PATCH v2 0/9] Bundle URIs IV: advertise over protocol v2 Derrick Stolee via GitGitGadget
2022-11-16 19:51 ` [PATCH v2 1/9] protocol v2: add server-side "bundle-uri" skeleton Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-16 19:51 ` [PATCH v2 2/9] bundle-uri client: add minimal NOOP client Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-29 0:57 ` Victoria Dye
2022-12-02 15:00 ` Derrick Stolee
2022-11-16 19:51 ` [PATCH v2 3/9] bundle-uri client: add helper for testing server Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-29 0:59 ` Victoria Dye
2022-12-02 15:28 ` Derrick Stolee
2022-11-16 19:51 ` [PATCH v2 4/9] bundle-uri: serve bundle.* keys from config Derrick Stolee via GitGitGadget
2022-11-29 1:00 ` Victoria Dye
2022-11-16 19:51 ` [PATCH v2 5/9] bundle-uri client: add boolean transfer.bundleURI setting Ævar Arnfjörð Bjarmason via GitGitGadget
2022-11-29 1:03 ` Victoria Dye
2022-12-02 15:38 ` Derrick Stolee
2022-11-16 19:51 ` [PATCH v2 6/9] strbuf: introduce strbuf_strip_file_from_path() Derrick Stolee via GitGitGadget
2022-11-29 1:03 ` Victoria Dye
2022-12-02 15:40 ` Derrick Stolee
2022-12-02 18:32 ` Ævar Arnfjörð Bjarmason [this message]
2022-12-05 15:11 ` Derrick Stolee
2022-11-16 19:51 ` [PATCH v2 7/9] bundle-uri: allow relative URLs in bundle lists Derrick Stolee via GitGitGadget
2022-11-29 1:25 ` Victoria Dye
2022-12-02 16:03 ` Derrick Stolee
2022-11-16 19:51 ` [PATCH v2 8/9] bundle-uri: download bundles from an advertised list Derrick Stolee via GitGitGadget
2022-11-29 1:51 ` Victoria Dye
2022-11-16 19:51 ` [PATCH v2 9/9] clone: unbundle the advertised bundles Derrick Stolee via GitGitGadget
2022-11-29 1:59 ` Victoria Dye
2022-12-02 16:16 ` Derrick Stolee
2022-12-05 17:50 ` [PATCH v3 00/11] Bundle URIs IV: advertise over protocol v2 Derrick Stolee via GitGitGadget
2022-12-05 17:50 ` [PATCH v3 01/11] protocol v2: add server-side "bundle-uri" skeleton Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-05 23:31 ` Victoria Dye
2022-12-05 17:50 ` [PATCH v3 02/11] t: create test harness for 'bundle-uri' command Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-05 17:50 ` [PATCH v3 03/11] clone: request the 'bundle-uri' command when available Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-05 17:50 ` [PATCH v3 04/11] bundle-uri client: add boolean transfer.bundleURI setting Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-05 23:32 ` Victoria Dye
2022-12-07 15:20 ` Derrick Stolee
2022-12-05 17:50 ` [PATCH v3 05/11] transport: rename got_remote_heads Derrick Stolee via GitGitGadget
2022-12-05 17:50 ` [PATCH v3 06/11] bundle-uri client: add helper for testing server Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-05 23:32 ` Victoria Dye
2022-12-05 17:50 ` [PATCH v3 07/11] bundle-uri: serve bundle.* keys from config Derrick Stolee via GitGitGadget
2022-12-05 17:50 ` [PATCH v3 08/11] strbuf: introduce strbuf_strip_file_from_path() Derrick Stolee via GitGitGadget
2022-12-06 10:06 ` Ævar Arnfjörð Bjarmason
2022-12-06 11:37 ` Ævar Arnfjörð Bjarmason
2022-12-07 14:44 ` Derrick Stolee
2022-12-08 12:52 ` Ævar Arnfjörð Bjarmason
2022-12-05 17:50 ` [PATCH v3 09/11] bundle-uri: allow relative URLs in bundle lists Derrick Stolee via GitGitGadget
2022-12-05 23:33 ` Victoria Dye
2022-12-07 15:22 ` Derrick Stolee
2022-12-05 17:50 ` [PATCH v3 10/11] bundle-uri: download bundles from an advertised list Derrick Stolee via GitGitGadget
2022-12-07 12:57 ` Jeff King
2022-12-07 15:27 ` Derrick Stolee
2022-12-07 15:54 ` Derrick Stolee
2022-12-08 6:40 ` Jeff King
2022-12-08 6:36 ` Jeff King
2022-12-08 14:58 ` Derrick Stolee
2022-12-05 17:50 ` [PATCH v3 11/11] clone: unbundle the advertised bundles Derrick Stolee via GitGitGadget
2022-12-05 23:42 ` [PATCH v3 00/11] Bundle URIs IV: advertise over protocol v2 Victoria Dye
2022-12-22 15:14 ` [PATCH v4 " Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 01/11] protocol v2: add server-side "bundle-uri" skeleton Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 02/11] t: create test harness for 'bundle-uri' command Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 03/11] clone: request the 'bundle-uri' command when available Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 04/11] bundle-uri client: add boolean transfer.bundleURI setting Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 05/11] transport: rename got_remote_heads Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 06/11] bundle-uri client: add helper for testing server Ævar Arnfjörð Bjarmason via GitGitGadget
2022-12-30 16:31 ` Jeff King
2023-01-05 19:09 ` Derrick Stolee
2023-01-06 8:48 ` [PATCH] test-bundle-uri: drop unused variables Jeff King
2023-01-06 14:13 ` Derrick Stolee
2022-12-22 15:14 ` [PATCH v4 07/11] bundle-uri: serve bundle.* keys from config Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 08/11] strbuf: introduce strbuf_strip_file_from_path() Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 09/11] bundle-uri: allow relative URLs in bundle lists Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 10/11] bundle-uri: download bundles from an advertised list Derrick Stolee via GitGitGadget
2022-12-22 15:14 ` [PATCH v4 11/11] clone: unbundle the advertised bundles Derrick Stolee via GitGitGadget
2022-12-25 11:35 ` [PATCH v4 00/11] Bundle URIs IV: advertise over protocol v2 Junio C Hamano
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=221202.86bkolfwzv.gmgdl@evledraar.gmail.com \
--to=avarab@gmail.com \
--cc=chooglen@google.com \
--cc=derrickstolee@github.com \
--cc=dyroneteng@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=me@ttaylorr.com \
--cc=mjcheetham@outlook.com \
--cc=newren@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.