on master help sign in
Show the "package not found" error on bad installs
commit988c63c0c9f4096af4d5700fe48ed5072e88a561 authorEvan Czaplicki <evancz@users.noreply.github.com> dateThu 29 Mar 2018, 19:21 (9 years ago) parentaacbe2c
4 files changed+78−16
builder/src/Deps/Explorer.hs+17−1 builder/src/Deps/Get.hs+7−8 builder/src/Elm/Install.hs+4−2 builder/src/Reporting/Exit/Deps.hs+50−5
builder/src/Deps/Explorer.hs+17−1
@@ -4,6 +4,7 @@ module Deps.Explorer
44 , Metadata
55 , Info(..)
66 , run
7+ , exists
78 , getVersions
89 , getConstraints
910 )
@@ -62,6 +63,21 @@ run explorer =
6263
6364
6465
66+-- EXISTS
67+
68+
69+exists :: Name -> Explorer ()
70+exists name =
71+ do pkgs <- gets _vsns
72+ case Get.versions name pkgs of
73+ Right _ ->
74+ return ()
75+
76+ Left allPkgs ->
77+ throwError (Exit.Deps (E.PackageNotFound name allPkgs))
78+
79+
80+
6581-- VERSIONS
6682
6783
@@ -72,7 +88,7 @@ getVersions name =
7288 Right versions ->
7389 return versions
7490
75− Left _suggestions ->
91+ Left _allPkgs ->
7692 throwError (Exit.Deps (E.CorruptVersionCache name))
7793
7894
builder/src/Deps/Get.hs+7−8
@@ -10,6 +10,7 @@ module Deps.Get
1010 )
1111 where
1212
13+
1314import Prelude hiding (all)
1415import Control.Monad.Except (catchError, liftIO)
1516import qualified Data.ByteString as BS
@@ -22,11 +23,9 @@ import qualified Text.PrettyPrint.ANSI.Leijen as P
2223
2324import qualified Elm.Docs as Docs
2425import qualified Elm.Package as Pkg
25−import Elm.Package (Name, Version)
2626
2727import qualified Deps.Website as Website
2828import qualified Elm.Project.Json as Project
29−import qualified Elm.Utils as Utils
3029import qualified File.IO as IO
3130import qualified Reporting.Exit as Exit
3231import qualified Reporting.Exit.Assets as E
@@ -42,7 +41,7 @@ import qualified Json.Decode as Decode
4241data Mode = RequireLatest | AllowOffline
4342
4443
45−newtype AllPackages = AllPackages (Map Name [Version])
44+newtype AllPackages = AllPackages (Map Pkg.Name [Pkg.Version])
4645
4746
4847all :: Mode -> Task.Task AllPackages
@@ -85,7 +84,7 @@ fetchNew versionsFile mode =
8584 return (AllPackages newAllPkgs)
8685
8786
88−addNew :: Map Name [Version] -> (Name, Version) -> Map Name [Version]
87+addNew :: Map Pkg.Name [Pkg.Version] -> (Pkg.Name, Pkg.Version) -> Map Pkg.Name [Pkg.Version]
8988addNew packages (name, version) =
9089 Map.insertWith (++) name [version] packages
9190
@@ -94,21 +93,21 @@ addNew packages (name, version) =
9493-- VERSIONS
9594
9695
97−versions :: Name -> AllPackages -> Either [Name] [Version]
96+versions :: Pkg.Name -> AllPackages -> Either [Pkg.Name] [Pkg.Version]
9897versions name (AllPackages pkgs) =
9998 case Map.lookup name pkgs of
10099 Just vsns ->
101100 Right vsns
102101
103102 Nothing ->
104− Left (Utils.nearbyNames Pkg.toString name (Map.keys pkgs))
103+ Left (Map.keys pkgs)
105104
106105
107106
108107-- PACKAGE INFO
109108
110109
111−info :: Name -> Version -> Task.Task Project.PkgInfo
110+info :: Pkg.Name -> Pkg.Version -> Task.Task Project.PkgInfo
112111info name version =
113112 do dir <- Task.getPackageCacheDirFor name version
114113 let elmJson = dir </> "elm.json"
@@ -136,7 +135,7 @@ info name version =
136135-- DOCS
137136
138137
139−docs :: Name -> Version -> Task.Task Docs.Documentation
138+docs :: Pkg.Name -> Pkg.Version -> Task.Task Docs.Documentation
140139docs name version =
141140 do dir <- Task.getPackageCacheDirFor name version
142141 let docsJson = dir </> "docs.json"
builder/src/Elm/Install.hs+4−2
@@ -138,7 +138,8 @@ keepNew change =
138138addToApp :: Name -> Project.AppInfo -> Task.Task (Map Name (Change Version))
139139addToApp pkg info@(Project.AppInfo _ _ deps tests trans) =
140140 Explorer.run $
141− do let old = Map.unions [ deps, tests, trans ]
141+ do Explorer.exists pkg
142+ let old = Map.unions [ deps, tests, trans ]
142143 result <- Solver.run (addToAppHelp pkg info)
143144 case result of
144145 Just new ->
@@ -177,7 +178,8 @@ addToAppHelp pkg (Project.AppInfo _ _ deps tests trans) =
177178addToPkg :: Name -> Project.PkgInfo -> Task.Task (Map Name (Change Constraint))
178179addToPkg pkg info@(Project.PkgInfo _ _ _ _ _ deps tests _) =
179180 Explorer.run $
180− do let old = Map.union deps tests
181+ do Explorer.exists pkg
182+ let old = Map.union deps tests
181183 result <- Solver.run (addToPkgHelp pkg info)
182184 case result of
183185 Just new ->
builder/src/Reporting/Exit/Deps.hs+50−5
@@ -5,12 +5,17 @@ module Reporting.Exit.Deps
55 )
66 where
77
8+
9+import Data.Function (on)
10+import qualified Data.List as List
11+import qualified Data.Text as Text
812import Text.PrettyPrint.ANSI.Leijen ((<>))
913import qualified Text.PrettyPrint.ANSI.Leijen as P
1014
1115import qualified Elm.Compiler as Compiler
1216import qualified Elm.Package as Pkg
1317import qualified Elm.Project.Constraint as Con
18+import qualified Elm.Utils as Utils
1419import qualified Reporting.Exit.Help as Help
1520
1621
@@ -46,12 +51,21 @@ toReport exit =
4651 \ so you can delete it and see if that fixes the issue."
4752 ]
4853
49− PackageNotFound package suggestions ->
50− Help.report "PACKAGE NOT FOUND" Nothing
51− ( "Could not find any packages named " ++ Pkg.toString package
54+ PackageNotFound package allPackages ->
55+ let
56+ suggestions =
57+ nearbyNames package allPackages
58+ in
59+ Help.docReport "PACKAGE NOT FOUND" Nothing
60+ ( P.fillSep
61+ ["I","cannot","find","a"
62+ ,P.red (P.text (Pkg.toString package))
63+ ,"package","on","the","package","website."
64+ ]
5265 )
53− [ P.text $ "Maybe you want one of these instead?"
54− , P.indent 4 $ P.vcat $ map (P.text . Pkg.toString) suggestions
66+ [ "Maybe you want one of these instead?"
67+ , P.indent 4 $ P.dullyellow $ P.vcat $ map (P.text . Pkg.toString) suggestions
68+ , "But check <https://package.elm-lang.org> to see all possibilities!"
5569 ]
5670
5771 AppBadElm version ->
@@ -97,3 +111,34 @@ toReport exit =
97111 "This probably means the downloaded files got corrupted somehow.\
98112 \ Maybe try deleting your ELM_HOME and see if that resolves the issue?"
99113 ]
114+
115+
116+
117+-- NEARBY NAMES
118+
119+
120+nearbyNames :: Pkg.Name -> [Pkg.Name] -> [Pkg.Name]
121+nearbyNames (Pkg.Name author1 project1) possibleNames =
122+ let
123+ authorDist = authorDistance (Text.unpack author1)
124+ projectDist = projectDistance (Text.unpack project1)
125+
126+ addDistance name@(Pkg.Name author2 project2) =
127+ ( authorDist author2 + projectDist project2, name )
128+ in
129+ map snd $ take 4 $
130+ List.sortBy (compare `on` fst) $
131+ map addDistance possibleNames
132+
133+
134+authorDistance :: String -> Text.Text -> Int
135+authorDistance bad possibility =
136+ abs (Utils.distance bad (Text.unpack possibility))
137+
138+
139+projectDistance :: String -> Text.Text -> Int
140+projectDistance bad possibility =
141+ if possibility == "elm-lang" || possibility == "elm-explorations" then
142+ 0
143+ else
144+ abs (Utils.distance bad (Text.unpack possibility))