diff --git a/pkg/commands/git.go b/pkg/commands/git.go index 3349e4860..94c3c3e1c 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -81,7 +81,7 @@ func (c *GitCommand) GetStatusFiles() []File { stagedChange := change[0:1] unstagedChange := statusString[1:2] filename := statusString[3:] - tracked := !includes([]string{"??", "A "}, change) + tracked := !includes([]string{"??", "A ", "AM"}, change) file := File{ Name: filename, DisplayString: statusString, @@ -358,11 +358,16 @@ func (c *GitCommand) IsInMergeState() (bool, error) { // RemoveFile directly func (c *GitCommand) RemoveFile(file File) error { // if the file isn't tracked, we assume you want to delete it + if file.HasStagedChanges { + if err := c.OSCommand.RunCommand("git reset -- " + file.Name); err != nil { + return err + } + } if !file.Tracked { - return os.RemoveAll(file.Name) + return os.RemoveAll(c.OSCommand.Unquote(file.Name)) } // if the file is tracked, we assume you want to just check it out - return c.OSCommand.RunCommand("git checkout " + file.Name) + return c.OSCommand.RunCommand("git checkout -- " + file.Name) } // Checkout checks out a branch, with --force if you set the force arg to true diff --git a/pkg/commands/os.go b/pkg/commands/os.go index 32514a419..b72585e44 100644 --- a/pkg/commands/os.go +++ b/pkg/commands/os.go @@ -167,3 +167,10 @@ func (c *OSCommand) Quote(message string) string { message = strings.Replace(message, "`", "\\`", -1) return c.Platform.escapedQuote + message + c.Platform.escapedQuote } + +// Unquote removes wrapping quotations marks if they are present +// this is needed for removing quotes from staged filenames with spaces +func (c *OSCommand) Unquote(message string) string { + message = strings.Replace(message, `"`, "", -1) + return message +} diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 166af4108..596eb80cc 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -128,7 +128,7 @@ func (gui *Gui) handleFileRemove(g *gocui.Gui, v *gocui.View) error { ) return gui.createConfirmationPanel(g, v, strings.Title(deleteVerb)+" file", message, func(g *gocui.Gui, v *gocui.View) error { if err := gui.GitCommand.RemoveFile(file); err != nil { - panic(err) + return err } return gui.refreshFiles(g) }, nil)