git-archive: recursive prefix directory creation
PATCH 1/1 git-archive: recursive prefix directory creation
Currently git-archive only adds a single directory entry for prefixes, e.g. for --prefix=a/b/c/ only the directory a/b/c/ would be added to the archive, not a/ nor a/b/. While tar and unzip don't seem to have a problem handling these missing entries, their omission was not intended.
This patch replaces the prefix path creation code in git-archive with calls to a new path walker similar to read_tree_recursive, named descend_leading_dirs. It calls a read_tree_fn_t function for each leading directory while descending deeper into the path (e.g. first a/, then a/b/ etc.).
--- archive-tar.c | 11 ++--------- archive-zip.c | 11 ++--------- tree.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ tree.h | 5 +++++ 4 files changed, 54 insertions(+), 18 deletions(-)
archive-tar.c +2 -9
@@ -308,15 +308,8 @@ int write_tar_archive(struct archiver_args *args)if (args->commit_sha1)write_global_extended_header (args->commit_sha1); -if (args->base && plen >0 && args->base[plen -1 ] =='/' ) { -char *base =xstrdup (args->base); -int baselen =strlen (base); - -while (baselen >0 && base[baselen -1 ] =='/' ) - base[--baselen] ='\0' ; -write_tar_entry (args->tree->object.sha1,"" ,0 , base,040777 ,0 ); -free (base); - } +descend_leading_dirs (args->tree->object.sha1, args->base, plen, +040777 ,0 , write_tar_entry);read_tree_recursive (args->tree, args->base, plen,0 , args->pathspec, write_tar_entry);write_trailer ();
archive-zip.c +2 -9
@@ -317,15 +317,8 @@ int write_zip_archive(struct archiver_args *args) zip_dir_size =ZIP_DIRECTORY_MIN_SIZE ; verbose = args->verbose; -if (args->base && plen >0 && args->base[plen -1 ] =='/' ) { -char *base =xstrdup (args->base); -int baselen =strlen (base); - -while (baselen >0 && base[baselen -1 ] =='/' ) - base[--baselen] ='\0' ; -write_zip_entry (args->tree->object.sha1,"" ,0 , base,040777 ,0 ); -free (base); - } +descend_leading_dirs (args->tree->object.sha1, args->base, plen, +040777 ,0 , write_zip_entry);read_tree_recursive (args->tree, args->base, plen,0 , args->pathspec, write_zip_entry);write_zip_trailer (args->commit_sha1);
tree.c +45 -0
48 lines not on this page · raw message
tree.h +5 -0
@@ -30,4 +30,9 @@ extern int read_tree_recursive(struct tree *tree,extern int read_tree (struct tree *tree,int stage,const char **paths); +extern int descend_leading_dirs (const unsigned char *sha1, +const char *path,size_t pathlen, +unsigned int mode,int stage, +read_tree_fn_t fn); +#endif /* TREE_H */
Quoted 5 lines · René Scharfe
Currently git-archive only adds a single directory entry for prefixes, e.g. for --prefix=a/b/c/ only the directory a/b/c/ would be added to the archive, not a/ nor a/b/. While tar and unzip don't seem to have a problem handling these missing entries, their omission was not intended.
Until we start tracking directories (we briefly discussed, and I think I agree with Linus that it should not be too painful), I'd rather keep the current behaviour which I feel is more consistent with what we really are doing.
Quoted 8 lines · Junio C Hamano
Quoted 5 lines · René Scharfe
Currently git-archive only adds a single directory entry for prefixes, e.g. for --prefix=a/b/c/ only the directory a/b/c/ would be added to the archive, not a/ nor a/b/. While tar and unzip don't seem to have a problem handling these missing entries, their omission was not intended.
Quoted 4 lines
Until we start tracking directories (we briefly discussed, and I think I agree with Linus that it should not be too painful), I'd rather keep the current behaviour which I feel is more consistent with what we really are doing.
Hmm, fair enough. I started out with a simple cleanup and then I guess went a bit overboard with that overblown path walker. :-]
René
Quoted 9 lines · René Scharfe
Quoted 8 lines · Junio C Hamano
Quoted 5 lines · René Scharfe
Currently git-archive only adds a single directory entry for prefixes, e.g. for --prefix=a/b/c/ only the directory a/b/c/ would be added to the archive, not a/ nor a/b/. While tar and unzip don't seem to have a problem handling these missing entries, their omission was not intended.
Quoted 7 lines
Quoted 4 lines
Until we start tracking directories (we briefly discussed, and I think I agree with Linus that it should not be too painful), I'd rather keep the current behaviour which I feel is more consistent with what we really are doing.
Hmm, fair enough. I started out with a simple cleanup and then I guess went a bit overboard with that overblown path walker. :-]
Well, I take that back -- I did not realize you were primarily talking about the LEADING part of the path.
Quoted 14 lines · Junio C Hamano
Quoted 12 lines · René Scharfe
Quoted 11 lines · Junio C Hamano
Quoted 5 lines · René Scharfe
Currently git-archive only adds a single directory entry for prefixes, e.g. for --prefix=a/b/c/ only the directory a/b/c/ would be added to the archive, not a/ nor a/b/. While tar and unzip don't seem to have a problem handling these missing entries, their omission was not intended.
Until we start tracking directories (we briefly discussed, and I think I agree with Linus that it should not be too painful), I'd rather keep the current behaviour which I feel is more consistent with what we really are doing.
Quoted 5 lines
Quoted 2 lines
Hmm, fair enough. I started out with a simple cleanup and then I guess went a bit overboard with that overblown path walker. :-]
Well, I take that back -- I did not realize you were primarily talking about the LEADING part of the path.
In any case, please don't apply this patch. I checked again, and it turns out both tar and zip don't always add leading directories to archives. So my "cleanup" only adds bloat. I'll try to find another way to beautify the code.
René