summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Johannes Schindelin <johannes.schindelin@gmx.de>2021-12-03 13:34:24 +0000
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-12-04 21:52:24 -0800
commit4368e40befd308d3055e81f8f6aaaa3fb8fe6407 (patch)
tree51ded11f2432fb410e5f5ab69e1154b77c2a9cd0
parentscalar: implement the `clone` subcommand (diff)
downloadtgif-4368e40befd308d3055e81f8f6aaaa3fb8fe6407.tar.xz
scalar: teach 'clone' to support the --single-branch option
Just like `git clone`, the `scalar clone` command now also offers to restrict the clone to a single branch. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--contrib/scalar/scalar.c9
-rw-r--r--contrib/scalar/scalar.txt12
-rwxr-xr-xcontrib/scalar/t/t9099-scalar.sh6
3 files changed, 23 insertions, 4 deletions
diff --git a/contrib/scalar/scalar.c b/contrib/scalar/scalar.c
index 60a9466421..61b66e48aa 100644
--- a/contrib/scalar/scalar.c
+++ b/contrib/scalar/scalar.c
@@ -327,12 +327,15 @@ static char *remote_default_branch(const char *url)
static int cmd_clone(int argc, const char **argv)
{
const char *branch = NULL;
- int full_clone = 0;
+ int full_clone = 0, single_branch = 0;
struct option clone_options[] = {
OPT_STRING('b', "branch", &branch, N_("<branch>"),
N_("branch to checkout after clone")),
OPT_BOOL(0, "full-clone", &full_clone,
N_("when cloning, create full working directory")),
+ OPT_BOOL(0, "single-branch", &single_branch,
+ N_("only download metadata for the branch that will "
+ "be checked out")),
OPT_END(),
};
const char * const clone_usage[] = {
@@ -403,7 +406,9 @@ static int cmd_clone(int argc, const char **argv)
if (set_config("remote.origin.url=%s", url) ||
set_config("remote.origin.fetch="
- "+refs/heads/*:refs/remotes/origin/*") ||
+ "+refs/heads/%s:refs/remotes/origin/%s",
+ single_branch ? branch : "*",
+ single_branch ? branch : "*") ||
set_config("remote.origin.promisor=true") ||
set_config("remote.origin.partialCloneFilter=blob:none")) {
res = error(_("could not configure remote in '%s'"), dir);
diff --git a/contrib/scalar/scalar.txt b/contrib/scalar/scalar.txt
index e8730967f1..56f744a4aa 100644
--- a/contrib/scalar/scalar.txt
+++ b/contrib/scalar/scalar.txt
@@ -8,7 +8,7 @@ scalar - an opinionated repository management tool
SYNOPSIS
--------
[verse]
-scalar clone [--branch <main-branch>] [--full-clone] <url> [<enlistment>]
+scalar clone [--single-branch] [--branch <main-branch>] [--full-clone] <url> [<enlistment>]
scalar list
scalar register [<enlistment>]
scalar unregister [<enlistment>]
@@ -57,6 +57,16 @@ HEAD[:<directory>]`.
Instead of checking out the branch pointed to by the cloned
repository's HEAD, check out the `<name>` branch instead.
+--[no-]single-branch::
+ Clone only the history leading to the tip of a single branch, either
+ specified by the `--branch` option or the primary branch remote's
+ `HEAD` points at.
++
+Further fetches into the resulting repository will only update the
+remote-tracking branch for the branch this option was used for the initial
+cloning. If the HEAD at the remote did not point at any branch when
+`--single-branch` clone was made, no remote-tracking branch is created.
+
--[no-]full-clone::
A sparse-checkout is initialized by default. This behavior can be
turned off via `--full-clone`.
diff --git a/contrib/scalar/t/t9099-scalar.sh b/contrib/scalar/t/t9099-scalar.sh
index 984d69e8f7..f60e086d6f 100755
--- a/contrib/scalar/t/t9099-scalar.sh
+++ b/contrib/scalar/t/t9099-scalar.sh
@@ -45,13 +45,17 @@ test_expect_success 'set up repository to clone' '
test_expect_success 'scalar clone' '
second=$(git rev-parse --verify second:second.t) &&
- scalar clone "file://$(pwd)" cloned &&
+ scalar clone "file://$(pwd)" cloned --single-branch &&
(
cd cloned/src &&
git config --get --global --fixed-value maintenance.repo \
"$(pwd)" &&
+ git for-each-ref --format="%(refname)" refs/remotes/origin/ >actual &&
+ echo "refs/remotes/origin/parallel" >expect &&
+ test_cmp expect actual &&
+
test_path_is_missing 1/2 &&
test_must_fail git rev-list --missing=print $second &&
git rev-list $second &&