Skip to content

Commit

Permalink
Smudge the files fed to external diff and textconv
Browse files Browse the repository at this point in the history
When preparing temporary files for an external diff or textconv, it is
easier on the external tools, especially when they are implemented using
platform tools, if they are fed the input after convert_to_working_tree().

This fixes msysGit issue 177.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Mar 22, 2009
1 parent a95148d commit 4e218f5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
13 changes: 10 additions & 3 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1948,24 +1948,31 @@ void diff_free_filespec_data(struct diff_filespec *s)
s->cnt_data = NULL;
}

static void prep_temp_blob(struct diff_tempfile *temp,
static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
void *blob,
unsigned long size,
const unsigned char *sha1,
int mode)
{
int fd;
struct strbuf buf = STRBUF_INIT;

fd = git_mkstemp(temp->tmp_path, PATH_MAX, ".diff_XXXXXX");
if (fd < 0)
die("unable to create temp-file: %s", strerror(errno));
if (convert_to_working_tree(path,
(const char *)blob, (size_t)size, &buf)) {
blob = buf.buf;
size = buf.len;
}
if (write_in_full(fd, blob, size) != size)
die("unable to write temp-file");
close(fd);
temp->name = temp->tmp_path;
strcpy(temp->hex, sha1_to_hex(sha1));
temp->hex[40] = 0;
sprintf(temp->mode, "%06o", mode);
strbuf_release(&buf);
}

static struct diff_tempfile *prepare_temp_file(const char *name,
Expand Down Expand Up @@ -2006,7 +2013,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
die("readlink(%s)", name);
if (ret == sizeof(buf))
die("symlink too long: %s", name);
prep_temp_blob(temp, buf, ret,
prep_temp_blob(name, temp, buf, ret,
(one->sha1_valid ?
one->sha1 : null_sha1),
(one->sha1_valid ?
Expand All @@ -2032,7 +2039,7 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
else {
if (diff_populate_filespec(one, 0))
die("cannot read data blob for %s", one->path);
prep_temp_blob(temp, one->data, one->size,
prep_temp_blob(name, temp, one->data, one->size,
one->sha1, one->mode);
}
return temp;
Expand Down
16 changes: 16 additions & 0 deletions t/t4020-diff-external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,20 @@ test_expect_success 'GIT_EXTERNAL_DIFF with more than one changed files' '
GIT_EXTERNAL_DIFF=echo git diff
'

echo "#!$SHELL_PATH" >fake-diff.sh
cat >> fake-diff.sh <<\EOF
cat $2 >> crlfed.txt
EOF
chmod a+x fake-diff.sh

keep_only_cr () {
tr -dc '\015'
}

test_expect_success 'external diff with autocrlf = true' '
git config core.autocrlf true &&
GIT_EXTERNAL_DIFF=./fake-diff.sh git diff &&
test $(wc -l < crlfed.txt) = $(cat crlfed.txt | keep_only_cr | wc -c)
'

test_done

0 comments on commit 4e218f5

Please sign in to comment.