@@ -442,7 +442,7 @@ static int filter_buffer_or_fd(int in, int out, void *data)
442
442
return (write_err || status );
443
443
}
444
444
445
- static int apply_filter (const char * path , const char * src , size_t len , int fd ,
445
+ static int apply_single_file_filter (const char * path , const char * src , size_t len , int fd ,
446
446
struct strbuf * dst , const char * cmd )
447
447
{
448
448
/*
@@ -456,12 +456,6 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd,
456
456
struct async async ;
457
457
struct filter_params params ;
458
458
459
- if (!cmd || !* cmd )
460
- return 0 ;
461
-
462
- if (!dst )
463
- return 1 ;
464
-
465
459
memset (& async , 0 , sizeof (async ));
466
460
async .proc = filter_buffer_or_fd ;
467
461
async .data = & params ;
@@ -493,6 +487,9 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd,
493
487
return !err ;
494
488
}
495
489
490
+ #define CAP_CLEAN (1u<<0)
491
+ #define CAP_SMUDGE (1u<<1)
492
+
496
493
static struct convert_driver {
497
494
const char * name ;
498
495
struct convert_driver * next ;
@@ -501,6 +498,29 @@ static struct convert_driver {
501
498
int required ;
502
499
} * user_convert , * * user_convert_tail ;
503
500
501
+ static int apply_filter (const char * path , const char * src , size_t len ,
502
+ int fd , struct strbuf * dst , struct convert_driver * drv ,
503
+ const unsigned int wanted_capability )
504
+ {
505
+ const char * cmd = NULL ;
506
+
507
+ if (!drv )
508
+ return 0 ;
509
+
510
+ if (!dst )
511
+ return 1 ;
512
+
513
+ if ((CAP_CLEAN & wanted_capability ) && drv -> clean )
514
+ cmd = drv -> clean ;
515
+ else if ((CAP_SMUDGE & wanted_capability ) && drv -> smudge )
516
+ cmd = drv -> smudge ;
517
+
518
+ if (cmd && * cmd )
519
+ return apply_single_file_filter (path , src , len , fd , dst , cmd );
520
+
521
+ return 0 ;
522
+ }
523
+
504
524
static int read_convert_config (const char * var , const char * value , void * cb )
505
525
{
506
526
const char * key , * name ;
@@ -839,7 +859,7 @@ int would_convert_to_git_filter_fd(const char *path)
839
859
if (!ca .drv -> required )
840
860
return 0 ;
841
861
842
- return apply_filter (path , NULL , 0 , -1 , NULL , ca .drv -> clean );
862
+ return apply_filter (path , NULL , 0 , -1 , NULL , ca .drv , CAP_CLEAN );
843
863
}
844
864
845
865
const char * get_convert_attr_ascii (const char * path )
@@ -872,18 +892,12 @@ int convert_to_git(const char *path, const char *src, size_t len,
872
892
struct strbuf * dst , enum safe_crlf checksafe )
873
893
{
874
894
int ret = 0 ;
875
- const char * filter = NULL ;
876
- int required = 0 ;
877
895
struct conv_attrs ca ;
878
896
879
897
convert_attrs (& ca , path );
880
- if (ca .drv ) {
881
- filter = ca .drv -> clean ;
882
- required = ca .drv -> required ;
883
- }
884
898
885
- ret |= apply_filter (path , src , len , -1 , dst , filter );
886
- if (!ret && required )
899
+ ret |= apply_filter (path , src , len , -1 , dst , ca . drv , CAP_CLEAN );
900
+ if (!ret && ca . drv && ca . drv -> required )
887
901
die ("%s: clean filter '%s' failed" , path , ca .drv -> name );
888
902
889
903
if (ret && dst ) {
@@ -907,7 +921,7 @@ void convert_to_git_filter_fd(const char *path, int fd, struct strbuf *dst,
907
921
assert (ca .drv );
908
922
assert (ca .drv -> clean );
909
923
910
- if (!apply_filter (path , NULL , 0 , fd , dst , ca .drv -> clean ))
924
+ if (!apply_filter (path , NULL , 0 , fd , dst , ca .drv , CAP_CLEAN ))
911
925
die ("%s: clean filter '%s' failed" , path , ca .drv -> name );
912
926
913
927
crlf_to_git (path , dst -> buf , dst -> len , dst , ca .crlf_action , checksafe );
@@ -919,15 +933,9 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
919
933
int normalizing )
920
934
{
921
935
int ret = 0 , ret_filter = 0 ;
922
- const char * filter = NULL ;
923
- int required = 0 ;
924
936
struct conv_attrs ca ;
925
937
926
938
convert_attrs (& ca , path );
927
- if (ca .drv ) {
928
- filter = ca .drv -> smudge ;
929
- required = ca .drv -> required ;
930
- }
931
939
932
940
ret |= ident_to_worktree (path , src , len , dst , ca .ident );
933
941
if (ret ) {
@@ -938,16 +946,16 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
938
946
* CRLF conversion can be skipped if normalizing, unless there
939
947
* is a smudge filter. The filter might expect CRLFs.
940
948
*/
941
- if (filter || !normalizing ) {
949
+ if (( ca . drv && ca . drv -> smudge ) || !normalizing ) {
942
950
ret |= crlf_to_worktree (path , src , len , dst , ca .crlf_action );
943
951
if (ret ) {
944
952
src = dst -> buf ;
945
953
len = dst -> len ;
946
954
}
947
955
}
948
956
949
- ret_filter = apply_filter (path , src , len , -1 , dst , filter );
950
- if (!ret_filter && required )
957
+ ret_filter = apply_filter (path , src , len , -1 , dst , ca . drv , CAP_SMUDGE );
958
+ if (!ret_filter && ca . drv && ca . drv -> required )
951
959
die ("%s: smudge filter %s failed" , path , ca .drv -> name );
952
960
953
961
return ret | ret_filter ;
0 commit comments