Skip to content

Commit 909376a

Browse files
committed
Merge branch 'rc/ls-remote-default'
* rc/ls-remote-default: ls-remote: fall-back to default remotes when no remote specified
2 parents 3cc9caa + 9c00de5 commit 909376a

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

builtin/ls-remote.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
#include "remote.h"
55

66
static const char ls_remote_usage[] =
7-
"git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>] <repository> <refs>...";
7+
"git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>]\n"
8+
" [<repository> [<refs>...]]";
89

910
/*
1011
* Is there one among the list of patterns that match the tail part
@@ -73,9 +74,6 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
7374
break;
7475
}
7576

76-
if (!dest)
77-
usage(ls_remote_usage);
78-
7977
if (argv[i]) {
8078
int j;
8179
pattern = xcalloc(sizeof(const char *), argc - i + 1);
@@ -87,6 +85,11 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
8785
}
8886
}
8987
remote = remote_get(dest);
88+
if (!remote) {
89+
if (dest)
90+
die("bad repository '%s'", dest);
91+
die("No remote configured to list refs from.");
92+
}
9093
if (!remote->url_nr)
9194
die("remote %s has no configured URL", dest);
9295
transport = transport_get(remote, NULL);

t/t5512-ls-remote.sh

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,62 @@ test_expect_success 'ls-remote self' '
4949
5050
'
5151

52+
test_expect_success 'dies when no remote specified and no default remotes found' '
53+
54+
test_must_fail git ls-remote
55+
56+
'
57+
58+
test_expect_success 'use "origin" when no remote specified' '
59+
60+
git remote add origin "$(pwd)/.git" &&
61+
git ls-remote >actual &&
62+
test_cmp expected.all actual
63+
64+
'
65+
66+
test_expect_success 'use branch.<name>.remote if possible' '
67+
68+
#
69+
# Test that we are indeed using branch.<name>.remote, not "origin", even
70+
# though the "origin" remote has been set.
71+
#
72+
73+
# setup a new remote to differentiate from "origin"
74+
git clone . other.git &&
75+
(
76+
cd other.git &&
77+
echo "$(git rev-parse HEAD) HEAD"
78+
git show-ref | sed -e "s/ / /"
79+
) >exp &&
80+
81+
git remote add other other.git &&
82+
git config branch.master.remote other &&
83+
84+
git ls-remote >actual &&
85+
test_cmp exp actual
86+
87+
'
88+
89+
cat >exp <<EOF
90+
fatal: 'refs*master' does not appear to be a git repository
91+
fatal: The remote end hung up unexpectedly
92+
EOF
93+
test_expect_success 'confuses pattern as remote when no remote specified' '
94+
#
95+
# Do not expect "git ls-remote <pattern>" to work; ls-remote, correctly,
96+
# confuses <pattern> for <remote>. Although ugly, this behaviour is akin
97+
# to the confusion of refspecs for remotes by git-fetch and git-push,
98+
# eg:
99+
#
100+
# $ git fetch branch
101+
#
102+
103+
# We could just as easily have used "master"; the "*" emphasizes its
104+
# role as a pattern.
105+
test_must_fail git ls-remote refs*master >actual 2>&1 &&
106+
test_cmp exp actual
107+
108+
'
109+
52110
test_done

0 commit comments

Comments
 (0)