* [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).