From: Derrick Stolee <derrickstolee@xxxxxxxxxx> When the 'url' parameter was absolute, the previous implementation would concatenate 'remote_url' with 'url'. Instead, we want to return 'url' in this case. Signed-off-by: Derrick Stolee <derrickstolee@xxxxxxxxxx> --- remote.c | 12 ++++++++++-- remote.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/remote.c b/remote.c index c4a56749e85..ac1d98ae922 100644 --- a/remote.c +++ b/remote.c @@ -2766,10 +2766,18 @@ char *relative_url(const char *remote_url, int is_relative = 0; int colonsep = 0; char *out; - char *remoteurl = xstrdup(remote_url); + char *remoteurl; struct strbuf sb = STRBUF_INIT; - size_t len = strlen(remoteurl); + size_t len; + + if (!url_is_local_not_ssh(url) || is_absolute_path(url)) + return xstrdup(url); + + len = strlen(remote_url); + if (!len) + BUG("invalid empty remote_url"); + remoteurl = xstrdup(remote_url); if (is_dir_sep(remoteurl[len-1])) remoteurl[len-1] = '\0'; diff --git a/remote.h b/remote.h index 91c7f187863..438152ef562 100644 --- a/remote.h +++ b/remote.h @@ -434,6 +434,7 @@ void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *); * http://a.com/b ../../../c http:/c error out * http://a.com/b ../../../../c http:c error out * http://a.com/b ../../../../../c .:c error out + * http://a.com/b http://d.org/e http://d.org/e as is */ char *relative_url(const char *remote_url, const char *url, -- gitgitgadget