@@ -36,14 +36,16 @@ import Control.Applicative
36import Control.Category ((>>>))
36import Control.Category ((>>>))
37import Control.Arrow ((***))
37import Control.Arrow ((***))
38import Control.Exception (catch, try)
38import Control.Exception (catch, try)
39+import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)
39import Control.Monad.Trans.Except
40import Control.Monad.Trans.Except
40import Control.Monad.Error.Class (MonadError(..))
41import Control.Monad.Error.Class (MonadError(..))
41import Control.Monad.Writer
42import Control.Monad.Writer
43−import System.Directory (doesFileExist)
44+import System.Directory (doesFileExist, findExecutable)
44import System.Process (readProcess)
45import System.Process (readProcess)
45import System.Exit (exitFailure)
46import System.Exit (exitFailure)
46import qualified System.FilePath.Glob as Glob
47import qualified System.FilePath.Glob as Glob
48+import qualified System.Info
48import Web.Bower.PackageMeta (PackageMeta(..), BowerError(..), PackageName,
50import Web.Bower.PackageMeta (PackageMeta(..), BowerError(..), PackageName,
49 runPackageName, parsePackageName, Repository(..))
51 runPackageName, parsePackageName, Repository(..))
@@ -238,7 +240,8 @@ data DependencyStatus
238-- appropriate to link to, and we should omit links.
240-- appropriate to link to, and we should omit links.
239getResolvedDependencies :: [PackageName] -> PrepareM [(PackageName, Version)]
241getResolvedDependencies :: [PackageName] -> PrepareM [(PackageName, Version)]
240getResolvedDependencies declaredDeps = do
242getResolvedDependencies declaredDeps = do
243+ bower <- findBowerExecutable
241− depsBS <- fromString <$> readProcess' "bower" ["list", "--json", "--offline"] ""
244+ depsBS <- fromString <$> readProcess' bower ["list", "--json", "--offline"] ""
243 -- Check for undeclared dependencies
246 -- Check for undeclared dependencies
244 toplevels <- catchJSON (parse asToplevelDependencies depsBS)
247 toplevels <- catchJSON (parse asToplevelDependencies depsBS)
@@ -250,6 +253,15 @@ getResolvedDependencies declaredDeps = do
251 catchJSON = flip catchLeft (internalError . JSONError FromBowerList)
254 catchJSON = flip catchLeft (internalError . JSONError FromBowerList)
256+findBowerExecutable :: PrepareM String
257+findBowerExecutable = do
258+ mname <- liftIO . runMaybeT . msum . map (MaybeT . findExecutable) $ names
259+ maybe (userError (BowerExecutableNotFound names)) return mname
261+ names = case System.Info.os of
262+ "mingw32" -> ["bower", "bower.cmd"]
253-- | Extracts all dependencies and their versions from
265-- | Extracts all dependencies and their versions from
254-- `bower list --json --offline`
266-- `bower list --json --offline`
255asResolvedDependencies :: Parse BowerError [(PackageName, DependencyStatus)]
267asResolvedDependencies :: Parse BowerError [(PackageName, DependencyStatus)]