Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Documentation/scalar.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ SYNOPSIS
[verse]
scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]
[--[no-]src] [--[no-]tags] [--[no-]maintenance]
[--[no-]src] [--local-cache-path <path>] [--cache-server-url <url>]
<url> [<enlistment>]
[--cache-server-url <url>] [--[verb]-cache-server-url <url>]
[--local-cache-path <path>] <url> [<enlistment>]
scalar list
scalar register [--[no-]maintenance] [<enlistment>]
scalar unregister [<enlistment>]
Expand Down Expand Up @@ -121,6 +121,11 @@ clone), and `~/.scalarCache` on macOS.
Retrieve missing objects from the specified remote, which is expected to
understand the GVFS protocol.

--[verb]-cache-server-url <url>::
Set the appropriate `gvfs.<verb>.cache-server` config value that overrides
the provided `--cache-server-url` or the dynamically discovered URL. The
list of allowed verbs is `prefetch`, `get`, and `post`.

--gvfs-protocol::
--no-gvfs-protocol::
When cloning from a `<url>` with either `dev.azure.com` or
Expand Down
40 changes: 39 additions & 1 deletion scalar.c
Original file line number Diff line number Diff line change
Expand Up @@ -773,6 +773,7 @@ static int cmd_clone(int argc, const char **argv)
int src = 1, tags = 1, maintenance = 1;
const char *cache_server_url = NULL, *local_cache_root = NULL;
char *default_cache_server_url = NULL, *local_cache_root_abs = NULL;
const char *prefetch_server = NULL, *get_server = NULL, *post_server = NULL;
int gvfs_protocol = -1;
const char *ref_format = NULL;

Expand All @@ -795,6 +796,15 @@ static int cmd_clone(int argc, const char **argv)
OPT_STRING(0, "cache-server-url", &cache_server_url,
N_("<url>"),
N_("the url or friendly name of the cache server")),
OPT_STRING(0, "prefetch-cache-server-url", &prefetch_server,
N_("<url>"),
N_("the url or friendly name of a cache server for the prefetch endpoint")),
OPT_STRING(0, "get-cache-server-url", &get_server,
N_("<url>"),
N_("the url or friendly name of a cache server for the objects GET endpoint")),
OPT_STRING(0, "post-cache-server-url", &post_server,
N_("<url>"),
N_("the url or friendly name of a cache server for the objects POST endpoint")),
OPT_STRING(0, "local-cache-path", &local_cache_root,
N_("<path>"),
N_("override the path for the local Scalar cache")),
Expand All @@ -807,7 +817,8 @@ static int cmd_clone(int argc, const char **argv)
const char * const clone_usage[] = {
N_("scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]\n"
"\t[--[no-]src] [--[no-]tags] [--[no-]maintenance] [--ref-format <format>]\n"
"\t<url> [<enlistment>]"),
"\t[--cache-server-url <url>] [--[verb]-cache-server-url <url>]\n"
"\t[--local-cache-path <path>] <url> [<enlistment>]"),
NULL
};
const char *url;
Expand Down Expand Up @@ -969,6 +980,33 @@ static int cmd_clone(int argc, const char **argv)
if (cache_server_url)
fprintf(stderr, "Cache server URL: %s\n",
cache_server_url);

if (prefetch_server &&
set_config("gvfs.prefetch.cache-server=%s", prefetch_server)) {
res = error(_("could not configure prefetch cache server"));
goto cleanup;
}
if (prefetch_server)
fprintf(stderr, "Prefetch cache server URL: %s\n",
prefetch_server);

if (get_server &&
set_config("gvfs.get.cache-server=%s", get_server)) {
res = error(_("could not configure objects GET cache server"));
goto cleanup;
}
if (get_server)
fprintf(stderr, "Objects GET cache server URL: %s\n",
get_server);

if (post_server &&
set_config("gvfs.post.cache-server=%s", post_server)) {
res = error(_("could not configure objects POST cache server"));
goto cleanup;
}
if (post_server)
fprintf(stderr, "Objects POST cache server URL: %s\n",
post_server);
} else {
if (set_config("core.useGVFSHelper=false") ||
set_config("remote.origin.promisor=true") ||
Expand Down
41 changes: 41 additions & 0 deletions t/t9210-scalar.sh
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,47 @@ test_expect_success '`scalar clone` with GVFS-enabled server' '
)
'

. "$TEST_DIRECTORY"/lib-gvfs-helper.sh

test_expect_success 'scalar clone: all verbs with different servers' '
git config --global core.askPass true &&

test_when_finished "per_test_cleanup" &&
test_when_finished "scalar delete scalar-clone" &&

start_gvfs_protocol_server 1 &&
start_gvfs_protocol_server 2 &&
start_gvfs_protocol_server 3 &&

# Configure each verb to use a different server:
# - server 0: default (unused in this test; not running.)
# - server 1: prefetch
# - server 2: get
# - server 3: post
scalar -c credential.interactive=true \
clone --full-clone \
--cache-server-url="$(cache_server_url 0)" \
--prefetch-cache-server-url="$(cache_server_url 1)" \
--get-cache-server-url="$(cache_server_url 2)" \
--post-cache-server-url="$(cache_server_url 3)" \
--gvfs-protocol \
-- "http://$HOST_PORT/" scalar-clone 2>err >out &&

test_grep "Cache server URL: $(cache_server_url 0)" err &&
test_grep "Prefetch cache server URL: $(cache_server_url 1)" err &&
test_grep "Objects GET cache server URL: $(cache_server_url 2)" err &&
test_grep "Objects POST cache server URL: $(cache_server_url 3)" err &&

test_cmp_config -C scalar-clone/src "$(cache_server_url 0)" gvfs.cache-server &&
test_cmp_config -C scalar-clone/src "$(cache_server_url 1)" gvfs.prefetch.cache-server &&
test_cmp_config -C scalar-clone/src "$(cache_server_url 2)" gvfs.get.cache-server &&
test_cmp_config -C scalar-clone/src "$(cache_server_url 3)" gvfs.post.cache-server &&

verify_server_was_contacted 1 &&
verify_server_was_contacted 2 &&
verify_server_was_contacted 3
'

test_expect_success 'fetch <non-existent> does not hang in gvfs-helper' '
test_must_fail git -C using-gvfs/src fetch origin does-not-exist
'
Expand Down
Loading