From 8e804415fd3183f56ced0dcc168f8cb4aa790473 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Fri, 14 Jun 2024 06:28:01 -0400 Subject: remote: use strvecs to store remote url/pushurl Now that the url/pushurl fields of "struct remote" own their strings, we can switch from bare arrays to strvecs. This has a few advantages: - push/clear are now one-liners - likewise the free+assigns in alias_all_urls() can use strvec_replace() - we now use size_t for storage, avoiding possible overflow - this will enable some further cleanups in future patches There's quite a bit of fallout in the code that reads these fields, as it tends to access these arrays directly. But it's mostly a mechanical replacement of "url_nr" with "url.nr", and "url[i]" with "url.v[i]", with a few variations (e.g. "*url" could become "*url.v", but I used "url.v[0]" for consistency). Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- transport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'transport.c') diff --git a/transport.c b/transport.c index 83ddea8fbc..eba92eb7e0 100644 --- a/transport.c +++ b/transport.c @@ -1127,8 +1127,8 @@ struct transport *transport_get(struct remote *remote, const char *url) ret->remote = remote; helper = remote->foreign_vcs; - if (!url && remote->url) - url = remote->url[0]; + if (!url && remote->url.nr) + url = remote->url.v[0]; ret->url = url; /* maybe it is a foreign URL? */ -- cgit v1.2.3 From aecd794fca275b42e271b80236e95f0d288bd709 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Fri, 14 Jun 2024 06:42:03 -0400 Subject: remote: drop checks for zero-url case Now that the previous commit removed the possibility that a "struct remote" will ever have zero url fields, we can drop a number of redundant checks and untriggerable code paths. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- builtin/archive.c | 2 -- builtin/ls-remote.c | 2 -- builtin/push.c | 13 ++----------- builtin/remote.c | 13 +++---------- t/helper/test-bundle-uri.c | 2 -- transport.c | 17 +++++++---------- 6 files changed, 12 insertions(+), 37 deletions(-) (limited to 'transport.c') diff --git a/builtin/archive.c b/builtin/archive.c index 0d9aff7e6f..7234607aaa 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -31,8 +31,6 @@ static int run_remote_archiver(int argc, const char **argv, struct packet_reader reader; _remote = remote_get(remote); - if (!_remote->url.nr) - die(_("git archive: Remote with no URL")); transport = transport_get(_remote, _remote->url.v[0]); transport_connect(transport, "git-upload-archive", exec, fd); diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index 4c04dbbf19..8f3a64d838 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -109,8 +109,6 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) die("bad repository '%s'", dest); die("No remote configured to list refs from."); } - if (!remote->url.nr) - die("remote %s has no configured URL", dest); if (get_url) { printf("%s\n", remote->url.v[0]); diff --git a/builtin/push.c b/builtin/push.c index 00d99af1a8..8260c6e46a 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -438,18 +438,9 @@ static int do_push(int flags, } errs = 0; url = push_url_of_remote(remote); - if (url->nr) { - for (i = 0; i < url->nr; i++) { - struct transport *transport = - transport_get(remote, url->v[i]); - if (flags & TRANSPORT_PUSH_OPTIONS) - transport->push_options = push_options; - if (push_with_options(transport, push_refspec, flags)) - errs++; - } - } else { + for (i = 0; i < url->nr; i++) { struct transport *transport = - transport_get(remote, NULL); + transport_get(remote, url->v[i]); if (flags & TRANSPORT_PUSH_OPTIONS) transport->push_options = push_options; if (push_with_options(transport, push_refspec, flags)) diff --git a/builtin/remote.c b/builtin/remote.c index 06c09ed060..c5c94d4dbd 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -1002,8 +1002,7 @@ static int get_remote_ref_states(const char *name, struct transport *transport; const struct ref *remote_refs; - transport = transport_get(states->remote, states->remote->url.nr > 0 ? - states->remote->url.v[0] : NULL); + transport = transport_get(states->remote, states->remote->url.v[0]); remote_refs = transport_get_remote_refs(transport, NULL); states->queried = 1; @@ -1294,8 +1293,7 @@ static int show(int argc, const char **argv, const char *prefix) get_remote_ref_states(*argv, &info.states, query_flag); printf_ln(_("* remote %s"), *argv); - printf_ln(_(" Fetch URL: %s"), info.states.remote->url.nr > 0 ? - info.states.remote->url.v[0] : _("(no URL)")); + printf_ln(_(" Fetch URL: %s"), info.states.remote->url.v[0]); url = push_url_of_remote(info.states.remote); for (i = 0; i < url->nr; i++) /* @@ -1440,10 +1438,7 @@ static int prune_remote(const char *remote, int dry_run) } printf_ln(_("Pruning %s"), remote); - printf_ln(_("URL: %s"), - states.remote->url.nr - ? states.remote->url.v[0] - : _("(no URL)")); + printf_ln(_("URL: %s"), states.remote->url.v[0]); for_each_string_list_item(item, &states.stale) string_list_append(&refs_to_prune, item->util); @@ -1632,8 +1627,6 @@ static int get_url(int argc, const char **argv, const char *prefix) } url = push_mode ? push_url_of_remote(remote) : &remote->url; - if (!url->nr) - die(_("no URLs configured for remote '%s'"), remotename); if (all_mode) { for (i = 0; i < url->nr; i++) diff --git a/t/helper/test-bundle-uri.c b/t/helper/test-bundle-uri.c index 3285dd962e..0c5fa723d8 100644 --- a/t/helper/test-bundle-uri.c +++ b/t/helper/test-bundle-uri.c @@ -88,8 +88,6 @@ static int cmd_ls_remote(int argc, const char **argv) die(_("bad repository '%s'"), dest); die(_("no remote configured to get bundle URIs from")); } - if (!remote->url.nr) - die(_("remote '%s' has no configured URL"), dest); transport = transport_get(remote, NULL); if (transport_get_remote_bundle_uri(transport) < 0) { diff --git a/transport.c b/transport.c index eba92eb7e0..a324045240 100644 --- a/transport.c +++ b/transport.c @@ -1112,6 +1112,7 @@ static struct transport_vtable builtin_smart_vtable = { struct transport *transport_get(struct remote *remote, const char *url) { const char *helper; + const char *p; struct transport *ret = xcalloc(1, sizeof(*ret)); ret->progress = isatty(2); @@ -1127,19 +1128,15 @@ struct transport *transport_get(struct remote *remote, const char *url) ret->remote = remote; helper = remote->foreign_vcs; - if (!url && remote->url.nr) + if (!url) url = remote->url.v[0]; ret->url = url; - /* maybe it is a foreign URL? */ - if (url) { - const char *p = url; - - while (is_urlschemechar(p == url, *p)) - p++; - if (starts_with(p, "::")) - helper = xstrndup(url, p - url); - } + p = url; + while (is_urlschemechar(p == url, *p)) + p++; + if (starts_with(p, "::")) + helper = xstrndup(url, p - url); if (helper) { transport_helper_init(ret, helper); -- cgit v1.2.3