@@ -401,16 +401,18 @@ func (self *FilesController) pressWithLock(selectedNodes []*filetree.FileNode) e
401401
402402 selectedNodes = normalisedSelectedNodes (selectedNodes )
403403
404- // If any node has unstaged changes, we'll stage all the selected nodes. Otherwise,
405- // we unstage all the selected nodes.
406- if someNodesHaveUnstagedChanges (selectedNodes ) {
404+ // If any node has unstaged changes, we'll stage all the selected unstaged nodes (staging already staged deleted files/folders would fail).
405+ // Otherwise, we unstage all the selected nodes.
406+ unstagedSelectedNodes := filterNodesHaveUnstagedChanges (selectedNodes )
407+
408+ if len (unstagedSelectedNodes ) > 0 {
407409 self .c .LogAction (self .c .Tr .Actions .StageFile )
408410
409- if err := self .optimisticChange (selectedNodes , self .optimisticStage ); err != nil {
411+ if err := self .optimisticChange (unstagedSelectedNodes , self .optimisticStage ); err != nil {
410412 return err
411413 }
412414
413- if err := self .c .Git ().WorkingTree .StageFiles (toPaths (selectedNodes )); err != nil {
415+ if err := self .c .Git ().WorkingTree .StageFiles (toPaths (unstagedSelectedNodes )); err != nil {
414416 return err
415417 }
416418 } else {
@@ -1027,6 +1029,12 @@ func someNodesHaveStagedChanges(nodes []*filetree.FileNode) bool {
10271029 return lo .SomeBy (nodes , (* filetree .FileNode ).GetHasStagedChanges )
10281030}
10291031
1032+ func filterNodesHaveUnstagedChanges (nodes []* filetree.FileNode ) []* filetree.FileNode {
1033+ return lo .Filter (nodes , func (node * filetree.FileNode , _ int ) bool {
1034+ return node .GetHasUnstagedChanges ()
1035+ })
1036+ }
1037+
10301038func (self * FilesController ) canRemove (selectedNodes []* filetree.FileNode ) * types.DisabledReason {
10311039 submodules := self .c .Model ().Submodules
10321040 submoduleCount := lo .CountBy (selectedNodes , func (node * filetree.FileNode ) bool {
0 commit comments