Merge branch 'jn/remote-helpers-with-git-dir' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 24 Mar 2017 19:57:53 +0000 (12:57 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 24 Mar 2017 19:57:53 +0000 (12:57 -0700)
"git ls-remote" and "git archive --remote" are designed to work
without being in a directory under Git's control. However, recent
updates revealed that we randomly look into a directory called
.git/ without actually doing necessary set-up when working in a
repository. Stop doing so.

* jn/remote-helpers-with-git-dir:
remote helpers: avoid blind fall-back to ".git" when setting GIT_DIR
remote: avoid reading $GIT_DIR config in non-repo

remote.c
t/t5512-ls-remote.sh
t/t5550-http-fetch-dumb.sh
transport-helper.c
index bf1bf2309128bf886eac16959b8162b9990c98d7..9f83fe2c4cbd477e47fc6c81eab324be7aa088c6 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -693,7 +693,7 @@ static struct remote *remote_get_1(const char *name,
                name = get_default(current_branch, &name_given);
 
        ret = make_remote(name, 0);
-       if (valid_remote_nick(name)) {
+       if (valid_remote_nick(name) && have_git_dir()) {
                if (!valid_remote(ret))
                        read_remotes_file(ret);
                if (!valid_remote(ret))
index 55fc83fc0624fa9bf1a024c4bc4aede25999fae0..94fc9be9ced3c89214b29e11c95201a38cc99d74 100755 (executable)
@@ -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_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
index 2d3b1e9f937219b84069d9d0b1ce17129e87d110..87308cdced9af11365d5eb0644b9ac86fac21177 100755 (executable)
@@ -34,6 +34,15 @@ test_expect_success 'clone http repository' '
        test_cmp file clone/file
 '
 
+test_expect_success 'list refs from outside any repository' '
+       cat >expect <<-EOF &&
+       $(git rev-parse master) HEAD
+       $(git rev-parse master) refs/heads/master
+       EOF
+       nongit git ls-remote "$HTTPD_URL/dumb/repo.git" >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'create password-protected repository' '
        mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/" &&
        cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
index 1258d6aedd26538f55c60495a61608236262cfc1..dc90a1fb769c078be2fbf77018242b6fc209acf6 100644 (file)
@@ -124,8 +124,9 @@ static struct child_process *get_helper(struct transport *transport)
        helper->git_cmd = 0;
        helper->silent_exec_failure = 1;
 
-       argv_array_pushf(&helper->env_array, "%s=%s", GIT_DIR_ENVIRONMENT,
-                        get_git_dir());
+       if (have_git_dir())
+               argv_array_pushf(&helper->env_array, "%s=%s",
+                                GIT_DIR_ENVIRONMENT, get_git_dir());
 
        code = start_command(helper);
        if (code < 0 && errno == ENOENT)