remote: avoid reading $GIT_DIR config in non-repo

The "git ls-remote" command can be run outside of a
repository, but needs to look up configured remotes. The
config code is smart enough to handle this case itself, but
we also check the historical "branches" and "remotes" paths
in $GIT_DIR. The git_path() function causes us to blindly
look at ".git/remotes", even if we know we aren't in a git
repository.

For now, this is just an unlikely bug (you probably don't
have such a file if you're not in a repository), but it will
become more obvious once we merge b1ef400ee (setup_git_env:
avoid blind fall-back to ".git", 2016-10-20):

  [now]
  $ git ls-remote
  fatal: No remote configured to list refs from.

  [with b1ef400ee]
  $ git ls-remote
  fatal: BUG: setup_git_env called without repository

We can fix this by skipping these sources entirely when
we're outside of a repository.

The test is a little more complex than the demonstration
above. Rather than detect the correct behavior by parsing
the error message, we can actually set up a case where the
remote name we give is a valid repository, but b1ef400ee
would cause us to die in the configuration step.

This test doesn't fail now, but it future-proofs us for the
b1ef400ee change.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-02-14 15:33:28 -05:00 коммит произвёл Junio C Hamano
Родитель 3b9e3c2ced
Коммит 4539c218c3
2 изменённых файлов: 10 добавлений и 1 удалений

Просмотреть файл

@ -689,7 +689,7 @@ static struct remote *remote_get_1(const char *name,
name = get_default(current_branch, &name_given); name = get_default(current_branch, &name_given);
ret = make_remote(name, 0); ret = make_remote(name, 0);
if (valid_remote_nick(name)) { if (valid_remote_nick(name) && have_git_dir()) {
if (!valid_remote(ret)) if (!valid_remote(ret))
read_remotes_file(ret); read_remotes_file(ret);
if (!valid_remote(ret)) if (!valid_remote(ret))

Просмотреть файл

@ -248,4 +248,13 @@ test_expect_success PIPE,JGIT,GIT_DAEMON 'indicate no refs in standards-complian
test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git
' '
test_expect_success 'ls-remote works outside repository' '
# It is important for this repo to be inside the nongit
# area, as we want a repo name that does not include
# slashes (because those inhibit some of our configuration
# lookups).
nongit git init --bare dst.git &&
nongit git ls-remote dst.git
'
test_done test_done