@@ -529,10 +529,12 @@ static int add_file_cb(const struct option *opt, const char *arg, int unset)
529529 return 0 ;
530530}
531531
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+ }
536538
537539static int parse_archive_args (int argc , const char * * argv ,
538540 const struct archiver * * ar , struct archiver_args * args ,
@@ -561,16 +563,8 @@ static int parse_archive_args(int argc, const char **argv,
561563 OPT_BOOL (0 , "worktree-attributes" , & worktree_attributes ,
562564 N_ ("read .gitattributes in working directory" )),
563565 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 ),
574568 OPT_GROUP ("" ),
575569 OPT_BOOL ('l' , "list" , & list ,
576570 N_ ("list supported archive formats" )),
@@ -617,7 +611,9 @@ static int parse_archive_args(int argc, const char **argv,
617611
618612 args -> compression_level = Z_DEFAULT_COMPRESSION ;
619613 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 ))
621617 args -> compression_level = compression_level ;
622618 else {
623619 die (_ ("Argument not supported for format '%s': -%d" ),
0 commit comments