diff --git a/src/Handler/Apps.hs b/src/Handler/Apps.hs index 7267d44..7c9bbe7 100644 --- a/src/Handler/Apps.hs +++ b/src/Handler/Apps.hs @@ -76,7 +76,7 @@ getAppR file = do addPackageHeader pkg version void $ recordMetrics pkg version (len, src) <- getPackage pkg version >>= \case - Nothing -> sendResponseStatus status404 ([i|#{pkg}@#{version} not found|] :: Text) + Nothing -> sendResponseStatus status404 (NotFoundE [i|#{pkg}@#{version}|]) Just a -> pure a addHeader "Content-Length" (show len) respondSource typeOctet $ src .| awaitForever sendChunkBS diff --git a/src/Lib/PkgRepository.hs b/src/Lib/PkgRepository.hs index 56a7251..fc4db82 100644 --- a/src/Lib/PkgRepository.hs +++ b/src/Lib/PkgRepository.hs @@ -96,7 +96,8 @@ import UnliftIO ( MonadUnliftIO ) import UnliftIO ( tryPutMVar ) import UnliftIO.Concurrent ( forkIO ) -import UnliftIO.Directory ( doesPathExist +import UnliftIO.Directory ( doesDirectoryExist + , doesPathExist , getFileSize , listDirectory , removeFile @@ -122,11 +123,16 @@ data PkgRepo = PkgRepo getVersionsFor :: (MonadIO m, MonadReader r m, Has PkgRepo r, MonadLogger m) => PkgId -> m [Version] getVersionsFor pkg = do - root <- asks pkgRepoFileRoot - subdirs <- listDirectory $ root show pkg - let (failures, successes) = partitionEithers $ (Atto.parseOnly parseVersion . T.pack) <$> subdirs - for_ failures $ \f -> $logWarn [i|Emver Parse Failure for #{pkg}: #{f}|] - pure successes + root <- asks pkgRepoFileRoot + let pkgDir = root show pkg + exists <- doesDirectoryExist pkgDir + if exists + then do + subdirs <- listDirectory pkgDir + let (failures, successes) = partitionEithers $ (Atto.parseOnly parseVersion . T.pack) <$> subdirs + for_ failures $ \f -> $logWarn [i|Emver Parse Failure for #{pkg}: #{f}|] + pure successes + else pure [] getViableVersions :: (MonadIO m, MonadReader r m, Has PkgRepo r, MonadLogger m) => PkgId -> VersionRange -> m [Version] getViableVersions pkg spec = filter (`satisfies` spec) <$> getVersionsFor pkg