From patchwork Fri Nov 4 01:03:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Abel X-Patchwork-Id: 13031139 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C737C433FE for ; Fri, 4 Nov 2022 01:03:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229954AbiKDBDP (ORCPT ); Thu, 3 Nov 2022 21:03:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229492AbiKDBDN (ORCPT ); Thu, 3 Nov 2022 21:03:13 -0400 Received: from mail-4317.proton.ch (mail-4317.proton.ch [185.70.43.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 556D31E3FC for ; Thu, 3 Nov 2022 18:03:12 -0700 (PDT) Date: Fri, 04 Nov 2022 01:03:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nullpo.dev; s=protonmail2; t=1667523790; x=1667782990; bh=11ySiXZgSuqaGTVC5I73fvMaZ8SRBWBbTXDpTVEo8D8=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=dHfuZGKElwGFzMce8n2E8IHjwqIY1dFGLhTAaG3LFPYTcNbpP2wIfM4FeLG/3BHOL +5PrKXLuNdroBAL7/EeT4hTmtR7Gi/IsIzaTMt4IwiCcrESF2KVqa2vs8BNzETxZqz 3gly/zo+HPRDfbLPPhmbCUR5ZuxJaUwtExnazi9sPmnDmxb2k2m1MQRivy+KRDC50Q Kt4gSPeCizoBbiCOnXhq/WLb0CYlQd0QmV3lBngPK5wHaOD98Ar2q2LQyxZv75kX2N BKYCUDGTAb3k1nQzM/YmtfCBPPYZTodUmXdGC8Nx/eiea65edetbragX8uh/qNJsTo zkID9spPeOk1Q== To: git@vger.kernel.org From: Jacob Abel Cc: Jacob Abel Subject: [PATCH 1/4] worktree add: Include -B in usage docs Message-ID: <20221104010242.11555-2-jacobabel@nullpo.dev> In-Reply-To: <20221104010242.11555-1-jacobabel@nullpo.dev> References: <20221104010242.11555-1-jacobabel@nullpo.dev> Feedback-ID: 21506737:user:proton MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org While -B behavior is already documented, it was not included in the usage docs for either the man page or the help text. This change fixes that and brings the usage docs in line with how the flags are documented in other commands such as git checkout. Signed-off-by: Jacob Abel --- Documentation/git-worktree.txt | 2 +- builtin/worktree.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) -- 2.37.4 diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 063d6eeb99..4dd658012b 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -10,7 +10,7 @@ SYNOPSIS -------- [verse] 'git worktree add' [-f] [--detach] [--checkout] [--lock [--reason ]] - [-b ] [] + [[-b | -B] ] [] 'git worktree list' [-v | --porcelain [-z]] 'git worktree lock' [--reason ] 'git worktree move' diff --git a/builtin/worktree.c b/builtin/worktree.c index 4a24d53be1..b3373fbbd6 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -15,9 +15,9 @@ #include "worktree.h" #include "quote.h" -#define BUILTIN_WORKTREE_ADD_USAGE \ +#define BUILTIN_WORKTREE_ADD_USAGE \ N_("git worktree add [-f] [--detach] [--checkout] [--lock [--reason ]]\n" \ - " [-b ] []") + " [[-b | -B] ] []") #define BUILTIN_WORKTREE_LIST_USAGE \ N_("git worktree list [-v | --porcelain [-z]]") #define BUILTIN_WORKTREE_LOCK_USAGE \ From patchwork Fri Nov 4 01:03:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Abel X-Patchwork-Id: 13031140 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id ADE05C433FE for ; Fri, 4 Nov 2022 01:03:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230096AbiKDBD3 (ORCPT ); Thu, 3 Nov 2022 21:03:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230294AbiKDBDW (ORCPT ); Thu, 3 Nov 2022 21:03:22 -0400 Received: from mail-0301.mail-europe.com (mail-0301.mail-europe.com [188.165.51.139]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E765321835 for ; Thu, 3 Nov 2022 18:03:19 -0700 (PDT) Date: Fri, 04 Nov 2022 01:03:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nullpo.dev; s=protonmail2; t=1667523795; x=1667782995; bh=+Aj0MAnQ+PokZzekdXICJISxmuXSjJwPXdeYf0QafEw=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=j4dAkIRjK3FU3Zpiir8rF3qgi9fkOd75db8JpybqjH+4wHizDnA+G8NnCHoeam1MX n0DaKi2keGjLznxY9E5hbevmWxXcEtqsIzkOJU7XtP+5Owaiwac5QTsQyzwDynXAGA 5UAZnGkiSKqnrZGwk5sr0uDbGZpQIwVTVZTunA/70VNyQ8+TRGIKdfM+8hxNiVf7h1 BKzkdouuvYxmPM0mPBEgG2Jbjhj/4M3k0KZf49rKOvk8FW0Up9ujMpFg83gqhghjwm dmNSQQ5BJMWJzQX7gKXhoHHbPjHYqBUd4Mvs/oqZ4zTpvyK13G9EdD5l4zJrE/UhAI E7TUrnXl0ExdQ== To: git@vger.kernel.org From: Jacob Abel Cc: Jacob Abel Subject: [PATCH 2/4] builtin/worktree.c: Update checkout_worktree() to use git-worktree Message-ID: <20221104010242.11555-3-jacobabel@nullpo.dev> In-Reply-To: <20221104010242.11555-1-jacobabel@nullpo.dev> References: <20221104010242.11555-1-jacobabel@nullpo.dev> Feedback-ID: 21506737:user:proton MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Updates the function to call `git checkout` instead of `git reset --hard` to simplify adding orphan support. Signed-off-by: Jacob Abel --- builtin/worktree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.37.4 diff --git a/builtin/worktree.c b/builtin/worktree.c index b3373fbbd6..d40f771848 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -357,7 +357,7 @@ static int checkout_worktree(const struct add_opts *opts, { struct child_process cp = CHILD_PROCESS_INIT; cp.git_cmd = 1; - strvec_pushl(&cp.args, "reset", "--hard", "--no-recurse-submodules", NULL); + strvec_pushl(&cp.args, "checkout", "--no-recurse-submodules", NULL); if (opts->quiet) strvec_push(&cp.args, "--quiet"); strvec_pushv(&cp.env, child_env->v); From patchwork Fri Nov 4 01:03:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Abel X-Patchwork-Id: 13031141 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5225EC4332F for ; Fri, 4 Nov 2022 01:03:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230205AbiKDBDj (ORCPT ); Thu, 3 Nov 2022 21:03:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230262AbiKDBD3 (ORCPT ); Thu, 3 Nov 2022 21:03:29 -0400 Received: from mail-4317.proton.ch (mail-4317.proton.ch [185.70.43.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A14C1EC53 for ; Thu, 3 Nov 2022 18:03:25 -0700 (PDT) Date: Fri, 04 Nov 2022 01:03:20 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nullpo.dev; s=protonmail2; t=1667523803; x=1667783003; bh=Pql34eLJJuLd6n+4bJD6FcYpLXQ6T6WHV+XjgMfKHME=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=dQUo2CbsB57cX0UWFJIsWus7tGagvb76rm0OCvNTYgRb77muhtblry/mUgCDJ4Ydt PAwL3oWJYGj/xTxuCmJ8FQDYSDwFfxhGpAY7MTolDK4MVghwZXZFeSo8NXNpsS3rUK a9/7/TB96++lP8h6eKMkAacxtcXc2v6jGap5c0dvsXOqUsgVVnXTFZSVIEpyBl/my2 8HqFRRggganMy0k9iTl5x7qi2zF+K92uSOkoTsLqRHRhBgq/ueow8MrNKDcdOEQRUR HGpg+uvqCbqI+AJlSljyB2KKhZP3KesP5gmkBlw9/xwr4MbT/MoxWuygJCy1veyEc2 fX9PBMcyBhadA== To: git@vger.kernel.org From: Jacob Abel Cc: Jacob Abel Subject: [PATCH 3/4] worktree add: add --orphan flag Message-ID: <20221104010242.11555-4-jacobabel@nullpo.dev> In-Reply-To: <20221104010242.11555-1-jacobabel@nullpo.dev> References: <20221104010242.11555-1-jacobabel@nullpo.dev> Feedback-ID: 21506737:user:proton MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Adds support for creating an orphan branch when adding a new worktree. This functionality is equivalent to git checkout's --orphan flag. The original reason this feature was implemented was to allow a user to initialise a new repository using solely the worktree oriented workflow. Example usage included below. $ GIT_DIR=".git" git init --bare $ git worktree add --orphan master master/ Signed-off-by: Jacob Abel --- Documentation/git-worktree.txt | 18 ++++++++- builtin/worktree.c | 68 +++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 18 deletions(-) -- 2.37.4 diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 4dd658012b..92bd75564f 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -10,7 +10,7 @@ SYNOPSIS -------- [verse] 'git worktree add' [-f] [--detach] [--checkout] [--lock [--reason ]] - [[-b | -B] ] [] + [[-b | -B | --orphan] ] [] 'git worktree list' [-v | --porcelain [-z]] 'git worktree lock' [--reason ] 'git worktree move' @@ -95,6 +95,17 @@ exist, a new branch based on `HEAD` is automatically created as if `-b ` was given. If `` does exist, it will be checked out in the new worktree, if it's not checked out anywhere else, otherwise the command will refuse to create the worktree (unless `--force` is used). ++ +------------ +$ git worktree add --orphan [] +------------ ++ +Create a worktree containing an orphan branch named `` based +on ``. If `` is not specified, the new orphan branch +will be created based on `HEAD`. ++ +Note that unlike with `-b` or `-B`, this operation will succeed even if +`` is a branch that is currently checked out somewhere else. list:: @@ -222,6 +233,11 @@ This can also be set up as the default behaviour by using the With `prune`, do not remove anything; just report what it would remove. +--orphan :: + With `add`, create a new orphan branch named `` in the new + worktree based on ``. If `` is omitted, it + defaults to `HEAD`. + --porcelain:: With `list`, output in an easy-to-parse format for scripts. This format will remain stable across Git versions and regardless of user diff --git a/builtin/worktree.c b/builtin/worktree.c index d40f771848..70f319a6b5 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -17,7 +17,7 @@ #define BUILTIN_WORKTREE_ADD_USAGE \ N_("git worktree add [-f] [--detach] [--checkout] [--lock [--reason ]]\n" \ - " [[-b | -B] ] []") + " [[-b | -B | --orphan] ] []") #define BUILTIN_WORKTREE_LIST_USAGE \ N_("git worktree list [-v | --porcelain [-z]]") #define BUILTIN_WORKTREE_LOCK_USAGE \ @@ -90,6 +90,8 @@ struct add_opts { int detach; int quiet; int checkout; + int implicit; + const char *orphan_branch; const char *keep_locked; }; @@ -360,6 +362,8 @@ static int checkout_worktree(const struct add_opts *opts, strvec_pushl(&cp.args, "checkout", "--no-recurse-submodules", NULL); if (opts->quiet) strvec_push(&cp.args, "--quiet"); + if (opts->orphan_branch) + strvec_pushl(&cp.args, "--orphan", opts->orphan_branch, NULL); strvec_pushv(&cp.env, child_env->v); return run_command(&cp); } @@ -393,7 +397,8 @@ static int add_worktree(const char *path, const char *refname, die_if_checked_out(symref.buf, 0); } commit = lookup_commit_reference_by_name(refname); - if (!commit) + + if (!commit && !opts->implicit) die(_("invalid reference: %s"), refname); name = worktree_basename(path, &len); @@ -482,10 +487,10 @@ static int add_worktree(const char *path, const char *refname, strvec_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path); cp.git_cmd = 1; - if (!is_branch) + if (!is_branch && commit) { strvec_pushl(&cp.args, "update-ref", "HEAD", oid_to_hex(&commit->object.oid), NULL); - else { + } else { strvec_pushl(&cp.args, "symbolic-ref", "HEAD", symref.buf, NULL); if (opts->quiet) @@ -516,7 +521,7 @@ static int add_worktree(const char *path, const char *refname, * Hook failure does not warrant worktree deletion, so run hook after * is_junk is cleared, but do return appropriate code when hook fails. */ - if (!ret && opts->checkout) { + if (!ret && opts->checkout && !opts->orphan_branch) { struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT; strvec_pushl(&opt.env, "GIT_DIR", "GIT_WORK_TREE", NULL); @@ -608,33 +613,52 @@ static int add(int ac, const char **av, const char *prefix) const char *opt_track = NULL; const char *lock_reason = NULL; int keep_locked = 0; + struct option options[] = { - OPT__FORCE(&opts.force, - N_("checkout even if already checked out in other worktree"), - PARSE_OPT_NOCOMPLETE), + OPT__FORCE( + &opts.force, + N_("checkout even if already checked out in other worktree"), + PARSE_OPT_NOCOMPLETE), OPT_STRING('b', NULL, &new_branch, N_("branch"), N_("create a new branch")), OPT_STRING('B', NULL, &new_branch_force, N_("branch"), N_("create or reset a branch")), - OPT_BOOL('d', "detach", &opts.detach, N_("detach HEAD at named commit")), - OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")), - OPT_BOOL(0, "lock", &keep_locked, N_("keep the new working tree locked")), + OPT_STRING(0, "orphan", &opts.orphan_branch, N_("branch"), + N_("create a new unparented branch")), + OPT_BOOL('d', "detach", &opts.detach, + N_("detach HEAD at named commit")), + OPT_BOOL(0, "checkout", &opts.checkout, + N_("populate the new working tree")), + OPT_BOOL(0, "lock", &keep_locked, + N_("keep the new working tree locked")), OPT_STRING(0, "reason", &lock_reason, N_("string"), N_("reason for locking")), OPT__QUIET(&opts.quiet, N_("suppress progress reporting")), OPT_PASSTHRU(0, "track", &opt_track, NULL, N_("set up tracking mode (see git-branch(1))"), PARSE_OPT_NOARG | PARSE_OPT_OPTARG), - OPT_BOOL(0, "guess-remote", &guess_remote, - N_("try to match the new branch name with a remote-tracking branch")), + OPT_BOOL( + 0, "guess-remote", &guess_remote, + N_("try to match the new branch name with a remote-tracking branch")), OPT_END() }; memset(&opts, 0, sizeof(opts)); opts.checkout = 1; ac = parse_options(ac, av, prefix, options, git_worktree_add_usage, 0); - if (!!opts.detach + !!new_branch + !!new_branch_force > 1) - die(_("options '%s', '%s', and '%s' cannot be used together"), "-b", "-B", "--detach"); + + opts.implicit = ac < 2; + + if (!!opts.detach + !!new_branch + !!new_branch_force + + !!opts.orphan_branch > + 1) + die(_("options '%s', '%s', '%s', and '%s' cannot be used together"), + "-b", "-B", "--orphan", "--detach"); + if (opts.orphan_branch && opt_track) + die(_("'%s' cannot be used with '%s'"), "--orphan", "--track"); + if (opts.orphan_branch && !opts.checkout) + die(_("'%s' cannot be used with '%s'"), "--orphan", + "--no-checkout"); if (lock_reason && !keep_locked) die(_("the option '%s' requires '%s'"), "--reason", "--lock"); if (lock_reason) @@ -646,11 +670,16 @@ static int add(int ac, const char **av, const char *prefix) usage_with_options(git_worktree_add_usage, options); path = prefix_filename(prefix, av[0]); - branch = ac < 2 ? "HEAD" : av[1]; + branch = opts.implicit ? "HEAD" : av[1]; if (!strcmp(branch, "-")) branch = "@{-1}"; + /* + * From here on, new_branch will contain the branch to be checked out, + * and new_branch_force and opts.orphan_branch will tell us which one of + * -b/-B/--orphan is being used. + */ if (new_branch_force) { struct strbuf symref = STRBUF_INIT; @@ -663,6 +692,11 @@ static int add(int ac, const char **av, const char *prefix) strbuf_release(&symref); } + if (opts.orphan_branch) { + new_branch = opts.orphan_branch; + opts.force = 1; + } + if (ac < 2 && !new_branch && !opts.detach) { const char *s = dwim_branch(path, &new_branch); if (s) @@ -686,7 +720,7 @@ static int add(int ac, const char **av, const char *prefix) if (!opts.quiet) print_preparing_worktree_line(opts.detach, branch, new_branch, !!new_branch_force); - if (new_branch) { + if (new_branch && !opts.orphan_branch) { struct child_process cp = CHILD_PROCESS_INIT; cp.git_cmd = 1; strvec_push(&cp.args, "branch"); From patchwork Fri Nov 4 01:03:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Abel X-Patchwork-Id: 13031142 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0216CC433FE for ; Fri, 4 Nov 2022 01:03:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230297AbiKDBDw (ORCPT ); Thu, 3 Nov 2022 21:03:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54572 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230294AbiKDBDq (ORCPT ); Thu, 3 Nov 2022 21:03:46 -0400 Received: from mail-4317.proton.ch (mail-4317.proton.ch [185.70.43.17]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8DFDB205C7 for ; Thu, 3 Nov 2022 18:03:44 -0700 (PDT) Date: Fri, 04 Nov 2022 01:03:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nullpo.dev; s=protonmail2; t=1667523823; x=1667783023; bh=EI/jkfRC63yeLQKrPK+H8+GsFIazDcAz8WsdciEGfu4=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=EgvIDJC7+lh9BHstXkBCeTz+Z+63uZJRVUOqNHYBD167PClQ490Lm4yO2I5ggZQaF mInQsQ0w/wX0M9c5sXQvLDSwZ0XZILYlHvycofaCvkLgrhT9TnXFx1RgmjxoNn66PK iu5nLBzTFAGFAaknOlJJ8yNwTGszyDfvTIV49824nTMA4l6tt371ROI1xgNcoM2E0K zM+jaqjNL2lkPY7i/ilGqwenVNfDgTMlFKOBS4nWDBMwhJSOhqLryqUAztxtW6VMUN oFPAwvObltCmIttwr2Ul22QEOXWNnp2zzfpVYFmQHg/wS5NWZMlci28rwnGMSVdhNY rm3yzsW8QZ5lg== To: git@vger.kernel.org From: Jacob Abel Cc: Jacob Abel Subject: [PATCH 4/4] worktree add: Add unit tests for --orphan Message-ID: <20221104010242.11555-5-jacobabel@nullpo.dev> In-Reply-To: <20221104010242.11555-1-jacobabel@nullpo.dev> References: <20221104010242.11555-1-jacobabel@nullpo.dev> Feedback-ID: 21506737:user:proton MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: Jacob Abel --- t/t2400-worktree-add.sh | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) -- 2.37.4 diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index d587e0b20d..064e1336e2 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -310,6 +310,26 @@ test_expect_success '"add" -B/--detach mutually exclusive' ' test_must_fail git worktree add -B poodle --detach bamboo main ' +test_expect_success '"add" --orphan/-b mutually exclusive' ' + test_must_fail git worktree add --orphan poodle -b poodle bamboo main +' + +test_expect_success '"add" --orphan/-B mutually exclusive' ' + test_must_fail git worktree add --orphan poodle -B poodle bamboo main +' + +test_expect_success '"add" --orphan/--detach mutually exclusive' ' + test_must_fail git worktree add --orphan poodle --detach bamboo main +' + +test_expect_success '"add" --orphan/--no-checkout mutually exclusive' ' + test_must_fail git worktree add --orphan poodle --no-checkout bamboo main +' + +test_expect_success '"add" -B/--detach mutually exclusive' ' + test_must_fail git worktree add -B poodle --detach bamboo main +' + test_expect_success '"add -B" fails if the branch is checked out' ' git rev-parse newmain >before && test_must_fail git worktree add -B newmain bamboo main && @@ -330,6 +350,40 @@ test_expect_success 'add --quiet' ' test_must_be_empty actual ' +test_expect_success '"add --orphan"' ' + git worktree add --orphan neworphan orphandir main && + git -C orphandir symbolic-ref HEAD >actual && + echo refs/heads/neworphan >expected && + test_cmp expected actual && + ( + cd orphandir && + git diff main + ) +' + +test_expect_success '"add --orphan" fails if the branch already exists' ' + git worktree add -b existingbranch orphandir2 main && + test_must_fail git worktree add --orphan existingbranch orphandir3 main && + [ ! -d orphandir3 ] +' + +test_expect_success '"add --orphan" fails if the commit-ish doesnt exist' ' + test_must_fail git worktree add --orphan badcommitish orphandir4 eee2222 && + [ ! -d orphandir4 ] +' + +test_expect_success '"add --orphan" with empty repository' ' + ( + mkdir emptyorphanrepo && + cd emptyorphanrepo && + GIT_DIR=".git" git init --bare && + git worktree add --orphan newbranch worktreedir && + git -C worktreedir symbolic-ref HEAD >actual && + echo refs/heads/newbranch >expected && + test_cmp expected actual + ) +' + test_expect_success 'local clone from linked checkout' ' git clone --local here here-clone && ( cd here-clone && git fsck )