@@ -1028,7 +1028,7 @@ func (self *FilesController) createStashMenu() error {
1028
1028
}
1029
1029
1030
1030
func (self * FilesController ) openMergeConflictMenu (nodes []* filetree.FileNode ) error {
1031
- normalizedNodes := normalisedSelectedNodes (nodes )
1031
+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
1032
1032
1033
1033
fileNodesWithConflicts := lo .Filter (normalizedNodes , func (node * filetree.FileNode , _ int ) bool {
1034
1034
return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1042,7 +1042,7 @@ func (self *FilesController) openMergeConflictMenu(nodes []*filetree.FileNode) e
1042
1042
}
1043
1043
1044
1044
func (self * FilesController ) canOpenMergeConflictMenu (nodes []* filetree.FileNode ) * types.DisabledReason {
1045
- normalizedNodes := normalisedSelectedNodes (nodes )
1045
+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
1046
1046
1047
1047
hasFileNodesWithConflicts := lo .SomeBy (normalizedNodes , func (node * filetree.FileNode ) bool {
1048
1048
return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1267,6 +1267,38 @@ func isDescendentOfSelectedNodes(node *filetree.FileNode, selectedNodes []*filet
1267
1267
return false
1268
1268
}
1269
1269
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
+
1270
1302
func someNodesHaveUnstagedChanges (nodes []* filetree.FileNode ) bool {
1271
1303
return lo .SomeBy (nodes , (* filetree .FileNode ).GetHasUnstagedChanges )
1272
1304
}
0 commit comments