#!/bin/sh global test_description := ''prune $GIT_DIR/worktrees'' source ./test-lib.sh test_expect_success initialize ' git commit --allow-empty -m init ' test_expect_success 'worktree prune on normal repo' ' git worktree prune && test_must_fail git worktree prune abc ' test_expect_success 'prune files inside $GIT_DIR/worktrees' ' mkdir .git/worktrees && : >.git/worktrees/abc && git worktree prune --verbose >actual && cat >expect <.git/worktrees/def/def && cat >expect <actual && test_i18ncmp expect actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' test_expect_success SANITY 'prune directories with unreadable gitdir' ' mkdir -p .git/worktrees/def/abc && : >.git/worktrees/def/def && : >.git/worktrees/def/gitdir && chmod u-r .git/worktrees/def/gitdir && git worktree prune --verbose >actual && test_i18ngrep "Removing worktrees/def: unable to read gitdir file" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' test_expect_success 'prune directories with invalid gitdir' ' mkdir -p .git/worktrees/def/abc && : >.git/worktrees/def/def && : >.git/worktrees/def/gitdir && git worktree prune --verbose >actual && test_i18ngrep "Removing worktrees/def: invalid gitdir file" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' test_expect_success 'prune directories with gitdir pointing to nowhere' ' mkdir -p .git/worktrees/def/abc && : >.git/worktrees/def/def && echo "$(pwd)"/nowhere >.git/worktrees/def/gitdir && git worktree prune --verbose >actual && test_i18ngrep "Removing worktrees/def: gitdir file points to non-existent location" actual && ! test -d .git/worktrees/def && ! test -d .git/worktrees ' test_expect_success 'not prune locked checkout' ' test_when_finished rm -r .git/worktrees && mkdir -p .git/worktrees/ghi && : >.git/worktrees/ghi/locked && git worktree prune && test -d .git/worktrees/ghi ' test_expect_success 'not prune recent checkouts' ' test_when_finished rm -r .git/worktrees && mkdir zz && mkdir -p .git/worktrees/jlm && echo "$(pwd)"/zz >.git/worktrees/jlm/gitdir && rmdir zz && git worktree prune --verbose --expire=2.days.ago && test -d .git/worktrees/jlm ' test_expect_success 'not prune proper checkouts' ' test_when_finished rm -r .git/worktrees && git worktree add --detach "$PWD/nop" master && git worktree prune && test -d .git/worktrees/nop ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"prune $GIT_DIR/worktrees">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(initialize)} {(SQ <"\n"> <"\tgit commit --allow-empty -m init\n">)}) (C {(test_expect_success)} {(SQ <"worktree prune on normal repo">)} {(SQ <"\n"> <"\tgit worktree prune &&\n"> <"\ttest_must_fail git worktree prune abc\n">)} ) (C {(test_expect_success)} {(SQ <"prune files inside $GIT_DIR/worktrees">)} { (SQ <"\n"> <"\tmkdir .git/worktrees &&\n"> <"\t: >.git/worktrees/abc &&\n"> <"\tgit worktree prune --verbose >actual &&\n"> <"\tcat >expect < <"Removing worktrees/abc: not a valid directory\n"> <"EOF\n"> <"\ttest_i18ncmp expect actual &&\n"> <"\t! test -f .git/worktrees/abc &&\n"> <"\t! test -d .git/worktrees\n"> ) } ) (C {(test_expect_success)} {(SQ <"prune directories without gitdir">)} { (SQ <"\n"> <"\tmkdir -p .git/worktrees/def/abc &&\n"> <"\t: >.git/worktrees/def/def &&\n"> <"\tcat >expect < <"Removing worktrees/def: gitdir file does not exist\n"> <"EOF\n"> <"\tgit worktree prune --verbose >actual &&\n"> <"\ttest_i18ncmp expect actual &&\n"> <"\t! test -d .git/worktrees/def &&\n"> <"\t! test -d .git/worktrees\n"> ) } ) (C {(test_expect_success)} {(SANITY)} {(SQ <"prune directories with unreadable gitdir">)} { (SQ <"\n"> <"\tmkdir -p .git/worktrees/def/abc &&\n"> <"\t: >.git/worktrees/def/def &&\n"> <"\t: >.git/worktrees/def/gitdir &&\n"> <"\tchmod u-r .git/worktrees/def/gitdir &&\n"> <"\tgit worktree prune --verbose >actual &&\n"> <"\ttest_i18ngrep \"Removing worktrees/def: unable to read gitdir file\" actual &&\n"> <"\t! test -d .git/worktrees/def &&\n"> <"\t! test -d .git/worktrees\n"> ) } ) (C {(test_expect_success)} {(SQ <"prune directories with invalid gitdir">)} { (SQ <"\n"> <"\tmkdir -p .git/worktrees/def/abc &&\n"> <"\t: >.git/worktrees/def/def &&\n"> <"\t: >.git/worktrees/def/gitdir &&\n"> <"\tgit worktree prune --verbose >actual &&\n"> <"\ttest_i18ngrep \"Removing worktrees/def: invalid gitdir file\" actual &&\n"> <"\t! test -d .git/worktrees/def &&\n"> <"\t! test -d .git/worktrees\n"> ) } ) (C {(test_expect_success)} {(SQ <"prune directories with gitdir pointing to nowhere">)} { (SQ <"\n"> <"\tmkdir -p .git/worktrees/def/abc &&\n"> <"\t: >.git/worktrees/def/def &&\n"> <"\techo \"$(pwd)\"/nowhere >.git/worktrees/def/gitdir &&\n"> <"\tgit worktree prune --verbose >actual &&\n"> < "\ttest_i18ngrep \"Removing worktrees/def: gitdir file points to non-existent location\" actual &&\n" > <"\t! test -d .git/worktrees/def &&\n"> <"\t! test -d .git/worktrees\n"> ) } ) (C {(test_expect_success)} {(SQ <"not prune locked checkout">)} { (SQ <"\n"> <"\ttest_when_finished rm -r .git/worktrees &&\n"> <"\tmkdir -p .git/worktrees/ghi &&\n"> <"\t: >.git/worktrees/ghi/locked &&\n"> <"\tgit worktree prune &&\n"> <"\ttest -d .git/worktrees/ghi\n"> ) } ) (C {(test_expect_success)} {(SQ <"not prune recent checkouts">)} { (SQ <"\n"> <"\ttest_when_finished rm -r .git/worktrees &&\n"> <"\tmkdir zz &&\n"> <"\tmkdir -p .git/worktrees/jlm &&\n"> <"\techo \"$(pwd)\"/zz >.git/worktrees/jlm/gitdir &&\n"> <"\trmdir zz &&\n"> <"\tgit worktree prune --verbose --expire=2.days.ago &&\n"> <"\ttest -d .git/worktrees/jlm\n"> ) } ) (C {(test_expect_success)} {(SQ <"not prune proper checkouts">)} { (SQ <"\n"> <"\ttest_when_finished rm -r .git/worktrees &&\n"> <"\tgit worktree add --detach \"$PWD/nop\" master &&\n"> <"\tgit worktree prune &&\n"> <"\ttest -d .git/worktrees/nop\n"> ) } ) (C {(test_done)}) ] )