@@ -1028,7 +1028,7 @@ func (self *FilesController) createStashMenu() error {
10281028}
10291029
10301030func (self * FilesController ) openMergeConflictMenu (nodes []* filetree.FileNode ) error {
1031- normalizedNodes := normalisedSelectedNodes (nodes )
1031+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
10321032
10331033 fileNodesWithConflicts := lo .Filter (normalizedNodes , func (node * filetree.FileNode , _ int ) bool {
10341034 return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1042,7 +1042,7 @@ func (self *FilesController) openMergeConflictMenu(nodes []*filetree.FileNode) e
10421042}
10431043
10441044func (self * FilesController ) canOpenMergeConflictMenu (nodes []* filetree.FileNode ) * types.DisabledReason {
1045- normalizedNodes := normalisedSelectedNodes (nodes )
1045+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
10461046
10471047 hasFileNodesWithConflicts := lo .SomeBy (normalizedNodes , func (node * filetree.FileNode ) bool {
10481048 return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1267,6 +1267,38 @@ func isDescendentOfSelectedNodes(node *filetree.FileNode, selectedNodes []*filet
12671267 return false
12681268}
12691269
1270+ // BFS algorithm for expanding directories into their children,
1271+ // and for collecting the unique file nodes
1272+ func flattenSelectedNodesToFiles (selectedNodes []* filetree.FileNode ) []* filetree.FileNode {
1273+ queue := append (make ([]* filetree.FileNode , 0 , len (selectedNodes )), selectedNodes ... )
1274+ visited := make (map [string ]bool )
1275+ var files []* filetree.FileNode
1276+
1277+ for len (queue ) > 0 {
1278+ // pop node from queue
1279+ node := queue [0 ]
1280+ queue = queue [1 :]
1281+
1282+ nodeID := node .ID ()
1283+ if visited [nodeID ] {
1284+ continue
1285+ }
1286+ visited [nodeID ] = true
1287+
1288+ if node .File != nil {
1289+ // unique file node -> collect it
1290+ files = append (files , node )
1291+ continue
1292+ }
1293+
1294+ // directory node -> enqueue children
1295+ for _ , ch := range node .Children {
1296+ queue = append (queue , & filetree.FileNode {Node : ch })
1297+ }
1298+ }
1299+ return files
1300+ }
1301+
12701302func someNodesHaveUnstagedChanges (nodes []* filetree.FileNode ) bool {
12711303 return lo .SomeBy (nodes , (* filetree .FileNode ).GetHasUnstagedChanges )
12721304}
0 commit comments