On 2020-11-28 at 10:08:09, René Scharfe wrote: > Am 28.11.20 um 00:19 schrieb brian m. carlson: > > We'd like to canonicalize paths such that we can preserve any number of > > trailing components that may be missing. Let's add a function to do > > that, taking the number of components to canonicalize, and make > > strbuf_realpath a wrapper around it that allows just one component. > > > > Signed-off-by: brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> > > --- > > abspath.c | 33 ++++++++++++++++++++++++++++++++- > > cache.h | 2 ++ > > 2 files changed, 34 insertions(+), 1 deletion(-) > > > > diff --git a/abspath.c b/abspath.c > > index 6f15a418bb..1d8f3d007c 100644 > > --- a/abspath.c > > +++ b/abspath.c > > @@ -20,6 +20,7 @@ static void strip_last_component(struct strbuf *path) > > /* Find start of the last component */ > > while (offset < len && !is_dir_sep(path->buf[len - 1])) > > len--; > > + > > /* Skip sequences of multiple path-separators */ > > while (offset < len && is_dir_sep(path->buf[len - 1])) > > len--; > > Stray change? Ah, yes. I pulled out the old code from v2, but left the whitespace. Will fix. > Nitpicking: Do we need both empty lines? No, we don't. > > /* > > * Return the real path (i.e., absolute path, with symlinks resolved > > * and extra slashes removed) equivalent to the specified path. (If > > @@ -80,6 +97,16 @@ static void get_root_part(struct strbuf *resolved, struct strbuf *remaining) > > */ > > char *strbuf_realpath(struct strbuf *resolved, const char *path, > > int die_on_error) > > +{ > > + return strbuf_realpath_missing(resolved, path, 1, die_on_error); > > +} > > + > > +/* > > + * Just like strbuf_realpath, but allows specifying how many missing components > > + * are permitted. -1 may be specified to allow an unlimited number. > > + */ > > +char *strbuf_realpath_missing(struct strbuf *resolved, const char *path, > > + int missing_components, int die_on_error) > > { > > struct strbuf remaining = STRBUF_INIT; > > struct strbuf next = STRBUF_INIT; > > @@ -128,8 +155,12 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path, > > strbuf_addbuf(resolved, &next); > > > > if (lstat(resolved->buf, &st)) { > > + int trailing_components = count_dir_separators(remaining.buf) + > > + (remaining.len != 0); > > Hmm, so you actually want to count path components, not separators. > Perhaps like this? > > static size_t count_components(const char *p) > { > size_t n = 0; > while (*p) { > while (*p && !is_dir_sep(*p)) > p++; > while (is_dir_sep(*p)) > p++; > n++; > } > return n; > } Yeah, I think that's nicer, and simpler, too. Will reroll with that fix. -- brian m. carlson (he/him or they/them) Houston, Texas, US
Attachment:
signature.asc
Description: PGP signature