@@ -529,10 +529,12 @@ static int add_file_cb(const struct option *opt, const char *arg, int unset)
529
529
return 0 ;
530
530
}
531
531
532
- #define OPT__COMPR (s , v , h , p ) \
533
- OPT_SET_INT_F(s, NULL, v, h, p, PARSE_OPT_NONEG)
534
- #define OPT__COMPR_HIDDEN (s , v , p ) \
535
- OPT_SET_INT_F(s, NULL, v, "", p, PARSE_OPT_NONEG | PARSE_OPT_HIDDEN)
532
+ static int number_callback (const struct option * opt , const char * arg , int unset )
533
+ {
534
+ BUG_ON_OPT_NEG (unset );
535
+ * (int * )opt -> value = strtol (arg , NULL , 10 );
536
+ return 0 ;
537
+ }
536
538
537
539
static int parse_archive_args (int argc , const char * * argv ,
538
540
const struct archiver * * ar , struct archiver_args * args ,
@@ -561,16 +563,8 @@ static int parse_archive_args(int argc, const char **argv,
561
563
OPT_BOOL (0 , "worktree-attributes" , & worktree_attributes ,
562
564
N_ ("read .gitattributes in working directory" )),
563
565
OPT__VERBOSE (& verbose , N_ ("report archived files on stderr" )),
564
- OPT__COMPR ('0' , & compression_level , N_ ("store only" ), 0 ),
565
- OPT__COMPR ('1' , & compression_level , N_ ("compress faster" ), 1 ),
566
- OPT__COMPR_HIDDEN ('2' , & compression_level , 2 ),
567
- OPT__COMPR_HIDDEN ('3' , & compression_level , 3 ),
568
- OPT__COMPR_HIDDEN ('4' , & compression_level , 4 ),
569
- OPT__COMPR_HIDDEN ('5' , & compression_level , 5 ),
570
- OPT__COMPR_HIDDEN ('6' , & compression_level , 6 ),
571
- OPT__COMPR_HIDDEN ('7' , & compression_level , 7 ),
572
- OPT__COMPR_HIDDEN ('8' , & compression_level , 8 ),
573
- OPT__COMPR ('9' , & compression_level , N_ ("compress better" ), 9 ),
566
+ OPT_NUMBER_CALLBACK (& compression_level ,
567
+ N_ ("set compression level" ), number_callback ),
574
568
OPT_GROUP ("" ),
575
569
OPT_BOOL ('l' , "list" , & list ,
576
570
N_ ("list supported archive formats" )),
@@ -617,7 +611,9 @@ static int parse_archive_args(int argc, const char **argv,
617
611
618
612
args -> compression_level = Z_DEFAULT_COMPRESSION ;
619
613
if (compression_level != -1 ) {
620
- if ((* ar )-> flags & ARCHIVER_WANT_COMPRESSION_LEVELS )
614
+ int levels_ok = (* ar )-> flags & ARCHIVER_WANT_COMPRESSION_LEVELS ;
615
+ int high_ok = (* ar )-> flags & ARCHIVER_HIGH_COMPRESSION_LEVELS ;
616
+ if (levels_ok && (compression_level <= 9 || high_ok ))
621
617
args -> compression_level = compression_level ;
622
618
else {
623
619
die (_ ("Argument not supported for format '%s': -%d" ),
0 commit comments