@@ -8,6 +8,7 @@ module Obelisk.Command.Run where
88
99import Control.Arrow ((&&&))
1010import Control.Exception (Exception, bracket)
11+import Control.Lens (ifor)
1112import Control.Monad (filterM, unless)
1213import Control.Monad.Except (runExceptT, throwError)
1314import Control.Monad.IO.Class (liftIO)
@@ -245,7 +246,17 @@ parsePackagesOrFail dirs = do
245246 | _cabalPackageInfo_buildable packageInfo -> Right packageInfo
246247 _ -> Left dir
247248
248− packageInfos <- case NE.nonEmpty packageInfos' of
249+ let packagesByName = Map.fromListWith (<>) [(_cabalPackageInfo_packageName p, p NE.:| []) | p <- packageInfos']
250+ unambiguous <- ifor packagesByName $ \packageName ps -> case ps of
251+ p NE.:| [] -> pure p -- No ambiguity here
252+ p NE.:| _ -> do
253+ putLog Warning $ T.pack $
254+ "Packages named '" <> T.unpack packageName <> "' appear in " <> show (length ps) <> " different locations: "
255+ <> intercalate ", " (map _cabalPackageInfo_packageFile $ toList ps)
256+ <> "; Picking " <> _cabalPackageInfo_packageFile p
257+ pure p
258+
259+ packageInfos <- case NE.nonEmpty $ toList unambiguous of
249260 Nothing -> failWith $ T.pack $ "No valid, buildable packages found in " <> intercalate ", " dirs
250261 Just xs -> pure xs
251262