Recent document clarification on the "--prefix" option of the "git archive" command from René serves as a good basis for the documentation of the "--add-virtual-file" option added by this series, so here is my attempt to rebase js/scalar-diagnose topic on it to hopefully help reduce Dscho's workload ;-) Aside from obvious adjustments needed while rebasing onto the updated documentation, there are only a couple of changes: - The way the <path> in --add-virtual-file=<path>:<contents> is used has been corrected. Earlier, leading directory components of the <path> were all discarded and used nowhere, which made no sense. The <path> is used as a whole, but for consistency with --add-file=<path>, <prefix> is still applied. - Overly loose quoting of variables in test scripts has been corrected. Both changes have been in 'seen' from before the rebase. 1: 510f6b226b ! 1: 61522a0866 archive: optionally add "virtual" files @@ Commit message ## Documentation/git-archive.txt ## @@ Documentation/git-archive.txt: OPTIONS - by concatenating the value for `--prefix` (if any) and the - basename of <file>. + --prefix=<prefix>/:: + Prepend <prefix>/ to paths in the archive. Can be repeated; its + rightmost value is used for all tracked files. See below which +- value gets used by `--add-file`. ++ value gets used by `--add-file` and `--add-virtual-file`. + + -o <file>:: + --output=<file>:: +@@ Documentation/git-archive.txt: OPTIONS + concatenating the value of the last `--prefix` option (if any) + before this `--add-file` and the basename of <file>. +--add-virtual-file=<path>:<content>:: + Add the specified contents to the archive. Can be repeated to add + multiple files. The path of the file in the archive is built -+ by concatenating the value for `--prefix` (if any) and the -+ basename of <file>. ++ by concatenating the value of the last `--prefix` option (if any) ++ before this `--add-virtual-file` and `<path>`. ++ +The `<path>` cannot contain any colon, the file mode is limited to +a regular file, and the option may be subject to platform-dependent @@ archive.c: static int queue_or_write_archive_entry(const struct object_id *oid, int write_archive_entries(struct archiver_args *args, @@ archive.c: int write_archive_entries(struct archiver_args *args, - strbuf_addstr(&path_in_archive, basename(path)); - strbuf_reset(&content); + put_be64(fake_oid.hash, i + 1); + +- strbuf_reset(&path_in_archive); +- if (info->base) +- strbuf_addstr(&path_in_archive, info->base); +- strbuf_addstr(&path_in_archive, basename(path)); +- +- strbuf_reset(&content); - if (strbuf_read_file(&content, path, info->stat.st_size) < 0) -+ if (info->content) -+ err = write_entry(args, &fake_oid, path_in_archive.buf, -+ path_in_archive.len, -+ canon_mode(info->stat.st_mode), +- err = error_errno(_("cannot read '%s'"), path); +- else +- err = write_entry(args, &fake_oid, path_in_archive.buf, +- path_in_archive.len, ++ if (!info->content) { ++ strbuf_reset(&path_in_archive); ++ if (info->base) ++ strbuf_addstr(&path_in_archive, info->base); ++ strbuf_addstr(&path_in_archive, basename(path)); ++ ++ strbuf_reset(&content); ++ if (strbuf_read_file(&content, path, info->stat.st_size) < 0) ++ err = error_errno(_("could not read '%s'"), path); ++ else ++ err = write_entry(args, &fake_oid, path_in_archive.buf, ++ path_in_archive.len, ++ canon_mode(info->stat.st_mode), ++ content.buf, content.len); ++ } else { ++ err = write_entry(args, &fake_oid, ++ path, strlen(path), + canon_mode(info->stat.st_mode), +- content.buf, content.len); + info->content, info->stat.st_size); -+ else if (strbuf_read_file(&content, path, -+ info->stat.st_size) < 0) - err = error_errno(_("cannot read '%s'"), path); - else - err = write_entry(args, &fake_oid, path_in_archive.buf, ++ } ++ + if (err) + break; + } @@ archive.c: static void extra_file_info_clear(void *util, const char *str) { struct extra_file_info *info = util; 2: 208f4aad5f ! 2: 5e9d19a70f archive --add-virtual-file: allow paths containing colons @@ Commit message ## Documentation/git-archive.txt ## @@ Documentation/git-archive.txt: OPTIONS - by concatenating the value for `--prefix` (if any) and the - basename of <file>. + by concatenating the value of the last `--prefix` option (if any) + before this `--add-virtual-file` and `<path>`. + -The `<path>` cannot contain any colon, the file mode is limited to -a regular file, and the option may be subject to platform-dependent -command-line limits. For non-trivial cases, write an untracked file -and use `--add-file` instead. +The `<path>` argument can start and end with a literal double-quote -+character; The contained file name is interpreted as a C-style string, ++character; the contained file name is interpreted as a C-style string, +i.e. the backslash is interpreted as escape character. The path must +be quoted if it contains a colon, to avoid the colon from being +misinterpreted as the separator between the path and the contents, or @@ t/t5003-archive-zip.sh: check_zip with_untracked test_expect_success UNZIP 'git archive --format=zip --add-virtual-file' ' + if test_have_prereq FUNNYNAMES + then -+ PATHNAME=quoted:colon ++ PATHNAME="pathname with : colon" + else -+ PATHNAME=quoted ++ PATHNAME="pathname without colon" + fi && git archive --format=zip >with_file_with_content.zip \ -+ --add-virtual-file=\"$PATHNAME\": \ ++ --add-virtual-file=\""$PATHNAME"\": \ --add-virtual-file=hello:world $EMPTY_TREE && test_when_finished "rm -rf tmp-unpack" && mkdir tmp-unpack && ( cd tmp-unpack && "$GIT_UNZIP" ../with_file_with_content.zip && test_path_is_file hello && -+ test_path_is_file $PATHNAME && ++ test_path_is_file "$PATHNAME" && test world = $(cat hello) ) ' 3: bc1164404f = 3: 4f5b3aa775 scalar: validate the optional enlistment argument 4: 69daeb7d9d ! 4: f4f070df8e Implement `scalar diagnose` @@ Metadata Author: Johannes Schindelin <Johannes.Schindelin@xxxxxx> ## Commit message ## - Implement `scalar diagnose` + scalar: implement `scalar diagnose` Over the course of Scalar's development, it became obvious that there is a need for a command that can gather all kinds of useful information 5: 5c1ef19524 = 5: 0417d8abe4 scalar diagnose: include disk space information 6: 0325b9c3ab = 6: 5531b65ddb scalar: teach `diagnose` to gather packfile info 7: 8fee365b07 = 7: ce9eba5e32 scalar: teach `diagnose` to gather loose objects information