From e8b97c9fe2db8d39084789a8503db4cbadcdde42 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Fri, 11 Nov 2022 12:16:38 +1100 Subject: [PATCH 1/2] fix could-not-access error --- pkg/commands/git_commands/working_tree.go | 2 +- pkg/commands/models/file.go | 5 +++ pkg/gui/filetree/file_node.go | 4 +++ pkg/integration/components/shell.go | 9 +++++ .../tests/file/dir_with_untracked_file.go | 32 ++++++++++++++++++ pkg/integration/tests/tests.go | 2 ++ .../expected/repo/.git_keep/COMMIT_EDITMSG | 1 + .../expected/repo/.git_keep/FETCH_HEAD | 0 .../expected/repo/.git_keep/HEAD | 1 + .../expected/repo/.git_keep/config | 12 +++++++ .../expected/repo/.git_keep/description | 1 + .../expected/repo/.git_keep/index | Bin 0 -> 165 bytes .../expected/repo/.git_keep/info/exclude | 7 ++++ .../expected/repo/.git_keep/logs/HEAD | 1 + .../repo/.git_keep/logs/refs/heads/master | 1 + .../19/102815663d23f8b75a47e7a01965dcdc96468c | Bin 0 -> 18 bytes .../76/3788c33660f53eecaecce8dae27c34e647ac57 | Bin 0 -> 121 bytes .../87/a5800c820f9b267ff243860bceb24b04af76a2 | Bin 0 -> 49 bytes .../a9/63b9597d0f4f0b9995472e5eff3622b136a4b5 | Bin 0 -> 45 bytes .../expected/repo/.git_keep/refs/heads/master | 1 + .../expected/repo/dir/file | 1 + .../expected/repo/dir/untracked | 1 + 22 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 pkg/integration/tests/file/dir_with_untracked_file.go create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/COMMIT_EDITMSG create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/FETCH_HEAD create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/HEAD create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/config create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/description create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/index create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/info/exclude create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/logs/HEAD create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/logs/refs/heads/master create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/19/102815663d23f8b75a47e7a01965dcdc96468c create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/76/3788c33660f53eecaecce8dae27c34e647ac57 create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/87/a5800c820f9b267ff243860bceb24b04af76a2 create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/a9/63b9597d0f4f0b9995472e5eff3622b136a4b5 create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/refs/heads/master create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/dir/file create mode 100644 test/integration_new/file/dir_with_untracked_file/expected/repo/dir/untracked diff --git a/pkg/commands/git_commands/working_tree.go b/pkg/commands/git_commands/working_tree.go index 8fd1fb177..9c02d4300 100644 --- a/pkg/commands/git_commands/working_tree.go +++ b/pkg/commands/git_commands/working_tree.go @@ -241,7 +241,7 @@ func (self *WorkingTreeCommands) WorktreeFileDiffCmdObj(node models.IFile, plain if cached { cachedArg = " --cached" } - if !node.GetIsTracked() && !node.GetHasStagedChanges() && !cached { + if !node.GetIsTracked() && !node.GetHasStagedChanges() && !cached && node.GetIsFile() { trackedArg = "--no-index -- /dev/null" } if plain { diff --git a/pkg/commands/models/file.go b/pkg/commands/models/file.go index eeb540def..dbe015cf1 100644 --- a/pkg/commands/models/file.go +++ b/pkg/commands/models/file.go @@ -29,6 +29,7 @@ type IFile interface { GetIsTracked() bool GetPath() string GetPreviousPath() string + GetIsFile() bool } func (f *File) IsRename() bool { @@ -92,6 +93,10 @@ func (f *File) GetPreviousPath() string { return f.PreviousName } +func (f *File) GetIsFile() bool { + return true +} + type StatusFields struct { HasStagedChanges bool HasUnstagedChanges bool diff --git a/pkg/gui/filetree/file_node.go b/pkg/gui/filetree/file_node.go index 2ff707113..abfdbafe6 100644 --- a/pkg/gui/filetree/file_node.go +++ b/pkg/gui/filetree/file_node.go @@ -42,6 +42,10 @@ func (self *FileNode) GetIsTracked() bool { return self.SomeFile(func(file *models.File) bool { return file.Tracked }) } +func (self *FileNode) GetIsFile() bool { + return self.IsFile() +} + func (self *FileNode) GetPreviousPath() string { if self.File == nil { return "" diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go index 1d8182edb..95b601783 100644 --- a/pkg/integration/components/shell.go +++ b/pkg/integration/components/shell.go @@ -45,6 +45,15 @@ func (s *Shell) CreateFile(path string, content string) *Shell { return s } +func (s *Shell) CreateDir(path string) *Shell { + fullPath := filepath.Join(s.dir, path) + if err := os.MkdirAll(fullPath, 0o755); err != nil { + panic(fmt.Sprintf("error creating directory: %s\n%s", fullPath, err)) + } + + return s +} + func (s *Shell) UpdateFile(path string, content string) *Shell { fullPath := filepath.Join(s.dir, path) err := os.WriteFile(fullPath, []byte(content), 0o644) diff --git a/pkg/integration/tests/file/dir_with_untracked_file.go b/pkg/integration/tests/file/dir_with_untracked_file.go new file mode 100644 index 000000000..c67745c65 --- /dev/null +++ b/pkg/integration/tests/file/dir_with_untracked_file.go @@ -0,0 +1,32 @@ +package file + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var DirWithUntrackedFile = NewIntegrationTest(NewIntegrationTestArgs{ + // notably, we currently _don't_ actually see the untracked file in the diff. Not sure how to get around that. + Description: "When selecting a directory that contains an untracked file, we should not get an error", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) { + config.UserConfig.Gui.ShowFileTree = true + }, + SetupRepo: func(shell *Shell) { + shell.CreateDir("dir") + shell.CreateFile("dir/file", "foo") + shell.GitAddAll() + shell.Commit("first commit") + shell.CreateFile("dir/untracked", "bar") + shell.UpdateFile("dir/file", "baz") + }, + Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) { + assert.CommitCount(1) + + assert.MatchMainViewContent(NotContains("error: Could not access")) + // we show baz because it's a modified file but we don't show bar because it's untracked + // (though it would be cool if we could show that too) + assert.MatchMainViewContent(Contains("baz")) + }, +}) diff --git a/pkg/integration/tests/tests.go b/pkg/integration/tests/tests.go index 6b4583e6d..5c891a4e3 100644 --- a/pkg/integration/tests/tests.go +++ b/pkg/integration/tests/tests.go @@ -15,6 +15,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/integration/tests/cherry_pick" "github.com/jesseduffield/lazygit/pkg/integration/tests/commit" "github.com/jesseduffield/lazygit/pkg/integration/tests/custom_commands" + "github.com/jesseduffield/lazygit/pkg/integration/tests/file" "github.com/jesseduffield/lazygit/pkg/integration/tests/interactive_rebase" "github.com/jesseduffield/lazygit/pkg/integration/tests/stash" ) @@ -40,6 +41,7 @@ var tests = []*components.IntegrationTest{ cherry_pick.CherryPickConflicts, custom_commands.FormPrompts, stash.Rename, + file.DirWithUntrackedFile, } func GetTests() []*components.IntegrationTest { diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/COMMIT_EDITMSG b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/COMMIT_EDITMSG new file mode 100644 index 000000000..5ec586d22 --- /dev/null +++ b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/COMMIT_EDITMSG @@ -0,0 +1 @@ +first commit diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/FETCH_HEAD b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/HEAD b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/config b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/config new file mode 100644 index 000000000..8a748ce32 --- /dev/null +++ b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/config @@ -0,0 +1,12 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[user] + email = CI@example.com + name = CI +[commit] + gpgSign = false diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/description b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/description new file mode 100644 index 000000000..498b267a8 --- /dev/null +++ b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/index b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/index new file mode 100644 index 0000000000000000000000000000000000000000..486f8bab9e2e329dca9349f939a0fd2479a4510e GIT binary patch literal 165 zcmZ?q402{*U|<4b#^l^3rxfl#_lMDp3=FJnpGw>q7#f!VrN08zhyXEzq=1HKnyvDW z?NRQ}7f7bwxiihJhk+v{vq(QJGbfdSAtcDv6{yUV!BD}FYi07z$Xb4X?wM2F_2T}U zDQz@cvK6QlC}+UczO;d-iGQ|Q{U_%(?sJ>GS=N^=GR 1668129994 +1100 commit (initial): first commit diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/logs/refs/heads/master b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/logs/refs/heads/master new file mode 100644 index 000000000..5a93ac9cc --- /dev/null +++ b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 763788c33660f53eecaecce8dae27c34e647ac57 CI 1668129994 +1100 commit (initial): first commit diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/19/102815663d23f8b75a47e7a01965dcdc96468c b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/19/102815663d23f8b75a47e7a01965dcdc96468c new file mode 100644 index 0000000000000000000000000000000000000000..280a426b7656bd61cdd4f48a43f8088ea18291b6 GIT binary patch literal 18 Zcmbd;@;K>oCKtt=3He z2@l#uAaV4WiKn|Qq1epK6ecGmrTFMvMjuniWYSw7t;4*)WnOObNp*k9X>Iii7~>h; bC<7c3tu=#=iOQe4DO-Oj{3`PW+ubgI%49d` literal 0 HcmV?d00001 diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/87/a5800c820f9b267ff243860bceb24b04af76a2 b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/87/a5800c820f9b267ff243860bceb24b04af76a2 new file mode 100644 index 0000000000000000000000000000000000000000..115dcca4644a2968b0626173be1b391ff6e94da9 GIT binary patch literal 49 zcmV-10M7q-0V^p=O;s>9VlXr?Ff%bxNXyJgWsnrm5KXgH{;@sE{rLjP)H`>kx%B`5 H>1++gxn&gE literal 0 HcmV?d00001 diff --git a/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/a9/63b9597d0f4f0b9995472e5eff3622b136a4b5 b/test/integration_new/file/dir_with_untracked_file/expected/repo/.git_keep/objects/a9/63b9597d0f4f0b9995472e5eff3622b136a4b5 new file mode 100644 index 0000000000000000000000000000000000000000..ba6b1afcde1396992dcafef1d18d328bec541c01 GIT binary patch literal 45 zcmV+|0Mh?>0V^p=O;s>9U@$QN0)>>!B8K**4LnW!v(@T9Ik$12+vLr%zHAWy Date: Sat, 12 Nov 2022 10:18:02 +1100 Subject: [PATCH 2/2] fix broken CI (see https://vielmetti.typepad.com/logbook/2022/10/git-security-fixes-lead-to-fatal-transport-file-not-allowed-error-in-ci-systems-cve-2022-39253.html) try this WIP --- .github/workflows/ci.yml | 3 ++- pkg/integration/components/runner.go | 1 + test/integration/submoduleAdd/setup.sh | 5 +++++ test/integration/submoduleEnter/setup.sh | 2 +- test/integration/submoduleRemove/setup.sh | 2 +- test/integration/submoduleReset/setup.sh | 2 +- 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a781b290f..d09b8a53a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,8 +73,9 @@ jobs: restore-keys: | ${{runner.os}}-go- - name: Test code + # for file.allow thing see https://vielmetti.typepad.com/logbook/2022/10/git-security-fixes-lead-to-fatal-transport-file-not-allowed-error-in-ci-systems-cve-2022-39253.html run: | - PARALLEL_TOTAL=${{ matrix.parallelism }} PARALLEL_INDEX=${{ matrix.index }} go test pkg/integration/deprecated/*.go + git config --global protocol.file.allow always && PARALLEL_TOTAL=${{ matrix.parallelism }} PARALLEL_INDEX=${{ matrix.index }} go test pkg/integration/deprecated/*.go integration-tests: runs-on: ubuntu-latest name: "Integration Tests" diff --git a/pkg/integration/components/runner.go b/pkg/integration/components/runner.go index d25f3795c..11b34db11 100644 --- a/pkg/integration/components/runner.go +++ b/pkg/integration/components/runner.go @@ -144,6 +144,7 @@ func createFixture(test *IntegrationTest, paths Paths) error { shell.RunCommand(`git config user.email "CI@example.com"`) shell.RunCommand(`git config user.name "CI"`) shell.RunCommand(`git config commit.gpgSign false`) + shell.RunCommand(`git config protocol.file.allow always`) test.SetupRepo(shell) diff --git a/test/integration/submoduleAdd/setup.sh b/test/integration/submoduleAdd/setup.sh index 47c92bd27..35a139f79 100644 --- a/test/integration/submoduleAdd/setup.sh +++ b/test/integration/submoduleAdd/setup.sh @@ -11,6 +11,11 @@ git init git config user.email "CI@example.com" git config user.name "CI" +# see https://vielmetti.typepad.com/logbook/2022/10/git-security-fixes-lead-to-fatal-transport-file-not-allowed-error-in-ci-systems-cve-2022-39253.html +# NOTE: I don't think this actually works if it's only applied to the repo. +# On CI we set the global setting, but given it's a security concern I don't want +# people to do that for their locals. +git config protocol.file.allow always echo test1 > myfile1 git add . diff --git a/test/integration/submoduleEnter/setup.sh b/test/integration/submoduleEnter/setup.sh index 307593a71..a38c6045b 100644 --- a/test/integration/submoduleEnter/setup.sh +++ b/test/integration/submoduleEnter/setup.sh @@ -26,5 +26,5 @@ cd .. git clone --bare ./repo other_repo cd repo -git submodule add ../other_repo +git -c protocol.file.allow=always submodule add ../other_repo git commit -am "add submodule" diff --git a/test/integration/submoduleRemove/setup.sh b/test/integration/submoduleRemove/setup.sh index 2525abf31..cd5b3ce64 100644 --- a/test/integration/submoduleRemove/setup.sh +++ b/test/integration/submoduleRemove/setup.sh @@ -23,5 +23,5 @@ cd .. git clone --bare ./repo other_repo cd repo -git submodule add ../other_repo +git -c protocol.file.allow=always submodule add ../other_repo git commit -am "add submodule" diff --git a/test/integration/submoduleReset/setup.sh b/test/integration/submoduleReset/setup.sh index 2525abf31..cd5b3ce64 100644 --- a/test/integration/submoduleReset/setup.sh +++ b/test/integration/submoduleReset/setup.sh @@ -23,5 +23,5 @@ cd .. git clone --bare ./repo other_repo cd repo -git submodule add ../other_repo +git -c protocol.file.allow=always submodule add ../other_repo git commit -am "add submodule"