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 v3 08/11] strbuf: introduce strbuf_strip_file_from_path()
Date: Tue, 06 Dec 2022 11:06:53 +0100 [thread overview]
Message-ID: <221206.86a640dda3.gmgdl@evledraar.gmail.com> (raw)
In-Reply-To: <1eec3426aee12bbd674ebd646075f0d4c0b1f5af.1670262639.git.gitgitgadget@gmail.com>
On Mon, Dec 05 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.
>
> Signed-off-by: Derrick Stolee <derrickstolee@github.com>
> ---
> strbuf.c | 6 ++++++
> strbuf.h | 11 +++++++++++
> 2 files changed, 17 insertions(+)
>
> diff --git a/strbuf.c b/strbuf.c
> index 0890b1405c5..c383f41a3c5 100644
> --- a/strbuf.c
> +++ b/strbuf.c
> @@ -1200,3 +1200,9 @@ int strbuf_edit_interactively(struct strbuf *buffer, const char *path,
> free(path2);
> return res;
> }
> +
> +void strbuf_strip_file_from_path(struct strbuf *sb)
> +{
> + char *path_sep = find_last_dir_sep(sb->buf);
> + strbuf_setlen(sb, path_sep ? path_sep - sb->buf + 1 : 0);
> +}
> diff --git a/strbuf.h b/strbuf.h
> index 76965a17d44..f6dbb9681ee 100644
> --- a/strbuf.h
> +++ b/strbuf.h
> @@ -664,6 +664,17 @@ int launch_sequence_editor(const char *path, struct strbuf *buffer,
> int strbuf_edit_interactively(struct strbuf *buffer, const char *path,
> const char *const *env);
>
> +/*
> + * Remove the filename from the provided path string. If the path
> + * contains a trailing separator, then the path is considered a directory
> + * and nothing is modified.
> + *
> + * Examples:
> + * - "/path/to/file" -> "/path/to/"
> + * - "/path/to/dir/" -> "/path/to/dir/"
> + */
> +void strbuf_strip_file_from_path(struct strbuf *sb);
> +
> void strbuf_add_lines(struct strbuf *sb,
> const char *prefix,
> const char *buf,
Re your reply in
https://lore.kernel.org/git/0980dcd4-30eb-4ef4-9369-279abe5ca5a2@github.com/
I still don't get how this is different from a 1-byte change to
strbuf_trim_trailing_dir_sep(), and if it isn't I think it's confusing
API design to have two very different ways to return the same data.
There you said "The difference is all about whether or not we start with
a slash _and_ no other slash appears in the path.".
But I can't find a case where there's any difference between the two. I
tried this ad-hoc test on top:
diff --git a/help.c b/help.c
index f1e090a4428..b0866b01439 100644
--- a/help.c
+++ b/help.c
@@ -765,6 +765,16 @@ int cmd_version(int argc, const char **argv, const char *prefix)
"also print build options"),
OPT_END()
};
+ struct strbuf sb1 = STRBUF_INIT;
+ struct strbuf sb2 = STRBUF_INIT;
+
+ if (getenv("STR")) {
+ strbuf_addstr(&sb1, getenv("STR"));
+ strbuf_addstr(&sb2, getenv("STR"));
+ strbuf_strip_file_from_path(&sb1);
+ strbuf_trim_trailing_not_dir_sep(&sb2);
+ fprintf(stderr, "%s: %s | %s\n", strcmp(sb1.buf, sb2.buf) ? "NEQ" : "EQ", sb1.buf, sb2.buf);
+ }
argc = parse_options(argc, argv, prefix, options, usage, 0);
diff --git a/strbuf.c b/strbuf.c
index c383f41a3c5..f75d94556fc 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -114,13 +114,23 @@ void strbuf_rtrim(struct strbuf *sb)
sb->buf[sb->len] = '\0';
}
-void strbuf_trim_trailing_dir_sep(struct strbuf *sb)
+static void strbuf_trim_trailing_dir_sep_1(struct strbuf *sb, int flip)
{
- while (sb->len > 0 && is_dir_sep((unsigned char)sb->buf[sb->len - 1]))
+ while (sb->len > 0 && is_dir_sep((unsigned char)sb->buf[sb->len - 1]) - flip)
sb->len--;
sb->buf[sb->len] = '\0';
}
+void strbuf_trim_trailing_dir_sep(struct strbuf *sb)
+{
+ strbuf_trim_trailing_dir_sep_1(sb, 1);
+}
+
+void strbuf_trim_trailing_not_dir_sep(struct strbuf *sb)
+{
+ strbuf_trim_trailing_dir_sep_1(sb, 1);
+}
+
void strbuf_trim_trailing_newline(struct strbuf *sb)
{
if (sb->len > 0 && sb->buf[sb->len - 1] == '\n') {
diff --git a/strbuf.h b/strbuf.h
index f6dbb9681ee..b936f45ffad 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -189,6 +189,8 @@ void strbuf_ltrim(struct strbuf *sb);
/* Strip trailing directory separators */
void strbuf_trim_trailing_dir_sep(struct strbuf *sb);
+/* Strip trailing not-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);
Then:
$ for str in a / b/ /c /d/ /e/ /f/g /h/i/ j/k l//m n/o/p //q/r/s/t; do STR=$str ./git version; done 2>&1 | grep :
EQ: |
EQ: / | /
EQ: b/ | b/
EQ: / | /
EQ: /d/ | /d/
EQ: /e/ | /e/
EQ: /f/ | /f/
EQ: /h/i/ | /h/i/
EQ: j/ | j/
EQ: l// | l//
EQ: n/o/ | n/o/
EQ: //q/r/s/ | //q/r/s/
I.e. for those inputs it's the same as the existing
strbuf_trim_trailing_dir_sep() with an inverted test. Is there some edge
case that I'm missing?
next prev parent reply other threads:[~2022-12-06 10:43 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
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 [this message]
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=221206.86a640dda3.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.