diff: generate pretty filenames in prep_temp_blob()
Naturally, prep_temp_blob() did not care about filenames. As a result, GIT_EXTERNAL_DIFF and textconv generated filenames such as ".diff_XXXXXX". This modifies prep_temp_blob() to generate user-friendly filenames when creating temporary files. Diffing "name.ext" now generates "XXXXXX_name.ext". Signed-off-by: David Aguilar <davvid@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e1c0688692
commit
003b33a8ad
2
cache.h
2
cache.h
@ -614,6 +614,8 @@ extern int is_empty_blob_sha1(const unsigned char *sha1);
|
|||||||
|
|
||||||
int git_mkstemp(char *path, size_t n, const char *template);
|
int git_mkstemp(char *path, size_t n, const char *template);
|
||||||
|
|
||||||
|
int git_mkstemps(char *path, size_t n, const char *template, int suffix_len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE NOTE NOTE!!
|
* NOTE NOTE NOTE!!
|
||||||
*
|
*
|
||||||
|
12
diff.c
12
diff.c
@ -1964,8 +1964,16 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
struct strbuf template = STRBUF_INIT;
|
||||||
|
char *path_dup = xstrdup(path);
|
||||||
|
const char *base = basename(path_dup);
|
||||||
|
|
||||||
fd = git_mkstemp(temp->tmp_path, PATH_MAX, ".diff_XXXXXX");
|
/* Generate "XXXXXX_basename.ext" */
|
||||||
|
strbuf_addstr(&template, "XXXXXX_");
|
||||||
|
strbuf_addstr(&template, base);
|
||||||
|
|
||||||
|
fd = git_mkstemps(temp->tmp_path, PATH_MAX, template.buf,
|
||||||
|
strlen(base) + 1);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
die("unable to create temp-file: %s", strerror(errno));
|
die("unable to create temp-file: %s", strerror(errno));
|
||||||
if (convert_to_working_tree(path,
|
if (convert_to_working_tree(path,
|
||||||
@ -1981,6 +1989,8 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
|
|||||||
temp->hex[40] = 0;
|
temp->hex[40] = 0;
|
||||||
sprintf(temp->mode, "%06o", mode);
|
sprintf(temp->mode, "%06o", mode);
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
|
strbuf_release(&template);
|
||||||
|
free(path_dup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct diff_tempfile *prepare_temp_file(const char *name,
|
static struct diff_tempfile *prepare_temp_file(const char *name,
|
||||||
|
16
path.c
16
path.c
@ -139,6 +139,22 @@ int git_mkstemp(char *path, size_t len, const char *template)
|
|||||||
return mkstemp(path);
|
return mkstemp(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* git_mkstemps() - create tmp file with suffix honoring TMPDIR variable. */
|
||||||
|
int git_mkstemps(char *path, size_t len, const char *template, int suffix_len)
|
||||||
|
{
|
||||||
|
const char *tmp;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
tmp = getenv("TMPDIR");
|
||||||
|
if (!tmp)
|
||||||
|
tmp = "/tmp";
|
||||||
|
n = snprintf(path, len, "%s/%s", tmp, template);
|
||||||
|
if (len <= n) {
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return mkstemps(path, suffix_len);
|
||||||
|
}
|
||||||
|
|
||||||
int validate_headref(const char *path)
|
int validate_headref(const char *path)
|
||||||
{
|
{
|
||||||
|
@ -136,6 +136,15 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '
|
|||||||
GIT_EXTERNAL_DIFF=echo git diff
|
GIT_EXTERNAL_DIFF=echo git diff
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'GIT_EXTERNAL_DIFF generates pretty paths' '
|
||||||
|
touch file.ext &&
|
||||||
|
git add file.ext &&
|
||||||
|
echo with extension > file.ext &&
|
||||||
|
GIT_EXTERNAL_DIFF=echo git diff file.ext | grep ......_file\.ext &&
|
||||||
|
git update-index --force-remove file.ext &&
|
||||||
|
rm file.ext
|
||||||
|
'
|
||||||
|
|
||||||
echo "#!$SHELL_PATH" >fake-diff.sh
|
echo "#!$SHELL_PATH" >fake-diff.sh
|
||||||
cat >> fake-diff.sh <<\EOF
|
cat >> fake-diff.sh <<\EOF
|
||||||
cat $2 >> crlfed.txt
|
cat $2 >> crlfed.txt
|
||||||
|
Loading…
Reference in New Issue
Block a user