merge(3p/git): Merge git upstream at v2.26.2
This commit is contained in:
commit
5229c9b232
1006 changed files with 149006 additions and 60819 deletions
61
third_party/git/builtin/clone.c
vendored
61
third_party/git/builtin/clone.c
vendored
|
|
@ -32,7 +32,6 @@
|
|||
#include "connected.h"
|
||||
#include "packfile.h"
|
||||
#include "list-objects-filter-options.h"
|
||||
#include "object-store.h"
|
||||
|
||||
/*
|
||||
* Overall FIXMEs:
|
||||
|
|
@ -60,6 +59,7 @@ 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,6 +147,8 @@ 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()
|
||||
};
|
||||
|
||||
|
|
@ -671,7 +673,7 @@ static void update_remote_refs(const struct ref *refs,
|
|||
const char *msg,
|
||||
struct transport *transport,
|
||||
int check_connectivity,
|
||||
int check_refs_only)
|
||||
int check_refs_are_promisor_objects_only)
|
||||
{
|
||||
const struct ref *rm = mapped_refs;
|
||||
|
||||
|
|
@ -680,7 +682,8 @@ static void update_remote_refs(const struct ref *refs,
|
|||
|
||||
opt.transport = transport;
|
||||
opt.progress = transport->progress;
|
||||
opt.check_refs_only = !!check_refs_only;
|
||||
opt.check_refs_are_promisor_objects_only =
|
||||
!!check_refs_are_promisor_objects_only;
|
||||
|
||||
if (check_connected(iterate_ref_map, &rm, &opt))
|
||||
die(_("remote did not send all necessary objects"));
|
||||
|
|
@ -734,6 +737,27 @@ 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;
|
||||
|
|
@ -785,12 +809,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", sha1_to_hex(null_sha1),
|
||||
err |= run_hook_le(NULL, "post-checkout", oid_to_hex(&null_oid),
|
||||
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", "--init", "--recursive", NULL);
|
||||
argv_array_pushl(&args, "submodule", "update", "--require-init", "--recursive", NULL);
|
||||
|
||||
if (option_shallow_submodules == 1)
|
||||
argv_array_push(&args, "--depth=1");
|
||||
|
|
@ -809,6 +833,11 @@ 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);
|
||||
}
|
||||
|
|
@ -900,7 +929,7 @@ static void dissociate_from_references(void)
|
|||
free(alternates);
|
||||
}
|
||||
|
||||
static int dir_exists(const char *path)
|
||||
static int path_exists(const char *path)
|
||||
{
|
||||
struct stat sb;
|
||||
return !stat(path, &sb);
|
||||
|
|
@ -928,8 +957,6 @@ 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);
|
||||
|
|
@ -982,7 +1009,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 = dir_exists(dir);
|
||||
dest_exists = path_exists(dir);
|
||||
if (dest_exists && !is_empty_dir(dir))
|
||||
die(_("destination path '%s' already exists and is not "
|
||||
"an empty directory."), dir);
|
||||
|
|
@ -993,7 +1020,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 && dir_exists(work_tree))
|
||||
if (work_tree && path_exists(work_tree))
|
||||
die(_("working tree '%s' already exists."), work_tree);
|
||||
}
|
||||
|
||||
|
|
@ -1021,7 +1048,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||
}
|
||||
|
||||
if (real_git_dir) {
|
||||
if (dir_exists(real_git_dir))
|
||||
if (path_exists(real_git_dir))
|
||||
junk_git_dir_flags |= REMOVE_DIR_KEEP_TOPLEVEL;
|
||||
junk_git_dir = real_git_dir;
|
||||
} else {
|
||||
|
|
@ -1107,6 +1134,9 @@ 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,
|
||||
|
|
@ -1160,13 +1190,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
|||
transport->server_options = &server_options;
|
||||
|
||||
if (filter_options.choice) {
|
||||
struct strbuf expanded_filter_spec = STRBUF_INIT;
|
||||
expand_list_objects_filter_spec(&filter_options,
|
||||
&expanded_filter_spec);
|
||||
const char *spec =
|
||||
expand_list_objects_filter_spec(&filter_options);
|
||||
transport_set_option(transport, TRANS_OPT_LIST_OBJECTS_FILTER,
|
||||
expanded_filter_spec.buf);
|
||||
spec);
|
||||
transport_set_option(transport, TRANS_OPT_FROM_PROMISOR, "1");
|
||||
strbuf_release(&expanded_filter_spec);
|
||||
}
|
||||
|
||||
if (transport->smart_options && !deepen && !filter_options.choice)
|
||||
|
|
@ -1268,7 +1296,6 @@ 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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue