Re: [PATCH v3 1/2] abspath: add a function to resolve paths with missing components
- From
brian m. carlson <sandals@crustytoothpaste.net>
- Date
- Nov 28, 2020, 18:41 UTC
- Message-ID
- <X8KZ0gd85g7fhqm5@camp.crustytoothpaste.net>
- In-Reply-To
- <374553d7-6027-0152-bf56-9395e8268fa9@web.de>
On 2020-11-28 at 10:08:09, René Scharfe wrote:
Show 26 quoted lines
> 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@crustytoothpaste.net> > > --- > > 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.
Show 42 quoted lines
> > /*
> > * 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