From af94e1f03991a98775934a67433f10d2ac46a727 Mon Sep 17 00:00:00 2001 From: Derrick Stolee Date: Wed, 1 May 2024 10:08:11 -0400 Subject: [PATCH] scalar: make GVFS Protocol a forced choice * Add --[no-]gvfs-protocol option. * Remove fallback. TODO: expand this message. Signed-off-by: Derrick Stolee --- Documentation/scalar.txt | 20 ++++++++++++++++++++ scalar.c | 19 ++++++++++++++++--- t/t9210-scalar.sh | 25 ++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Documentation/scalar.txt b/Documentation/scalar.txt index 38612f4bcae6e2..dab62be71fe496 100644 --- a/Documentation/scalar.txt +++ b/Documentation/scalar.txt @@ -103,6 +103,26 @@ clone), and `~/.scalarCache` on macOS. Retrieve missing objects from the specified remote, which is expected to understand the GVFS protocol. +--[no-]gvfs-protocol:: + When cloning from a `` with either `dev.azure.com` or + `visualstudio.com` in the name, `scalar clone` will attempt to use the GVFS + Protocol to access Git objects, specifically from a cache server when + available, and will fail to clone if there is an error over that protocol. + + To enable the GVFS Protocol regardless of the origin ``, use + `--gvfs-protocol`. This will cause `scalar clone` to fail when the origin + server fails to provide a valid response to the `gvfs/config` endpoint. + + To disable the GVFS Protocol, use `--no-gvfs-protocol` and `scalar clone` + will only use the Git protocol, starting with a partial clone. This can be + helpful if your `` points to Azure Repos but the repository does not + have GVFS cache servers enabled. It is likely more efficient to use its + partial clone functionality through the Git protocol. + + Previous versions of `scalar clone` could fall back to a partial clone over + the Git protocol if there is any issue gathering GVFS configuration + information from the origin server. + List ~~~~ diff --git a/scalar.c b/scalar.c index 5b6ae5b9a59c61..7d3ad362e792a1 100644 --- a/scalar.c +++ b/scalar.c @@ -708,6 +708,8 @@ static int cmd_clone(int argc, const char **argv) int src = 1; const char *cache_server_url = NULL, *local_cache_root = NULL; char *default_cache_server_url = NULL, *local_cache_root_abs = NULL; + int gvfs_protocol = -1; + struct option clone_options[] = { OPT_STRING('b', "branch", &branch, N_(""), N_("branch to checkout after clone")), @@ -718,6 +720,8 @@ static int cmd_clone(int argc, const char **argv) "be checked out")), OPT_BOOL(0, "src", &src, N_("create repository within 'src' directory")), + OPT_BOOL(0, "gvfs-protocol", &gvfs_protocol, + N_("force enable (or disable) the GVFS Protocol")), OPT_STRING(0, "cache-server-url", &cache_server_url, N_(""), N_("the url or friendly name of the cache server")), @@ -737,7 +741,6 @@ static int cmd_clone(int argc, const char **argv) char *enlistment = NULL, *dir = NULL; struct strbuf buf = STRBUF_INIT; int res; - int gvfs_protocol; argc = parse_options(argc, argv, NULL, clone_options, clone_usage, 0); @@ -845,8 +848,18 @@ static int cmd_clone(int argc, const char **argv) goto cleanup; } - gvfs_protocol = cache_server_url || - supports_gvfs_protocol(url, &default_cache_server_url); + /* Is --[no-]gvfs-protocol unspecified? Infer from url. */ + if (gvfs_protocol < 0) { + if (cache_server_url || + strstr(url, "dev.azure.com") || + strstr(url, "visualstudio.com")) + gvfs_protocol = 1; + else + gvfs_protocol = 0; + } + + if (gvfs_protocol && !supports_gvfs_protocol(url, &default_cache_server_url)) + die(_("failed to contact server via GVFS Protocol")); if (gvfs_protocol) { if ((res = init_shared_object_cache(url, local_cache_root))) diff --git a/t/t9210-scalar.sh b/t/t9210-scalar.sh index ac3b8b3a02bfdf..ceff5050b77192 100755 --- a/t/t9210-scalar.sh +++ b/t/t9210-scalar.sh @@ -314,7 +314,12 @@ test_expect_success '`scalar clone` with GVFS-enabled server' ' # We must set credential.interactive=true to bypass a setting # in "scalar clone" that disables interactive credentials during # an unattended command. - scalar -c credential.interactive=true clone --single-branch -- http://$HOST_PORT/ using-gvfs && + GIT_TRACE2_EVENT="$(pwd)/clone-trace-with-gvfs" scalar \ + -c credential.interactive=true \ + clone --gvfs-protocol \ + --single-branch -- http://$HOST_PORT/ using-gvfs && + + grep "GET/config(main)"