From: Sean Barag <sean@xxxxxxxxx> Providing a bad origin name to `git clone` currently reports an 'invalid refspec' error instead of a more explicit message explaining that the `--origin` option was malformed. Per Junio, it's been this way since 8434c2f1 (Build in clone, 2008-04-27). This patch reintroduces validation for the provided `--origin` option, but notably _doesn't_ include a multi-level check (e.g. "foo/bar") that was present in the original `git-clone.sh`. It seems `git remote` allows multi-level remote names, so applying that same validation in `git clone` seems reasonable. Signed-off-by: Sean Barag <sean@xxxxxxxxx> Thanks-to: Junio C Hamano <gitster@xxxxxxxxx> --- builtin/clone.c | 7 +++++++ t/t5606-clone-options.sh | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/builtin/clone.c b/builtin/clone.c index bf095815f0..1cd62d0001 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -967,6 +967,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) const struct ref *ref; struct strbuf key = STRBUF_INIT; struct strbuf default_refspec = STRBUF_INIT; + struct strbuf resolved_refspec = STRBUF_INIT; struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT; struct transport *transport = NULL; const char *src_ref_prefix = "refs/heads/"; @@ -1011,6 +1012,12 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (!option_origin) option_origin = "origin"; + strbuf_addf(&resolved_refspec, "refs/heads/test:refs/remotes/%s/test", option_origin); + if (!valid_fetch_refspec(resolved_refspec.buf)) + /* TRANSLATORS: %s will be the user-provided --origin / -o option */ + die(_("'%s' is not a valid origin name"), option_origin); + strbuf_release(&resolved_refspec); + repo_name = argv[0]; path = get_repo_path(repo_name, &is_bundle); diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index d20a78f84b..c865f96def 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -19,6 +19,14 @@ test_expect_success 'clone -o' ' ' +test_expect_success 'rejects invalid -o/--origin' ' + + test_expect_code 128 git clone -o "bad...name" parent clone-bad-name 2>err && + test_debug "cat err" && + test_i18ngrep "'\''bad...name'\'' is not a valid origin name" err + +' + test_expect_success 'disallows --bare with --origin' ' test_expect_code 128 git clone -o foo --bare parent clone-bare-o 2>err && -- gitgitgadget