Skip to content

Commit 17ab91e

Browse files
authored
Skip post-checkout hook when discarding changes (#4313)
- **PR Description** Some people have post-checkout hooks that take a lot of time, which makes discarding changes slow. You can argue that a post-checkout hook should only run when you switch branches, so it doesnt't have to run when checking out single files or directories. You can also argue that lazygit might have implemented discarding changes by taking the current patch and applying it in reverse, which wouldn't have run a post-checkout hook either. So disable them for all cases where we use git checkout with a path; this includes checking out a file from the commit files view. Fixes #4272.
2 parents 5669507 + 9642782 commit 17ab91e

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

pkg/commands/git_commands/rebase_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) {
149149
runner: oscommands.NewFakeRunner(t).
150150
ExpectGitArgs([]string{"rebase", "--interactive", "--autostash", "--keep-empty", "--no-autosquash", "--rebase-merges", "abcdef"}, "", nil).
151151
ExpectGitArgs([]string{"cat-file", "-e", "HEAD^:test999.txt"}, "", nil).
152-
ExpectGitArgs([]string{"checkout", "HEAD^", "--", "test999.txt"}, "", nil).
152+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "HEAD^", "--", "test999.txt"}, "", nil).
153153
ExpectGitArgs([]string{"commit", "--amend", "--no-edit", "--allow-empty"}, "", nil).
154154
ExpectGitArgs([]string{"rebase", "--continue"}, "", nil),
155155
test: func(err error) {

pkg/commands/git_commands/working_tree.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ func (self *WorkingTreeCommands) BeforeAndAfterFileForRename(file *models.File)
109109
return beforeFile, afterFile, nil
110110
}
111111

112+
func newCheckoutCommand() *GitCommandBuilder {
113+
return NewGitCmd("checkout").Config(fmt.Sprintf("core.hooksPath=%s", os.DevNull))
114+
}
115+
112116
// DiscardAllFileChanges directly
113117
func (self *WorkingTreeCommands) DiscardAllFileChanges(file *models.File) error {
114118
if file.IsRename() {
@@ -130,7 +134,7 @@ func (self *WorkingTreeCommands) DiscardAllFileChanges(file *models.File) error
130134

131135
if file.ShortStatus == "AA" {
132136
if err := self.cmd.New(
133-
NewGitCmd("checkout").Arg("--ours", "--", file.Name).ToArgv(),
137+
newCheckoutCommand().Arg("--ours", "--", file.Name).ToArgv(),
134138
).Run(); err != nil {
135139
return err
136140
}
@@ -189,7 +193,7 @@ func (self *WorkingTreeCommands) DiscardUnstagedDirChanges(node IFileNode) error
189193
return err
190194
}
191195

192-
cmdArgs := NewGitCmd("checkout").Arg("--", node.GetPath()).ToArgv()
196+
cmdArgs := newCheckoutCommand().Arg("--", node.GetPath()).ToArgv()
193197
if err := self.cmd.New(cmdArgs).Run(); err != nil {
194198
return err
195199
}
@@ -222,7 +226,7 @@ func (self *WorkingTreeCommands) RemoveUntrackedDirFiles(node IFileNode) error {
222226
}
223227

224228
func (self *WorkingTreeCommands) DiscardUnstagedFileChanges(file *models.File) error {
225-
cmdArgs := NewGitCmd("checkout").Arg("--", file.Name).ToArgv()
229+
cmdArgs := newCheckoutCommand().Arg("--", file.Name).ToArgv()
226230
return self.cmd.New(cmdArgs).Run()
227231
}
228232

@@ -315,15 +319,15 @@ func (self *WorkingTreeCommands) ShowFileDiffCmdObj(from string, to string, reve
315319

316320
// CheckoutFile checks out the file for the given commit
317321
func (self *WorkingTreeCommands) CheckoutFile(commitHash, fileName string) error {
318-
cmdArgs := NewGitCmd("checkout").Arg(commitHash, "--", fileName).
322+
cmdArgs := newCheckoutCommand().Arg(commitHash, "--", fileName).
319323
ToArgv()
320324

321325
return self.cmd.New(cmdArgs).Run()
322326
}
323327

324328
// DiscardAnyUnstagedFileChanges discards any unstaged file changes via `git checkout -- .`
325329
func (self *WorkingTreeCommands) DiscardAnyUnstagedFileChanges() error {
326-
cmdArgs := NewGitCmd("checkout").Arg("--", ".").
330+
cmdArgs := newCheckoutCommand().Arg("--", ".").
327331
ToArgv()
328332

329333
return self.cmd.New(cmdArgs).Run()

pkg/commands/git_commands/working_tree_test.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package git_commands
22

33
import (
4+
"fmt"
5+
"os"
46
"testing"
57

68
"github.com/go-errors/errors"
@@ -10,6 +12,8 @@ import (
1012
"github.com/stretchr/testify/assert"
1113
)
1214

15+
var disableHooksFlag = fmt.Sprintf("core.hooksPath=%s", os.DevNull)
16+
1317
func TestWorkingTreeStageFile(t *testing.T) {
1418
runner := oscommands.NewFakeRunner(t).
1519
ExpectGitArgs([]string{"add", "--", "test.txt"}, "", nil)
@@ -113,7 +117,7 @@ func TestWorkingTreeDiscardAllFileChanges(t *testing.T) {
113117
},
114118
removeFile: func(string) error { return nil },
115119
runner: oscommands.NewFakeRunner(t).
116-
ExpectGitArgs([]string{"checkout", "--", "test"}, "", errors.New("error")),
120+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "test"}, "", errors.New("error")),
117121
expectedError: "error",
118122
},
119123
{
@@ -125,7 +129,7 @@ func TestWorkingTreeDiscardAllFileChanges(t *testing.T) {
125129
},
126130
removeFile: func(string) error { return nil },
127131
runner: oscommands.NewFakeRunner(t).
128-
ExpectGitArgs([]string{"checkout", "--", "test"}, "", nil),
132+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "test"}, "", nil),
129133
expectedError: "",
130134
},
131135
{
@@ -138,7 +142,7 @@ func TestWorkingTreeDiscardAllFileChanges(t *testing.T) {
138142
removeFile: func(string) error { return nil },
139143
runner: oscommands.NewFakeRunner(t).
140144
ExpectGitArgs([]string{"reset", "--", "test"}, "", nil).
141-
ExpectGitArgs([]string{"checkout", "--", "test"}, "", nil),
145+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "test"}, "", nil),
142146
expectedError: "",
143147
},
144148
{
@@ -151,7 +155,7 @@ func TestWorkingTreeDiscardAllFileChanges(t *testing.T) {
151155
removeFile: func(string) error { return nil },
152156
runner: oscommands.NewFakeRunner(t).
153157
ExpectGitArgs([]string{"reset", "--", "test"}, "", nil).
154-
ExpectGitArgs([]string{"checkout", "--", "test"}, "", nil),
158+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "test"}, "", nil),
155159
expectedError: "",
156160
},
157161
{
@@ -428,7 +432,7 @@ func TestWorkingTreeCheckoutFile(t *testing.T) {
428432
commitHash: "11af912",
429433
fileName: "test999.txt",
430434
runner: oscommands.NewFakeRunner(t).
431-
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", nil),
435+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "11af912", "--", "test999.txt"}, "", nil),
432436
test: func(err error) {
433437
assert.NoError(t, err)
434438
},
@@ -438,7 +442,7 @@ func TestWorkingTreeCheckoutFile(t *testing.T) {
438442
commitHash: "11af912",
439443
fileName: "test999.txt",
440444
runner: oscommands.NewFakeRunner(t).
441-
ExpectGitArgs([]string{"checkout", "11af912", "--", "test999.txt"}, "", errors.New("error")),
445+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "11af912", "--", "test999.txt"}, "", errors.New("error")),
442446
test: func(err error) {
443447
assert.Error(t, err)
444448
},
@@ -468,7 +472,7 @@ func TestWorkingTreeDiscardUnstagedFileChanges(t *testing.T) {
468472
testName: "valid case",
469473
file: &models.File{Name: "test.txt"},
470474
runner: oscommands.NewFakeRunner(t).
471-
ExpectGitArgs([]string{"checkout", "--", "test.txt"}, "", nil),
475+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "test.txt"}, "", nil),
472476
test: func(err error) {
473477
assert.NoError(t, err)
474478
},
@@ -495,7 +499,7 @@ func TestWorkingTreeDiscardAnyUnstagedFileChanges(t *testing.T) {
495499
{
496500
testName: "valid case",
497501
runner: oscommands.NewFakeRunner(t).
498-
ExpectGitArgs([]string{"checkout", "--", "."}, "", nil),
502+
ExpectGitArgs([]string{"-c", disableHooksFlag, "checkout", "--", "."}, "", nil),
499503
test: func(err error) {
500504
assert.NoError(t, err)
501505
},

0 commit comments

Comments
 (0)