[PATCH 3/4] use clean-from-file in git add
From: Joey Hess <hidden>
Date: 2016-06-16 20:33:46
Subsystem:
the rest · Maintainer:
Linus Torvalds
Includes test cases. Signed-off-by: Joey Hess <redacted> --- 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