OSDN Git Service

convert: treat an empty string for clean/smudge filters as "cat"
authorLars Schneider <larsxschneider@gmail.com>
Fri, 29 Jan 2016 08:21:37 +0000 (09:21 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 29 Jan 2016 19:04:27 +0000 (11:04 -0800)
Once a lower-priority configuration file defines a clean or smudge
filter, there is no convenient way to override it to produce as-is
output.  Even though the configuration mechanism implements "the
last one wins" semantics, you cannot set them to an empty string and
expect them to work, as apply_filter() would try to run the empty
string as an external command and fail.  The conversion is not done,
but the function would still report a failure to convert.

Even though resetting the variable to "cat" (i.e. pass the data back
as-is and report success) is an obvious and a viable way to solve
this, it is wasteful to spawn an external process just as a
workaround.

Instead, teach apply_filter() to treat an empty string as a no-op
filter that always returns successfully its input as-is without
conversion.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
convert.c
t/t0021-conversion.sh

index 814e814..02d5f1e 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -395,7 +395,7 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd,
        struct async async;
        struct filter_params params;
 
-       if (!cmd)
+       if (!cmd || !*cmd)
                return 0;
 
        if (!dst)
index 718efa0..7bac2bc 100755 (executable)
@@ -252,4 +252,20 @@ test_expect_success "filter: smudge empty file" '
        test_cmp expected filtered-empty-in-repo
 '
 
+test_expect_success 'disable filter with empty override' '
+       test_config_global filter.disable.smudge false &&
+       test_config_global filter.disable.clean false &&
+       test_config filter.disable.smudge false &&
+       test_config filter.disable.clean false &&
+
+       echo "*.disable filter=disable" >.gitattributes &&
+
+       echo test >test.disable &&
+       git -c filter.disable.clean= add test.disable 2>err &&
+       test_must_be_empty err &&
+       rm -f test.disable &&
+       git -c filter.disable.smudge= checkout -- test.disable 2>err &&
+       test_must_be_empty err
+'
+
 test_done