diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2018-08-28 19:19:03 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-28 19:19:03 +1000 |
commit | 145cba34a0ab2653c9c4e403ad9b4d84129892c0 (patch) | |
tree | ddf77f98afc9e005f7a739bef4ba1eb90448bc7b /pkg/commands | |
parent | 320ccdb22afc89e7bd77695eafb262281b323095 (diff) | |
parent | 7e1e97d050dd38b08e0131776bf130bae1fb1a4c (diff) |
Merge pull request #228 from jesseduffield/hotfix/226-dont-panic-when-cattingv0.2.0
226: dont panic when catting directories
Diffstat (limited to 'pkg/commands')
-rw-r--r-- | pkg/commands/git.go | 5 | ||||
-rw-r--r-- | pkg/commands/git_structs.go | 2 | ||||
-rw-r--r-- | pkg/commands/os.go | 12 | ||||
-rw-r--r-- | pkg/commands/os_test.go | 58 |
4 files changed, 74 insertions, 3 deletions
diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 1e36aa84c..b56650e97 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -86,16 +86,17 @@ func (c *GitCommand) GetStatusFiles() []File { change := statusString[0:2] stagedChange := change[0:1] unstagedChange := statusString[1:2] - filename := statusString[3:] + filename := c.OSCommand.Unquote(statusString[3:]) tracked := !includes([]string{"??", "A ", "AM"}, change) file := File{ - Name: c.OSCommand.Unquote(filename), + Name: filename, DisplayString: statusString, HasStagedChanges: !includes([]string{" ", "U", "?"}, stagedChange), HasUnstagedChanges: unstagedChange != " ", Tracked: tracked, Deleted: unstagedChange == "D" || stagedChange == "D", HasMergeConflicts: change == "UU", + Type: c.OSCommand.FileType(filename), } files = append(files, file) } diff --git a/pkg/commands/git_structs.go b/pkg/commands/git_structs.go index 6b10b18bb..2b3b3f2db 100644 --- a/pkg/commands/git_structs.go +++ b/pkg/commands/git_structs.go @@ -1,7 +1,6 @@ package commands // File : A staged/unstaged file -// TODO: decide whether to give all of these the Git prefix type File struct { Name string HasStagedChanges bool @@ -10,6 +9,7 @@ type File struct { Deleted bool HasMergeConflicts bool DisplayString string + Type string // one of 'file', 'directory', and 'other' } // Commit : A git commit diff --git a/pkg/commands/os.go b/pkg/commands/os.go index 10f78c7c3..0fa92f724 100644 --- a/pkg/commands/os.go +++ b/pkg/commands/os.go @@ -59,6 +59,18 @@ func (c *OSCommand) RunCommand(command string) error { return err } +// FileType tells us if the file is a file, directory or other +func (c *OSCommand) FileType(path string) string { + fileInfo, err := os.Stat(path) + if err != nil { + return "other" + } + if fileInfo.IsDir() { + return "directory" + } + return "file" +} + // RunDirectCommand wrapper around direct commands func (c *OSCommand) RunDirectCommand(command string) (string, error) { c.Log.WithField("command", command).Info("RunDirectCommand") diff --git a/pkg/commands/os_test.go b/pkg/commands/os_test.go index d78391d17..a7ccef560 100644 --- a/pkg/commands/os_test.go +++ b/pkg/commands/os_test.go @@ -1,6 +1,7 @@ package commands import ( + "os" "os/exec" "testing" @@ -297,3 +298,60 @@ func TestOSCommandUnquote(t *testing.T) { assert.EqualValues(t, expected, actual) } + +func TestOSCommandFileType(t *testing.T) { + type scenario struct { + path string + setup func() + test func(string) + } + + scenarios := []scenario{ + { + "testFile", + func() { + if _, err := os.Create("testFile"); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "file", output) + }, + }, + { + "file with spaces", + func() { + if _, err := os.Create("file with spaces"); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "file", output) + }, + }, + { + "testDirectory", + func() { + if err := os.Mkdir("testDirectory", 0644); err != nil { + panic(err) + } + }, + func(output string) { + assert.EqualValues(t, "directory", output) + }, + }, + { + "nonExistant", + func() {}, + func(output string) { + assert.EqualValues(t, "other", output) + }, + }, + } + + for _, s := range scenarios { + s.setup() + s.test(newDummyOSCommand().FileType(s.path)) + _ = os.RemoveAll(s.path) + } +} |