This is more or less for fun. Does anyone really want to create archives from index? Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- archive.c | 38 +++++++++++++++++++++++++------------- archive.h | 1 + 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/archive.c b/archive.c index 1ce644e..bb0a0f1 100644 --- a/archive.c +++ b/archive.c @@ -181,7 +181,7 @@ int write_archive_entries(struct archiver_args *args, len--; if (args->verbose) fprintf(stderr, "%.*s\n", (int)len, args->base); - err = write_entry(args, args->tree->object.sha1, args->base, + err = write_entry(args, args->tree ? args->tree->object.sha1 : null_sha1, args->base, len, 040777, NULL, 0); if (err) return err; @@ -190,15 +190,19 @@ int write_archive_entries(struct archiver_args *args, context.args = args; context.write_entry = write_entry; - memset(&opts, 0, sizeof(opts)); - opts.index_only = 1; - opts.head_idx = -1; - opts.src_index = &the_index; - opts.dst_index = &the_index; - opts.fn = oneway_merge; - init_tree_desc(&t, args->tree->buffer, args->tree->size); - if (unpack_trees(1, &t, &opts)) - return -1; + if (args->tree) { + memset(&opts, 0, sizeof(opts)); + opts.index_only = 1; + opts.head_idx = -1; + opts.src_index = &the_index; + opts.dst_index = &the_index; + opts.fn = oneway_merge; + init_tree_desc(&t, args->tree->buffer, args->tree->size); + if (unpack_trees(1, &t, &opts)) + return -1; + } + else + read_cache(); prefix_len = common_prefix(args->pathspec); if (prefix_len) prune_cache(args->pathspec[0], prefix_len); @@ -300,6 +304,7 @@ static int parse_archive_args(int argc, const char **argv, int verbose = 0; int i; int list = 0; + int use_index = 0; struct option opts[] = { OPT_GROUP(""), OPT_STRING('f', "format", &format, "fmt", "archive format"), @@ -307,6 +312,8 @@ static int parse_archive_args(int argc, const char **argv, "prepend prefix to each pathname in the archive"), OPT_STRING(0, "output", &output, "file", "write the archive to this file"), + OPT_BOOLEAN('i', "index", &use_index, + "generate from index instead"), OPT__VERBOSE(&verbose), OPT__COMPR('0', &compression_level, "store only", 0), OPT__COMPR('1', &compression_level, "compress faster", 1), @@ -348,7 +355,7 @@ static int parse_archive_args(int argc, const char **argv, } /* We need at least one parameter -- tree-ish */ - if (argc < 1) + if (argc < 1 && !use_index) usage_with_options(archive_usage, opts); *ar = lookup_archiver(format); if (!*ar) @@ -366,6 +373,7 @@ static int parse_archive_args(int argc, const char **argv, args->verbose = verbose; args->base = base; args->baselen = strlen(base); + args->use_index = use_index; return argc; } @@ -376,12 +384,16 @@ int write_archive(int argc, const char **argv, const char *prefix, const struct archiver *ar = NULL; struct archiver_args args; + memset(&args, 0, sizeof(args)); argc = parse_archive_args(argc, argv, &ar, &args); if (setup_prefix && prefix == NULL) prefix = setup_git_directory(); - parse_treeish_arg(argv, &args, prefix); - parse_pathspec_arg(argv + 1, &args, prefix); + if (!args.use_index) { + parse_treeish_arg(argv, &args, prefix); + argv++; + } + parse_pathspec_arg(argv, &args, prefix); git_config(git_default_config, NULL); diff --git a/archive.h b/archive.h index 0b15b35..fb94d47 100644 --- a/archive.h +++ b/archive.h @@ -10,6 +10,7 @@ struct archiver_args { time_t time; const char **pathspec; unsigned int verbose : 1; + unsigned int use_index : 1; int compression_level; }; -- 1.6.2.2.602.g83ee9f -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html