clone: cut down on global variables in clone.c
In clone.c the `struct option` which is used to parse the input options for git-clone(1) is a global variable. Due to this, many variables that are used to parse the value into, are also global. Make `builtin_clone_options` a local variable in cmd_clone() and carry along all variables that are only used in that function. Signed-off-by: Toon Claes <toon@iotcl.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Toon Claes committed
Feb 6, 2025 at 07:33 UTC
7f420a6bda9704684ccc924070e8404dac55ffdf
1 file changed
+101
-94
builtin/clone.c
+101
-94
@@ -56,42 +56,22 @@
56
* - dropping use-separate-remote and no-separate-remote compatibility
57
*
58
*/
59
-static const char * const builtin_clone_usage[] = {
60
- N_("git clone [<options>] [--] <repo> [<dir>]"),
61
- NULL
62
-};
59
60
static int option_no_checkout, option_bare, option_mirror, option_single_branch = -1;
61
static int option_local = -1, option_no_hardlinks, option_shared;
62
static int option_no_tags;
63
static int option_shallow_submodules;
68
-static int option_reject_shallow = -1; /* unspecified */
64
static int config_reject_shallow = -1; /* unspecified */
70
-static int deepen;
71
-static char *option_template, *option_depth, *option_since;
72
-static char *option_origin = NULL;
65
static char *remote_name = NULL;
66
static char *option_branch = NULL;
75
-static struct string_list option_not = STRING_LIST_INIT_NODUP;
76
-static const char *real_git_dir;
77
-static const char *ref_format;
78
-static const char *option_upload_pack = "git-upload-pack";
67
static int option_verbosity;
80
-static int option_progress = -1;
81
-static int option_sparse_checkout;
82
-static enum transport_family family;
83
-static struct string_list option_config = STRING_LIST_INIT_NODUP;
68
static struct string_list option_required_reference = STRING_LIST_INIT_NODUP;
69
static struct string_list option_optional_reference = STRING_LIST_INIT_NODUP;
86
-static int option_dissociate;
70
static int max_jobs = -1;
71
static struct string_list option_recurse_submodules = STRING_LIST_INIT_NODUP;
72
static struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
90
-static int option_filter_submodules = -1; /* unspecified */
73
static int config_filter_submodules = -1; /* unspecified */
92
-static struct string_list server_options = STRING_LIST_INIT_NODUP;
74
static int option_remote_submodules;
94
-static const char *bundle_uri;
75
76
static int recurse_submodules_cb(const struct option *opt,
77
const char *arg, int unset)
@@ -107,78 +87,6 @@ static int recurse_submodules_cb(const struct option *opt,
87
return 0;
88
}
89
110
-static struct option builtin_clone_options[] = {
111
- OPT__VERBOSITY(&option_verbosity),
112
- OPT_BOOL(0, "progress", &option_progress,
113
- N_("force progress reporting")),
114
- OPT_BOOL(0, "reject-shallow", &option_reject_shallow,
115
- N_("don't clone shallow repository")),
116
- OPT_BOOL('n', "no-checkout", &option_no_checkout,
117
- N_("don't create a checkout")),
118
- OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
119
- OPT_HIDDEN_BOOL(0, "naked", &option_bare,
120
- N_("create a bare repository")),
121
- OPT_BOOL(0, "mirror", &option_mirror,
122
- N_("create a mirror repository (implies --bare)")),
123
- OPT_BOOL('l', "local", &option_local,
124
- N_("to clone from a local repository")),
125
- OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
126
- N_("don't use local hardlinks, always copy")),
127
- OPT_BOOL('s', "shared", &option_shared,
128
- N_("setup as shared repository")),
129
- { OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
130
- N_("pathspec"), N_("initialize submodules in the clone"),
131
- PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
132
- OPT_ALIAS(0, "recursive", "recurse-submodules"),
133
- OPT_INTEGER('j', "jobs", &max_jobs,
134
- N_("number of submodules cloned in parallel")),
135
- OPT_STRING(0, "template", &option_template, N_("template-directory"),
136
- N_("directory from which templates will be used")),
137
- OPT_STRING_LIST(0, "reference", &option_required_reference, N_("repo"),
138
- N_("reference repository")),
139
- OPT_STRING_LIST(0, "reference-if-able", &option_optional_reference,
140
- N_("repo"), N_("reference repository")),
141
- OPT_BOOL(0, "dissociate", &option_dissociate,
142
- N_("use --reference only while cloning")),
143
- OPT_STRING('o', "origin", &option_origin, N_("name"),
144
- N_("use <name> instead of 'origin' to track upstream")),
145
- OPT_STRING('b', "branch", &option_branch, N_("branch"),
146
- N_("checkout <branch> instead of the remote's HEAD")),
147
- OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
148
- N_("path to git-upload-pack on the remote")),
149
- OPT_STRING(0, "depth", &option_depth, N_("depth"),
150
- N_("create a shallow clone of that depth")),
151
- OPT_STRING(0, "shallow-since", &option_since, N_("time"),
152
- N_("create a shallow clone since a specific time")),
153
- OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("ref"),
154
- N_("deepen history of shallow clone, excluding ref")),
155
- OPT_BOOL(0, "single-branch", &option_single_branch,
156
- N_("clone only one branch, HEAD or --branch")),
157
- OPT_BOOL(0, "no-tags", &option_no_tags,
158
- N_("don't clone any tags, and make later fetches not to follow them")),
159
- OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
160
- N_("any cloned submodules will be shallow")),
161
- OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
162
- N_("separate git dir from working tree")),
163
- OPT_STRING(0, "ref-format", &ref_format, N_("format"),
164
- N_("specify the reference format to use")),
165
- OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
166
- N_("set config inside the new repository")),
167
- OPT_STRING_LIST(0, "server-option", &server_options,
168
- N_("server-specific"), N_("option to transmit")),
169
- OPT_IPVERSION(&family),
170
- OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
171
- OPT_BOOL(0, "also-filter-submodules", &option_filter_submodules,
172
- N_("apply partial clone filters to submodules")),
173
- OPT_BOOL(0, "remote-submodules", &option_remote_submodules,
174
- N_("any cloned submodules will use their remote-tracking branch")),
175
- OPT_BOOL(0, "sparse", &option_sparse_checkout,
176
- N_("initialize sparse-checkout file to include only files at root")),
177
- OPT_STRING(0, "bundle-uri", &bundle_uri,
178
- N_("uri"), N_("a URI for downloading bundles before fetching from origin remote")),
179
- OPT_END()
180
-};
181
-
90
static const char *get_repo_path_1(struct strbuf *path, int *is_bundle)
91
{
92
static const char *suffix[] = { "/.git", "", ".git/.git", ".git" };
@@ -989,10 +897,103 @@ int cmd_clone(int argc,
897
int hash_algo;
898
enum ref_storage_format ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
899
const int do_not_override_repo_unix_permissions = -1;
900
+ int option_reject_shallow = -1; /* unspecified */
901
+ int deepen = 0;
902
+ char *option_template = NULL, *option_depth = NULL, *option_since = NULL;
903
+ char *option_origin = NULL;
904
+ struct string_list option_not = STRING_LIST_INIT_NODUP;
905
+ const char *real_git_dir = NULL;
906
+ const char *ref_format = NULL;
907
+ const char *option_upload_pack = "git-upload-pack";
908
+ int option_progress = -1;
909
+ int option_sparse_checkout = 0;
910
+ enum transport_family family = TRANSPORT_FAMILY_ALL;
911
+ struct string_list option_config = STRING_LIST_INIT_DUP;
912
+ int option_dissociate = 0;
913
+ int option_filter_submodules = -1; /* unspecified */
914
+ struct string_list server_options = STRING_LIST_INIT_NODUP;
915
+ const char *bundle_uri = NULL;
916
917
struct transport_ls_refs_options transport_ls_refs_options =
918
TRANSPORT_LS_REFS_OPTIONS_INIT;
919
920
+ struct option builtin_clone_options[] = {
921
+ OPT__VERBOSITY(&option_verbosity),
922
+ OPT_BOOL(0, "progress", &option_progress,
923
+ N_("force progress reporting")),
924
+ OPT_BOOL(0, "reject-shallow", &option_reject_shallow,
925
+ N_("don't clone shallow repository")),
926
+ OPT_BOOL('n', "no-checkout", &option_no_checkout,
927
+ N_("don't create a checkout")),
928
+ OPT_BOOL(0, "bare", &option_bare, N_("create a bare repository")),
929
+ OPT_HIDDEN_BOOL(0, "naked", &option_bare,
930
+ N_("create a bare repository")),
931
+ OPT_BOOL(0, "mirror", &option_mirror,
932
+ N_("create a mirror repository (implies --bare)")),
933
+ OPT_BOOL('l', "local", &option_local,
934
+ N_("to clone from a local repository")),
935
+ OPT_BOOL(0, "no-hardlinks", &option_no_hardlinks,
936
+ N_("don't use local hardlinks, always copy")),
937
+ OPT_BOOL('s', "shared", &option_shared,
938
+ N_("setup as shared repository")),
939
+ { OPTION_CALLBACK, 0, "recurse-submodules", &option_recurse_submodules,
940
+ N_("pathspec"), N_("initialize submodules in the clone"),
941
+ PARSE_OPT_OPTARG, recurse_submodules_cb, (intptr_t)"." },
942
+ OPT_ALIAS(0, "recursive", "recurse-submodules"),
943
+ OPT_INTEGER('j', "jobs", &max_jobs,
944
+ N_("number of submodules cloned in parallel")),
945
+ OPT_STRING(0, "template", &option_template, N_("template-directory"),
946
+ N_("directory from which templates will be used")),
947
+ OPT_STRING_LIST(0, "reference", &option_required_reference, N_("repo"),
948
+ N_("reference repository")),
949
+ OPT_STRING_LIST(0, "reference-if-able", &option_optional_reference,
950
+ N_("repo"), N_("reference repository")),
951
+ OPT_BOOL(0, "dissociate", &option_dissociate,
952
+ N_("use --reference only while cloning")),
953
+ OPT_STRING('o', "origin", &option_origin, N_("name"),
954
+ N_("use <name> instead of 'origin' to track upstream")),
955
+ OPT_STRING('b', "branch", &option_branch, N_("branch"),
956
+ N_("checkout <branch> instead of the remote's HEAD")),
957
+ OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
958
+ N_("path to git-upload-pack on the remote")),
959
+ OPT_STRING(0, "depth", &option_depth, N_("depth"),
960
+ N_("create a shallow clone of that depth")),
961
+ OPT_STRING(0, "shallow-since", &option_since, N_("time"),
962
+ N_("create a shallow clone since a specific time")),
963
+ OPT_STRING_LIST(0, "shallow-exclude", &option_not, N_("ref"),
964
+ N_("deepen history of shallow clone, excluding ref")),
965
+ OPT_BOOL(0, "single-branch", &option_single_branch,
966
+ N_("clone only one branch, HEAD or --branch")),
967
+ OPT_BOOL(0, "no-tags", &option_no_tags,
968
+ N_("don't clone any tags, and make later fetches not to follow them")),
969
+ OPT_BOOL(0, "shallow-submodules", &option_shallow_submodules,
970
+ N_("any cloned submodules will be shallow")),
971
+ OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
972
+ N_("separate git dir from working tree")),
973
+ OPT_STRING(0, "ref-format", &ref_format, N_("format"),
974
+ N_("specify the reference format to use")),
975
+ OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
976
+ N_("set config inside the new repository")),
977
+ OPT_STRING_LIST(0, "server-option", &server_options,
978
+ N_("server-specific"), N_("option to transmit")),
979
+ OPT_IPVERSION(&family),
980
+ OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
981
+ OPT_BOOL(0, "also-filter-submodules", &option_filter_submodules,
982
+ N_("apply partial clone filters to submodules")),
983
+ OPT_BOOL(0, "remote-submodules", &option_remote_submodules,
984
+ N_("any cloned submodules will use their remote-tracking branch")),
985
+ OPT_BOOL(0, "sparse", &option_sparse_checkout,
986
+ N_("initialize sparse-checkout file to include only files at root")),
987
+ OPT_STRING(0, "bundle-uri", &bundle_uri,
988
+ N_("uri"), N_("a URI for downloading bundles before fetching from origin remote")),
989
+ OPT_END()
990
+ };
991
+
992
+ const char * const builtin_clone_usage[] = {
993
+ N_("git clone [<options>] [--] <repo> [<dir>]"),
994
+ NULL
995
+ };
996
+
997
packet_trace_identity("clone");
998
999
git_config(git_clone_config, NULL);
@@ -1138,8 +1139,8 @@ int cmd_clone(int argc,
1139
for_each_string_list_item(item, &option_recurse_submodules) {
1140
strbuf_addf(&sb, "submodule.active=%s",
1141
item->string);
1141
- string_list_append(&option_config,
1142
- strbuf_detach(&sb, NULL));
1142
+ string_list_append(&option_config, sb.buf);
1143
+ strbuf_reset(&sb);
1144
}
1145
1146
if (!git_config_get_bool("submodule.stickyRecursiveClone", &val) &&
@@ -1161,6 +1162,8 @@ int cmd_clone(int argc,
1162
string_list_append(&option_config,
1163
"submodule.alternateErrorStrategy=info");
1164
}
1165
+
1166
+ strbuf_release(&sb);
1167
}
1168
1169
/*
@@ -1578,6 +1581,10 @@ int cmd_clone(int argc,
1581
err = checkout(submodule_progress, filter_submodules,
1582
ref_storage_format);
1583
1584
+ string_list_clear(&option_not, 0);
1585
+ string_list_clear(&option_config, 0);
1586
+ string_list_clear(&server_options, 0);
1587
+
1588
free(remote_name);
1589
strbuf_release(&reflog_msg);
1590
strbuf_release(&branch_top);