]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff: use mks_tempfile_dt()
authorRené Scharfe <l.s.r@web.de>
Wed, 20 Apr 2022 20:30:10 +0000 (22:30 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Apr 2022 23:17:35 +0000 (16:17 -0700)
Git uses temporary files to pass the contents of blobs to external diff
programs and textconv filters.  It calls mks_tempfile_ts() to create
them, which puts them all in the same directory.  This requires adding
a random name prefix.

Use mks_tempfile_dt() instead, which allows the files to have arbitrary
names, each in their own separate temporary directory.  This way they
can have the same basename as the original blob, which looks nicer in
graphical diff programs.

The test in t4020 to check the prettiness of the temporary paths was
neutered by 5476bdf0e8 (diff tests: don't ignore "git diff" exit code in
"read" loop, 2022-03-07), which removed its grep check without replacing
it with an equivalent test_cmp check.  Add one that only checks the
basename of the temporary file and nothing else.

And make the test more robust while at it, by using test_when_finished
to get rid of the added file even if the test fails.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t4020-diff-external.sh

diff --git a/diff.c b/diff.c
index ef7159968b68c43c361a4cacc4558e14fe82fd4f..e71cf758861bd7596ce122611a4c92fe6b27d8c5 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4136,18 +4136,13 @@ static void prep_temp_blob(struct index_state *istate,
                           int mode)
 {
        struct strbuf buf = STRBUF_INIT;
-       struct strbuf tempfile = STRBUF_INIT;
        char *path_dup = xstrdup(path);
        const char *base = basename(path_dup);
        struct checkout_metadata meta;
 
        init_checkout_metadata(&meta, NULL, NULL, oid);
 
-       /* Generate "XXXXXX_basename.ext" */
-       strbuf_addstr(&tempfile, "XXXXXX_");
-       strbuf_addstr(&tempfile, base);
-
-       temp->tempfile = mks_tempfile_ts(tempfile.buf, strlen(base) + 1);
+       temp->tempfile = mks_tempfile_dt("git-blob-XXXXXX", base);
        if (!temp->tempfile)
                die_errno("unable to create temp-file");
        if (convert_to_working_tree(istate, path,
@@ -4162,7 +4157,6 @@ static void prep_temp_blob(struct index_state *istate,
        oid_to_hex_r(temp->hex, oid);
        xsnprintf(temp->mode, sizeof(temp->mode), "%06o", mode);
        strbuf_release(&buf);
-       strbuf_release(&tempfile);
        free(path_dup);
 }
 
index 1219f8bd4c05f69ca159717c9b2e92f9510e76da..858a5522f96b63b971daf85f20e5d66aaebc48e6 100755 (executable)
@@ -206,17 +206,17 @@ test_expect_success 'GIT_EXTERNAL_DIFF path counter/total' '
 '
 
 test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' '
+       test_when_finished "git rm -f file.ext" &&
        touch file.ext &&
        git add file.ext &&
        echo with extension > file.ext &&
 
        cat >expect <<-EOF &&
-       file.ext file $(git rev-parse --verify HEAD:file) 100644 file.ext $(test_oid zero) 100644
+       file.ext
        EOF
        GIT_EXTERNAL_DIFF=echo git diff file.ext >out &&
-       cut -d" " -f1,3- <out >actual &&
-       git update-index --force-remove file.ext &&
-       rm file.ext
+       basename $(cut -d" " -f2 <out) >actual &&
+       test_cmp expect actual
 '
 
 echo "#!$SHELL_PATH" >fake-diff.sh