Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Abstract definition of a Repository
Most clients should only need to import this module if they wish to define their own Repository implementations.
Synopsis
- data Metadata
- data Binary
- data RemoteFile :: Type -> Type -> Type where
- RemoteTimestamp :: RemoteFile (FormatUn :- ()) Metadata
- RemoteRoot :: Maybe (Trusted FileInfo) -> RemoteFile (FormatUn :- ()) Metadata
- RemoteSnapshot :: Trusted FileInfo -> RemoteFile (FormatUn :- ()) Metadata
- RemoteMirrors :: Trusted FileInfo -> RemoteFile (FormatUn :- ()) Metadata
- RemoteIndex :: HasFormat fs FormatGz -> Formats fs (Trusted FileInfo) -> RemoteFile fs Binary
- RemotePkgTarGz :: PackageIdentifier -> Trusted FileInfo -> RemoteFile (FormatGz :- ()) Binary
- data CachedFile
- data IndexFile :: Type -> Type where
- IndexPkgMetadata :: PackageIdentifier -> IndexFile (Signed Targets)
- IndexPkgCabal :: PackageIdentifier -> IndexFile ()
- IndexPkgPrefs :: PackageName -> IndexFile ()
- remoteFileDefaultFormat :: RemoteFile fs typ -> Some (HasFormat fs)
- remoteFileDefaultInfo :: RemoteFile fs typ -> Maybe (Trusted FileInfo)
- data Repository down = DownloadedFile down => Repository {
- repGetRemote :: forall fs typ. Throws SomeRemoteError => AttemptNr -> RemoteFile fs typ -> Verify (Some (HasFormat fs), down typ)
- repGetCached :: CachedFile -> IO (Maybe (Path Absolute))
- repGetCachedRoot :: IO (Path Absolute)
- repClearCache :: IO ()
- repWithIndex :: forall a. (Handle -> IO a) -> IO a
- repGetIndexIdx :: IO TarIndex
- repLockCache :: IO () -> IO ()
- repWithMirror :: forall a. Maybe [Mirror] -> IO a -> IO a
- repLog :: LogMessage -> IO ()
- repLayout :: RepoLayout
- repIndexLayout :: IndexLayout
- repDescription :: String
- newtype AttemptNr = AttemptNr Int
- data LogMessage
- = LogRootUpdated
- | LogVerificationError VerificationError
- | forall fs typ. LogDownloading (RemoteFile fs typ)
- | forall fs. LogUpdating (RemoteFile fs Binary)
- | LogSelectedMirror MirrorDescription
- | forall fs. LogCannotUpdate (RemoteFile fs Binary) UpdateFailure
- | LogMirrorFailed MirrorDescription SomeException
- | LogLockWait (Path Absolute)
- | LogLockWaitDone (Path Absolute)
- | LogUnlock (Path Absolute)
- data UpdateFailure
- data SomeRemoteError :: Type where
- SomeRemoteError :: Exception e => e -> SomeRemoteError
- class DownloadedFile (down :: Type -> Type) where
- downloadedVerify :: down a -> Trusted FileInfo -> IO Bool
- downloadedRead :: down Metadata -> IO ByteString
- downloadedCopyTo :: down a -> Path Absolute -> IO ()
- mirrorsUnsupported :: Maybe [Mirror] -> IO a -> IO a
- remoteRepoPath :: RepoLayout -> RemoteFile fs typ -> Formats fs RepoPath
- remoteRepoPath' :: RepoLayout -> RemoteFile fs typ -> HasFormat fs f -> RepoPath
- data IsCached :: Type -> Type where
- mustCache :: RemoteFile fs typ -> IsCached typ
Files
data RemoteFile :: Type -> Type -> Type where Source #
Abstract definition of files we might have to download
RemoteFile
is parametrized by the type of the formats that we can accept
from the remote repository, as well as with information on whether this file
is metadata actual binary content.
NOTE: Haddock lacks GADT support so constructors have only regular comments.
RemoteTimestamp :: RemoteFile (FormatUn :- ()) Metadata | |
RemoteRoot :: Maybe (Trusted FileInfo) -> RemoteFile (FormatUn :- ()) Metadata | |
RemoteSnapshot :: Trusted FileInfo -> RemoteFile (FormatUn :- ()) Metadata | |
RemoteMirrors :: Trusted FileInfo -> RemoteFile (FormatUn :- ()) Metadata | |
RemoteIndex :: HasFormat fs FormatGz -> Formats fs (Trusted FileInfo) -> RemoteFile fs Binary | |
RemotePkgTarGz :: PackageIdentifier -> Trusted FileInfo -> RemoteFile (FormatGz :- ()) Binary |
Instances
Show (RemoteFile fs typ) Source # | |
Defined in Hackage.Security.Client.Repository showsPrec :: Int -> RemoteFile fs typ -> ShowS # show :: RemoteFile fs typ -> String # showList :: [RemoteFile fs typ] -> ShowS # | |
Pretty (RemoteFile fs typ) Source # | |
Defined in Hackage.Security.Client.Repository pretty :: RemoteFile fs typ -> String Source # |
data CachedFile Source #
Files that we might request from the local cache
CachedTimestamp | Timestamp metadata ( |
CachedRoot | Root metadata ( |
CachedSnapshot | Snapshot metadata ( |
CachedMirrors | Mirrors list ( |
Instances
Show CachedFile Source # | |
Defined in Hackage.Security.Client.Repository showsPrec :: Int -> CachedFile -> ShowS # show :: CachedFile -> String # showList :: [CachedFile] -> ShowS # | |
Eq CachedFile Source # | |
Defined in Hackage.Security.Client.Repository (==) :: CachedFile -> CachedFile -> Bool # (/=) :: CachedFile -> CachedFile -> Bool # | |
Ord CachedFile Source # | |
Defined in Hackage.Security.Client.Repository compare :: CachedFile -> CachedFile -> Ordering # (<) :: CachedFile -> CachedFile -> Bool # (<=) :: CachedFile -> CachedFile -> Bool # (>) :: CachedFile -> CachedFile -> Bool # (>=) :: CachedFile -> CachedFile -> Bool # max :: CachedFile -> CachedFile -> CachedFile # min :: CachedFile -> CachedFile -> CachedFile # | |
Pretty CachedFile Source # | |
Defined in Hackage.Security.Client.Repository pretty :: CachedFile -> String Source # |
data IndexFile :: Type -> Type where Source #
Files that we might request from the index
The type index tells us the type of the decoded file, if any. For files for
which the library does not support decoding this will be ()
.
NOTE: Clients should NOT rely on this type index being ()
, or they might
break if we add support for parsing additional file formats in the future.
TODO: If we wanted to support legacy Hackage, we should also have a case for the global preferred-versions file. But supporting legacy Hackage will probably require more work anyway..
IndexPkgMetadata :: PackageIdentifier -> IndexFile (Signed Targets) | |
IndexPkgCabal :: PackageIdentifier -> IndexFile () | |
IndexPkgPrefs :: PackageName -> IndexFile () |
remoteFileDefaultFormat :: RemoteFile fs typ -> Some (HasFormat fs) Source #
Default format for each file type
For most file types we don't have a choice; for the index the repository is only required to offer the GZip-compressed format so that is the default.
remoteFileDefaultInfo :: RemoteFile fs typ -> Maybe (Trusted FileInfo) Source #
Default file info (see also remoteFileDefaultFormat
)
Repository proper
data Repository down Source #
Repository
This is an abstract representation of a repository. It simply provides a way to download metafiles and target files, without specifying how this is done. For instance, for a local repository this could just be doing a file read, whereas for remote repositories this could be using any kind of HTTP client.
DownloadedFile down => Repository | |
|
Instances
Show (Repository down) Source # | |
Defined in Hackage.Security.Client.Repository showsPrec :: Int -> Repository down -> ShowS # show :: Repository down -> String # showList :: [Repository down] -> ShowS # |
Are we requesting this information because of a previous validation error?
Clients can take advantage of this to tell caches to revalidate files.
data LogMessage Source #
Log messages
We use a RemoteFile
rather than a RepoPath
here because we might not have
a RepoPath
for the file that we were trying to download (that is, for
example if the server does not provide an uncompressed tarball, it doesn't
make much sense to list the path to that non-existing uncompressed tarball).
LogRootUpdated | Root information was updated This message is issued when the root information is updated as part of the normal check for updates procedure. If the root information is updated because of a verification error WarningVerificationError is issued instead. |
LogVerificationError VerificationError | A verification error Verification errors can be temporary, and may be resolved later; hence these are just warnings. (Verification errors that cannot be resolved are thrown as exceptions.) |
forall fs typ. LogDownloading (RemoteFile fs typ) | Download a file from a repository |
forall fs. LogUpdating (RemoteFile fs Binary) | Incrementally updating a file from a repository |
LogSelectedMirror MirrorDescription | Selected a particular mirror |
forall fs. LogCannotUpdate (RemoteFile fs Binary) UpdateFailure | Updating a file failed (we will instead download it whole) |
LogMirrorFailed MirrorDescription SomeException | We got an exception with a particular mirror (we will try with a different mirror if any are available) |
LogLockWait (Path Absolute) | This log event is triggered before invoking a filesystem lock
operation that may block for a significant amount of time; once
the possibly blocking call completes successfully,
Since: 0.6.0 |
LogLockWaitDone (Path Absolute) | Denotes completion of the operation that advertised a
Since: 0.6.0 |
LogUnlock (Path Absolute) | Denotes the filesystem lock previously acquired (signaled by
Since: 0.6.0 |
Instances
Pretty LogMessage Source # | |
Defined in Hackage.Security.Client.Repository pretty :: LogMessage -> String Source # |
data UpdateFailure Source #
Records why we are downloading a file rather than updating it.
UpdateImpossibleUnsupported | Server does not support incremental downloads |
UpdateImpossibleNoLocalCopy | We don't have a local copy of the file to update |
UpdateFailedTwice | Update failed twice If we attempt an incremental update the first time, and it fails, we let it go round the loop, update local security information, and try again. But if an incremental update then fails _again_, we instead attempt a regular download. |
UpdateFailed SomeException | Update failed (for example: perhaps the local file got corrupted) |
Instances
Pretty UpdateFailure Source # | |
Defined in Hackage.Security.Client.Repository pretty :: UpdateFailure -> String Source # |
data SomeRemoteError :: Type where Source #
Repository-specific exceptions
For instance, for repositories using HTTP this might correspond to a 404; for local repositories this might correspond to file-not-found, etc.
SomeRemoteError :: Exception e => e -> SomeRemoteError |
Instances
Exception SomeRemoteError Source # | |
Defined in Hackage.Security.Client.Repository | |
Show SomeRemoteError Source # | |
Defined in Hackage.Security.Client.Repository showsPrec :: Int -> SomeRemoteError -> ShowS # show :: SomeRemoteError -> String # showList :: [SomeRemoteError] -> ShowS # | |
Pretty SomeRemoteError Source # | |
Defined in Hackage.Security.Client.Repository pretty :: SomeRemoteError -> String Source # |
Downloaded files
class DownloadedFile (down :: Type -> Type) where Source #
downloadedVerify :: down a -> Trusted FileInfo -> IO Bool Source #
Verify a download file
downloadedRead :: down Metadata -> IO ByteString Source #
Read the file we just downloaded into memory
We never read binary data, only metadata.
downloadedCopyTo :: down a -> Path Absolute -> IO () Source #
Copy a downloaded file to its destination
Instances
DownloadedFile LocalFile Source # | |
Defined in Hackage.Security.Client.Repository.Local | |
DownloadedFile RemoteTemp Source # | |
Defined in Hackage.Security.Client.Repository.Remote downloadedVerify :: RemoteTemp a -> Trusted FileInfo -> IO Bool Source # downloadedRead :: RemoteTemp Metadata -> IO ByteString Source # downloadedCopyTo :: RemoteTemp a -> Path Absolute -> IO () Source # |
Helpers
mirrorsUnsupported :: Maybe [Mirror] -> IO a -> IO a Source #
Helper function to implement repWithMirrors
.
Paths
remoteRepoPath :: RepoLayout -> RemoteFile fs typ -> Formats fs RepoPath Source #
remoteRepoPath' :: RepoLayout -> RemoteFile fs typ -> HasFormat fs f -> RepoPath Source #
Utility
data IsCached :: Type -> Type where Source #
Is a particular remote file cached?
CacheAs :: CachedFile -> IsCached Metadata | |
DontCache :: IsCached Binary | |
CacheIndex :: IsCached Binary |
mustCache :: RemoteFile fs typ -> IsCached typ Source #
Which remote files should we cache locally?