From: Derrick Stolee <derrickstolee@xxxxxxxxxx> 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. The method requirements are slightly modified to allow a trailing slash, in which case nothing is done. The return value is the number of byte removed. Signed-off-by: Derrick Stolee <derrickstolee@xxxxxxxxxx> --- strbuf.c | 9 +++++++++ strbuf.h | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/strbuf.c b/strbuf.c index 0890b1405c5..b5cb324c431 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_parent_directory(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 : offset); + return len - buf->len; +} diff --git a/strbuf.h b/strbuf.h index 76965a17d44..8a964a08c31 100644 --- a/strbuf.h +++ b/strbuf.h @@ -664,6 +664,13 @@ 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 deepest subdirectory in the provided path string. If path + * contains a trailing separator, then the path is considered a directory + * and nothing is modified. + */ +size_t strbuf_parent_directory(struct strbuf *buf); + void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, -- gitgitgadget