Includes test cases. Signed-off-by: Joey Hess <joeyh@xxxxxxxxxx> --- sha1_file.c | 42 ++++++++++++++++++++++++++++++++++++------ t/t0021-conversion.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index d5e1121..8df86a0 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -3329,6 +3329,29 @@ static int index_stream_convert_blob(unsigned char *sha1, int fd, return ret; } +static int index_from_file_convert_blob(unsigned char *sha1, + const char *path, unsigned flags) +{ + int ret; + const int write_object = flags & HASH_WRITE_OBJECT; + struct strbuf sbuf = STRBUF_INIT; + + assert(path); + assert(can_clean_from_file(path)); + + convert_to_git_filter_from_file(path, &sbuf, + write_object ? safe_crlf : SAFE_CRLF_FALSE); + + if (write_object) + ret = write_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB), + sha1); + else + ret = hash_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB), + sha1); + strbuf_release(&sbuf); + return ret; +} + static int index_pipe(unsigned char *sha1, int fd, enum object_type type, const char *path, unsigned flags) { @@ -3421,12 +3444,19 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, unsigned switch (st->st_mode & S_IFMT) { case S_IFREG: - fd = open(path, O_RDONLY); - if (fd < 0) - return error_errno("open(\"%s\")", path); - if (index_fd(sha1, fd, st, OBJ_BLOB, path, flags) < 0) - return error("%s: failed to insert into database", - path); + if (can_clean_from_file(path)) { + if (index_from_file_convert_blob(sha1, path, flags) < 0) + return error("%s: failed to insert into database", + path); + } + else { + fd = open(path, O_RDONLY); + if (fd < 0) + return error_errno("open(\"%s\")", path); + if (index_fd(sha1, fd, st, OBJ_BLOB, path, flags) < 0) + return error("%s: failed to insert into database", + path); + } break; case S_IFLNK: if (strbuf_readlink(&sb, path, st->st_size)) diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh index 7bac2bc..1043ea5 100755 --- a/t/t0021-conversion.sh +++ b/t/t0021-conversion.sh @@ -12,6 +12,14 @@ tr \ EOF chmod +x rot13.sh +cat <<EOF >rot13-from-file.sh +#!$SHELL_PATH +fsfile="\$1" +touch rot13-from-file.ran +cat "\$fsfile" | ./rot13.sh +EOF +chmod +x rot13-from-file.sh + test_expect_success setup ' git config filter.rot13.smudge ./rot13.sh && git config filter.rot13.clean ./rot13.sh && @@ -268,4 +276,32 @@ test_expect_success 'disable filter with empty override' ' test_must_be_empty err ' +test_expect_success 'clean-from-file filter is used when adding a file' ' + test_config filter.rot13.clean-from-file "./rot13-from-file.sh %p" && + + echo "*.t filter=rot13" >.gitattributes && + + cat test.t >fstest.t && + git add fstest.t && + test -e rot13-from-file.ran && + rm -f rot13-from-file.ran && + + rm -f fstest.t && + git checkout -- fstest.t && + cmp test.t fstest.t +' + +test_expect_success 'clean-from-file filter is not used when clean filter is not configured' ' + test_config filter.no.smudge ./rot13.sh && + test_config filter.no.clean-from-file "./rot13-from-file.sh %p" && + + echo "*.no filter=no" >.gitattributes && + + cat test.t >test.no && + git add test.no && + test ! -e rot13-from-file.ran && + git cat-file blob :test.no >actual && + cmp test.t actual +' + test_done -- 2.9.0.4.g2856e74.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html