diff options
author | Junio C Hamano <gitster@pobox.com> | 2022-10-18 00:56:35 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-10-18 00:56:35 +0300 |
commit | a2e618cb0fa76a453f41f2095653190e785f1c66 (patch) | |
tree | beb7a7d3893e1fd2cd3ea506a984015e9a0abda6 | |
parent | 2790ba84b6611820caa57fc624304d7ef2efdcdf (diff) | |
parent | 301f1e3ac1531dc3a15064a06b24fa98f02a3b78 (diff) |
Merge branch 'jt/promisor-remote-fetch-tweak'
Remove error detection from a function that fetches from promisor
remotes, and make it die when such a fetch fails to bring all the
requested objects, to give an early failure to various operations.
* jt/promisor-remote-fetch-tweak:
promisor-remote: die upon failing fetch
promisor-remote: remove a return value
-rw-r--r-- | object-file.c | 4 | ||||
-rw-r--r-- | promisor-remote.c | 23 | ||||
-rw-r--r-- | promisor-remote.h | 11 | ||||
-rwxr-xr-x | t/t0410-partial-clone.sh | 14 |
4 files changed, 33 insertions, 19 deletions
diff --git a/object-file.c b/object-file.c index 5b270f046d..5e30960234 100644 --- a/object-file.c +++ b/object-file.c @@ -1599,10 +1599,6 @@ static int do_oid_object_info_extended(struct repository *r, if (fetch_if_missing && repo_has_promisor_remote(r) && !already_retried && !(flags & OBJECT_INFO_SKIP_FETCH_OBJECT)) { - /* - * TODO Investigate checking promisor_remote_get_direct() - * TODO return value and stopping on error here. - */ promisor_remote_get_direct(r, real, 1); already_retried = 1; continue; diff --git a/promisor-remote.c b/promisor-remote.c index 68f46f5ec7..faa7612941 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -4,6 +4,7 @@ #include "config.h" #include "transport.h" #include "strvec.h" +#include "packfile.h" struct promisor_remote_config { struct promisor_remote *promisors; @@ -230,18 +231,18 @@ static int remove_fetched_oids(struct repository *repo, return remaining_nr; } -int promisor_remote_get_direct(struct repository *repo, - const struct object_id *oids, - int oid_nr) +void promisor_remote_get_direct(struct repository *repo, + const struct object_id *oids, + int oid_nr) { struct promisor_remote *r; struct object_id *remaining_oids = (struct object_id *)oids; int remaining_nr = oid_nr; int to_free = 0; - int res = -1; + int i; if (oid_nr == 0) - return 0; + return; promisor_remote_init(repo); @@ -256,12 +257,16 @@ int promisor_remote_get_direct(struct repository *repo, continue; } } - res = 0; - break; + goto all_fetched; } + for (i = 0; i < remaining_nr; i++) { + if (is_promisor_object(&remaining_oids[i])) + die(_("could not fetch %s from promisor remote"), + oid_to_hex(&remaining_oids[i])); + } + +all_fetched: if (to_free) free(remaining_oids); - - return res; } diff --git a/promisor-remote.h b/promisor-remote.h index edc45ab0f5..df36eb08ef 100644 --- a/promisor-remote.h +++ b/promisor-remote.h @@ -39,13 +39,12 @@ static inline int has_promisor_remote(void) /* * Fetches all requested objects from all promisor remotes, trying them one at - * a time until all objects are fetched. Returns 0 upon success, and non-zero - * otherwise. + * a time until all objects are fetched. * - * If oid_nr is 0, this function returns 0 (success) immediately. + * If oid_nr is 0, this function returns immediately. */ -int promisor_remote_get_direct(struct repository *repo, - const struct object_id *oids, - int oid_nr); +void promisor_remote_get_direct(struct repository *repo, + const struct object_id *oids, + int oid_nr); #endif /* PROMISOR_REMOTE_H */ diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh index 1e864cf317..5b7bee888d 100755 --- a/t/t0410-partial-clone.sh +++ b/t/t0410-partial-clone.sh @@ -215,6 +215,20 @@ test_expect_success 'fetching of missing objects' ' grep "$HASH" out ' +test_expect_success 'fetching of a promised object that promisor remote no longer has' ' + rm -f err && + test_create_repo unreliable-server && + git -C unreliable-server config uploadpack.allowanysha1inwant 1 && + git -C unreliable-server config uploadpack.allowfilter 1 && + test_commit -C unreliable-server foo && + + git clone --filter=blob:none --no-checkout "file://$(pwd)/unreliable-server" unreliable-client && + + rm -rf unreliable-server/.git/objects/* && + test_must_fail git -C unreliable-client checkout HEAD 2>err && + grep "could not fetch.*from promisor remote" err +' + test_expect_success 'fetching of missing objects works with ref-in-want enabled' ' # ref-in-want requires protocol version 2 git -C server config protocol.version 2 && |