From: Michael Barabanov Date: Thu, 17 Jul 2014 18:41:26 GMT Subject: Re: [PATCH] use local cloning if insteadOf makes a local URL Message-ID: <53C818D6.7020907@windriver.com> In-Reply-To: On 07/17/2014 10:23 AM, Junio C Hamano wrote: > Michael Barabanov writes: >> Move the is_local logic to the place where origin remote has been setup and >> check if the remote url can be used to do local cloning. >> >> This saves a lot of space (and time) in some of the mirroring scenarios that >> involve insteadOf rewrites. >> >> Signed-off-by: Michael Barabanov >> --- > > Strictly speaking, this change introduces a regression to those who > would rather use --no-local if they knew the are cloning from a > local copy, but they can rewrite their insteadOf to use file:// URL > as a workaround. Plus --no-local still works on command line, even if rewritten URL ends up to be local. > > The code change looked OK from a cursory read, modulo possibly > introducing a new memory leak on the old value of "path" (I didn't > check carefully). In fact, I couldn't find where original "path" is freed anyway. Memory will be freed when the clone process exits of course. Michael. > > Thanks. > >> builtin/clone.c | 25 +++++++++++++------------ >> 1 file changed, 13 insertions(+), 12 deletions(-) >> >> diff --git a/builtin/clone.c b/builtin/clone.c >> index f0dabec..bbd169c 100644 >> --- a/builtin/clone.c >> +++ b/builtin/clone.c >> @@ -799,18 +799,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix) >> die(_("repository '%s' does not exist"), repo_name); >> else >> repo = repo_name; >> - is_local = option_local != 0 && path && !is_bundle; >> - if (is_local) { >> - if (option_depth) >> - warning(_("--depth is ignored in local clones; use file:// instead.")); >> - if (!access(mkpath("%s/shallow", path), F_OK)) { >> - if (option_local > 0) >> - warning(_("source repository is shallow, ignoring --local")); >> - is_local = 0; >> - } >> - } >> - if (option_local > 0 && !is_local) >> - warning(_("--local is ignored")); >> >> /* no need to be strict, transport_set_option() will validate it again */ >> if (option_depth && atoi(option_depth) < 1) >> @@ -903,6 +891,19 @@ int cmd_clone(int argc, const char **argv, const char *prefix) >> >> remote = remote_get(option_origin); >> transport = transport_get(remote, remote->url[0]); >> + path = get_repo_path(remote->url[0], &is_bundle); >> + is_local = option_local != 0 && path && !is_bundle; >> + if (is_local) { >> + if (option_depth) >> + warning(_("--depth is ignored in local clones; use file:// instead.")); >> + if (!access(mkpath("%s/shallow", path), F_OK)) { >> + if (option_local > 0) >> + warning(_("source repository is shallow, ignoring --local")); >> + is_local = 0; >> + } >> + } >> + if (option_local > 0 && !is_local) >> + warning(_("--local is ignored")); >> transport->cloning = 1; >> >> if (!transport->get_refs_list || (!is_local && !transport->fetch)) >