-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
prune: strategies for linked checkouts
(alias R=$GIT_COMMON_DIR/worktrees/<id>) - linked checkouts are supposed to keep its location in $R/gitdir up to date. The use case is auto fixup after a manual checkout move. - linked checkouts are supposed to update mtime of $R/gitdir. If $R/gitdir's mtime is older than a limit, and it points to nowhere, worktrees/<id> is to be pruned. - If $R/locked exists, worktrees/<id> is not supposed to be pruned. If $R/locked exists and $R/gitdir's mtime is older than a really long limit, warn about old unused repo. - "git checkout --to" is supposed to make a hard link named $R/link pointing to the .git file on supported file systems to help detect the user manually deleting the checkout. If $R/link exists and its link count is greated than 1, the repo is kept. Helped-by: Marc Branchaud <marcnarc@xiplink.com> Helped-by: Eric Sunshine <sunshine@sunshineco.com> Helped-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Marc Branchaud <marcnarc@xiplink.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Nguyễn Thái Ngọc Duy
authored and
Junio C Hamano
committed
Dec 1, 2014
1 parent
529fef2
commit 23af91d
Showing
7 changed files
with
251 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
#!/bin/sh | ||
|
||
test_description='prune $GIT_DIR/worktrees' | ||
|
||
. ./test-lib.sh | ||
|
||
test_expect_success 'prune --worktrees on normal repo' ' | ||
git prune --worktrees && | ||
test_must_fail git prune --worktrees abc | ||
' | ||
|
||
test_expect_success 'prune files inside $GIT_DIR/worktrees' ' | ||
mkdir .git/worktrees && | ||
: >.git/worktrees/abc && | ||
git prune --worktrees --verbose >actual && | ||
cat >expect <<EOF && | ||
Removing worktrees/abc: not a valid directory | ||
EOF | ||
test_i18ncmp expect actual && | ||
! test -f .git/worktrees/abc && | ||
! test -d .git/worktrees | ||
' | ||
|
||
test_expect_success 'prune directories without gitdir' ' | ||
mkdir -p .git/worktrees/def/abc && | ||
: >.git/worktrees/def/def && | ||
cat >expect <<EOF && | ||
Removing worktrees/def: gitdir file does not exist | ||
EOF | ||
git prune --worktrees --verbose >actual && | ||
test_i18ncmp expect actual && | ||
! test -d .git/worktrees/def && | ||
! test -d .git/worktrees | ||
' | ||
|
||
test_expect_success POSIXPERM '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 prune --worktrees --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 prune --worktrees --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 prune --worktrees --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 prune --worktrees && | ||
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 && | ||
git prune --worktrees --verbose --expire=2.days.ago && | ||
test -d .git/worktrees/jlm | ||
' | ||
|
||
test_done |