Re: [RFC/PATCH] remote-curl: Obey passed URL
- From
Michael J Gruber <git@drmicha.warpmail.net>
- Date
- Oct 12, 2011, 20:51 UTC
- Message-ID
- <4E95FDC8.5030009@drmicha.warpmail.net>
- In-Reply-To
- <20111006133758.GA18033@sigill.intra.peff.net>
Jeff King venit, vidit, dixit 06.10.2011 15:37:
Show 9 quoted lines
> On Thu, Oct 06, 2011 at 09:25:00AM -0400, Jeff King wrote: > >> Your analysis is correct, but tweaking the remote object seems kind >> of ugly. I think a nicer solution would be to pass the URL in >> separately to http_init. Of the three existing callers: > > Here's what that patch looks like. It's definitely an improvement and > fixes a real bug, so it may be worth applying. But I'm still going to > look into pushing the url examination closer to the point of use.
It definitely is an improvement. I've been running happily with this (and without my askpass helper/workaround). Are you going forward with this one?
Show 129 quoted lines
>
> -- >8 --
> Subject: [PATCH] http_init: accept separate URL parameter
>
> The http_init function takes a "struct remote". Part of its
> initialization procedure is to look at the remote's url and
> grab some auth-related parameters. However, using the url
> included in the remote is:
>
> - wrong; the remote-curl helper may have a separate,
> unrelated URL (e.g., from remote.*.pushurl). Looking at
> the remote's configured url is incorrect.
>
> - incomplete; http-fetch doesn't have a remote, so passes
> NULL. So http_init never gets to see the URL we are
> actually going to use.
>
> - cumbersome; http-push has a similar problem to
> http-fetch, but actually builds a fake remote just to
> pass in the URL.
>
> Instead, let's just add a separate URL parameter to
> http_init, and all three callsites can pass in the
> appropriate information.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> http-fetch.c | 2 +-
> http-push.c | 10 +---------
> http.c | 8 ++++----
> http.h | 2 +-
> remote-curl.c | 2 +-
> 5 files changed, 8 insertions(+), 16 deletions(-)
>
> diff --git a/http-fetch.c b/http-fetch.c
> index 3af4c71..e341872 100644
> --- a/http-fetch.c
> +++ b/http-fetch.c
> @@ -63,7 +63,7 @@ int main(int argc, const char **argv)
>
> git_config(git_default_config, NULL);
>
> - http_init(NULL);
> + http_init(NULL, url);
> walker = get_http_walker(url);
> walker->get_tree = get_tree;
> walker->get_history = get_history;
> diff --git a/http-push.c b/http-push.c
> index 376331a..215b640 100644
> --- a/http-push.c
> +++ b/http-push.c
> @@ -1747,7 +1747,6 @@ int main(int argc, char **argv)
> int i;
> int new_refs;
> struct ref *ref, *local_refs;
> - struct remote *remote;
>
> git_extract_argv0_path(argv[0]);
>
> @@ -1821,14 +1820,7 @@ int main(int argc, char **argv)
>
> memset(remote_dir_exists, -1, 256);
>
> - /*
> - * Create a minimum remote by hand to give to http_init(),
> - * primarily to allow it to look at the URL.
> - */
> - remote = xcalloc(sizeof(*remote), 1);
> - ALLOC_GROW(remote->url, remote->url_nr + 1, remote->url_alloc);
> - remote->url[remote->url_nr++] = repo->url;
> - http_init(remote);
> + http_init(NULL, repo->url);
>
> #ifdef USE_CURL_MULTI
> is_running_queue = 0;
> diff --git a/http.c b/http.c
> index b2ae8de..d9f9938 100644
> --- a/http.c
> +++ b/http.c
> @@ -357,7 +357,7 @@ static void set_from_env(const char **var, const char *envname)
> *var = val;
> }
>
> -void http_init(struct remote *remote)
> +void http_init(struct remote *remote, const char *url)
> {
> char *low_speed_limit;
> char *low_speed_time;
> @@ -421,11 +421,11 @@ void http_init(struct remote *remote)
> if (getenv("GIT_CURL_FTP_NO_EPSV"))
> curl_ftp_no_epsv = 1;
>
> - if (remote && remote->url && remote->url[0]) {
> - http_auth_init(remote->url[0]);
> + if (url) {
> + http_auth_init(url);
> if (!ssl_cert_password_required &&
> getenv("GIT_SSL_CERT_PASSWORD_PROTECTED") &&
> - !prefixcmp(remote->url[0], "https://"))
> + !prefixcmp(url, "https://"))
> ssl_cert_password_required = 1;
> }
>
> diff --git a/http.h b/http.h
> index 0bf8592..3c332a9 100644
> --- a/http.h
> +++ b/http.h
> @@ -86,7 +86,7 @@ struct buffer {
> extern void step_active_slots(void);
> #endif
>
> -extern void http_init(struct remote *remote);
> +extern void http_init(struct remote *remote, const char *url);
> extern void http_cleanup(void);
>
> extern int data_received;
> diff --git a/remote-curl.c b/remote-curl.c
> index 69831e9..33d3d8c 100644
> --- a/remote-curl.c
> +++ b/remote-curl.c
> @@ -852,7 +852,7 @@ int main(int argc, const char **argv)
>
> url = strbuf_detach(&buf, NULL);
>
> - http_init(remote);
> + http_init(remote, url);
>
> do {
> if (strbuf_getline(&buf, stdin, '\n') == EOF)