@@ -96,6 +96,11 @@ defmodule GitWork.Commands.CheckoutTest do
9696 project = Path . join ( tmp , "project" )
9797 { :ok , _ } = GitWork.Commands.Clone . run ( [ origin , project ] )
9898
99+ { _ , 0 } =
100+ System . cmd ( "git" , [ "config" , "git-work.hooks.mise.task" , "" ] ,
101+ cd: Path . join ( project , ".bare" )
102+ )
103+
99104 # Create a branch on the remote
100105 GitWork.TestHelper . create_remote_branch ( origin , "feature-remote" )
101106
@@ -114,6 +119,11 @@ defmodule GitWork.Commands.CheckoutTest do
114119 project = Path . join ( tmp , "project" )
115120 { :ok , _ } = GitWork.Commands.Clone . run ( [ origin , project ] )
116121
122+ { _ , 0 } =
123+ System . cmd ( "git" , [ "config" , "git-work.hooks.mise.task" , "" ] ,
124+ cd: Path . join ( project , ".bare" )
125+ )
126+
117127 # Create a branch on the remote
118128 GitWork.TestHelper . create_remote_branch ( origin , "feature-remote" )
119129
@@ -132,4 +142,59 @@ defmodule GitWork.Commands.CheckoutTest do
132142 { output , 0 } = System . cmd ( "git" , [ "worktree" , "list" ] , cd: Path . join ( project , ".bare" ) )
133143 assert output =~ "feature-remote"
134144 end
145+
146+ test "post worktree hook runs on -b and can modify worktree" , % { tmp: tmp } do
147+ project = GitWork.TestHelper . create_gw_project ( tmp )
148+ bare = Path . join ( project , ".bare" )
149+
150+ GitWork.TestHelper . write_hook_script ( tmp )
151+ GitWork.TestHelper . prepend_path ( tmp )
152+
153+ File . write! ( Path . join ( [ project , "main" , ".trusted" ] ) , "ok" )
154+
155+ { _ , 0 } = System . cmd ( "git" , [ "config" , "git-work.hooks.mise.task" , "hook-task" ] , cd: bare )
156+
157+ File . cd! ( Path . join ( project , "main" ) )
158+
159+ assert { :ok , path } = Checkout . run ( [ "-b" , "feature-hook" ] )
160+ assert File . regular? ( Path . join ( path , "hook-ran" ) )
161+ assert File . regular? ( Path . join ( path , ".trusted" ) )
162+ end
163+
164+ test "existing worktree checkout does not run hook" , % { tmp: tmp } do
165+ project = GitWork.TestHelper . create_gw_project ( tmp )
166+ bare = Path . join ( project , ".bare" )
167+
168+ GitWork.TestHelper . write_hook_script ( tmp )
169+ GitWork.TestHelper . prepend_path ( tmp )
170+
171+ { _ , 0 } = System . cmd ( "git" , [ "config" , "git-work.hooks.mise.task" , "hook-task" ] , cd: bare )
172+
173+ File . cd! ( Path . join ( project , "main" ) )
174+
175+ assert { :ok , _ } = Checkout . run ( [ "-b" , "feature-existing" ] )
176+ File . rm! ( Path . join ( [ project , "feature-existing" , "hook-ran" ] ) )
177+
178+ assert { :ok , path } = Checkout . run ( [ "feature-existing" ] )
179+ refute File . regular? ( Path . join ( path , "hook-ran" ) )
180+ end
181+
182+ test "post worktree hook failure triggers rollback" , % { tmp: tmp } do
183+ project = GitWork.TestHelper . create_gw_project ( tmp )
184+ bare = Path . join ( project , ".bare" )
185+
186+ GitWork.TestHelper . write_hook_script ( tmp )
187+ GitWork.TestHelper . prepend_path ( tmp )
188+
189+ { _ , 0 } = System . cmd ( "git" , [ "config" , "git-work.hooks.mise.task" , "hook-fail" ] , cd: bare )
190+
191+ File . cd! ( Path . join ( project , "main" ) )
192+
193+ assert { :error , msg } = Checkout . run ( [ "-b" , "feature-fail" ] )
194+ assert msg =~ "mise run"
195+ refute File . dir? ( Path . join ( project , "feature-fail" ) )
196+
197+ { output , 0 } = System . cmd ( "git" , [ "branch" , "--list" , "feature-fail" ] , cd: bare )
198+ assert output == ""
199+ end
135200end
0 commit comments