diff --git a/archive.c b/archive.c index b8b45bad77..75eb257760 100644 --- a/archive.c +++ b/archive.c @@ -155,3 +155,21 @@ int write_archive_entries(struct archiver_args *args, err = 0; return err; } + +int write_archive(int argc, const char **argv, const char *prefix, + int setup_prefix) +{ + const struct archiver *ar = NULL; + struct archiver_args args; + int tree_idx; + + tree_idx = parse_archive_args(argc, argv, &ar, &args); + if (setup_prefix && prefix == NULL) + prefix = setup_git_directory(); + + argv += tree_idx; + parse_treeish_arg(argv, &args, prefix); + parse_pathspec_arg(argv + 1, &args); + + return ar->write_archive(&args); +} diff --git a/archive.h b/archive.h index 4a02371f37..6b5fe5af45 100644 --- a/archive.h +++ b/archive.h @@ -41,5 +41,6 @@ extern int write_tar_archive(struct archiver_args *); extern int write_zip_archive(struct archiver_args *); extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry); +extern int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix); #endif /* ARCHIVE_H */ diff --git a/builtin-archive.c b/builtin-archive.c index df97724696..502b339e6b 100644 --- a/builtin-archive.c +++ b/builtin-archive.c @@ -232,9 +232,6 @@ static const char *extract_remote_arg(int *ac, const char **av) int cmd_archive(int argc, const char **argv, const char *prefix) { - const struct archiver *ar = NULL; - struct archiver_args args; - int tree_idx; const char *remote = NULL; remote = extract_remote_arg(&argc, argv); @@ -243,13 +240,5 @@ int cmd_archive(int argc, const char **argv, const char *prefix) setvbuf(stderr, NULL, _IOLBF, BUFSIZ); - tree_idx = parse_archive_args(argc, argv, &ar, &args); - if (prefix == NULL) - prefix = setup_git_directory(); - - argv += tree_idx; - parse_treeish_arg(argv, &args, prefix); - parse_pathspec_arg(argv + 1, &args); - - return ar->write_archive(&args); + return write_archive(argc, argv, prefix, 1); } diff --git a/builtin-upload-archive.c b/builtin-upload-archive.c index 13a6c6203e..cc37b36d99 100644 --- a/builtin-upload-archive.c +++ b/builtin-upload-archive.c @@ -19,12 +19,9 @@ static const char lostchild[] = static int run_upload_archive(int argc, const char **argv, const char *prefix) { - const struct archiver *ar; - struct archiver_args args; const char *sent_argv[MAX_ARGS]; const char *arg_cmd = "argument "; char *p, buf[4096]; - int treeish_idx; int sent_argc; int len; @@ -66,12 +63,7 @@ static int run_upload_archive(int argc, const char **argv, const char *prefix) sent_argv[sent_argc] = NULL; /* parse all options sent by the client */ - treeish_idx = parse_archive_args(sent_argc, sent_argv, &ar, &args); - - parse_treeish_arg(sent_argv + treeish_idx, &args, prefix); - parse_pathspec_arg(sent_argv + treeish_idx + 1, &args); - - return ar->write_archive(&args); + return write_archive(sent_argc, sent_argv, prefix, 0); } static void error_clnt(const char *fmt, ...)