* [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks
@ 2010-09-29 11:35 Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 1/3] blame,cat-file: Prepare --textconv tests for correctly-failing conversion program Kirill Smelkov
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Kirill Smelkov @ 2010-09-29 11:35 UTC (permalink / raw)
To: Junio C Hamano
Cc: Axel Bonnet, Clément Poulain, Diane Gasselin, Matthieu Moy,
Jeff King, Kirill Smelkov, git, Kirill Smelkov
Recently I've spot a bug in git blame --textconv, which was wrongly
calling pdftotext (my *.pdf conversion program) on a symlink.pdf, and I
was getting something like
$ git blame -C -C regular-file.pdf
Error: May not be a PDF file (continuing anyway)
Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table
Warning: program returned non-zero exit code #1
fatal: unable to read files to diff
That errors come from pdftotext run on symlink.pdf being extracted to
/tmp/ with one-line plain-text content pointing to link destination.
Please apply and thanks,
Kirill
P.S. I'm sorry if this time there is again some bug on my side...
v5:
o Avoid touching t4042 at all
o Change $@ to $1 in textconv helper directly in patch1
v4:
o add prereq on SYMLINKS in tests
o Use consistent pattern for detecting and converting binaries (was 'bin:' and
'bin: ')
o avoid using $@ in textconv helper - it gets only one argument
v3:
o Slightly changed patches descriptions as per comment by Matthieu, and added
Matthieu's Reviewed-by.
v2:
o Incorporated suggestions by Matthieu and Jeff (details in each patch)
Kirill Smelkov (3):
tests: Prepare --textconv tests for correctly-failing conversion
program
blame,cat-file: Demonstrate --textconv is wrongly running converter
on symlinks
blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
builtin.h | 2 +-
builtin/blame.c | 33 +++++++++++++++-------
builtin/cat-file.c | 2 +-
sha1_name.c | 2 +
t/t8006-blame-textconv.sh | 62 +++++++++++++++++++++++++++++++++++++-----
t/t8007-cat-file-textconv.sh | 38 ++++++++++++++++++++++---
6 files changed, 114 insertions(+), 25 deletions(-)
--
1.7.3.19.g3fe0a
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v5 1/3] blame,cat-file: Prepare --textconv tests for correctly-failing conversion program
2010-09-29 11:35 [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Kirill Smelkov
@ 2010-09-29 11:35 ` Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 2/3] blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks Kirill Smelkov
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Kirill Smelkov @ 2010-09-29 11:35 UTC (permalink / raw)
To: Junio C Hamano
Cc: Axel Bonnet, Clément Poulain, Diane Gasselin, Matthieu Moy,
Jeff King, Kirill Smelkov, git
From: Kirill Smelkov <kirr@landau.phys.spbu.ru>
The textconv filter is sometimes incorrectly ran on a temporary file
whose content is the target of a symbolic link, instead of actual file
content. Prepare to test this by marking the content of the file to
convert with "bin:", and let the helper die if "bin:" is not found in
the file content.
NOTE: I've changed $@ to $1 in helper becase textconv program "should
take a single argument" (see Documentation/gitattributes.txt), so
making this more explicit makes sense and also helps to avoid
problems with feeding arguments to echo.
(Description partly by Matthieu Moy)
Cc: Axel Bonnet <axel.bonnet@ensimag.imag.fr>
Cc: Clément Poulain <clement.poulain@ensimag.imag.fr>
Cc: Diane Gasselin <diane.gasselin@ensimag.imag.fr>
Cc: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Cc: Jeff King <peff@peff.net>
Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru>
Reviewed-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
---
v5:
o Avoid touching t4042-diff-textconv-caching.sh at all.
o Use $1 instead of $@ in textconv helper
v4:
o Use consistent pattern for detecting and converting binaries (was 'bin:' and
'bin: ')
v3:
o Add Matthieu's Reviewed-by, and move secondary note to the end to avoid
distracting an intrested reader.
v2:
o Changed patch description as suggested by Matthieu
t/t8006-blame-textconv.sh | 15 ++++++++-------
t/t8007-cat-file-textconv.sh | 11 ++++++-----
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh
index 9ad96d4..3619f8a 100755
--- a/t/t8006-blame-textconv.sh
+++ b/t/t8006-blame-textconv.sh
@@ -9,22 +9,23 @@ find_blame() {
cat >helper <<'EOF'
#!/bin/sh
-sed 's/^/converted: /' "$@"
+grep -q '^bin: ' "$1" || { echo "E: $1 is not \"binary\" file" 1>&2; exit 1; }
+sed 's/^bin: /converted: /' "$1"
EOF
chmod +x helper
test_expect_success 'setup ' '
- echo test 1 >one.bin &&
- echo test number 2 >two.bin &&
+ echo "bin: test 1" >one.bin &&
+ echo "bin: test number 2" >two.bin &&
git add . &&
GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
- echo test 1 version 2 >one.bin &&
- echo test number 2 version 2 >>two.bin &&
+ echo "bin: test 1 version 2" >one.bin &&
+ echo "bin: test number 2 version 2" >>two.bin &&
GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
'
cat >expected <<EOF
-(Number2 2010-01-01 20:00:00 +0000 1) test 1 version 2
+(Number2 2010-01-01 20:00:00 +0000 1) bin: test 1 version 2
EOF
test_expect_success 'no filter specified' '
@@ -67,7 +68,7 @@ test_expect_success 'blame --textconv going through revisions' '
'
test_expect_success 'make a new commit' '
- echo "test number 2 version 3" >>two.bin &&
+ echo "bin: test number 2 version 3" >>two.bin &&
GIT_AUTHOR_NAME=Number3 git commit -a -m Third --date="2010-01-01 22:00:00"
'
diff --git a/t/t8007-cat-file-textconv.sh b/t/t8007-cat-file-textconv.sh
index 38ac05e..71f4145 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/t/t8007-cat-file-textconv.sh
@@ -5,15 +5,16 @@ test_description='git cat-file textconv support'
cat >helper <<'EOF'
#!/bin/sh
-sed 's/^/converted: /' "$@"
+grep -q '^bin: ' "$1" || { echo "E: $1 is not \"binary\" file" 1>&2; exit 1; }
+sed 's/^bin: /converted: /' "$1"
EOF
chmod +x helper
test_expect_success 'setup ' '
- echo test >one.bin &&
+ echo "bin: test" >one.bin &&
git add . &&
GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
- echo test version 2 >one.bin &&
+ echo "bin: test version 2" >one.bin &&
GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
'
@@ -33,7 +34,7 @@ test_expect_success 'setup textconv filters' '
'
cat >expected <<EOF
-test version 2
+bin: test version 2
EOF
test_expect_success 'cat-file without --textconv' '
@@ -42,7 +43,7 @@ test_expect_success 'cat-file without --textconv' '
'
cat >expected <<EOF
-test
+bin: test
EOF
test_expect_success 'cat-file without --textconv on previous commit' '
--
1.7.3.19.g3fe0a
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v5 2/3] blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks
2010-09-29 11:35 [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 1/3] blame,cat-file: Prepare --textconv tests for correctly-failing conversion program Kirill Smelkov
@ 2010-09-29 11:35 ` Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 3/3] blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664'' Kirill Smelkov
2010-10-22 20:05 ` [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Jeff King
3 siblings, 0 replies; 6+ messages in thread
From: Kirill Smelkov @ 2010-09-29 11:35 UTC (permalink / raw)
To: Junio C Hamano
Cc: Axel Bonnet, Clément Poulain, Diane Gasselin, Matthieu Moy,
Jeff King, Kirill Smelkov, git
From: Kirill Smelkov <kirr@landau.phys.spbu.ru>
git blame --textconv is wrongly calling the textconv filter on
symlinks: symlinks are stored as blobs whose content is the target of
the link, and blame calls the textconv filter on a temporary file
filled-in with the content of this blob.
For example:
$ git blame -C -C regular-file.pdf
Error: May not be a PDF file (continuing anyway)
Error: PDF file is damaged - attempting to reconstruct xref table...
Error: Couldn't find trailer dictionary
Error: Couldn't read xref table
Warning: program returned non-zero exit code #1
fatal: unable to read files to diff
That errors come from pdftotext run on symlink.pdf being extracted to
/tmp/ with one-line plain-text content pointing to link destination.
So several failures are demonstrated here:
- git cat-file --textconv :symlink.bin # also HEAD:symlink.bin
- git blame --textconv symlink.bin
- git blame -C -C --textconv regular-file # but also looks on symlink.bin
At present they all fail with something like.
E: /tmp/j3ELEs_symlink.bin is not "binary" file
NOTE: git diff doesn't try to textconv the pathnames, it runs the
textual diff without textconv, which is the expected behavior.
(Description partly by Matthieu Moy)
Cc: Axel Bonnet <axel.bonnet@ensimag.imag.fr>
Cc: Clément Poulain <clement.poulain@ensimag.imag.fr>
Cc: Diane Gasselin <diane.gasselin@ensimag.imag.fr>
Cc: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Cc: Jeff King <peff@peff.net>
Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru>
Reviewed-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
---
v5:
o No changes
v4:
o As noticed by Junio add prereq on SYMLINKS where appropriate
v3:
o Slight cleanup of the description
o Reviewed-by: Matthieu
v2:
(As suggested by Matthieu)
o Changed patch descriptio
o Moved most of >expected preparation into test_expect_*
o Changed multiple echo'es into cat <<EOF
o Use printf "%s" instead echo -n, since latter is said to be not very
portable
t/t8006-blame-textconv.sh | 49 ++++++++++++++++++++++++++++++++++++++++++
t/t8007-cat-file-textconv.sh | 29 ++++++++++++++++++++++++
2 files changed, 78 insertions(+), 0 deletions(-)
diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh
index 3619f8a..7c35959 100755
--- a/t/t8006-blame-textconv.sh
+++ b/t/t8006-blame-textconv.sh
@@ -17,10 +17,16 @@ chmod +x helper
test_expect_success 'setup ' '
echo "bin: test 1" >one.bin &&
echo "bin: test number 2" >two.bin &&
+ if test_have_prereq SYMLINKS; then
+ ln -s one.bin symlink.bin
+ fi &&
git add . &&
GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
echo "bin: test 1 version 2" >one.bin &&
echo "bin: test number 2 version 2" >>two.bin &&
+ if test_have_prereq SYMLINKS; then
+ ln -sf two.bin symlink.bin
+ fi &&
GIT_AUTHOR_NAME=Number2 git commit -a -m Second --date="2010-01-01 20:00:00"
'
@@ -78,4 +84,47 @@ test_expect_success 'blame from previous revision' '
test_cmp expected result
'
+cat >expected <<EOF
+(Number2 2010-01-01 20:00:00 +0000 1) two.bin
+EOF
+
+test_expect_success SYMLINKS 'blame with --no-textconv (on symlink)' '
+ git blame --no-textconv symlink.bin >blame &&
+ find_blame <blame >result &&
+ test_cmp expected result
+'
+
+# fails with '...symlink.bin is not "binary" file'
+test_expect_failure SYMLINKS 'blame --textconv (on symlink)' '
+ git blame --textconv symlink.bin >blame &&
+ find_blame <blame >result &&
+ test_cmp expected result
+'
+
+# cp two.bin three.bin and make small tweak
+# (this will direct blame -C -C three.bin to consider two.bin and symlink.bin)
+test_expect_success SYMLINKS 'make another new commit' '
+ cat >three.bin <<\EOF &&
+bin: test number 2
+bin: test number 2 version 2
+bin: test number 2 version 3
+bin: test number 3
+EOF
+ git add three.bin &&
+ GIT_AUTHOR_NAME=Number4 git commit -a -m Fourth --date="2010-01-01 23:00:00"
+'
+
+# fails with '...symlink.bin is not "binary" file'
+test_expect_failure SYMLINKS 'blame on last commit (-C -C, symlink)' '
+ git blame -C -C three.bin >blame &&
+ find_blame <blame >result &&
+ cat >expected <<\EOF &&
+(Number1 2010-01-01 18:00:00 +0000 1) converted: test number 2
+(Number2 2010-01-01 20:00:00 +0000 2) converted: test number 2 version 2
+(Number3 2010-01-01 22:00:00 +0000 3) converted: test number 2 version 3
+(Number4 2010-01-01 23:00:00 +0000 4) converted: test number 3
+EOF
+ test_cmp expected result
+'
+
test_done
diff --git a/t/t8007-cat-file-textconv.sh b/t/t8007-cat-file-textconv.sh
index 71f4145..98a3e1f 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/t/t8007-cat-file-textconv.sh
@@ -12,6 +12,9 @@ chmod +x helper
test_expect_success 'setup ' '
echo "bin: test" >one.bin &&
+ if test_have_prereq SYMLINKS; then
+ ln -s one.bin symlink.bin
+ fi &&
git add . &&
GIT_AUTHOR_NAME=Number1 git commit -a -m First --date="2010-01-01 18:00:00" &&
echo "bin: test version 2" >one.bin &&
@@ -68,4 +71,30 @@ test_expect_success 'cat-file --textconv on previous commit' '
git cat-file --textconv HEAD^:one.bin >result &&
test_cmp expected result
'
+
+test_expect_success SYMLINKS 'cat-file without --textconv (symlink)' '
+ git cat-file blob :symlink.bin >result &&
+ printf "%s" "one.bin" >expected
+ test_cmp expected result
+'
+
+
+# fails because cat-file tries to run converter on symlink.bin
+test_expect_failure SYMLINKS 'cat-file --textconv on index (symlink)' '
+ ! git cat-file --textconv :symlink.bin 2>result &&
+ cat >expected <<\EOF &&
+fatal: git cat-file --textconv: unable to run textconv on :symlink.bin
+EOF
+ test_cmp expected result
+'
+
+# fails because cat-file tries to run converter on symlink.bin
+test_expect_failure SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
+ ! git cat-file --textconv HEAD:symlink.bin 2>result &&
+ cat >expected <<EOF &&
+fatal: git cat-file --textconv: unable to run textconv on HEAD:symlink.bin
+EOF
+ test_cmp expected result
+'
+
test_done
--
1.7.3.19.g3fe0a
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v5 3/3] blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
2010-09-29 11:35 [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 1/3] blame,cat-file: Prepare --textconv tests for correctly-failing conversion program Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 2/3] blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks Kirill Smelkov
@ 2010-09-29 11:35 ` Kirill Smelkov
2010-10-22 20:05 ` [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Jeff King
3 siblings, 0 replies; 6+ messages in thread
From: Kirill Smelkov @ 2010-09-29 11:35 UTC (permalink / raw)
To: Junio C Hamano
Cc: Axel Bonnet, Clément Poulain, Diane Gasselin, Matthieu Moy,
Jeff King, Kirill Smelkov, git
From: Kirill Smelkov <kirr@landau.phys.spbu.ru>
Instead get the mode from either worktree, index, .git, or origin
entries when blaming and pass it to textconv_object() as context.
The reason to do it is not to run textconv filters on symlinks.
Cc: Axel Bonnet <axel.bonnet@ensimag.imag.fr>
Cc: Clément Poulain <clement.poulain@ensimag.imag.fr>
Cc: Diane Gasselin <diane.gasselin@ensimag.imag.fr>
Cc: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Cc: Jeff King <peff@peff.net>
Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru>
Reviewed-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
---
v5:
o No changes
v4:
o Update to resolve conflicts after patch 2 v4 update; no changes otherwise.
v3:
o Reviewed-by: Matthieu
v2:
o Thanks to Matthieu and Jeff got a bit more sure I'm not doing stupid things,
so
o My XXX were removed, and the patch is no longer an RFC
builtin.h | 2 +-
builtin/blame.c | 33 ++++++++++++++++++++++-----------
builtin/cat-file.c | 2 +-
sha1_name.c | 2 ++
t/t8006-blame-textconv.sh | 6 ++----
t/t8007-cat-file-textconv.sh | 6 ++----
6 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/builtin.h b/builtin.h
index 0398d24..9bf69ee 100644
--- a/builtin.h
+++ b/builtin.h
@@ -35,7 +35,7 @@ void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c);
extern int check_pager_config(const char *cmd);
-extern int textconv_object(const char *path, const unsigned char *sha1, char **buf, unsigned long *buf_size);
+extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, char **buf, unsigned long *buf_size);
extern int cmd_add(int argc, const char **argv, const char *prefix);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
diff --git a/builtin/blame.c b/builtin/blame.c
index 1015354..f5fccc1 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -83,6 +83,7 @@ struct origin {
struct commit *commit;
mmfile_t file;
unsigned char blob_sha1[20];
+ unsigned mode;
char path[FLEX_ARRAY];
};
@@ -92,6 +93,7 @@ struct origin {
* Return 1 if the conversion succeeds, 0 otherwise.
*/
int textconv_object(const char *path,
+ unsigned mode,
const unsigned char *sha1,
char **buf,
unsigned long *buf_size)
@@ -100,7 +102,7 @@ int textconv_object(const char *path,
struct userdiff_driver *textconv;
df = alloc_filespec(path);
- fill_filespec(df, sha1, S_IFREG | 0664);
+ fill_filespec(df, sha1, mode);
textconv = get_textconv(df);
if (!textconv) {
free_filespec(df);
@@ -125,7 +127,7 @@ static void fill_origin_blob(struct diff_options *opt,
num_read_blob++;
if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
- textconv_object(o->path, o->blob_sha1, &file->ptr, &file_size))
+ textconv_object(o->path, o->mode, o->blob_sha1, &file->ptr, &file_size))
;
else
file->ptr = read_sha1_file(o->blob_sha1, &type, &file_size);
@@ -313,21 +315,23 @@ static struct origin *get_origin(struct scoreboard *sb,
* for an origin is also used to pass the blame for the entire file to
* the parent to detect the case where a child's blob is identical to
* that of its parent's.
+ *
+ * This also fills origin->mode for corresponding tree path.
*/
-static int fill_blob_sha1(struct origin *origin)
+static int fill_blob_sha1_and_mode(struct origin *origin)
{
- unsigned mode;
if (!is_null_sha1(origin->blob_sha1))
return 0;
if (get_tree_entry(origin->commit->object.sha1,
origin->path,
- origin->blob_sha1, &mode))
+ origin->blob_sha1, &origin->mode))
goto error_out;
if (sha1_object_info(origin->blob_sha1, NULL) != OBJ_BLOB)
goto error_out;
return 0;
error_out:
hashclr(origin->blob_sha1);
+ origin->mode = S_IFINVALID;
return -1;
}
@@ -360,12 +364,14 @@ static struct origin *find_origin(struct scoreboard *sb,
/*
* If the origin was newly created (i.e. get_origin
* would call make_origin if none is found in the
- * scoreboard), it does not know the blob_sha1,
+ * scoreboard), it does not know the blob_sha1/mode,
* so copy it. Otherwise porigin was in the
- * scoreboard and already knows blob_sha1.
+ * scoreboard and already knows blob_sha1/mode.
*/
- if (porigin->refcnt == 1)
+ if (porigin->refcnt == 1) {
hashcpy(porigin->blob_sha1, cached->blob_sha1);
+ porigin->mode = cached->mode;
+ }
return porigin;
}
/* otherwise it was not very useful; free it */
@@ -400,6 +406,7 @@ static struct origin *find_origin(struct scoreboard *sb,
/* The path is the same as parent */
porigin = get_origin(sb, parent, origin->path);
hashcpy(porigin->blob_sha1, origin->blob_sha1);
+ porigin->mode = origin->mode;
} else {
/*
* Since origin->path is a pathspec, if the parent
@@ -425,6 +432,7 @@ static struct origin *find_origin(struct scoreboard *sb,
case 'M':
porigin = get_origin(sb, parent, origin->path);
hashcpy(porigin->blob_sha1, p->one->sha1);
+ porigin->mode = p->one->mode;
break;
case 'A':
case 'T':
@@ -444,6 +452,7 @@ static struct origin *find_origin(struct scoreboard *sb,
cached = make_origin(porigin->commit, porigin->path);
hashcpy(cached->blob_sha1, porigin->blob_sha1);
+ cached->mode = porigin->mode;
parent->util = cached;
}
return porigin;
@@ -486,6 +495,7 @@ static struct origin *find_rename(struct scoreboard *sb,
!strcmp(p->two->path, origin->path)) {
porigin = get_origin(sb, parent, p->one->path);
hashcpy(porigin->blob_sha1, p->one->sha1);
+ porigin->mode = p->one->mode;
break;
}
}
@@ -1099,6 +1109,7 @@ static int find_copy_in_parent(struct scoreboard *sb,
norigin = get_origin(sb, parent, p->one->path);
hashcpy(norigin->blob_sha1, p->one->sha1);
+ norigin->mode = p->one->mode;
fill_origin_blob(&sb->revs->diffopt, norigin, &file_p);
if (!file_p.ptr)
continue;
@@ -2075,7 +2086,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
switch (st.st_mode & S_IFMT) {
case S_IFREG:
if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
- textconv_object(read_from, null_sha1, &buf.buf, &buf_len))
+ textconv_object(read_from, mode, null_sha1, &buf.buf, &buf_len))
buf.len = buf_len;
else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
die_errno("cannot open or read '%s'", read_from);
@@ -2455,11 +2466,11 @@ parse_done:
}
else {
o = get_origin(&sb, sb.final, path);
- if (fill_blob_sha1(o))
+ if (fill_blob_sha1_and_mode(o))
die("no such path %s in %s", path, final_commit_name);
if (DIFF_OPT_TST(&sb.revs->diffopt, ALLOW_TEXTCONV) &&
- textconv_object(path, o->blob_sha1, (char **) &sb.final_buf,
+ textconv_object(path, o->mode, o->blob_sha1, (char **) &sb.final_buf,
&sb.final_buf_size))
;
else
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 76ec3fe..94632db 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -143,7 +143,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
die("git cat-file --textconv %s: <object> must be <sha1:path>",
obj_name);
- if (!textconv_object(obj_context.path, sha1, &buf, &size))
+ if (!textconv_object(obj_context.path, obj_context.mode, sha1, &buf, &size))
die("git cat-file --textconv: unable to run textconv on %s",
obj_name);
break;
diff --git a/sha1_name.c b/sha1_name.c
index 484081d..3e856b8 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -1069,6 +1069,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
struct cache_entry *ce;
int pos;
if (namelen > 2 && name[1] == '/')
+ /* don't need mode for commit */
return get_sha1_oneline(name + 2, sha1);
if (namelen < 3 ||
name[2] != ':' ||
@@ -1096,6 +1097,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
break;
if (ce_stage(ce) == stage) {
hashcpy(sha1, ce->sha1);
+ oc->mode = ce->ce_mode;
return 0;
}
pos++;
diff --git a/t/t8006-blame-textconv.sh b/t/t8006-blame-textconv.sh
index 7c35959..dbf623b 100755
--- a/t/t8006-blame-textconv.sh
+++ b/t/t8006-blame-textconv.sh
@@ -94,8 +94,7 @@ test_expect_success SYMLINKS 'blame with --no-textconv (on symlink)' '
test_cmp expected result
'
-# fails with '...symlink.bin is not "binary" file'
-test_expect_failure SYMLINKS 'blame --textconv (on symlink)' '
+test_expect_success SYMLINKS 'blame --textconv (on symlink)' '
git blame --textconv symlink.bin >blame &&
find_blame <blame >result &&
test_cmp expected result
@@ -114,8 +113,7 @@ EOF
GIT_AUTHOR_NAME=Number4 git commit -a -m Fourth --date="2010-01-01 23:00:00"
'
-# fails with '...symlink.bin is not "binary" file'
-test_expect_failure SYMLINKS 'blame on last commit (-C -C, symlink)' '
+test_expect_success SYMLINKS 'blame on last commit (-C -C, symlink)' '
git blame -C -C three.bin >blame &&
find_blame <blame >result &&
cat >expected <<\EOF &&
diff --git a/t/t8007-cat-file-textconv.sh b/t/t8007-cat-file-textconv.sh
index 98a3e1f..78a0085 100755
--- a/t/t8007-cat-file-textconv.sh
+++ b/t/t8007-cat-file-textconv.sh
@@ -79,8 +79,7 @@ test_expect_success SYMLINKS 'cat-file without --textconv (symlink)' '
'
-# fails because cat-file tries to run converter on symlink.bin
-test_expect_failure SYMLINKS 'cat-file --textconv on index (symlink)' '
+test_expect_success SYMLINKS 'cat-file --textconv on index (symlink)' '
! git cat-file --textconv :symlink.bin 2>result &&
cat >expected <<\EOF &&
fatal: git cat-file --textconv: unable to run textconv on :symlink.bin
@@ -88,8 +87,7 @@ EOF
test_cmp expected result
'
-# fails because cat-file tries to run converter on symlink.bin
-test_expect_failure SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
+test_expect_success SYMLINKS 'cat-file --textconv on HEAD (symlink)' '
! git cat-file --textconv HEAD:symlink.bin 2>result &&
cat >expected <<EOF &&
fatal: git cat-file --textconv: unable to run textconv on HEAD:symlink.bin
--
1.7.3.19.g3fe0a
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks
2010-09-29 11:35 [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Kirill Smelkov
` (2 preceding siblings ...)
2010-09-29 11:35 ` [PATCH v5 3/3] blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664'' Kirill Smelkov
@ 2010-10-22 20:05 ` Jeff King
2010-10-24 17:40 ` Kirill Smelkov
3 siblings, 1 reply; 6+ messages in thread
From: Jeff King @ 2010-10-22 20:05 UTC (permalink / raw)
To: Kirill Smelkov
Cc: Junio C Hamano, Axel Bonnet, Clément Poulain, Diane Gasselin,
Matthieu Moy, Kirill Smelkov, git
On Wed, Sep 29, 2010 at 03:35:21PM +0400, Kirill Smelkov wrote:
> Kirill Smelkov (3):
> tests: Prepare --textconv tests for correctly-failing conversion
> program
> blame,cat-file: Demonstrate --textconv is wrongly running converter
> on symlinks
> blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
I finally got around to reviewing this series again (thanks for your
patience, Kirill). This latest version (v5) looks good to me.
-Peff
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks
2010-10-22 20:05 ` [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Jeff King
@ 2010-10-24 17:40 ` Kirill Smelkov
0 siblings, 0 replies; 6+ messages in thread
From: Kirill Smelkov @ 2010-10-24 17:40 UTC (permalink / raw)
To: Jeff King
Cc: Kirill Smelkov, Junio C Hamano, Axel Bonnet, Cl??ment Poulain,
Diane Gasselin, Matthieu Moy, git
On Fri, Oct 22, 2010 at 04:05:16PM -0400, Jeff King wrote:
> On Wed, Sep 29, 2010 at 03:35:21PM +0400, Kirill Smelkov wrote:
>
> > Kirill Smelkov (3):
> > tests: Prepare --textconv tests for correctly-failing conversion
> > program
> > blame,cat-file: Demonstrate --textconv is wrongly running converter
> > on symlinks
> > blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''
>
> I finally got around to reviewing this series again (thanks for your
> patience, Kirill). This latest version (v5) looks good to me.
Thanks, Jeff. And thanks for your and everyone's patience with me too.
Kirill
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-10-24 17:40 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-29 11:35 [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 1/3] blame,cat-file: Prepare --textconv tests for correctly-failing conversion program Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 2/3] blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinks Kirill Smelkov
2010-09-29 11:35 ` [PATCH v5 3/3] blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664'' Kirill Smelkov
2010-10-22 20:05 ` [BUG, PATCH v5 0/3] Fix {blame,cat-file} --textconv for cases with symlinks Jeff King
2010-10-24 17:40 ` Kirill Smelkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).