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

Re: Git archive and trailing "/" in prefix

From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
Date
Oct 8, 2009, 16:46 UTC
Message-ID
<4ACE177E.209@lsrfire.ath.cx>
In-Reply-To
<loom.20091008T172303-658@post.gmane.org>
Sergio Callegari schrieb:
Show 12 quoted lines
> Hi!
> 
> The git-archive man page indicates that if the --prefix option is passed to
> git-archive, it is compulsory to end the prefix with a "/"
> 
>  git archive [--format=<fmt>] [--list] [--prefix=<prefix>/] [<extra>] ...
> 
> As a matter of fact, the archiver behaves quite strangely if that slash is
> missing. Files in the root of the working dir are added to the archive with
> their own name modified by the prefix and the same happens for working dir
> sub-directories. However, no file present in the sub-directories, nor
> sub-sub-directories are added.
The latter is a bug.
> I would like to know if there some reason why a trailing "/" is not added
> automatically to the prefix when it is missing and the prefix is not empty.
> Would that break anything?

The --prefix option is intended to add a string to the beginning (i.e. "to prefix") of the name of the archive entries. I'm not sure if there's a use case for anything else than adding a fake directory for all entries to live in (thus requiring a trailing slash), but I also don't see why we should disallow it.

The following patch fixes handling of prefixes without trailing slashes by taking it out of the hands of get_pathspec() and read_tree_recursive() -- which can only handle prefixes that are path components -- and adding the prefix later, in write_archive_entry().

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
---
 archive.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/archive.c b/archive.c
index 73b8e8a..0cc79d2 100644
--- a/archive.c
+++ b/archive.c
@@ -115,6 +115,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
 
 	strbuf_reset(&path);
 	strbuf_grow(&path, PATH_MAX);
+	strbuf_add(&path, args->base, args->baselen);
 	strbuf_add(&path, base, baselen);
 	strbuf_addstr(&path, filename);
 	path_without_prefix = path.buf + args->baselen;
@@ -187,8 +188,8 @@ int write_archive_entries(struct archiver_args *args,
 		git_attr_set_direction(GIT_ATTR_INDEX, &the_index);
 	}
 
-	err =  read_tree_recursive(args->tree, args->base, args->baselen, 0,
-			args->pathspec, write_archive_entry, &context);
+	err = read_tree_recursive(args->tree, "", 0, 0, args->pathspec,
+				  write_archive_entry, &context);
 	if (err == READ_TREE_RECURSIVE)
 		err = 0;
 	return err;
@@ -211,7 +212,7 @@ static const struct archiver *lookup_archiver(const char *name)
 static void parse_pathspec_arg(const char **pathspec,
 		struct archiver_args *ar_args)
 {
-	ar_args->pathspec = get_pathspec(ar_args->base, pathspec);
+	ar_args->pathspec = get_pathspec("", pathspec);
 }
 
 static void parse_treeish_arg(const char **argv,
Previous: René ScharfeNext: Junio C Hamano
Message 5 of 7 in “Git archive and trailing "/" in prefix”
  1. Sergio CallegariOct 8, 2009
  2. Junio C HamanoOct 8, 2009
  3. Sergio CallegariOct 8, 2009
  4. René ScharfeOct 9, 2009
  5. René ScharfeOct 8, 2009
  6. Junio C HamanoOct 9, 2009
  7. Linus TorvaldsOct 8, 2009

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.