@@ -9,6 +9,7 @@ module Obelisk.Command.Run where
99import Control.Arrow ((&&&))
1010import Control.Exception (Exception, bracket)
1111import qualified Control.Lens as Lens
12+import Control.Lens (ifor)
1213import Control.Monad (filterM, unless)
1314import Control.Monad.Except (runExceptT, throwError)
1415import Control.Monad.IO.Class (liftIO)
@@ -159,7 +160,7 @@ getLocalPkgs root = do
159160 -- We do not want to find packages that are embedded inside other obelisk projects, unless that
160161 -- obelisk project is our own.
161162 let exclusions = filter (/= root) $ map takeDirectory obeliskPaths
162− runFind $
163+ fmap (map (makeRelative ".")) $ runFind $
163164 ["-L", root, "(", "-name", "*.cabal", "-o", "-name", Hpack.packageConfig, ")", "-a", "-type", "f"]
164165 <> concat [["-not", "-path", p </> "*"] | p <- exclusions]
165166 where
@@ -276,7 +277,17 @@ parsePackagesOrFail dirs = do
276277 | _cabalPackageInfo_buildable packageInfo -> Right packageInfo
277278 _ -> Left dir
278279
279− packageInfos <- case NE.nonEmpty packageInfos' of
280+ let packagesByName = Map.fromListWith (<>) [(_cabalPackageInfo_packageName p, p NE.:| []) | p <- packageInfos']
281+ unambiguous <- ifor packagesByName $ \packageName ps -> case ps of
282+ p NE.:| [] -> pure p -- No ambiguity here
283+ p NE.:| _ -> do
284+ putLog Warning $ T.pack $
285+ "Packages named '" <> T.unpack packageName <> "' appear in " <> show (length ps) <> " different locations: "
286+ <> intercalate ", " (map _cabalPackageInfo_packageFile $ toList ps)
287+ <> "; Picking " <> _cabalPackageInfo_packageFile p
288+ pure p
289+
290+ packageInfos <- case NE.nonEmpty $ toList unambiguous of
280291 Nothing -> failWith $ T.pack $ "No valid, buildable packages found in " <> intercalate ", " dirs
281292 Just xs -> pure xs
282293