git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
Previous: René ScharfeNext: Johannes Schindelin
Message 5 of 8 in “rev-parse options for absolute or relative paths”
  1. 0/2 rev-parse options for absolute or relative pathsbrian m. carlson, Nov 27, 2020
  2. 2/2 rev-parse: add option for absolute or relative path formattingbrian m. carlson, Nov 27, 2020
  3. 1/2 abspath: add a function to resolve paths with missing componentsbrian m. carlson, Nov 27, 2020
  4. René ScharfeNov 28, 2020
  5. brian m. carlsonNov 28, 2020
  6. Johannes SchindelinDec 2, 2020
  7. brian m. carlsonDec 2, 2020
  8. Johannes SchindelinDec 2, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.