diff options
Diffstat (limited to 'third_party/git/builtin/clone.c')
-rw-r--r-- | third_party/git/builtin/clone.c | 61 |
1 files changed, 17 insertions, 44 deletions
diff --git a/third_party/git/builtin/clone.c b/third_party/git/builtin/clone.c index 1ad26f4d8c81..f665b28ccccf 100644 --- a/third_party/git/builtin/clone.c +++ b/third_party/git/builtin/clone.c @@ -32,6 +32,7 @@ #include "connected.h" #include "packfile.h" #include "list-objects-filter-options.h" +#include "object-store.h" /* * Overall FIXMEs: @@ -59,7 +60,6 @@ static const char *real_git_dir; static char *option_upload_pack = "git-upload-pack"; static int option_verbosity; static int option_progress = -1; -static int option_sparse_checkout; static enum transport_family family; static struct string_list option_config = STRING_LIST_INIT_NODUP; static struct string_list option_required_reference = STRING_LIST_INIT_NODUP; @@ -147,8 +147,6 @@ static struct option builtin_clone_options[] = { OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options), OPT_BOOL(0, "remote-submodules", &option_remote_submodules, N_("any cloned submodules will use their remote-tracking branch")), - OPT_BOOL(0, "sparse", &option_sparse_checkout, - N_("initialize sparse-checkout file to include only files at root")), OPT_END() }; @@ -673,7 +671,7 @@ static void update_remote_refs(const struct ref *refs, const char *msg, struct transport *transport, int check_connectivity, - int check_refs_are_promisor_objects_only) + int check_refs_only) { const struct ref *rm = mapped_refs; @@ -682,8 +680,7 @@ static void update_remote_refs(const struct ref *refs, opt.transport = transport; opt.progress = transport->progress; - opt.check_refs_are_promisor_objects_only = - !!check_refs_are_promisor_objects_only; + opt.check_refs_only = !!check_refs_only; if (check_connected(iterate_ref_map, &rm, &opt)) die(_("remote did not send all necessary objects")); @@ -737,27 +734,6 @@ static void update_head(const struct ref *our, const struct ref *remote, } } -static int git_sparse_checkout_init(const char *repo) -{ - struct argv_array argv = ARGV_ARRAY_INIT; - int result = 0; - argv_array_pushl(&argv, "-C", repo, "sparse-checkout", "init", NULL); - - /* - * We must apply the setting in the current process - * for the later checkout to use the sparse-checkout file. - */ - core_apply_sparse_checkout = 1; - - if (run_command_v_opt(argv.argv, RUN_GIT_CMD)) { - error(_("failed to initialize sparse-checkout")); - result = 1; - } - - argv_array_clear(&argv); - return result; -} - static int checkout(int submodule_progress) { struct object_id oid; @@ -809,12 +785,12 @@ static int checkout(int submodule_progress) if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK)) die(_("unable to write new index file")); - err |= run_hook_le(NULL, "post-checkout", oid_to_hex(&null_oid), + err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1), oid_to_hex(&oid), "1", NULL); if (!err && (option_recurse_submodules.nr > 0)) { struct argv_array args = ARGV_ARRAY_INIT; - argv_array_pushl(&args, "submodule", "update", "--require-init", "--recursive", NULL); + argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL); if (option_shallow_submodules == 1) argv_array_push(&args, "--depth=1"); @@ -833,11 +809,6 @@ static int checkout(int submodule_progress) argv_array_push(&args, "--no-fetch"); } - if (option_single_branch >= 0) - argv_array_push(&args, option_single_branch ? - "--single-branch" : - "--no-single-branch"); - err = run_command_v_opt(args.argv, RUN_GIT_CMD); argv_array_clear(&args); } @@ -929,7 +900,7 @@ static void dissociate_from_references(void) free(alternates); } -static int path_exists(const char *path) +static int dir_exists(const char *path) { struct stat sb; return !stat(path, &sb); @@ -957,6 +928,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix) struct argv_array ref_prefixes = ARGV_ARRAY_INIT; + fetch_if_missing = 0; + packet_trace_identity("clone"); argc = parse_options(argc, argv, prefix, builtin_clone_options, builtin_clone_usage, 0); @@ -1009,7 +982,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) dir = guess_dir_name(repo_name, is_bundle, option_bare); strip_trailing_slashes(dir); - dest_exists = path_exists(dir); + dest_exists = dir_exists(dir); if (dest_exists && !is_empty_dir(dir)) die(_("destination path '%s' already exists and is not " "an empty directory."), dir); @@ -1020,7 +993,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) work_tree = NULL; else { work_tree = getenv("GIT_WORK_TREE"); - if (work_tree && path_exists(work_tree)) + if (work_tree && dir_exists(work_tree)) die(_("working tree '%s' already exists."), work_tree); } @@ -1048,7 +1021,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } if (real_git_dir) { - if (path_exists(real_git_dir)) + if (dir_exists(real_git_dir)) junk_git_dir_flags |= REMOVE_DIR_KEEP_TOPLEVEL; junk_git_dir = real_git_dir; } else { @@ -1134,9 +1107,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (option_required_reference.nr || option_optional_reference.nr) setup_reference(); - if (option_sparse_checkout && git_sparse_checkout_init(dir)) - return 1; - remote = remote_get(option_origin); strbuf_addf(&default_refspec, "+%s*:%s*", src_ref_prefix, @@ -1190,11 +1160,13 @@ int cmd_clone(int argc, const char **argv, const char *prefix) transport->server_options = &server_options; if (filter_options.choice) { - const char *spec = - expand_list_objects_filter_spec(&filter_options); + struct strbuf expanded_filter_spec = STRBUF_INIT; + expand_list_objects_filter_spec(&filter_options, + &expanded_filter_spec); transport_set_option(transport, TRANS_OPT_LIST_OBJECTS_FILTER, - spec); + expanded_filter_spec.buf); transport_set_option(transport, TRANS_OPT_FROM_PROMISOR, "1"); + strbuf_release(&expanded_filter_spec); } if (transport->smart_options && !deepen && !filter_options.choice) @@ -1296,6 +1268,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } junk_mode = JUNK_LEAVE_REPO; + fetch_if_missing = 1; err = checkout(submodule_progress); strbuf_release(&reflog_msg); |