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

Re: [PATCH] apply: replace mksnpath() with a mkpathdup() call

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 4, 2024, 21:29 UTC
Message-ID
<xmqqo7aozuih.fsf@gitster.g>
In-Reply-To
<df774306-f29b-4a75-a282-59db89812b9a@web.de>
René Scharfe <l.s.r@web.de> writes:
Show 13 quoted lines
> Support paths longer than PATH_MAX in create_one_file() (which is not a
> hard limit e.g. on Linux) by calling mkpathdup() instead of mksnpath().
> Remove the latter, as it becomes unused by this change.  Resist the
> temptation of using the more convenient mkpath() to avoid introducing a
> dependency on a static variable deep inside the apply machinery.
>
> Suggested-by: Jeff King <peff@peff.net>
> Signed-off-by: René Scharfe <l.s.r@web.de>
> ---
>  apply.c | 13 +++++++++----
>  path.c  | 17 -----------------
>  path.h  |  6 ------
>  3 files changed, 9 insertions(+), 27 deletions(-)

As a patch to "apply", this is perfectly good, but in the larger picture, the value of the patch is in getting rid of mksnpath, isn't it?

I am tempted to
 - queue it on rs/retire-mksnpath topic branch
 - remove the mention of mksnpath in contrib/vscode/init.sh (I think
   it is registering non-words to spell checker, so having an extra
   entry there would not hurt, but it would more likely to be a typo
   of mkpath than before this patch retires mksnpath function).
 - ask you to come up with a title with more focus on mksnpath than
   on apply.
Thanks.
Show 85 quoted lines
> diff --git a/apply.c b/apply.c
> index 432837a674..4793b05f3d 100644
> --- a/apply.c
> +++ b/apply.c
> @@ -4502,17 +4502,22 @@ static int create_one_file(struct apply_state *state,
>  		unsigned int nr = getpid();
>
>  		for (;;) {
> -			char newpath[PATH_MAX];
> -			mksnpath(newpath, sizeof(newpath), "%s~%u", path, nr);
> +			char *newpath = mkpathdup("%s~%u", path, nr);
>  			res = try_create_file(state, newpath, mode, buf, size);
> -			if (res < 0)
> +			if (res < 0) {
> +				free(newpath);
>  				return -1;
> +			}
>  			if (!res) {
> -				if (!rename(newpath, path))
> +				if (!rename(newpath, path)) {
> +					free(newpath);
>  					return 0;
> +				}
>  				unlink_or_warn(newpath);
> +				free(newpath);
>  				break;
>  			}
> +			free(newpath);
>  			if (errno != EEXIST)
>  				break;
>  			++nr;
> diff --git a/path.c b/path.c
> index 8bb223c92c..67229edb9c 100644
> --- a/path.c
> +++ b/path.c
> @@ -28,8 +28,6 @@ static int get_st_mode_bits(const char *path, int *mode)
>  	return 0;
>  }
>
> -static char bad_path[] = "/bad-path/";
> -
>  static struct strbuf *get_pathname(void)
>  {
>  	static struct strbuf pathname_array[4] = {
> @@ -59,21 +57,6 @@ static void strbuf_cleanup_path(struct strbuf *sb)
>  		strbuf_remove(sb, 0, path - sb->buf);
>  }
>
> -char *mksnpath(char *buf, size_t n, const char *fmt, ...)
> -{
> -	va_list args;
> -	unsigned len;
> -
> -	va_start(args, fmt);
> -	len = vsnprintf(buf, n, fmt, args);
> -	va_end(args);
> -	if (len >= n) {
> -		strlcpy(buf, bad_path, n);
> -		return buf;
> -	}
> -	return (char *)cleanup_path(buf);
> -}
> -
>  static int dir_prefix(const char *buf, const char *dir)
>  {
>  	int len = strlen(dir);
> diff --git a/path.h b/path.h
> index e053effef2..ea96487b29 100644
> --- a/path.h
> +++ b/path.h
> @@ -23,12 +23,6 @@ const char *mkpath(const char *fmt, ...)
>  char *mkpathdup(const char *fmt, ...)
>  	__attribute__((format (printf, 1, 2)));
>
> -/*
> - * Construct a path and place the result in the provided buffer `buf`.
> - */
> -char *mksnpath(char *buf, size_t n, const char *fmt, ...)
> -	__attribute__((format (printf, 3, 4)));
> -
>  /*
>   * The `git_common_path` family of functions will construct a path into a
>   * repository's common git directory, which is shared by all worktrees.
> --
> 2.44.0
Previous: René ScharfeNext: Jeff King
Message 2 of 15 in “apply: replace mksnpath() with a mkpathdup() call”
  1. apply: replace mksnpath() with a mkpathdup() callRené Scharfe, Apr 4, 2024
  2. Junio C HamanoApr 4, 2024
  3. free and errno, was Re: [PATCH] apply: replace mksnpath() with a mkpathdup() callJeff King, Apr 4, 2024
  4. Junio C HamanoApr 4, 2024
  5. René ScharfeApr 5, 2024
  6. Jeff KingApr 5, 2024
  7. Jeff KingApr 5, 2024
  8. René ScharfeApr 6, 2024
  9. Jeff KingApr 7, 2024
  10. René ScharfeApr 14, 2024
  11. Jeff KingApr 24, 2024
  12. 1/2 apply: avoid fixed-size buffer in create_one_file()René Scharfe, Apr 5, 2024
  13. 2/2 path: remove mksnpath()René Scharfe, Apr 5, 2024
  14. Jeff KingApr 5, 2024
  15. Junio C HamanoApr 5, 2024

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.