#!/bin/sh test_description='test git worktree move, remove, lock and unlock' . ./test-lib.sh test_expect_success 'setup' ' test_commit init && git worktree add source && git worktree list --porcelain >out && grep "^worktree" out >actual && cat <<-EOF >expected && worktree $(pwd) worktree $(pwd)/source EOF test_cmp expected actual ' test_expect_success 'lock main worktree' ' test_must_fail git worktree lock . ' test_expect_success 'lock linked worktree' ' git worktree lock --reason hahaha source && echo hahaha >expected && test_cmp expected .git/worktrees/source/locked ' test_expect_success 'lock linked worktree from another worktree' ' rm .git/worktrees/source/locked && git worktree add elsewhere && git -C elsewhere worktree lock --reason hahaha ../source && echo hahaha >expected && test_cmp expected .git/worktrees/source/locked ' test_expect_success 'lock worktree twice' ' test_must_fail git worktree lock source && echo hahaha >expected && test_cmp expected .git/worktrees/source/locked ' test_expect_success 'lock worktree twice (from the locked worktree)' ' test_must_fail git -C source worktree lock . && echo hahaha >expected && test_cmp expected .git/worktrees/source/locked ' test_expect_success 'unlock main worktree' ' test_must_fail git worktree unlock . ' test_expect_success 'unlock linked worktree' ' git worktree unlock source && test_path_is_missing .git/worktrees/source/locked ' test_expect_success 'unlock worktree twice' ' test_must_fail git worktree unlock source && test_path_is_missing .git/worktrees/source/locked ' test_expect_success 'move non-worktree' ' mkdir abc && test_must_fail git worktree move abc def ' test_expect_success 'move locked worktree' ' git worktree lock source && test_when_finished "git worktree unlock source" && test_must_fail git worktree move source destination ' test_expect_success 'move worktree' ' git worktree move source destination && test_path_is_missing source && git worktree list --porcelain >out && grep "^worktree.*/destination$" out && ! grep "^worktree.*/source$" out && git -C destination log --format=%s >actual2 && echo init >expected2 && test_cmp expected2 actual2 ' test_expect_success 'move main worktree' ' test_must_fail git worktree move . def ' test_expect_success 'move worktree to another dir' ' mkdir some-dir && git worktree move destination some-dir && test_when_finished "git worktree move some-dir/destination destination" && test_path_is_missing destination && git worktree list --porcelain >out && grep "^worktree.*/some-dir/destination$" out && git -C some-dir/destination log --format=%s >actual2 && echo init >expected2 && test_cmp expected2 actual2 ' test_expect_success 'remove main worktree' ' test_must_fail git worktree remove . ' test_expect_success 'remove locked worktree' ' git worktree lock destination && test_when_finished "git worktree unlock destination" && test_must_fail git worktree remove destination ' test_expect_success 'remove worktree with dirty tracked file' ' echo dirty >>destination/init.t && test_when_finished "git -C destination checkout init.t" && test_must_fail git worktree remove destination ' test_expect_success 'remove worktree with untracked file' ' : >destination/untracked && test_must_fail git worktree remove destination ' test_expect_success 'force remove worktree with untracked file' ' git worktree remove --force destination && test_path_is_missing destination ' test_expect_success 'remove missing worktree' ' git worktree add to-be-gone && test -d .git/worktrees/to-be-gone && mv to-be-gone gone && git worktree remove to-be-gone && test_path_is_missing .git/worktrees/to-be-gone ' test_expect_success 'NOT remove missing-but-locked worktree' ' git worktree add gone-but-locked && git worktree lock gone-but-locked && test -d .git/worktrees/gone-but-locked && mv gone-but-locked really-gone-now && test_must_fail git worktree remove gone-but-locked && test_path_is_dir .git/worktrees/gone-but-locked ' test_done