Skip to content

Commit ede4d63

Browse files
committed
Merge branch 'rs/archive-high-compression'
"git archive" now allows compression level higher than "-9" when generating tar.gz output. * rs/archive-high-compression: archive: support compression levels beyond 9
2 parents 890bc95 + cde8ea9 commit ede4d63

File tree

3 files changed

+14
-16
lines changed

3 files changed

+14
-16
lines changed

archive-tar.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,8 @@ static int tar_filter_config(const char *var, const char *value, void *data)
374374
ar = xcalloc(1, sizeof(*ar));
375375
ar->name = xmemdupz(name, namelen);
376376
ar->write_archive = write_tar_filter_archive;
377-
ar->flags = ARCHIVER_WANT_COMPRESSION_LEVELS;
377+
ar->flags = ARCHIVER_WANT_COMPRESSION_LEVELS |
378+
ARCHIVER_HIGH_COMPRESSION_LEVELS;
378379
ALLOC_GROW(tar_filters, nr_tar_filters + 1, alloc_tar_filters);
379380
tar_filters[nr_tar_filters++] = ar;
380381
}

archive.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

537539
static 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"),

archive.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const char *archive_format_from_filename(const char *filename);
3636

3737
#define ARCHIVER_WANT_COMPRESSION_LEVELS 1
3838
#define ARCHIVER_REMOTE 2
39+
#define ARCHIVER_HIGH_COMPRESSION_LEVELS 4
3940
struct archiver {
4041
const char *name;
4142
int (*write_archive)(const struct archiver *, struct archiver_args *);

0 commit comments

Comments
 (0)