@@ -1028,7 +1028,11 @@ func (self *FilesController) createStashMenu() error {
10281028}
10291029
10301030func (self * FilesController ) openMergeConflictMenu (nodes []* filetree.FileNode ) error {
1031- normalizedNodes := normalisedSelectedNodes (nodes )
1031+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
1032+
1033+ for _ , node := range normalizedNodes {
1034+ self .c .LogAction (node .GetPath ())
1035+ }
10321036
10331037 fileNodesWithConflicts := lo .Filter (normalizedNodes , func (node * filetree.FileNode , _ int ) bool {
10341038 return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1042,7 +1046,7 @@ func (self *FilesController) openMergeConflictMenu(nodes []*filetree.FileNode) e
10421046}
10431047
10441048func (self * FilesController ) canOpenMergeConflictMenu (nodes []* filetree.FileNode ) * types.DisabledReason {
1045- normalizedNodes := normalisedSelectedNodes (nodes )
1049+ normalizedNodes := flattenSelectedNodesToFiles (nodes )
10461050
10471051 hasFileNodesWithConflicts := lo .SomeBy (normalizedNodes , func (node * filetree.FileNode ) bool {
10481052 return node .File != nil && node .File .HasInlineMergeConflicts
@@ -1267,6 +1271,38 @@ func isDescendentOfSelectedNodes(node *filetree.FileNode, selectedNodes []*filet
12671271 return false
12681272}
12691273
1274+ // BFS algorithm for expanding directories into their children,
1275+ // and for collecting the unique file nodes
1276+ func flattenSelectedNodesToFiles (selectedNodes []* filetree.FileNode ) []* filetree.FileNode {
1277+ queue := append (make ([]* filetree.FileNode , 0 , len (selectedNodes )), selectedNodes ... )
1278+ visited := make (map [string ]bool )
1279+ var files []* filetree.FileNode
1280+
1281+ for len (queue ) > 0 {
1282+ // pop node from queue
1283+ node := queue [0 ]
1284+ queue = queue [1 :]
1285+
1286+ nodeID := node .ID ()
1287+ if visited [nodeID ] {
1288+ continue
1289+ }
1290+ visited [nodeID ] = true
1291+
1292+ if node .File != nil {
1293+ // unique file node -> collect it
1294+ files = append (files , node )
1295+ continue
1296+ }
1297+
1298+ // directory node -> enqueue children
1299+ for _ , ch := range node .Children {
1300+ queue = append (queue , & filetree.FileNode {Node : ch })
1301+ }
1302+ }
1303+ return files
1304+ }
1305+
12701306func someNodesHaveUnstagedChanges (nodes []* filetree.FileNode ) bool {
12711307 return lo .SomeBy (nodes , (* filetree .FileNode ).GetHasUnstagedChanges )
12721308}
0 commit comments