diff --git a/lib/GHCup.hs b/lib/GHCup.hs index 9fdbe08..8a66fdb 100644 --- a/lib/GHCup.hs +++ b/lib/GHCup.hs @@ -506,6 +506,9 @@ listVersions av lt criteria pfreq = do GHC -> do slr <- strayGHCs avTools pure $ (sort (slr ++ lr)) + Cabal -> do + slr <- strayCabals avTools + pure $ (sort (slr ++ lr)) _ -> pure lr Nothing -> do ghcvers <- listVersions av (Just GHC) criteria pfreq @@ -554,6 +557,33 @@ listVersions av lt criteria pfreq = do [i|Could not parse version of stray directory #{toFilePath e}|] pure Nothing + strayCabals :: (MonadReader Settings m, MonadCatch m, MonadThrow m, MonadLogger m, MonadIO m) + => Map.Map Version [Tag] + -> m [ListResult] + strayCabals avTools = do + cabals <- getInstalledCabals + fmap catMaybes $ forM cabals $ \case + Right ver -> + case Map.lookup ver avTools of + Just _ -> pure Nothing + Nothing -> do + lSet <- fmap (maybe False (== ver)) $ cabalSet + pure $ Just $ ListResult + { lTool = Cabal + , lVer = ver + , lCross = Nothing + , lTag = [] + , lInstalled = True + , lStray = maybe True (const False) (Map.lookup ver avTools) + , lNoBindist = False + , fromSrc = False -- actually, we don't know :> + , .. + } + Left e -> do + $(logWarn) + [i|Could not parse version of stray directory #{toFilePath e}|] + pure Nothing + -- NOTE: this are not cross ones, because no bindists toListResult :: (MonadReader Settings m, MonadIO m, MonadCatch m) => Tool -> (Version, [Tag]) -> m ListResult toListResult t (v, tags) = case t of