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>

Jeff King committed Feb 14, 2017 at 15:33 UTC 4539c218c362f2c1a26c61b1aa57af10342fd5a4
2 files changed +10 -1
remote.c
+1 -1
@@ -689,7 +689,7 @@ static struct remote *remote_get_1(const char *name,
689 name = get_default(current_branch, &name_given);
690
691 ret = make_remote(name, 0);
692 - if (valid_remote_nick(name)) {
692 + if (valid_remote_nick(name) && have_git_dir()) {
693 if (!valid_remote(ret))
694 read_remotes_file(ret);
695 if (!valid_remote(ret))
t/t5512-ls-remote.sh
+9
@@ -248,4 +248,13 @@ test_expect_success PIPE,JGIT,GIT_DAEMON 'indicate no refs in standards-complian
248 test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git
249 '
250
251 +test_expect_success 'ls-remote works outside repository' '
252 + # It is important for this repo to be inside the nongit
253 + # area, as we want a repo name that does not include
254 + # slashes (because those inhibit some of our configuration
255 + # lookups).
256 + nongit git init --bare dst.git &&
257 + nongit git ls-remote dst.git
258 +'
259 +
260 test_done