fetch_refs_via_pack: call report_unmatched_refs
"git fetch" currently doesn't bother to check that it got all refs it sought, because the common case of requesting a nonexistent ref triggers a die() in get_fetch_map. However, there's at least one case that slipped through: "git fetch REMOTE SHA1" if the server doesn't allow requests for unadvertised objects. Make fetch_refs_via_pack (which is on the "git fetch" code path) call report_unmatched_refs so that we at least get an error message in that case. Signed-off-by: Matt McCutchen <matt@mattmccutchen.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e860d96bf8
commit
e70a65c5d8
@ -1098,7 +1098,8 @@ test_expect_success 'fetch exact SHA1' '
|
||||
test_must_fail git cat-file -t $the_commit &&
|
||||
|
||||
# fetching the hidden object should fail by default
|
||||
test_must_fail git fetch -v ../testrepo $the_commit:refs/heads/copy &&
|
||||
test_must_fail git fetch -v ../testrepo $the_commit:refs/heads/copy 2>err &&
|
||||
test_i18ngrep "no such remote ref" err &&
|
||||
test_must_fail git rev-parse --verify refs/heads/copy &&
|
||||
|
||||
# the server side can allow it to succeed
|
||||
|
14
transport.c
14
transport.c
@ -204,6 +204,7 @@ static struct ref *get_refs_via_connect(struct transport *transport, int for_pus
|
||||
static int fetch_refs_via_pack(struct transport *transport,
|
||||
int nr_heads, struct ref **to_fetch)
|
||||
{
|
||||
int ret = 0;
|
||||
struct git_transport_data *data = transport->data;
|
||||
struct ref *refs;
|
||||
char *dest = xstrdup(transport->url);
|
||||
@ -241,19 +242,22 @@ static int fetch_refs_via_pack(struct transport *transport,
|
||||
&transport->pack_lockfile);
|
||||
close(data->fd[0]);
|
||||
close(data->fd[1]);
|
||||
if (finish_connect(data->conn)) {
|
||||
free_refs(refs);
|
||||
refs = NULL;
|
||||
}
|
||||
if (finish_connect(data->conn))
|
||||
ret = -1;
|
||||
data->conn = NULL;
|
||||
data->got_remote_heads = 0;
|
||||
data->options.self_contained_and_connected =
|
||||
args.self_contained_and_connected;
|
||||
|
||||
if (refs == NULL)
|
||||
ret = -1;
|
||||
if (report_unmatched_refs(to_fetch, nr_heads))
|
||||
ret = -1;
|
||||
|
||||
free_refs(refs_tmp);
|
||||
free_refs(refs);
|
||||
free(dest);
|
||||
return (refs ? 0 : -1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int push_had_errors(struct ref *ref)
|
||||
|
Loading…
Reference in New Issue
Block a user