Skip to content

Commit 1d18803

Browse files
committed
Merge pull request #1555 from kadoban/template-edge-cases
give better errors for broken templates
2 parents 189d677 + c3674b0 commit 1d18803

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/Stack/New.hs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ loadTemplate name logIt = do
167167

168168
-- | Apply and unpack a template into a directory.
169169
applyTemplate
170-
:: (MonadIO m, MonadThrow m, MonadReader r m, HasConfig r, MonadLogger m)
170+
:: (MonadIO m, MonadThrow m, MonadCatch m, MonadReader r m, HasConfig r, MonadLogger m)
171171
=> PackageName
172172
-> TemplateName
173173
-> Map Text Text
@@ -189,9 +189,17 @@ applyTemplate project template nonceParams dir templateText = do
189189
unless (S.null missingKeys)
190190
($logInfo (T.pack (show (MissingParameters project template missingKeys (configUserConfigPath config)))))
191191
files :: Map FilePath LB.ByteString <-
192-
execWriterT $
193-
yield (T.encodeUtf8 (LT.toStrict applied)) $$
194-
unpackTemplate receiveMem id
192+
catch (execWriterT $
193+
yield (T.encodeUtf8 (LT.toStrict applied)) $$
194+
unpackTemplate receiveMem id
195+
)
196+
(\(e :: ProjectTemplateException) ->
197+
throwM (InvalidTemplate template (show e)))
198+
when (M.null files) $
199+
throwM (InvalidTemplate template "Template does not contain any files")
200+
unless (any (".cabal" `isSuffixOf`) . M.keys $ files) $
201+
throwM (InvalidTemplate template "Template does not contain a .cabal\
202+
\ file")
195203
liftM
196204
M.fromList
197205
(mapM
@@ -319,6 +327,7 @@ data NewException
319327
| BadTemplatesJSON !String !LB.ByteString
320328
| AlreadyExists !(Path Abs Dir)
321329
| MissingParameters !PackageName !TemplateName !(Set String) !(Path Abs File)
330+
| InvalidTemplate !TemplateName !String
322331
deriving (Typeable)
323332

324333
instance Exception NewException
@@ -373,3 +382,7 @@ instance Show NewException where
373382
(\key ->
374383
"-p \"" <> key <> ":value\"")
375384
(S.toList missingKeys))]
385+
show (InvalidTemplate name why) =
386+
"The template \"" <> T.unpack (templateName name) <>
387+
"\" is invalid and could not be used. " <>
388+
"The error was: \"" <> why <> "\""

0 commit comments

Comments
 (0)