git-annex 10.20261026 → 10.20261113
raw patch · 41 files changed
+4686/−265 lines, 41 filesdep +http-semanticsdep +libmagicdep +nsisdep −magicdep ~network
Dependencies added: http-semantics, libmagic, nsis
Dependencies removed: magic
Dependency ranges changed: network
Files
- Annex.hs +16/−5
- Annex/Action.hs +9/−4
- Annex/Magic.hs +49/−29
- Annex/Path.hs +11/−6
- Build/BundledPrograms.hs +0/−14
- Build/NullSoftInstaller.hs +236/−0
- BuildFlags.hs +1/−5
- CHANGELOG +28/−0
- CmdLine/Action.hs +16/−24
- CmdLine/GitAnnex.hs +2/−0
- CmdLine/Multicall.hs +22/−1
- Command/P2PHttp.hs +16/−8
- Command/Transfers.hs +123/−0
- Database/RepoSize.hs +7/−4
- Git/Config.hs +12/−3
- Logs/Transfer.hs +3/−3
- Messages.hs +4/−0
- Messages/Concurrent.hs +23/−1
- Messages/JSON.hs +5/−0
- Messages/Progress.hs +6/−1
- P2P/Http/Client.hs +11/−9
- P2P/Http/State.hs +249/−30
- P2P/Http/Url.hs +3/−0
- P2P/Protocol.hs +25/−13
- Remote/Git.hs +6/−0
- Test.hs +31/−5
- Types/Messages.hs +2/−0
- Types/WorkerPool.hs +42/−7
- Utility/Hash.hs +0/−4
- Utility/Hash/HMAC.hs +1/−15
- Utility/LRU.hs +202/−0
- Utility/Metered.hs +33/−19
- Utility/SimpleProtocol.hs +1/−2
- cabal-stackage.config +3453/−0
- cabal-stackage.project +9/−0
- cabal.project +2/−0
- git-annex.cabal +17/−18
- git-annex.hs +4/−2
- stack-NoLLMDependencies.yaml +3/−2
- stack-botan.yaml +0/−29
- stack.yaml +3/−2
Annex.hs view
@@ -13,6 +13,7 @@ AnnexRead(..), new, new',+ newMaker, run, eval, makeRunner,@@ -296,19 +297,29 @@ , reposizehandle = Nothing } -{- Makes an Annex state object for the specified git repo.+{- Makes an Annex state and read objects for the specified git repo. - Ensures the config is read, if it was not already, and performs - any necessary git repo fixups. -} new :: Git.Repo -> IO (AnnexState, AnnexRead) new = new' fixupRepo new' :: (Git.Repo -> GitConfig -> IO Git.Repo) -> Git.Repo -> IO (AnnexState, AnnexRead)-new' f r = do+new' f r = join $ newMaker' f r++{- Returns an IO action which can be called repeatedly, making+ - new Annex state and read objects each time. -}+newMaker :: Git.Repo -> IO (IO (AnnexState, AnnexRead))+newMaker = newMaker' fixupRepo++newMaker' :: (Git.Repo -> GitConfig -> IO Git.Repo) -> Git.Repo -> IO (IO (AnnexState, AnnexRead))+newMaker' f r = do r' <- Git.Config.read r let c = extractGitConfig FromGitConfig r'- st <- newAnnexState c =<< f r' c- rd <- newAnnexRead c- return (st, rd)+ r'' <- f r' c+ return $ do+ st <- newAnnexState c r''+ rd <- newAnnexRead c+ return (st, rd) {- Performs an action in the Annex monad from a starting state, - returning a new state. -}
Annex/Action.hs view
@@ -1,6 +1,6 @@ {- git-annex actions -- - Copyright 2010-2022 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -23,6 +23,7 @@ import Annex.CheckIgnore import Annex.TransferrerPool import qualified Database.Keys+import qualified Database.RepoSize {- Runs an action that may throw exceptions, catching and displaying them. -} action :: Annex () -> Annex Bool@@ -39,8 +40,8 @@ warning (UnquotedString (show e)) return (False, UnVerified) -{- Rn all cleanup actions, save all state, stop all long-running child- - processes.+{- Rn all cleanup actions, save all state, stop long-running child+ - processes, close file handles. - - This can be run repeatedly with other Annex actions run in between, - but usually it is run only once at the end.@@ -58,8 +59,12 @@ saveState nocommit stopCoProcesses Database.Keys.closeDb+ Database.RepoSize.closeDb -{- Stops all long-running child processes, including git query processes. -}+{- Stops long-running child processes, including git query processes. + -+ - Does not stop processes belonging to Remotes or Backends.+ -} stopCoProcesses :: Annex () stopCoProcesses = do catFileStop
Annex/Magic.hs view
@@ -1,6 +1,6 @@ {- Interface to libmagic -- - Copyright 2019-2020 Joey Hess <id@joeyh.name>+ - Copyright 2019-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -13,32 +13,63 @@ MimeType, MimeEncoding, initMagicMime,+ getMagicMime, getMagicMimeType, getMagicMimeEncoding,+ parseMagicMime,+ magicFileLocation, ) where import Common import Types.Mime import Control.Monad.IO.Class+import qualified Data.ByteString as B+import Data.Char+import Utility.Env+import Annex.Path+ #ifdef WITH_MAGICMIME import Magic-import Utility.Env-import Control.Concurrent-import System.IO.Unsafe (unsafePerformIO)+import qualified Data.List.NonEmpty as NE+import qualified System.OsString.Internal as OS #else type Magic = () #endif +magicFileLocation :: IO (Maybe OsPath)+magicFileLocation = + gitAnnexInstallDir >>= \case+ Nothing -> do+#ifndef mingw32_HOST_OS+ pure Nothing+#else+ -- On windows, the magic file is+ -- in ../share/misc/ relative+ -- to the program.+ pd <- takeDirectory <$> programPath+ use $+ pd+ </> literalOsPath ".."+ </> literalOsPath "share"+ </> literalOsPath "misc"+ </> literalOsPath "magic.mgc"+#endif+ Just d -> use $+ d+ </> literalOsPath "magic"+ </> literalOsPath "magic.mgc"+ where+ use p = Just . maybe p toOsPath <$> getEnv "MAGIC"+ initMagicMime :: IO (Maybe Magic) #ifdef WITH_MAGICMIME initMagicMime = catchMaybeIO $ do m <- magicOpen [MagicMime]- liftIO $ getEnv "GIT_ANNEX_DIR" >>= \case+ magicFileLocation >>= \case Nothing -> magicLoadDefault m- Just d -> magicLoad m $ fromOsPath $- toOsPath d- </> literalOsPath "magic"- </> literalOsPath "magic.mgc"+ Just d -> do+ p <- OS.encodeFS $ fromOsPath d+ magicLoad m $ NE.singleton p return m #else initMagicMime = return Nothing@@ -46,32 +77,21 @@ getMagicMime :: Magic -> OsPath -> IO (Maybe (MimeType, MimeEncoding)) #ifdef WITH_MAGICMIME-getMagicMime m f = Just . parse <$> magicConcurrentSafe (magicFile m (fromOsPath f))- where- parse s = - let (mimetype, rest) = separate (== ';') s- in case rest of- (' ':'c':'h':'a':'r':'s':'e':'t':'=':mimeencoding) -> - (mimetype, mimeencoding)- _ -> (mimetype, "")+getMagicMime m f = Just . parseMagicMime+ <$> (magicFile m =<< OS.encodeFS (fromOsPath f)) #else getMagicMime _ _ = return Nothing #endif +parseMagicMime :: B.ByteString -> (MimeType, MimeEncoding)+parseMagicMime b = (decodeBS mimetype, decodeBS mimeencoding)+ where+ (mimetype, rest) = B.break (== semicolon) b+ mimeencoding = fromMaybe mempty (B.stripPrefix "; charset=" rest)+ semicolon = fromIntegral (ord ';')+ getMagicMimeType :: MonadIO m => Magic -> OsPath -> m (Maybe MimeType) getMagicMimeType m f = liftIO $ fmap fst <$> getMagicMime m f getMagicMimeEncoding :: MonadIO m => Magic -> OsPath -> m(Maybe MimeEncoding) getMagicMimeEncoding m f = liftIO $ fmap snd <$> getMagicMime m f--#ifdef WITH_MAGICMIME-{-# NOINLINE mutex #-}-mutex :: MVar ()-mutex = unsafePerformIO $ newMVar ()---- Work around a bug, the library is not concurrency safe and will--- sometimes access the wrong memory if multiple ones are called at the--- same time.-magicConcurrentSafe :: IO a -> IO a-magicConcurrentSafe = bracket_ (takeMVar mutex) (putMVar mutex ())-#endif
Annex/Path.hs view
@@ -1,6 +1,6 @@ {- git-annex program path -- - Copyright 2013-2024 Joey Hess <id@joeyh.name>+ - Copyright 2013-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -8,6 +8,7 @@ module Annex.Path ( programPath, readProgramFile,+ gitAnnexInstallDir, gitAnnexChildProcess, gitAnnexChildProcessParams, gitAnnexDaemonizeParams,@@ -24,6 +25,11 @@ import System.Environment (getExecutablePath, getArgs, getProgName) import qualified Data.Map as M +{- The standalone build sets GIT_ANNEX_DIR to the location of the+ - standalone build directory. -}+gitAnnexInstallDir :: IO (Maybe OsPath)+gitAnnexInstallDir = fmap toOsPath <$> getEnv "GIT_ANNEX_DIR"+ {- A fully qualified path to the currently running git-annex program. - - getExecutablePath is used when possible. On OSs it supports@@ -32,20 +38,19 @@ - or searching for the command name in PATH. - - The standalone build runs git-annex via ld.so, and defeats- - getExecutablePath. It sets GIT_ANNEX_DIR to the location of the- - standalone build directory, and there are wrapper scripts for git-annex- - and git-annex-shell in that directory.+ - getExecutablePath. There are wrapper scripts for git-annex+ - and git-annex-shell in the gitAnnexInstallDir. - - When the currently running program is not git-annex, but is instead eg - git-annex-shell or git-remote-annex, this finds a git-annex program - instead. -} programPath :: IO OsPath-programPath = go =<< getEnv "GIT_ANNEX_DIR"+programPath = go =<< gitAnnexInstallDir where go (Just dir) = do name <- reqgitannex <$> getProgName- return (toOsPath dir </> toOsPath name)+ return (dir </> toOsPath name) go Nothing = do name <- getProgName exe <- if isgitannex name
Build/BundledPrograms.hs view
@@ -79,17 +79,3 @@ -- we rely on the system's own version, which may better match -- its kernel, and avoid using them if not available. ]--magicDLLs :: [FilePath]-#ifdef mingw32_HOST_OS-magicDLLs = ["libmagic-1.dll", "libgnurx-0.dll"]-#else-magicDLLs = []-#endif--magicShare :: [FilePath]-#ifdef mingw32_HOST_OS-magicShare = ["magic.mgc"]-#else-magicShare = []-#endif
+ Build/NullSoftInstaller.hs view
@@ -0,0 +1,236 @@+{- Generates a NullSoft installer program for git-annex on Windows. + - + - This uses the Haskell nsis package to generate a .nsi file, + - which is then used to produce git-annex-installer.exe + - + - The installer includes git-annex, and utilities it uses, with the + - exception of git and some utilities that are bundled with git. + - The user needs to install git separately, and the installer checks + - for that. + - + - To build the installer, git-annex should already be built to + - ./git-annex.exe, then run this program by eg: + - cp git-annex.exe nullsoft-installer.exe + - ./nullsoft-installer + - + - Copyright 2013-2026 Joey Hess <id@joeyh.name> + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings, FlexibleContexts #-} + +module Build.NullSoftInstaller (main) where + +#ifndef mingw32_HOST_OS + +main :: IO () +main = error "only supported on Windows" + +#else + +import Development.NSIS +import Control.Monad +import Data.String +import Data.Maybe +import Data.List (isSuffixOf) + +import Utility.Tmp.Dir +import Utility.SafeCommand +import Utility.SystemDirectory +import Utility.OsPath +import Utility.Directory +import qualified Utility.FileIO as F +import Build.BundledPrograms + +{- Magic file database will be included if this file is found in the + - current directory. -} +magicShare :: [FilePath] +magicShare = ["magic.mgc"] + +{- *.dll in the current directory will be included. -} +findDLLs :: IO [FilePath] +findDLLs = do + l <- dirContents (literalOsPath ".") + return $ filter (".dll" `isSuffixOf`) $ map fromOsPath l + +main :: IO () +main = do + withTmpDir (literalOsPath "nsis-build") $ \tmpdir -> do + let gitannex = fromOsPath $ tmpdir </> toOsPath gitannexprogram + mustSucceed "ln" [File "git-annex.exe", File gitannex] + dlls <- findDLLs + dlls' <- installwhenpresent dlls tmpdir + magicShare' <- installwhenpresent magicShare tmpdir + let license = fromOsPath $ tmpdir </> toOsPath licensefile + mustSucceed "sh" [Param "-c", Param $ "zcat standalone/licences.gz > '" ++ license ++ "'"] + webappscript <- vbsLauncher tmpdir "git-annex-webapp" "git annex webapp" + autostartscript <- vbsLauncher tmpdir "git-annex-autostart" "git annex assistant --autostart" + let htmlhelp = tmpdir </> literalOsPath "git-annex.html" + F.writeFileString htmlhelp htmlHelpText + let gitannexcmd = tmpdir </> literalOsPath "git-annex.cmd" + F.writeFileString gitannexcmd "git annex %*" + F.writeFileString (toOsPath nsifile) $ makeInstaller + gitannex (fromOsPath gitannexcmd) license + (fromOsPath htmlhelp) + (winPrograms ++ dlls') + magicShare' + [ webappscript, autostartscript ] + mustSucceed "makensis" [File nsifile] + removeFile (toOsPath nsifile) -- left behind if makensis fails + where + nsifile = "git-annex.nsi" + mustSucceed cmd params = do + r <- boolSystem cmd params + case r of + True -> return () + False -> error $ cmd ++ " failed" + installwhenpresent fs tmpdir = do + fs' <- forM fs $ \f -> do + present <- doesFileExist (toOsPath f) + if present + then do + mustSucceed "ln" [File f, File (fromOsPath (tmpdir </> toOsPath f))] + return (Just f) + else return Nothing + return (catMaybes fs') + +{- Generates a .vbs launcher which runs a command without any visible DOS + - box. It expects to be passed the directory where git-annex is installed. -} +vbsLauncher :: OsPath -> String -> String -> IO String +vbsLauncher tmpdir basename cmd = do + let f = tmpdir </> toOsPath (basename ++ ".vbs") + F.writeFileString f $ unlines + [ "Set objshell=CreateObject(\"Wscript.Shell\")" + , "objShell.CurrentDirectory = Wscript.Arguments.item(0)" + , "objShell.Run(\"" ++ cmd ++ "\"), 0, False" + ] + return (fromOsPath f) + +gitannexprogram :: FilePath +gitannexprogram = "git-annex.exe" + +licensefile :: FilePath +licensefile = "git-annex-licenses.txt" + +installer :: FilePath +installer = "git-annex-installer.exe" + +uninstaller :: FilePath +uninstaller = "git-annex-uninstall.exe" + +gitInstallDir64 :: Exp FilePath +gitInstallDir64 = fromString "$PROGRAMFILES64\\Git" + +gitInstallDir :: Exp FilePath +gitInstallDir = gitInstallDir64 + +-- This intentionally has a different name than git-annex or +-- git-annex-webapp, since it is itself treated as an executable file. +-- Also, on XP, the filename is displayed, not the description. +startMenuItem :: Exp FilePath +startMenuItem = "$SMPROGRAMS/Git Annex (Webapp).lnk" + +oldStartMenuItem :: Exp FilePath +oldStartMenuItem = "$SMPROGRAMS/git-annex.lnk" + +autoStartItem :: Exp FilePath +autoStartItem = "$SMSTARTUP/git-annex-autostart.lnk" + +needGit :: Exp String +needGit = strConcat + [ fromString "You need git installed to use git-annex. Looking at " + , gitInstallDir + , fromString " , it seems to not be installed, " + , fromString "or may be installed in another location. " + , fromString "You can install git from http:////git-scm.com//" + ] + +makeInstaller :: FilePath -> FilePath -> FilePath -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> String +makeInstaller gitannex gitannexcmd license htmlhelp extrabins sharefiles launchers = nsis $ do + name "git-annex" + outFile $ str installer + {- Installing into the same directory as git avoids needing to modify + - path myself, since the git installer already does it. -} + installDir gitInstallDir + requestExecutionLevel Admin + + iff (fileExists gitInstallDir) + (return ()) + (alert needGit) + + -- Pages to display + page Directory -- Pick where to install + page (License license) + page InstFiles -- Give a progress bar while installing + -- Start menu shortcut + Development.NSIS.createDirectory "$SMPROGRAMS" + createShortcut startMenuItem + [ Target "wscript.exe" + , Parameters "\"$INSTDIR/cmd/git-annex-webapp.vbs\" \"$INSTDIR/cmd\"" + , StartOptions "SW_SHOWNORMAL" + , IconFile "$INSTDIR/usr/bin/git-annex.exe" + , IconIndex 2 + , Description "Git Annex (Webapp)" + ] + delete [RebootOK] $ oldStartMenuItem + createShortcut autoStartItem + [ Target "wscript.exe" + , Parameters "\"$INSTDIR/cmd/git-annex-autostart.vbs\" \"$INSTDIR/cmd\"" + , StartOptions "SW_SHOWNORMAL" + , IconFile "$INSTDIR/usr/bin/git-annex.exe" + , IconIndex 2 + , Description "git-annex autostart" + ] + _ <- section "cmd" [] $ do + -- Install everything to the same location git puts its + -- bins. This makes "git annex" work in the git bash + -- shell, since git expects to find the git-annex binary + -- there. + setOutPath "$INSTDIR\\usr\\bin" + mapM_ addfile (gitannex:extrabins) + setOutPath "$INSTDIR\\usr\\share\\misc" + mapM_ addfile sharefiles + -- This little wrapper is installed in the cmd directory, + -- so that "git-annex" works (as well as "git annex"), + -- when only that directory is in PATH (ie, in a ms-dos + -- prompt window). + setOutPath "$INSTDIR\\cmd" + addfile gitannexcmd + _ <- section "meta" [] $ do + -- git opens this file when git annex --help is run. + -- (Program Files/Git/mingw64/share/doc/git-doc/git-annex.html) + setOutPath "$INSTDIR\\mingw64\\share\\doc\\git-doc" + addfile htmlhelp + setOutPath "$INSTDIR" + addfile license + setOutPath "$INSTDIR\\cmd" + mapM_ addfile launchers + writeUninstaller $ str uninstaller + uninstall $ do + delete [RebootOK] $ startMenuItem + delete [RebootOK] $ autoStartItem + removefilesFrom "$INSTDIR/usr/bin" (gitannex:extrabins) + removefilesFrom "$INSTDIR/cmd" (gitannexcmd:launchers) + removefilesFrom "$INSTDIR\\mingw64\\share\\doc\\git-doc" [htmlhelp] + removefilesFrom "$INSTDIR" [license, uninstaller] + where + addfile f = file [] (str f) + removefilesFrom d = mapM_ (\f -> delete [RebootOK] $ fromString $ d ++ "/" ++ fromOsPath (takeFileName (toOsPath f))) + +winPrograms :: [FilePath] +winPrograms = map (\p -> p ++ ".exe") bundledPrograms + +htmlHelpText :: String +htmlHelpText = unlines + [ "<html>" + , "<title>git-annex help</title>" + , "<body>" + , "For help on git-annex, run \"git annex help\", or" + , "<a href=\"https://git-annex.branchable.com/git-annex/\">read the man page</a>." + , "</body>" + , "</html" + ] + +#endif
BuildFlags.hs view
@@ -60,15 +60,11 @@ , "S3" , "WebDAV" , "Servant"+ , "Botan" #ifdef WITH_OSPATH , "OsPath" #else #warning Building without the OsPath build flag set results in slower filename manipulation and is not recommended.-#endif-#ifdef WITH_BOTAN- , "Botan"-#else -#warning Consider building with the Botan build flag set, it speeds up checksumming by up 4x to 8x. #endif #ifdef WITH_BLAKE3 , "Blake3"
CHANGELOG view
@@ -1,3 +1,31 @@+git-annex (10.20261113) upstream; urgency=medium++ * Added transfers command, displays a live view of transfers.+ * Don't prompt for verification of proxied remotes, which is not+ necessary and didn't work. (Fixes reversion in 10.20261026.)+ * p2phttp: When --directory is used to serve a large number of+ repositories, limit the amount of git helper processes and open files.+ * Fix buggy handling of a submodule in a linked git worktree.+ * Fix bug in parsing the P2P protocol that caused breakage when filenames+ contained unicode multibyte space characters.+ * Fix mimetype and mimencoding detection of non-ascii filenames + in non-unicode locales.+ * Avoid display issues with multiple progress meters when not in a+ unicode locale.+ * Botan is enabled by default; removed build flag.+ * git-annex.cabal: Switch from magic to libmagic.+ * Allow the MAGIC environment variable to override the bundled magic file+ location.+ * The Linux arm64-ancient build has reached end of security support + and will be removed after this release. Android users are recommended+ to switch to running `pkg install git-annex` inside termux.+ * NoLLMDependencies: Update for network and http-semantics. + * Fix build when the Memory build flag is disabled.+ * Fix testremote failure with p2phttp remote.+ (Reversion from 10.20261005)++ -- Joey Hess <id@joeyh.name> Fri, 13 Nov 2026 14:08:26 -0400+ git-annex (10.20261026) upstream; urgency=high * This releases fixes a security hole that allowed private data
CmdLine/Action.hs view
@@ -17,7 +17,6 @@ import Types.Concurrency import Annex.Content import Messages.Concurrent-import Types.Messages import Types.WorkerPool import Types.ActionItem import Remote.List@@ -27,7 +26,6 @@ import Control.Concurrent.STM import GHC.Conc import qualified Data.Map.Strict as M-import qualified System.Console.Regions as Regions {- Runs a command, starting with the check stage, and then - the seek stage. Finishes by running the continuation.@@ -226,17 +224,21 @@ - started here, that has the same effect. -} startConcurrency :: UsedStages -> Annex a -> Annex a-startConcurrency usedstages a = do+startConcurrency usedstages a = startConcurrency' usedstages (const a)++{- Passes the number of worker threads to the Annex action. -}+startConcurrency' :: UsedStages -> (Int -> Annex a) -> Annex a+startConcurrency' usedstages a = do fromcmdline <- getConcurrency fromgitcfg <- annexJobs <$> Annex.getGitConfig let usegitcfg = setConcurrency (ConcurrencyGitConfig fromgitcfg) case (fromcmdline, fromgitcfg) of- (NonConcurrent, NonConcurrent) -> a+ (NonConcurrent, NonConcurrent) -> a 1 (Concurrent n, _) | n > 1 -> goconcurrent n | otherwise -> do setConcurrency' NonConcurrent ConcurrencyCmdLine- a+ a 1 (ConcurrentPerCpu, _) -> goconcurrentpercpu (NonConcurrent, Concurrent n) -> do@@ -246,29 +248,14 @@ usegitcfg goconcurrentpercpu where- goconcurrent n = do- raiseCapabilitiesForJobs n- withMessageState $ \s -> case outputType s of- NormalOutput -> ifM (liftIO concurrentOutputSupported)- ( Regions.displayConsoleRegions $- goconcurrent' n True- , goconcurrent' n False- )- _ -> goconcurrent' n False- goconcurrent' n b = bracket_ (setup n b) cleanup a+ goconcurrent n = prepareConcurrency n $+ bracket_ (setup n) cleanup (a n) goconcurrentpercpu = goconcurrent =<< liftIO getNumProcessors - setup n b = do- setconcurrentoutputenabled b- initworkerpool n-- cleanup = do- finishCommandActions- setconcurrentoutputenabled False+ setup n = initworkerpool n - setconcurrentoutputenabled b = Annex.changeState $ \s ->- s { Annex.output = (Annex.output s) { concurrentOutputEnabled = b } }+ cleanup = finishCommandActions initworkerpool n = do tv <- liftIO newEmptyTMVarIO@@ -278,6 +265,11 @@ rd <- Annex.getRead id liftIO $ atomically $ putTMVar tv $ allocateWorkerPool (st, rd) (max n 1) usedstages++prepareConcurrency :: Int -> Annex a -> Annex a+prepareConcurrency n a = do+ raiseCapabilitiesForJobs n+ withConcurrentOutput a -- Make sure that some expensive actions have been done before -- starting threads. This way the state has them already run,
CmdLine/GitAnnex.hs view
@@ -39,6 +39,7 @@ import qualified Command.DropKey import qualified Command.Transferrer import qualified Command.TransferKey+import qualified Command.Transfers import qualified Command.SetPresentKey import qualified Command.ReadPresentKey import qualified Command.CheckPresentKey@@ -216,6 +217,7 @@ , Command.DropKey.cmd , Command.Transferrer.cmd , Command.TransferKey.cmd+ , Command.Transfers.cmd , Command.SetPresentKey.cmd , Command.ReadPresentKey.cmd , Command.CheckPresentKey.cmd
CmdLine/Multicall.hs view
@@ -1,13 +1,22 @@ {- git-annex multicall binary -- - Copyright 2024-2025 Joey Hess <id@joeyh.name>+ - Copyright 2024-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module CmdLine.Multicall where ++import Common++import System.Environment (getProgName) import qualified Data.Map as M+#ifdef mingw32_HOST_OS+import Data.Char+#endif -- Commands besides git-annex that can be run by the multicall binary. --@@ -19,6 +28,7 @@ | GitRemoteAnnex | GitRemoteP2PAnnex | GitRemoteTorAnnex+ | NullSoftInstaller otherMulticallCommands :: M.Map String OtherMultiCallCommand otherMulticallCommands = M.fromList@@ -26,5 +36,16 @@ , ("git-remote-annex", GitRemoteAnnex) , ("git-remote-p2p-annex", GitRemoteP2PAnnex) , ("git-remote-tor-annex", GitRemoteTorAnnex)+ , ("nullsoft-installer", NullSoftInstaller) ] +getCommandName :: IO String+getCommandName = do+#ifdef mingw32_HOST_OS+ n <- progname+ return $ map toLower $ takeWhile (/= '.') n+#else+ progname+#endif+ where+ progname = fromOsPath . takeFileName . toOsPath <$> getProgName
Command/P2PHttp.hs view
@@ -139,7 +139,7 @@ lockedfilesqsem <- liftIO $ mkLockedFilesQSem (lockedFilesOption o) authenv <- liftIO getAuthEnv- st <- mkServerState o authenv lockedfilesqsem+ st <- mkServerState o authenv lockedfilesqsem NoWorkerLimit liftIO $ runServer o st -- Run in a git repository that is not a git-annex repository. , liftIO $ startIO o @@ -158,20 +158,27 @@ mkst authenv oldst = do lockedfilesqsem <- mkLockedFilesQSem (lockedFilesOption o) repos <- findRepos o+ workerlimit <- mkAnnexWorkerLimit sts <- forM repos $ \r -> do- strd <- Annex.new r- Annex.eval strd (mkstannex authenv oldst lockedfilesqsem)+ maker <- Annex.newMaker r+ strd <- maker+ let workerlimit' = + setAnnexWorkerLimitName (Git.repoDescribe r) $+ setAnnexWorkerLimitMaker maker workerlimit+ Annex.eval strd $+ mkstannex authenv oldst lockedfilesqsem+ workerlimit' return (mconcat sts) { updateRepos = updaterepos authenv } - mkstannex authenv oldst lockedfilesqsem = do+ mkstannex authenv oldst lockedfilesqsem workerlimit = do Annex.setOutput QuietOutput u <- getUUID if u == NoUUID then return mempty else case M.lookup u (servedRepos oldst) of- Nothing -> mkServerState o authenv lockedfilesqsem+ Nothing -> mkServerState o authenv lockedfilesqsem workerlimit Just old -> return $ P2PHttpServerState { servedRepos = M.singleton u old , serverShutdownCleanup = mempty@@ -239,15 +246,16 @@ Socket.listen sock Socket.maxListenQueue return sock -mkServerState :: Options -> M.Map Auth P2P.ServerMode -> LockedFilesQSem -> Annex P2PHttpServerState-mkServerState o authenv lockedfilesqsem = - withAnnexWorkerPool (jobsOption o) (cpusOption o) $+mkServerState :: Options -> M.Map Auth P2P.ServerMode -> LockedFilesQSem -> AnnexWorkerLimit -> Annex P2PHttpServerState+mkServerState o authenv lockedfilesqsem workerlimit = + withAnnexWorkerPool (jobsOption o) (cpusOption o) workerlimit $ mkP2PHttpServerState (mkGetServerMode authenv o) return (fromMaybe 1 $ proxyConnectionsOption o) (fromMaybe 1 $ clusterJobsOption o) lockedfilesqsem+ workerlimit mkGetServerMode :: M.Map Auth P2P.ServerMode -> Options -> GetServerMode mkGetServerMode _ o _ Nothing
+ Command/Transfers.hs view
@@ -0,0 +1,123 @@+{- git-annex command+ -+ - Copyright 2026 Joey Hess <id@joeyh.name>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE OverloadedStrings #-}++module Command.Transfers where++import Command+import Types.Transfer+import Logs.Transfer+import Remote+import Messages.Progress+import Messages.Concurrent+import Utility.ThreadScheduler+import Utility.Metered+import Annex.Concurrent+import Database.Keys+import Git.FilePath++import qualified Data.Map as M+import Control.Concurrent.STM+import Control.Concurrent.Async++cmd :: Command+cmd = noCommit $ withAnnexOptions [jsonOptions, jsonProgressOption] $+ command "transfers" SectionQuery+ "display transfers"+ paramNothing (seek <$$> optParser)++data TransfersOptions = TransfersOptions+ { localFilenames :: Bool + }++optParser :: CmdParamsDesc -> Parser TransfersOptions+optParser _ = TransfersOptions+ <$> switch+ ( long "localfilenames"+ <> short 'l'+ <> help "display local filenames, not remote filenames"+ )++seek :: TransfersOptions -> CommandSeek+seek o = withConcurrentOutput $ do+ when (localFilenames o)+ updateDatabase+ rs <- remoteList+ let remotemap = M.fromList $ zip (map uuid rs) rs+ go remotemap M.empty+ where+ go remotemap transfermap = do+ l <- getTransfers+ new <- forM l $ \(t, ti) -> do+ case M.lookup t transfermap of+ Nothing -> startone remotemap t ti+ Just v -> return (t, v)+ let newmap = M.fromList new+ forM_ (M.toList transfermap) $ \(t, (endvar, tid)) -> + unless (M.member t newmap) $ do+ liftIO $ atomically $ putTMVar endvar ()+ void $ join $ liftIO $ wait tid+ liftIO $ threadDelaySeconds (SecondsDelay 1)+ go remotemap newmap+ + startone remotemap t ti = do+ endvar <- liftIO newEmptyTMVarIO+ a <- forkState $ + withMessageState $ \s ->+ inOwnConsoleRegion s $+ includeCommandAction $+ start o t ti endvar remotemap+ tid <- liftIO $ async a+ return (t, (endvar, tid))++start :: TransfersOptions -> Transfer -> TransferInfo -> TMVar () -> M.Map UUID Remote -> CommandStart+start o t ti endvar remotemap = do+ af <- if localFilenames o+ then headMaybe <$> getAssociatedFiles k >>= \case+ Just topf -> relaf =<< fromRepo (fromTopFilePath topf)+ Nothing -> pure $ AssociatedFile Nothing+ else pure $ associatedFile ti+ let ai = ActionItemAssociatedFile af k+ startingNoMessage ai $ do+ showStartMessage (StartMessage verb ai si)+ showNote $ UnquotedString $ fromto ++ " " ++ remotename+ maybeAddJSONField "remote-uuid" (transferUUID t)+ (tfile, _, _) <- fromRepo $ transferFileAndLockFile t+ metered Nothing k Nothing $ \_ p ->+ watchSizeWith (getprogress tfile) p $+ const waitend++ showEnd "done"+ next $ return True+ where+ k = transferKey t+ + si = SeekInput []+ + verb = case transferDirection t of+ Upload -> "send"+ Download -> "receive"+ + fromto = case transferDirection t of+ Upload -> "to"+ Download -> "from"+ + remotename =+ maybe (fromUUID (transferUUID t)) name $+ M.lookup (transferUUID t) remotemap+ + waitend = + liftIO $ atomically $ takeTMVar endvar+ + relaf f = AssociatedFile . Just <$> liftIO (relPathCwdToFile f)++ getprogress tfile = readTransferInfoFile Nothing tfile+ >>= return . \case+ Just ti' -> maybe zeroBytesProcessed toBytesProcessed+ (bytesComplete ti')+ Nothing -> zeroBytesProcessed
Database/RepoSize.hs view
@@ -130,10 +130,13 @@ isOpenDb (RepoSizeHandle (Just _) _) = True isOpenDb (RepoSizeHandle Nothing _) = False -closeDb :: RepoSizeHandle -> Annex ()-closeDb (RepoSizeHandle (Just h) _) = liftIO $ H.closeDb h-closeDb (RepoSizeHandle Nothing _) = noop+closeDb :: Annex ()+closeDb = Annex.getState Annex.reposizehandle >>= maybe noop closeDb' +closeDb' :: RepoSizeHandle -> Annex ()+closeDb' (RepoSizeHandle (Just h) _) = liftIO $ H.closeDb h+closeDb' (RepoSizeHandle Nothing _) = noop+ -- This does not prevent another process that has already -- opened the db from changing it at the same time. lockDbWhile :: (IOException -> Annex a) -> Annex a -> Annex a@@ -443,4 +446,4 @@ [ RecentChangesRepo ==. u ] _ -> noop- closeDb db+ closeDb' db
Git/Config.hs view
@@ -1,6 +1,6 @@ {- git repository configuration handling -- - Copyright 2010-2022 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -24,6 +24,7 @@ import Utility.UserInfo import Utility.Process.Transcript import Utility.Debug+import qualified Utility.RawFilePath as R {- Returns a single git config setting, or a fallback value if not set. -} get :: ConfigKey -> ConfigValue -> Repo -> ConfigValue@@ -181,12 +182,20 @@ l' <- case getMaybe "core.worktree" r of Nothing -> return l Just (ConfigValue d) -> do- {- core.worktree is relative to the gitdir -}- top <- absPath (gitdir l)+ top <- gitdirtop let p = absPathFrom top (toOsPath d) return $ l { worktree = Just p } Just NoConfigValue -> return l return $ r { location = l' }+ where+ {- core.worktree is relative to the gitdir. + - When the gitdir is a symlink, it's relative to the destination+ - of the symlink.+ -}+ gitdirtop = catchMaybeIO (R.readSymbolicLink (fromOsPath (gitdir l))) >>= \case+ Nothing -> absPath (gitdir l)+ Just linktarget -> absPath $+ takeDirectory (gitdir l) </> toOsPath linktarget updateLocation' r l = return r { location = l } data ConfigStyle = ConfigList | ConfigNullList
Logs/Transfer.hs view
@@ -68,8 +68,8 @@ return (liftIO . updater tvar loggedtvar, createtfile, tvar) where updater tvar loggedtvar new = do- old <- atomically $ swapTVar tvar (Just new)- let oldbytes = maybe 0 fromBytesProcessed old+ atomically $ writeTVar tvar (Just new)+ oldbytes <- atomically $ readTVar loggedtvar let newbytes = fromBytesProcessed new when (newbytes - oldbytes >= mindelta) $ do let info' = info { bytesComplete = Just newbytes }@@ -269,7 +269,7 @@ - On unix, the transferPid is not included; instead it is obtained - by looking at the process that locks the file. -- - On windows, the transferPid is included, as a second line.+ - On windows, the transferPid is included, as another line. -} writeTransferInfo :: TransferInfo -> String writeTransferInfo info = unlines
Messages.hs view
@@ -23,6 +23,7 @@ showOutput, showLongNote, showInfo,+ showEnd, showEndOk, showEndFail, showEndResult,@@ -174,6 +175,9 @@ -- to console, but json object containing the info is emitted immediately. showInfo :: StringContainingQuotedPath -> Annex () showInfo s = outputMessage' outputJSON (JSON.info (decodeBS (noquote s))) formatLongNote s++showEnd :: StringContainingQuotedPath -> Annex ()+showEnd s = outputMessage JSON.end' id (s <> "\n") showEndOk :: Annex () showEndOk = showEndResult True
Messages/Concurrent.hs view
@@ -1,6 +1,6 @@ {- git-annex output messages, including concurrent output to display regions -- - Copyright 2010-2017 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -122,6 +122,28 @@ #else concurrentOutputSupported = return True -- Windows is always unicode #endif++withConcurrentOutput :: Annex a -> Annex a+withConcurrentOutput a =+ Annex.getState Annex.output >>= \s -> case outputType s of+ NormalOutput -> ifM (liftIO concurrentOutputSupported)+ ( Regions.displayConsoleRegions $ go True+ , go False+ )+ _ -> go False+ where+ go b = bracket_ (setup b) cleanup a++ setup b = setconcurrentoutputenabled b++ cleanup = setconcurrentoutputenabled False++ setconcurrentoutputenabled b = Annex.changeState $ \s -> s+ { Annex.output = (Annex.output s)+ { concurrentOutputEnabled = b+ , disableProgressMeters = not b+ }+ } {- Hide any currently displayed console regions while running the action, - so that the action can use the console itself. -}
Messages/JSON.hs view
@@ -16,6 +16,7 @@ start, startActionItem, end,+ end', finalize, addErrorMessage, note,@@ -105,6 +106,10 @@ end :: Bool -> JSONBuilder end b (Just (o, _)) = Just (HM.insert "success" (toJSON' b) o, True) end _ Nothing = Nothing++end' :: JSONBuilder+end' (Just (o, _)) = Just (o, True)+end' Nothing = Nothing -- Always include error-messages field, even if empty, -- to make the json be self-documenting.
Messages/Progress.hs view
@@ -106,6 +106,11 @@ metered' st setclear othermeterupdate msize bwlimit showoutput a = go st where go (MessageState { outputType = QuietOutput }) = nometer+ go (MessageState { outputType = NormalOutput, disableProgressMeters = True }) = do+ meter <- liftIO $ mkMeter msize dontDisplayMeter+ m <- liftIO $ rateLimitMeterUpdate consoleratelimit meter $+ updateMeter meter+ a meter =<< mkmeterupdate m go (MessageState { outputType = NormalOutput, concurrentOutputEnabled = False }) = do showoutput meter <- liftIO $ mkMeter msize $ @@ -175,7 +180,7 @@ minratelimit = min consoleratelimit jsonratelimit -{- Poll file size to display meter. -}+{- Poll file size to display meter while running an action. -} meteredFile :: MeterSize sizer => OsPath
P2P/Http/Client.hs view
@@ -91,15 +91,17 @@ -- When unable to speak to the server, re-probe for its url, and -- try again if it changed. This avoids the user needing to manually -- update the remote.name.annexUrl config.- fallbackreprobe s = do- r <- reprobeurl- gc <- Annex.getRemoteGitConfig r- case remoteAnnexP2PHttpUrl gc of- Just p2purl' | Just p2purl' /= p2purl ->- p2pHttpClientVersions' allowedversion p2purl' rmt r fallback clientaction >>= \case- Just res -> return res- Nothing -> fallback s- _ -> fallback s+ fallbackreprobe s+ | maybe False isUnavailableP2PHttpUrl p2purl = fallback s+ | otherwise = do+ r <- reprobeurl+ gc <- Annex.getRemoteGitConfig r+ case remoteAnnexP2PHttpUrl gc of+ Just p2purl' | Just p2purl' /= p2purl ->+ p2pHttpClientVersions' allowedversion p2purl' rmt r fallback clientaction >>= \case+ Just res -> return res+ Nothing -> fallback s+ _ -> fallback s p2pHttpClientVersions' :: (ProtocolVersion -> Bool)
P2P/Http/State.hs view
@@ -27,10 +27,11 @@ import Types.WorkerPool import Annex.WorkerPool import Annex.BranchState+import Annex.Action import Annex.Concurrent import Types.Concurrency import Types.Cluster-import CmdLine.Action (startConcurrency)+import CmdLine.Action (startConcurrency', startConcurrency) import Utility.ThreadScheduler import Utility.HumanTime import Logs.Proxy@@ -40,13 +41,15 @@ import qualified P2P.Proxy as Proxy import qualified Types.Remote as Remote import Remote.List+import Utility.LRU -import Servant+import Servant hiding (Unique) import qualified Data.Map.Strict as M import qualified Data.Set as S import Control.Concurrent.Async import Control.Concurrent.STM import Data.Time.Clock.POSIX+import Data.Unique data P2PHttpServerState = P2PHttpServerState { servedRepos :: M.Map UUID PerRepoServerState@@ -86,13 +89,15 @@ , branchChangesInProgress :: TMVar Bool } -type AnnexWorkerPool = TMVar (WorkerPool (Annex.AnnexState, Annex.AnnexRead))+type AnnexWorker = (Annex.AnnexState, Annex.AnnexRead) +type AnnexWorkerPool = TMVar (WorkerPool (AnnexWorker, Unique))+ type GetServerMode = IsSecure -> Maybe Auth -> ServerMode data ServerMode = ServerMode- { serverMode :: P2P.ServerMode+ { serverMode :: P2P.ServerMode , unauthenticatedLockingAllowed :: Bool , authenticationAllowed :: Bool }@@ -309,9 +314,10 @@ -> ProxyConnectionPoolSize -> ClusterConcurrency -> LockedFilesQSem+ -> AnnexWorkerLimit -> AnnexWorkerPool -> Annex P2PHttpServerState-mkP2PHttpServerState getservermode updaterepos proxyconnectionpoolsize clusterconcurrency lockedfilesqsem workerpool = do+mkP2PHttpServerState getservermode updaterepos proxyconnectionpoolsize clusterconcurrency lockedfilesqsem workerlimit workerpool = do enableInteractiveBranchAccess myuuid <- getUUID myproxies <- M.lookup myuuid <$> getProxies@@ -328,7 +334,7 @@ (acquireconn reqv annexstate annexread) workerpool annexstate annexread getservermode lockedfilesqsem asynccommitter <- liftIO $ async $- branchCommitter st endv+ branchCommitter st endv workerlimit workerpool let endit = do liftIO $ atomically $ putTMVar endv () liftIO $ wait asyncservicer@@ -373,7 +379,7 @@ proxyConnection proxyconnectionpoolsize relv connparams runner proxypool conn ready Nothing -> checkcanproxy runnertype annexstate annexread myproxies proxypool relv connparams ready where- runner = annexActionRunner runnertype workerpool annexstate annexread+ runner = annexActionRunner runnertype workerlimit workerpool annexstate annexread checkcanproxy runnertype annexstate annexread myproxies proxypool relv connparams ready = runner@@ -393,7 +399,7 @@ Left ex -> return $ Left $ ConnectionFailed $ show ex where- runner = annexActionRunner runnertype workerpool annexstate annexread+ runner = annexActionRunner runnertype workerlimit workerpool annexstate annexread bypass = P2P.Bypass $ S.fromList $ connectionBypass connparams proxyconnection openconn = openconn >>= \case Right conn -> proxyConnection proxyconnectionpoolsize@@ -645,38 +651,237 @@ Nothing -> return () Just locker -> wait (lockerThread locker) -withAnnexWorkerPool :: Maybe Concurrency -> Maybe Cpus -> (AnnexWorkerPool -> Annex a) -> Annex a-withAnnexWorkerPool mconc mcpus a = do+withAnnexWorkerPool+ :: Maybe Concurrency+ -> Maybe Cpus+ -> AnnexWorkerLimit+ -> (AnnexWorkerPool -> Annex a)+ -> Annex a+withAnnexWorkerPool mconc mcpus workerlimit a = do maybe noop setCpus mcpus maybe noop (setConcurrency . ConcurrencyCmdLine) mconc- startConcurrency transferStages $+ startConcurrency' stages $ \nworkers -> Annex.getState Annex.workers >>= \case- Nothing -> giveup "Use -Jn or set annex.jobs to configure the number of worker threads."- Just wp -> a wp+ Nothing -> giveup "Use --jobs or set annex.jobs to configure the number of worker threads."+ Just wpv -> go wpv nworkers+ where+ stages = transferStages+ go wpv nworkers = case workerlimit of+ NoWorkerLimit -> use $ atomically $ readTMVar wpv+ WorkerLimit { makeNewWorker = Just maker } -> do+ liftIO $ setAnnexWorkerLimit workerlimit nworkers+ let maker' = do+ strd <- maker+ ((), strd') <- Annex.run strd $ do+ setConcurrency $ ConcurrencyCmdLine $ Concurrent 1+ startConcurrency stages noop+ return strd'+ use (allocateWorkerPoolM maker' nworkers stages)+ `finally` quiesce True+ WorkerLimit { makeNewWorker = Nothing } ->+ error "internal"+ use mkp = do+ tp <- liftIO $ taggedWorkerPool =<< mkp+ awp <- liftIO $ newTMVarIO tp+ a awp -inAnnexWorker :: AnnexWorkerPool -> Annex a -> IO (Either SomeException a)-inAnnexWorker poolv annexaction = do- (workerstrd, workerstage) <- atomically $ waitStartWorkerSlot poolv+inAnnexWorker :: AnnexWorkerLimit -> AnnexWorkerPool -> Annex a -> IO (Either SomeException a)+inAnnexWorker workerlimit poolv annexaction =+ allocateAnnexWorker workerlimit (waitStartWorkerSlot poolv)+ >>= inAnnexWorker' workerlimit poolv annexaction++inAnnexWorkerNonBlocking :: AnnexWorkerLimit -> AnnexWorkerPool -> Annex a -> IO (Maybe (Either SomeException a))+inAnnexWorkerNonBlocking workerlimit poolv annexaction =+ allocateAnnexWorkerNonBlocking workerlimit (waitStartWorkerSlot poolv) >>= \case+ Nothing -> return Nothing+ Just v -> Just <$> inAnnexWorker' workerlimit poolv annexaction v++inAnnexWorker'+ :: AnnexWorkerLimit+ -> AnnexWorkerPool+ -> Annex a+ -> ((AnnexWorker, Unique), WorkerStage)+ -> IO (Either SomeException a)+inAnnexWorker' workerlimit poolv annexaction ((workerstrd, workerid), workerstage) = do resv <- newEmptyTMVarIO aid <- async $ do (res, strd) <- Annex.run workerstrd annexaction atomically $ putTMVar resv res- return strd+ return (strd, workerid) atomically $ do pool <- takeTMVar poolv let !pool' = addWorkerPool (ActiveWorker aid workerstage) pool putTMVar poolv pool'- (res, workerstrd') <- waitCatch aid >>= \case- Right strd -> do+ + (res, workerstrdid) <- waitCatch aid >>= \case+ Right strdid -> do r <- atomically $ takeTMVar resv- return (Right r, strd)- Left err -> return (Left err, workerstrd)+ return (Right r, strdid)+ Left err -> return (Left err, (workerstrd, workerid))+ atomically $ do+ deallocateAnnexWorker workerlimit workerstrd workerid pool <- takeTMVar poolv- let !pool' = deactivateWorker pool aid workerstrd'+ let !pool' = deactivateWorker pool aid workerstrdid putTMVar poolv pool'+ return res +data AnnexWorkerLimit+ = NoWorkerLimit+ | WorkerLimit + { workerLimit :: TMVar (Int, WarmWorkers)+ , makeNewWorker :: Maybe (IO AnnexWorker)+ -- ^ quiesceAnnexWorker calls stopCoProcesses, which+ -- stops helper processes that are in resource pools+ -- set up by dupState and shared with other AnnexWorkers.+ -- So this must not use dupState.+ , workerLimitName :: Maybe String+ }++-- Workers that are not in use, but that have been warmed up: They have+-- opened file handles, started helper processes, etc.+type WarmWorkers = LRU Unique AnnexWorker++mkAnnexWorkerLimit :: IO AnnexWorkerLimit+mkAnnexWorkerLimit = WorkerLimit + <$> newTMVarIO (1, emptyLRU)+ <*> pure Nothing+ <*> pure Nothing++setAnnexWorkerLimitMaker :: IO AnnexWorker -> AnnexWorkerLimit -> AnnexWorkerLimit+setAnnexWorkerLimitMaker maker workerlimit@(WorkerLimit {}) =+ workerlimit { makeNewWorker = Just maker }+setAnnexWorkerLimitMaker _ workerlimit = workerlimit++setAnnexWorkerLimitName :: String -> AnnexWorkerLimit -> AnnexWorkerLimit+setAnnexWorkerLimitName name workerlimit@(WorkerLimit {}) =+ workerlimit { workerLimitName = Just name }+setAnnexWorkerLimitName _ workerlimit = workerlimit++setAnnexWorkerLimit :: AnnexWorkerLimit -> Int -> IO ()+setAnnexWorkerLimit WorkerLimit { workerLimit = v } nworkers =+ atomically $ do+ (_, lru) <- takeTMVar v+ putTMVar v (nworkers, lru)+setAnnexWorkerLimit NoWorkerLimit _ = noop++describeAnnexWorker :: AnnexWorkerLimit -> Unique -> String+describeAnnexWorker (WorkerLimit { workerLimitName = Just name }) workerid =+ name ++ " " ++ descibeAnnexWorker' workerid+describeAnnexWorker _ workerid =+ descibeAnnexWorker' workerid++descibeAnnexWorker' :: Unique -> String+descibeAnnexWorker' workerid = "#" ++ show (hashUnique workerid)++{- Allocate a new annex worker.+ - If necessary, first quiesces the least recently used one.+ -+ - Blocks when the server is too busy.+ -}+allocateAnnexWorker+ :: AnnexWorkerLimit+ -> STM ((AnnexWorker, Unique), WorkerStage)+ -> IO ((AnnexWorker, Unique), WorkerStage)+allocateAnnexWorker workerlimit a = + atomically (allocateAnnexWorker' workerlimit a)+ >>= allocatedAnnexWorker workerlimit a++allocateAnnexWorkerNonBlocking+ :: AnnexWorkerLimit+ -> STM ((AnnexWorker, Unique), WorkerStage)+ -> IO (Maybe ((AnnexWorker, Unique), WorkerStage))+allocateAnnexWorkerNonBlocking workerlimit a = do+ r <- atomically $+ (Just <$> allocateAnnexWorker' workerlimit a)+ `orElse`+ return Nothing+ case r of+ Nothing -> return Nothing+ Just r' -> Just <$> allocatedAnnexWorker workerlimit a r'++allocateAnnexWorker'+ :: AnnexWorkerLimit+ -> STM ((AnnexWorker, Unique), WorkerStage)+ -> STM (Either (Unique, AnnexWorker) ((AnnexWorker, Unique), WorkerStage))+allocateAnnexWorker' NoWorkerLimit a = Right <$> a+allocateAnnexWorker' (WorkerLimit { workerLimit = v }) a = do+ (n, warm) <- takeTMVar v+ if n < 1+ then case popLRU warm of+ (warm', Just toquiesce) -> do+ putTMVar v (n-1, warm')+ return $ Left toquiesce+ _ -> retry+ else do+ res@((_, workerid), _) <- a+ putTMVar v (n-1, removeLRU warm workerid)+ return $ Right res++allocatedAnnexWorker+ :: AnnexWorkerLimit+ -> STM ((AnnexWorker, Unique), WorkerStage)+ -> Either (Unique, AnnexWorker) ((AnnexWorker, Unique), WorkerStage)+ -> IO ((AnnexWorker, Unique), WorkerStage)+allocatedAnnexWorker workerlimit a r =+ observe reportworkerid $ case r of+ Right res -> return res+ Left toquiesce -> do+ quiesceAnnexWorker workerlimit toquiesce+ atomically $ postQueusceAnnexWorker workerlimit a+ where+ reportworkerid ((_, workerid), _) =+ debug "P2P.Http" $ "Using worker "+ ++ describeAnnexWorker workerlimit workerid++postQueusceAnnexWorker+ :: AnnexWorkerLimit+ -> STM ((AnnexWorker, Unique), WorkerStage)+ -> STM ((AnnexWorker, Unique), WorkerStage)+postQueusceAnnexWorker (WorkerLimit { workerLimit = v }) a = do+ (n, warm) <- takeTMVar v+ res@((_, workerid), _) <- a+ putTMVar v (n, removeLRU warm workerid)+ return res+postQueusceAnnexWorker NoWorkerLimit a = a++-- Called after allocateAnnexWorker has allocated a worker,+-- and it is done being used.+deallocateAnnexWorker :: AnnexWorkerLimit -> AnnexWorker -> Unique -> STM ()+deallocateAnnexWorker NoWorkerLimit _ _ = noop+deallocateAnnexWorker (WorkerLimit { workerLimit = v }) worker workerid = do+ (n, warm) <- takeTMVar v+ let warm' = addLRU warm workerid worker+ putTMVar v (n+1, warm')++-- Make an Annex worker no longer be warmed up, by stopping all+-- helper processes, closing file handles, etc.+quiesceAnnexWorker :: AnnexWorkerLimit -> (Unique, AnnexWorker) -> IO ()+quiesceAnnexWorker workerlimit (workerid, workerstrd) = do+ debug "P2P.Http" $ "Quiesceing worker "+ ++ describeAnnexWorker workerlimit workerid+ -- This discards the changed state, so the only things it can+ -- safely do are those that do not alter state.+ res <- tryNonAsync $ Annex.eval workerstrd $+ quiesce True + case res of+ Left ex -> debug "P2P.Http" $ "Quiesceing worker "+ ++ describeAnnexWorker workerlimit workerid+ ++ " failed: " ++ show ex+ Right () -> return ()++-- When there is a WorkerLimit, handleRequestAnnex may warm up+-- an Annex state, starting helper processes, opening file handles etc.+-- Quiesce it here to avoid one such Annex state per served repository+-- remaining warmed up.+--+-- With NoWorkerLimit, there is no need to quiesce here, because there+-- is only one such Annex state.+quiesceRequestAnnex :: AnnexWorkerLimit -> Annex ()+quiesceRequestAnnex NoWorkerLimit = noop+quiesceRequestAnnex (WorkerLimit {}) = quiesce True+ handleRequestAnnex :: PerRepoServerState -> Annex a -> IO (Either SomeException a) handleRequestAnnex st = handleRequestAnnex' (annexState st) (annexRead st) @@ -701,9 +906,11 @@ -- When using this, must enforce bounds first | RequestRunner -annexActionRunner :: AnnexActionRunner -> AnnexWorkerPool -> TMVar Annex.AnnexState -> Annex.AnnexRead -> Annex a -> IO (Either SomeException a)-annexActionRunner WorkerPoolRunner workerpool _ _ = inAnnexWorker workerpool-annexActionRunner RequestRunner _ st rd = handleRequestAnnex' st rd+annexActionRunner :: AnnexActionRunner -> AnnexWorkerLimit -> AnnexWorkerPool -> TMVar Annex.AnnexState -> Annex.AnnexRead -> Annex a -> IO (Either SomeException a)+annexActionRunner WorkerPoolRunner workerlimit workerpool _ _ =+ inAnnexWorker workerlimit workerpool+annexActionRunner RequestRunner _ _ st rd =+ handleRequestAnnex' st rd data ProxyConnection = ProxyConnection { proxyConnectionRemoteUUID :: UUID@@ -842,8 +1049,8 @@ send st b = liftIO $ atomically $ putTMVar (branchChangesInProgress st) b -branchCommitter :: PerRepoServerState -> TMVar () -> IO ()-branchCommitter st endv = do+branchCommitter :: PerRepoServerState -> TMVar () -> AnnexWorkerLimit -> AnnexWorkerPool -> IO ()+branchCommitter st endv workerlimit workerpool = do idlev <- newEmptyTMVarIO void $ async $ committer idlev go idlev (0 :: Integer)@@ -874,10 +1081,22 @@ -- Once it's been idle for a second, -- commit the journalled changes. atomically (tryTakeTMVar idlev) >>= \case- Just () ->- void $ handleRequestAnnex st $- Annex.Branch.commit =<< Annex.Branch.commitMessage+ Just () -> runcommit Nothing -> noop committer idlev Left () -> return () + runcommit =+ -- Use a warmed up AnnexWorker to do the commit when possible.+ -- But, if the server is too busy, the commit still needs+ -- to happen promptly. So avoid blocking and fall back+ -- to running the commit using the RequestRunner Annex+ -- state. Which then needs to be quiesced, which makes+ -- it less efficient.+ inAnnexWorkerNonBlocking workerlimit workerpool commit >>= \case+ Just _ -> return ()+ Nothing -> void $ handleRequestAnnex st $ do+ commit+ quiesceRequestAnnex workerlimit+ + commit = Annex.Branch.commit =<< Annex.Branch.commitMessage
P2P/Http/Url.hs view
@@ -70,6 +70,9 @@ unavailableP2PHttpUrl p = p { p2pHttpBaseUrl = (p2pHttpBaseUrl p) { baseUrlHost = "!dne!" } } +isUnavailableP2PHttpUrl :: P2PHttpUrl -> Bool+isUnavailableP2PHttpUrl p = unavailableP2PHttpUrl p == p+ -- When a p2phttp url is on the same host as a git repo, which also uses -- http, the same username+password is assumed to be used for both. isP2PHttpSameHost :: P2PHttpUrl -> Git.Repo -> Bool
P2P/Protocol.hs view
@@ -229,27 +229,39 @@ -- | Since ProtoAssociatedFile is not the last thing in a protocol line, -- its serialization cannot contain any whitespace. This is handled--- by replacing whitespace with '%' (and '%' with '%%')+-- by replacing ' ' with '%' (and '%' with '%%') -- -- When deserializing an AssociatedFile from a peer, that escaping is--- reversed. Unfortunately, an input tab will be deescaped to a space--- though. And it's sanitized, to avoid any control characters that might--- cause problems when it's displayed to the user.+-- reversed. ----- These mungings are ok, because a ProtoAssociatedFile is normally+-- This does not currently round trip cleanly. That is done to avoid+-- breaking backwards compatability with old versions of git-annex,+-- where the P2P protocol split words on isSpace. Which is why this+-- escapes '\t' and other spaces (including unicode spaces) to '%' as well.+--+-- Control characters are also sanitized. This sanitization is probably+-- unncessary, since git-annex uses Utility.SafeOutput to avoid displaying+-- control characters to the user.+--+-- Not roundtripping is ok because a ProtoAssociatedFile is normally -- only displayed to the user and so does not need to match a file on disk.--- It may also be used in checking preferred content, which is very--- unlikely to care about spaces vs tabs or control characters.+-- (It may also be used in checking preferred content, which is very+-- unlikely to care about spaces vs tabs or control characters.)+--+-- In the future, this could be made to round trip cleanly+-- by only escaping ' ' and not sanitizing control characters.+-- That should only be done once it's very unlikely that a peer+-- will be running a version of git-annex older than 10.20261029. instance Proto.Serializable ProtoAssociatedFile where serialize (ProtoAssociatedFile (AssociatedFile Nothing)) = "" serialize (ProtoAssociatedFile (AssociatedFile (Just af))) = fromOsPath $ toInternalGitPath $- OS.concat $ map esc $ OS.unpack af+ toOsPath $ concat $ map esc $ fromOsPath af where- esc c = case OS.toChar c of- '%' -> literalOsPath "%%"- c' | isSpace c' -> literalOsPath "%"- _ -> OS.singleton c+ esc c+ | c == '%' = "%%"+ | isSpace c = "%"+ | otherwise = [c] deserialize s = case fromInternalGitPath $ toOsPath $ deesc [] s of f@@ -261,7 +273,7 @@ where deesc b [] = reverse b deesc b ('%':'%':cs) = deesc ('%':b) cs- deesc b ('%':cs) = deesc ('_':b) cs+ deesc b ('%':cs) = deesc (' ':b) cs deesc b (c:cs) | isControl c = deesc ('_':b) cs | otherwise = deesc (c:b) cs
Remote/Git.hs view
@@ -1004,6 +1004,7 @@ let c = adduuid (configRepoUUID renamedr) $ addurl $ addproxiedby $+ addverified $ adjustclusternode clusters $ inheritconfigs $ Git.fullconfig r' in r'@@ -1024,6 +1025,11 @@ (Git.ConfigValue $ fromUUID u) Nothing -> id + addverified = case formatRemoteConfigVerification RemoteConfigVerified of+ Just s -> addremoteannexfield VerifiedField+ (Git.ConfigValue $ encodeBS s)+ Nothing -> id+ -- A node of a cluster that is being proxied along with -- that cluster does not need to be synced with -- by default, because syncing with the cluster will
Test.hs view
@@ -1,11 +1,12 @@ {- git-annex test suite -- - Copyright 2010-2024 Joey Hess <id@joeyh.name>+ - Copyright 2010-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE CPP #-} module Test where@@ -27,6 +28,11 @@ import qualified Utility.RawFilePath as R import qualified Data.List.NonEmpty as NE import Data.String+#ifdef WITH_MAGICMIME+#ifdef WITH_OSPATH+import System.OsString (osstr)+#endif+#endif import Common import CmdLine.GitAnnex.Options@@ -89,6 +95,7 @@ import qualified Utility.CopyFile import qualified Utility.MoveFile import qualified Utility.StatelessOpenPGP+import qualified Utility.LRU import qualified Types.Remote #ifndef mingw32_HOST_OS import qualified Remote.Helper.Encryptable@@ -203,6 +210,7 @@ , testProperty "prop_standardGroups_parse" Logs.PreferredContent.prop_standardGroups_parse , testProperty "prop_balanced_stable" Annex.Balanced.prop_balanced_stable , testProperty "prop_httpConfigKeys_sane" Git.Config.Url.prop_httpConfigKeys_sane+ , testProperty "prop_LRU_sane" Utility.LRU.prop_LRU_sane ] ++ map (uncurry testProperty) combos where combos = concat@@ -564,16 +572,34 @@ #ifdef WITH_MAGICMIME git "config" ["annex.largefiles", "mimeencoding=binary"] "git config annex.largefiles"- writeFileString (literalOsPath "binary") "\127"+ writeFileString (literalOsPath "binary") binarycontent writeFileString (literalOsPath "text") "test\n" - git_annex "add" ["binary", "text"]+#ifdef WITH_OSPATH+ writeFileString unicodefn binarycontent+#endif+ git_annex "add" [] "git-annex add with mimeencoding in largefiles" git_annex "sync" ["--no-content"] "git-annex sync"- (isJust <$> annexeval (Annex.CatFile.catKeyFile (literalOsPath "binary")))+ addedannex (literalOsPath "binary") @? "binary file not added to annex despite mimeencoding config"- (isNothing <$> annexeval (Annex.CatFile.catKeyFile (literalOsPath "text")))+ (not <$> addedannex (literalOsPath "text")) @? "non-binary file got added to annex despite mimeencoding config"+#ifndef mingw32_HOST_OS+#ifdef WITH_OSPATH+ -- This is a known failure on windows, see + -- doc/bugs/mimeencoding_detection_is_not_working.mdwn+ addedannex unicodefn+ @? "binary file with unicode name not added to annex despite mimeencoding config"+#endif+#endif+ where+ binarycontent = "\127"+#ifdef WITH_OSPATH+ -- quasiquoted because fromString for OsString mangles unicode+ unicodefn = [osstr|fo¡oüঊ|]+#endif+ addedannex f = isJust <$> annexeval (Annex.CatFile.catKeyFile f) #else return () #endif
Types/Messages.hs view
@@ -42,6 +42,7 @@ data MessageState = MessageState { outputType :: OutputType , concurrentOutputEnabled :: Bool+ , disableProgressMeters :: Bool , sideActionBlock :: SideActionBlock , consoleRegion :: Maybe ConsoleRegion , consoleRegionErrFlag :: Bool@@ -56,6 +57,7 @@ return $ MessageState { outputType = NormalOutput , concurrentOutputEnabled = False+ , disableProgressMeters = False , sideActionBlock = NoBlock , consoleRegion = Nothing , consoleRegionErrFlag = False
Types/WorkerPool.hs view
@@ -1,10 +1,12 @@ {- Worker thread pool. -- - Copyright 2019-2023 Joey Hess <id@joeyh.name>+ - Copyright 2019-2026 Joey Hess <id@joeyh.name> - - Licensed under the GNU AGPL version 3 or higher. -} +{-# LANGUAGE DeriveFunctor #-}+ module Types.WorkerPool where import Types.Direction@@ -12,6 +14,8 @@ import Control.Concurrent import Control.Concurrent.Async import qualified Data.Set as S+import Data.Unique+import Control.Monad -- | Pool of worker threads. data WorkerPool t = WorkerPool@@ -36,6 +40,7 @@ data Worker t = IdleWorker WorkerStage | ActiveWorker (Async t) WorkerStage+ deriving (Functor) instance Show (Worker t) where show (IdleWorker s) = "IdleWorker " ++ show s@@ -115,16 +120,32 @@ -- | Allocates a WorkerPool that has the specified number of workers -- in it, of each stage. allocateWorkerPool :: t -> Int -> UsedStages -> WorkerPool t-allocateWorkerPool t n u = WorkerPool+allocateWorkerPool t n u =+ let stages = workerPoolStages u+ in allocateWorkerPool' u+ (replicate (workerPoolSize n stages) t)+ stages++allocateWorkerPoolM :: IO t -> Int -> UsedStages -> IO (WorkerPool t)+allocateWorkerPoolM mkt n u = do+ let stages = workerPoolStages u+ ts <- replicateM (workerPoolSize n stages) mkt+ return $ allocateWorkerPool' u ts stages++allocateWorkerPool' :: UsedStages -> [t] -> [WorkerStage] -> WorkerPool t+allocateWorkerPool' u ts stages = WorkerPool { usedStages = u , workerList = map IdleWorker $- take totalthreads $ concat $ repeat stages- , spareVals = replicate totalthreads t+ take (length ts) $ concat $ repeat stages+ , spareVals = ts }- where- stages = StartStage : S.toList (stageSet u)- totalthreads = n * length stages +workerPoolSize :: Int -> [WorkerStage] -> Int+workerPoolSize n stages = n * length stages++workerPoolStages :: UsedStages -> [WorkerStage]+workerPoolStages u = StartStage : S.toList (stageSet u)+ addWorkerPool :: Worker t -> WorkerPool t -> WorkerPool t addWorkerPool w pool = pool { workerList = w : workerList pool } @@ -162,3 +183,17 @@ where idle (IdleWorker _) = True idle (ActiveWorker _ _) = False++{- Tags each value in a WorkerPool with a Unique identifier. -}+taggedWorkerPool :: WorkerPool t -> IO (WorkerPool (t, Unique))+taggedWorkerPool wp = do+ wl <- forM (workerList wp) $ \w -> do+ u <- newUnique+ return (fmap (\v -> (v, u)) w)+ sl <- zip (spareVals wp)+ <$> replicateM (length (spareVals wp)) newUnique+ return $ WorkerPool+ { usedStages = usedStages wp+ , workerList = wl+ , spareVals = sl+ }
Utility/Hash.hs view
@@ -11,7 +11,6 @@ import Utility.Hash.Types as X import Utility.Hash.Incremental as X-#ifdef WITH_BOTAN import Utility.Hash.Botan as X -- Fall back to crypton for hashes not in botan. import Utility.Hash.Crypton as X@@ -30,9 +29,6 @@ , blake2bp_512 , blake2bp_512_hasher )-#else-import Utility.Hash.Crypton as X-#endif #ifdef WITH_BLAKE3 import Utility.Hash.Blake3 as X #endif
Utility/Hash/HMAC.hs view
@@ -5,9 +5,8 @@ - License: BSD-2-clause -} -{-# LANGUAGE PackageImports #-} {-# LANGUAGE RankNTypes #-}-{-# LANGUAGE OverloadedStrings, CPP #-}+{-# LANGUAGE OverloadedStrings #-} module Utility.Hash.HMAC ( Mac(..),@@ -19,15 +18,9 @@ import qualified Data.ByteString as S import qualified Data.Text as T import qualified Data.Text.Encoding as T-#ifdef WITH_BOTAN import Botan.Low.MAC import Botan.Low.Hash hiding (HashDigest) import System.IO.Unsafe (unsafePerformIO)-#else-import Utility.Hash.Crypton (hashDigest)-import "crypton" Crypto.MAC.HMAC hiding (Context)-import "crypton" Crypto.Hash-#endif data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512 deriving (Eq)@@ -45,19 +38,12 @@ HmacSha384 -> use SHA384 HmacSha512 -> use SHA512 where-#ifdef WITH_BOTAN use alg k m = unsafePerformIO $ do maccer <- macInit (hmac alg) macSetKey maccer k macUpdate maccer m auth <- macFinal maccer return (f (HashDigest auth))-#else- use alg k m = f (hashDigest (hmacGetDigest (hmacWitnessAlg alg k m)))-- hmacWitnessAlg :: HashAlgorithm a => a -> S.ByteString -> S.ByteString -> HMAC a- hmacWitnessAlg _ = hmac-#endif -- Check that all the MACs continue to produce the same. props_macs_stable :: [(String, Bool)]
+ Utility/LRU.hs view
@@ -0,0 +1,202 @@+{- LRU+ -+ - Copyright 2026 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++{-# LANGUAGE StrictData, BangPatterns #-}++module Utility.LRU (+ LRU,+ emptyLRU,+ listLRU,+ addLRU,+ removeLRU,+ popLRU,+ mapLRU,+ testLRU,+ prop_LRU_sane,+) where++import qualified Data.Map.Strict as M++data LRU k v = LRU+ { lruFirst :: Maybe k+ , lruLast :: Maybe k+ , lruMap :: M.Map k (LinkedVal k v)+ }+ deriving (Show, Eq)++data LinkedVal k v = LinkedVal+ { value :: v+ , prev :: Maybe k+ , next :: Maybe k+ }+ deriving (Show, Eq)++setvalue :: Ord k => v -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setvalue v = M.adjust (\linkedval -> linkedval { value = v })++setprev :: Ord k => Maybe k -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setprev v = M.adjust (\linkedval -> linkedval { prev = v })++setnext :: Ord k => Maybe k -> k -> M.Map k (LinkedVal k v) -> M.Map k (LinkedVal k v)+setnext v = M.adjust (\linkedval -> linkedval { next = v })++emptyLRU :: LRU k v+emptyLRU = LRU Nothing Nothing M.empty++listLRU :: Ord k => LRU k v -> [(k, v)]+listLRU lru = case lruFirst lru of+ Nothing -> []+ Just k -> walk k+ where+ walk k = case M.lookup k (lruMap lru) of+ Nothing -> []+ Just linkedval -> (k, value linkedval) :+ case prev linkedval of+ Just k' -> walk k'+ Nothing -> []++removeLRU :: Ord k => LRU k v -> k -> LRU k v+removeLRU lru k = case M.lookup k (lruMap lru) of+ Nothing -> lru+ Just linkedval -> + let !lru' = addLRU lru k (value linkedval)+ in lru'+ { lruLast = case lruLast lru' of+ Nothing -> Nothing+ Just k' -> case M.lookup k' (lruMap lru') of+ Nothing -> Nothing+ Just linkedval' -> next linkedval'+ , lruFirst = case lruFirst lru' of+ Just k' | k' /= k -> Just k'+ _ -> Nothing+ , lruMap = M.delete k $ unsetprev $ lruMap lru'+ }+ where+ unsetprev m = case M.lookup k m of+ Nothing -> m+ Just linkedval -> case next linkedval of+ Nothing -> m+ Just k' -> setprev Nothing k' m++{- When the key already exists in the LRU, its value is updated, and it is+ - moved to last. -}+addLRU :: Ord k => LRU k v -> k -> v -> LRU k v+addLRU lru k v+ | lruLast lru == Just k = lru+ { lruMap = setvalue v k (lruMap lru)+ }+ | otherwise = LRU+ { lruFirst = newfirst+ , lruLast = Just k+ , lruMap = + let !linkedval = LinkedVal+ { value = v+ , prev = Nothing+ , next = lruLast lru+ }+ in updatefirst $ M.insert k linkedval $+ skipover $ updateprev $ lruMap lru+ }+ where+ newfirst = case lruFirst lru of+ Nothing -> Just k+ Just k'+ | k' /= k -> Just k'+ | otherwise -> case M.lookup k' (lruMap lru) of+ Nothing -> Nothing+ Just linkedval -> prev linkedval+ updateprev m = case lruLast lru of+ Nothing -> m+ Just k' -> setprev (Just k) k' m+ updatefirst m = case newfirst of+ Nothing -> m+ Just k' -> setnext Nothing k' m+ skipover m = case M.lookup k m of+ Nothing -> m+ Just linkedval -> case (prev linkedval, next linkedval) of+ (Just prevk, Just nextk) -> + setprev (Just prevk) nextk $+ setnext (Just nextk) prevk m+ _ -> m++popLRU :: Ord k => LRU k v -> (LRU k v, Maybe (k, v))+popLRU lru = case lruFirst lru of+ Nothing -> (lru, Nothing)+ Just first ->+ case M.lookup first (lruMap lru) of+ Nothing -> (lru, Nothing)+ Just linkedval ->+ let !lru' = LRU+ { lruFirst = prev linkedval+ , lruLast = case lruLast lru of+ Just k | k == first -> Nothing+ _ -> lruLast lru+ , lruMap = skipover linkedval $+ M.delete first (lruMap lru)+ }+ in (lru', Just (first, value linkedval))+ where+ skipover linkedval m = case prev linkedval of+ Just k -> setnext Nothing k m+ Nothing -> m++mapLRU :: (Ord k, Ord k') => (k -> k') -> (v -> v') -> LRU k v -> LRU k' v'+mapLRU kf vf lru = LRU+ { lruFirst = kf <$> lruFirst lru+ , lruLast = kf <$> lruLast lru+ , lruMap = M.fromList $ map go $ M.toList $ lruMap lru+ }+ where+ go (k, linkedval) = + (kf k, linkedval+ { value = vf (value linkedval)+ , prev = kf <$> prev linkedval+ , next = kf <$> next linkedval+ })++prop_LRU_sane :: Bool+prop_LRU_sane = and testLRU++testLRU :: [Bool]+testLRU =+ [ listLRU (fst (popLRU l1)) == []+ , listLRU l1 == [(1, foo)]+ , listLRU l2 == [(1, foo), (2, bar)]+ , listLRU l3 == [(1, foo),(2, bar),(3, baz)]+ , listLRU l4 == [(1, foo),(2, bar),(3, baz), (4, new)]+ , popLRU l1 == (emptyLRU, Just (1, foo))+ , popLRU l2 == (l2no1, Just (1, foo))+ , popLRU l3 == (l3no1, Just (1, foo))+ , popLRU (fst (popLRU l1)) == (emptyLRU, Nothing)+ , popLRU (fst (popLRU (fst (popLRU l2)))) == (emptyLRU, Nothing)+ , addLRU l3 1 new == addLRU l3no1 1 new+ , addLRU l3 2 new == addLRU (addLRU l1 3 baz) 2 new+ , addLRU l3 3 new == addLRU l2 3 new+ , removeLRU emptyLRU 1 == (emptyLRU :: LRU Int String)+ , removeLRU l1 1 == emptyLRU+ , removeLRU l2 3 == l2+ , removeLRU l3 3 == l2+ , removeLRU l3 1 == l3no1+ , removeLRU l3 2 == addLRU l1 3 baz+ , removeLRU l2 2 == l1+ , removeLRU l2 1 == l2no1+ , removeLRU l4 4 == l3+ , removeLRU l4 2 == addLRU (addLRU l1 3 baz) 4 new+ , removeLRU l4 3 == addLRU l2 4 new+ , removeLRU l4 1 == addLRU l3no1 4 new+ ]+ where+ l1 = addLRU emptyLRU (1 :: Int) foo+ l2 = addLRU l1 2 bar+ l3 = addLRU l2 3 baz+ l4 = addLRU l3 4 new+ l2no1 = addLRU emptyLRU 2 bar+ l3no1 = addLRU l2no1 3 baz+ foo = "foo"+ bar = "bar"+ baz = "baz"+ new = "new"
Utility/Metered.hs view
@@ -1,6 +1,6 @@ {- Metered IO and actions -- - Copyright 2012-2024 Joey Hess <id@joeyh.name>+ - Copyright 2012-2026 Joey Hess <id@joeyh.name> - - License: BSD-2-clause -}@@ -26,6 +26,7 @@ hGetContentsMetered, hGetMetered, defaultChunkSize,+ watchSizeWith, watchFileSize, OutputHandler(..), ProgressParser,@@ -42,6 +43,7 @@ mkMeter, setMeterTotalSize, updateMeter,+ dontDisplayMeter, displayMeterHandle, clearMeterHandle, bandwidthMeter,@@ -213,26 +215,13 @@ k = 1024 chunkOverhead = 2 * sizeOf (1 :: Int) -- GHC specific -{- Runs an action, watching a file as it grows and updating the meter.- -- - The file may already exist, and the action could throw the original file- - away and start over. To avoid reporting the original file size followed- - by a smaller size in that case, wait until the file starts growing- - before updating the meter for the first time.- -- - An updated version of the MeterUpdate is passed to the action, and the- - action should use that for any updates that it makes. This allows for- - eg, the action updating the meter before a write is flushed to the file.- - In that situation, this avoids the meter being set back to the size of- - the file when it's gotten ahead of that point.- -}-watchFileSize+watchSizeWith :: (MonadIO m, MonadMask m)- => OsPath+ => IO BytesProcessed -> MeterUpdate -> (MeterUpdate -> m a) -> m a-watchFileSize f p a = do+watchSizeWith getsize p a = do sizevar <- liftIO $ newMVar zeroBytesProcessed bracket (liftIO $ forkIO $ watcher (meterupdate sizevar True) =<< getsz)@@ -245,8 +234,8 @@ when (sz > oldsz) $ p' sz watcher p' sz- getsz = catchDefaultIO zeroBytesProcessed $- toBytesProcessed <$> getFileSize f+ + getsz = catchDefaultIO zeroBytesProcessed getsize meterupdate sizevar preventbacktracking n | preventbacktracking = do@@ -261,6 +250,27 @@ putMVar sizevar n p n +{- Runs an action, watching a file as it grows and updating the meter.+ -+ - The file may already exist, and the action could throw the original file+ - away and start over. To avoid reporting the original file size followed+ - by a smaller size in that case, wait until the file starts growing+ - before updating the meter for the first time.+ -+ - An updated version of the MeterUpdate is passed to the action, and the+ - action should use that for any updates that it makes. This allows for+ - eg, the action updating the meter before a write is flushed to the file.+ - In that situation, this avoids the meter being set back to the size of+ - the file when it's gotten ahead of that point.+ -}+watchFileSize+ :: (MonadIO m, MonadMask m)+ => OsPath+ -> MeterUpdate+ -> (MeterUpdate -> m a)+ -> m a+watchFileSize f = watchSizeWith (toBytesProcessed <$> getFileSize f)+ data OutputHandler = OutputHandler { quietMode :: Bool , stderrHandler :: String -> IO ()@@ -486,6 +496,10 @@ when (meterBytesProcessed oldms /= new) $ do totalsize <- readMVar totalsizev displaymeter bv totalsize oldms curms++-- | Don't display a meter.+dontDisplayMeter :: DisplayMeter+dontDisplayMeter _ _ _ _ = return () -- | Display meter to a Handle. displayMeterHandle :: Handle -> RenderMeter -> DisplayMeter
Utility/SimpleProtocol.hs view
@@ -29,7 +29,6 @@ getProtocolLine, ) where -import Data.Char import GHC.IO.Handle import Text.Read @@ -132,7 +131,7 @@ (p4, p5) = splitWord rest'' splitWord :: String -> (String, String)-splitWord = separate isSpace+splitWord = separate (== ' ') {- Only safe to use when the serialization does not include whitespace. -} parseList :: Serializable p => ([p] -> a) -> Parser a
+ cabal-stackage.config view
@@ -0,0 +1,3453 @@+-- NOTE: Due to revisions, this file may not work. See:+-- https://github.com/commercialhaskell/stackage-server/issues/232++-- Stackage snapshot from: http://www.stackage.org/snapshot/lts-24.52+-- Please place this file next to your .cabal file as cabal.config+-- To only use tested packages, uncomment the following line:+-- remote-repo: stackage-lts-24.52:http://www.stackage.org/lts-24.52++-- Modified to have newer file-io and aws.+with-compiler: ghc-9.10.3+constraints: abstract-deque ==0.3,+ abstract-deque-tests ==0.3,+ abstract-par ==0.3.3,+ AC-Angle ==1.0,+ acc ==0.2.0.4,+ ace ==0.6,+ acid-state ==0.16.1.4,+ action-permutations ==0.0.0.1,+ active ==0.2.1.1,+ ad ==4.5.6,+ ad-delcont ==0.5.0.0,+ adjunctions ==4.4.4,+ adler32 ==0.1.2.0,+ advent-of-code-api ==0.2.11.0,+ aern2-mp ==0.2.16.1,+ aern2-real ==0.2.16.1,+ aeson ==2.2.5.0,+ aeson-attoparsec ==0.0.0,+ aeson-better-errors ==0.9.1.4,+ AesonBson ==0.4.1,+ aeson-casing ==0.2.0.0,+ aeson-combinators ==0.1.2.2,+ aeson-diff ==1.1.0.15,+ aeson-gadt-th ==0.2.5.4,+ aeson-generic-compat ==0.0.2.0,+ aeson-jsonpath ==0.3.0.2,+ aeson-pretty ==0.8.11,+ aeson-qq ==0.8.4,+ aeson-schemas ==1.4.3.1,+ aeson-typescript ==0.6.4.0,+ aeson-unqualified-ast ==1.0.0.3,+ aeson-value-parser ==0.19.7.2,+ aeson-warning-parser ==0.1.1,+ aeson-yak ==0.1.1.3,+ aeson-yaml ==1.1.0.1,+ aftovolio ==0.8.0.0,+ Agda ==2.8.0,+ agda2lagda ==0.2023.6.9,+ agreeing ==0.2.2.0,+ alarmclock ==0.7.0.7,+ alex ==3.5.4.2,+ alex-meta ==0.3.0.13,+ alex-tools ==0.6.1,+ alfred-margaret ==2.1.0.2,+ algebra ==4.3.1,+ algebraic-graphs ==0.7,+ align-audio ==0.0.0.2,+ Allure ==0.11.0.0,+ almost-fix ==0.0.2,+ alsa-core ==0.5.0.1,+ alsa-mixer ==0.3.0.1,+ alsa-pcm ==0.6.1.2,+ alsa-seq ==0.6.0.10,+ alternative-vector ==0.0.0,+ alternators ==1.0.0.0,+ ALUT ==2.4.0.3,+ amqp ==0.24.0,+ amqp-utils ==0.6.8.0,+ annotated-exception ==0.3.0.4,+ annotated-wl-pprint ==0.7.0,+ ansigraph ==0.3.0.5,+ ansi-terminal ==1.1.5,+ ansi-terminal-game ==1.9.4.0,+ ansi-terminal-types ==1.1.3,+ ansi-wl-pprint ==1.0.2,+ ANum ==0.2.0.4,+ aos-signature ==0.1.1,+ apecs ==0.9.6,+ apecs-gloss ==0.2.4,+ apecs-physics ==0.4.6,+ api-field-json-th ==0.1.0.2,+ ap-normalize ==0.1.0.1,+ appar ==0.1.8,+ appendful ==0.1.0.0,+ appendful-persistent ==0.1.0.1,+ appendmap ==0.1.5,+ apply-merge ==0.1.1.0,+ apportionment ==0.0.0.4,+ approximate ==0.3.5,+ approximate-equality ==1.1.0.2,+ arithmoi ==0.13.4.0,+ array installed,+ array-chunks ==0.1.4.2,+ array-memoize ==0.6.0,+ arrow-extras ==0.1.0.1,+ arrows ==0.4.4.2,+ ascii-char ==1.0.1.0,+ ascii-progress ==0.3.3.0,+ asn1-encoding ==0.9.6,+ asn1-parse ==0.9.5,+ asn1-types ==0.3.4,+ assert-failure ==0.1.3.0,+ assignment ==0.0.1.0,+ assoc ==1.1.1,+ astro ==0.4.3.0,+ async ==2.2.6,+ async-extra ==0.2.0.0,+ async-pool ==0.9.2,+ async-refresh ==0.3.0.0,+ async-refresh-tokens ==0.4.0.0,+ atom-basic ==0.2.5,+ atom-conduit ==0.9.0.2,+ atomic-counter ==0.1.2.4,+ atomic-primops ==0.8.8,+ atomic-write ==0.2.1.1,+ attoparsec ==0.14.4,+ attoparsec-aeson ==2.2.2.0,+ attoparsec-base64 ==0.0.0,+ attoparsec-binary ==0.2,+ attoparsec-data ==1.0.5.4,+ attoparsec-expr ==0.1.1.2,+ attoparsec-framer ==0.1.0.11,+ attoparsec-iso8601 ==1.1.1.0,+ attoparsec-path ==0.0.0.1,+ attoparsec-time ==1.0.3.1,+ attoparsec-uri ==0.0.9,+ audacity ==0.0.2.4,+ authenticate ==1.3.5.2,+ authenticate-oauth ==1.7,+ autodocodec ==0.5.0.0,+ autodocodec-nix ==0.1.0.0,+ autodocodec-openapi3 ==0.3.0.1,+ autodocodec-schema ==0.2.0.1,+ autodocodec-servant-multipart ==0.0.0.2,+ autodocodec-swagger2 ==0.1.0.0,+ autodocodec-yaml ==0.4.0.2,+ autoexporter ==2.0.0.17,+ automaton ==1.5,+ auto-update ==0.2.6,+ avro ==0.6.2.1,+ aws ==0.25.2,+ aws-lambda-haskell-runtime ==4.3.2,+ aws-lambda-haskell-runtime-wai ==2.0.2,+ aws-sns-verify ==0.0.0.3,+ aws-xray-client ==0.1.0.2,+ aws-xray-client-persistent ==0.1.0.5,+ aws-xray-client-wai ==0.1.0.2,+ backprop ==0.2.7.2,+ backtracking ==0.1.0,+ bank-holiday-germany ==2.1.0.2,+ bank-holidays-england ==0.2.0.11,+ barbies ==2.1.1.0,+ base installed,+ base16 ==1.0,+ base16-bytestring ==1.0.2.0,+ base32 ==0.4,+ base32string ==0.9.1,+ base58-bytestring ==0.1.0,+ base58string ==0.10.0,+ base64 ==1.0,+ base64-bytestring ==1.2.1.0,+ base64-bytestring-type ==1.0.1,+ base64-string ==0.2,+ base-compat ==0.14.1,+ base-compat-batteries ==0.14.1,+ basement ==0.0.16,+ base-orphans ==0.9.4,+ base-prelude ==1.6.1.1,+ base-unicode-symbols ==0.2.4.2,+ basic-prelude ==0.7.0,+ battleship-combinatorics ==0.0.1.2,+ bazel-runfiles ==0.12,+ bbdb ==0.8,+ bcp47 ==0.3.0.0,+ bcp47-orphans ==0.1.3.0,+ bcrypt ==0.0.11,+ beam-core ==0.10.5.0,+ beam-migrate ==0.5.5.0,+ beam-postgres ==0.5.6.1,+ bech32 ==1.1.11,+ bech32-th ==1.1.11,+ bench ==1.0.13,+ benchpress ==0.2.3.0,+ bench-show ==0.3.2,+ bencode ==0.6.1.1,+ bencoding ==0.4.5.6,+ benri-hspec ==0.1.0.3,+ between ==0.11.0.0,+ bhoogle ==0.1.4.4,+ bibtex ==0.1.0.7,+ bifunctor-classes-compat ==0.1.1,+ bifunctors ==5.6.3,+ bimap ==0.5.0,+ bimaps ==0.1.0.2,+ bin ==0.1.4.1,+ binance-exports ==0.1.2.0,+ binary installed,+ binary-conduit ==1.3.1,+ binaryen ==0.0.6.0,+ binary-generic-combinators ==0.4.4.1,+ binary-ieee754 ==0.1.0.0,+ binary-instances ==1.0.6,+ binary-list ==1.1.1.2,+ binary-orphans ==1.0.6,+ binary-parser ==0.5.7.7,+ binary-parsers ==0.2.4.0,+ binary-search ==2.0.0,+ binary-shared ==0.8.3,+ bindings-DSL ==1.0.25,+ bindings-GLFW ==3.3.9.3,+ bindings-libzip ==1.0.1,+ bindings-uname ==0.1,+ BiobaseNewick ==0.0.0.2,+ bitarray ==0.0.1.1,+ bits ==0.6,+ bitset-word8 ==0.1.1.2,+ bits-extra ==0.0.2.3,+ bitvec ==1.1.6.0,+ bitwise ==1.0.0.1,+ bitwise-enum ==1.0.2.0,+ Blammo ==2.1.4.0,+ blank-canvas ==0.7.5,+ blas-carray ==0.1.0.2,+ blas-comfort-array ==0.0.0.4,+ blas-ffi ==0.1,+ blas-hs ==0.1.1.0,+ blaze-bootstrap ==0.1.0.1,+ blaze-builder ==0.4.4.1,+ blaze-colonnade ==1.2.3.0,+ blaze-html ==0.9.2.0,+ blaze-markup ==0.8.3.0,+ blaze-svg ==0.3.7,+ blaze-textual ==0.2.3.1,+ bloodhound ==0.23.0.1,+ bloomfilter ==2.0.1.3,+ bluefin ==0.0.17.1,+ bluefin-internal ==0.1.2.0,+ bm ==0.2.0.0,+ bmp ==1.2.6.4,+ bnb-staking-csvs ==0.2.2.0,+ BNFC ==2.9.6.3,+ BNFC-meta ==0.6.1,+ board-games ==0.4.0.3,+ bodhi ==0.1.0,+ boltzmann-samplers ==0.1.1.0,+ Boolean ==0.2.4,+ boolsimplifier ==0.1.8,+ boomwhacker ==0.0.2.1,+ bordacount ==0.1.0.0,+ boring ==0.2.2.1,+ bound ==2.0.7,+ BoundedChan ==1.0.3.0,+ bounded-qsem ==0.1.0.5,+ bounded-queue ==1.0.0,+ boundingboxes ==0.2.3,+ bower-json ==1.1.0.0,+ bowtie ==0.7.0,+ box ==0.9.4.0,+ boxes ==0.1.5,+ box-socket ==0.5.3.0,+ breakpoint ==0.1.5.1,+ brick ==2.9,+ brotli ==0.0.0.3,+ brotli-streams ==0.0.0.0,+ bsb-http-chunked ==0.0.0.4,+ bson ==0.4.0.1,+ bson-lens ==0.1.1,+ btrfs ==0.2.1.0,+ buffer-pipe ==0.0,+ bugsnag ==1.2.0.2,+ bugsnag-hs ==0.2.0.13,+ bugsnag-wai ==1.0.1.2,+ bugsnag-yesod ==1.0.1.0,+ bugzilla-redhat ==1.0.1.1,+ burrito ==2.0.1.17,+ butcher ==1.3.3.2,+ bv ==0.5,+ bv-sized ==1.0.7,+ byteable ==0.1.1,+ bytebuild ==0.3.17.0,+ byte-count-reader ==0.10.1.12,+ bytedump ==1.0,+ bytehash ==0.1.1.2,+ byte-order ==0.1.3.1,+ byteorder ==1.0.4,+ bytes ==0.17.5,+ byteset ==0.1.1.2,+ byteslice ==0.2.15.0,+ bytesmith ==0.3.14.0,+ bytestring installed,+ bytestring-aeson-orphans ==0.1.0.2,+ bytestring-builder ==0.10.8.2.0,+ bytestring-conversion ==0.3.2,+ bytestring-encodings ==0.2.0.2,+ bytestring-lexing ==0.5.0.15,+ bytestring-strict-builder ==0.4.5.8,+ bytestring-to-vector ==0.3.0.1,+ bytestring-tree-builder ==0.2.7.13,+ bytestring-trie ==0.2.7.6,+ bytezap ==1.6.0,+ bz2 ==1.0.1.2,+ bzip2-clib ==1.0.8,+ bzlib ==0.5.3.0,+ bzlib-conduit ==0.3.0.4,+ c14n ==0.1.0.3,+ c2hs ==0.28.8,+ Cabal installed,+ cabal2nix ==2.20.1,+ cabal2spec ==2.7.1,+ cabal-add ==0.2,+ cabal-appimage ==0.4.3.0,+ cabal-clean ==0.2.20230609,+ cabal-debian ==5.2.6,+ cabal-doctest ==1.0.12,+ cabal-file ==0.1.1,+ cabal-flatpak ==0.1.3,+ cabal-gild ==1.6.0.4,+ cabal-install ==3.12.1.0,+ cabal-install-parsers ==0.6.2,+ cabal-install-solver ==3.12.1.0,+ cabal-plan ==0.7.6.1,+ cabal-rpm ==2.3.0,+ cabal-sort ==0.1.2.1,+ Cabal-syntax installed,+ cache ==0.1.3.0,+ cached-json-file ==0.1.1,+ cacophony ==0.11.0,+ cairo ==0.13.12.0,+ cairo-image ==0.1.0.6,+ calendar-recycling ==0.0.0.1,+ call-alloy ==0.6.0.3,+ calligraphy ==0.1.8,+ call-plantuml ==0.0.1.3,+ call-stack ==0.4.0,+ can-i-haz ==0.3.1.1,+ capability ==0.5.0.1,+ ca-province-codes ==1.0.0.0,+ cardano-coin-selection ==1.0.1,+ carray ==0.1.6.8,+ casa-client ==0.0.4,+ casa-types ==0.0.3,+ cased ==0.1.0.0,+ case-insensitive ==1.2.1.0,+ cases ==0.1.4.5,+ casing ==0.1.4.1,+ cassava ==0.5.4.1,+ cassava-conduit ==0.6.6,+ cassava-megaparsec ==2.1.1,+ cast ==0.1.0.2,+ caster ==0.0.3.0,+ cauldron ==0.9.0.1,+ cayley-client ==0.4.19.5,+ cborg ==0.2.10.0,+ cborg-json ==0.2.6.0,+ cdar-mBound ==0.1.0.4,+ c-enum ==0.1.1.3,+ cereal ==0.5.8.3,+ cereal-conduit ==0.8.0,+ cereal-text ==0.1.0.2,+ cereal-unordered-containers ==0.1.0.1,+ cereal-vector ==0.2.0.1,+ cfenv ==0.1.0.0,+ cgi ==3001.5.1.0,+ chan ==0.0.4.1,+ ChannelT ==0.0.0.7,+ character-cases ==0.1.0.6,+ character-ps ==0.1,+ charset ==0.3.12,+ charsetdetect-ae ==1.1.0.4,+ Chart ==1.9.5,+ Chart-cairo ==1.9.4.1,+ Chart-diagrams ==1.9.5.1,+ chart-svg ==0.8.3.2,+ ChasingBottoms ==1.3.1.17,+ check-email ==1.0.2,+ checkers ==0.6.0,+ checksum ==0.0.0.1,+ chell ==0.5.0.2,+ chell-hunit ==0.3.0.2,+ chimera ==0.4.1.0,+ choice ==0.2.4.2,+ chronologique ==0.3.1.3,+ chronos ==1.1.7.0,+ chunked-data ==0.3.1,+ cipher-aes ==0.2.11,+ cipher-camellia ==0.0.2,+ cipher-rc4 ==0.1.4,+ circle-packing ==0.1.0.6,+ circular ==0.4.0.3,+ citeproc ==0.9.0.1,+ clash-ghc ==1.8.5,+ clash-lib ==1.8.5,+ clash-prelude ==1.8.5,+ clash-prelude-hedgehog ==1.8.5,+ classy-prelude ==1.5.0.3,+ classy-prelude-conduit ==1.5.0,+ classy-prelude-yesod ==1.5.0,+ clay ==0.16.1,+ cli-arguments ==0.7.0.0,+ clientsession ==0.9.3.0,+ Clipboard ==2.3.2.2,+ clock ==0.8.4,+ closed ==0.2.1.0,+ clumpiness ==0.17.0.2,+ ClustalParser ==1.3.0,+ cmark ==0.6.1,+ cmark-gfm ==0.2.6,+ cmark-lucid ==0.1.0.0,+ cmdargs ==0.10.22,+ codec-beam ==0.2.0,+ code-conjure ==0.7.8,+ code-page ==0.2.1,+ coinor-clp ==0.0.0.2,+ cointracking-imports ==0.1.0.2,+ collect-errors ==0.1.6.0,+ co-log ==0.7.0.0,+ co-log-concurrent ==0.5.1.1,+ co-log-core ==0.3.2.7,+ co-log-polysemy ==0.0.1.6,+ colonnade ==1.2.0.2,+ Color ==0.4.1,+ colorful-monoids ==0.2.1.3,+ colorize-haskell ==1.0.1,+ colour ==2.3.7,+ colourista ==0.1.0.2,+ columnar ==1.0.0.0,+ combinatorial ==0.1.1,+ comfort-array ==0.5.5,+ comfort-array-shape ==0.0,+ comfort-blas ==0.0.3.1,+ comfort-fftw ==0.0.0.1,+ comfort-glpk ==0.1,+ comfort-graph ==0.0.5.1,+ commonmark ==0.2.6.1,+ commonmark-extensions ==0.2.7.1,+ commonmark-pandoc ==0.2.3,+ commutative ==0.0.2,+ commutative-semigroups ==0.2.0.2,+ comonad ==5.0.10,+ compact ==0.2.0.0,+ compactmap ==0.1.4.6,+ companion ==0.1.0,+ compensated ==0.8.3,+ compiler-warnings ==0.1.0,+ componentm ==0.0.0.2,+ componentm-devel ==0.0.0.2,+ composable-associations ==0.1.0.0,+ composition ==1.0.2.2,+ composition-extra ==2.1.0,+ composition-prelude ==3.0.1.0,+ concise ==0.1.0.1,+ concurrency ==1.11.0.3,+ concurrent-extra ==0.7.0.12,+ concurrent-output ==1.10.21,+ concurrent-split ==0.0.1.1,+ concurrent-supply ==0.1.8,+ cond ==0.5.1,+ conduino ==0.2.4.0,+ conduit ==1.3.6.1,+ conduit-aeson ==0.1.1.0,+ conduit-algorithms ==0.0.14.0,+ conduit-combinators ==1.3.0,+ conduit-concurrent-map ==0.1.4,+ conduit-extra ==1.3.8,+ conduit-parse ==0.2.1.1,+ conduit-zstd ==0.0.2.0,+ config-ini ==0.2.7.0,+ configuration-tools ==0.7.1,+ configurator ==0.3.0.0,+ configurator-export ==0.1.0.1,+ config-value ==0.8.3,+ constrained-categories ==0.4.2.0,+ constraints ==0.14.4,+ constraints-extras ==0.4.0.2,+ constraint-tuples ==0.2,+ construct ==0.3.2,+ consumers ==2.3.3.1,+ containers installed,+ context ==0.2.1.1,+ context-http-client ==0.2.0.2,+ context-resource ==0.2.0.2,+ context-wai-middleware ==0.2.0.2,+ contiguous ==0.6.5.0,+ contra-tracer ==0.2.1.1,+ contravariant ==1.5.6,+ contravariant-extras ==0.3.5.4,+ control-bool ==0.2.1,+ control-dsl ==0.2.1.3,+ control-monad-free ==0.6.2,+ control-monad-omega ==0.3.4,+ convertible ==1.1.1.1,+ cookie ==0.5.1,+ copilot ==4.5.1,+ copilot-c99 ==4.5.1,+ copilot-core ==4.5.1,+ copilot-interpreter ==4.5.1,+ copilot-language ==4.5.1,+ copilot-libraries ==4.5.1,+ copilot-prettyprinter ==4.5.1,+ copilot-theorem ==4.5.1,+ copr-api ==0.2.0,+ core-data ==0.3.9.1,+ core-program ==0.7.0.0,+ core-telemetry ==0.2.9.4,+ core-text ==0.3.8.1,+ countable ==1.2,+ countdown-numbers-game ==0.0.0.1,+ country ==0.2.5.0,+ covariance ==0.2.0.1,+ cpphs ==1.20.10,+ cpu ==0.1.2,+ cpuinfo ==0.1.0.3,+ cql ==4.0.4,+ cql-io ==1.1.1,+ crackNum ==3.15,+ crc32c ==0.2.2,+ crdt-event-fold ==1.8.1.4,+ criterion ==1.6.4.0,+ criterion-measurement ==0.2.5.0,+ cron ==0.7.2,+ crypto-api ==0.13.3,+ crypto-api-tests ==0.3,+ crypto-cipher-tests ==0.0.11,+ crypto-cipher-types ==0.0.9,+ cryptocompare ==0.1.2,+ cryptohash ==0.11.9,+ cryptohash-cryptoapi ==0.1.4,+ cryptohash-md5 ==0.11.101.0,+ cryptohash-sha1 ==0.11.101.0,+ cryptohash-sha256 ==0.11.102.1,+ cryptohash-sha512 ==0.11.103.0,+ crypton ==1.0.6,+ crypton-conduit ==0.2.3,+ crypton-connection ==0.4.5,+ cryptonite ==0.30,+ cryptonite-conduit ==0.2.2,+ cryptonite-openssl ==0.7,+ crypton-pem ==0.3.0,+ crypton-socks ==0.6.2,+ crypton-x509 ==1.7.7,+ crypton-x509-store ==1.6.14,+ crypton-x509-system ==1.6.8,+ crypton-x509-validation ==1.6.14,+ crypto-pubkey-types ==0.4.3,+ crypto-random-api ==0.2.0,+ crypto-token ==0.1.2,+ csp ==1.4.0,+ css-syntax ==0.1.0.2,+ css-text ==0.1.3.0,+ c-struct ==0.1.3.0,+ csv ==0.1.2,+ csv-conduit ==1.0.1.1,+ ctrie ==0.2,+ cubicbezier ==0.6.0.7,+ cubicspline ==0.1.2,+ cue-sheet ==2.0.2,+ curl ==1.3.8,+ currency ==0.2.0.0,+ currycarbon ==0.4.0.1,+ cursor ==0.3.2.0,+ cursor-brick ==0.1.0.1,+ cursor-fuzzy-time ==0.1.0.0,+ cursor-gen ==0.4.0.0,+ cutter ==0.0,+ cyclotomic ==1.1.2,+ czipwith ==1.0.1.4,+ daemons ==0.4.0,+ data-accessor ==0.2.3.1,+ data-accessor-mtl ==0.2.0.5,+ data-accessor-transformers ==0.2.1.8,+ data-array-byte ==0.1.0.2,+ data-binary-ieee754 ==0.4.4,+ data-bword ==0.1.0.2,+ data-checked ==0.3,+ data-clist ==0.2,+ data-compat ==0.1.0.5,+ data-default ==0.8.0.2,+ data-default-class ==0.2.0.0,+ data-diverse ==4.7.1.0,+ data-dword ==0.3.2.1,+ data-effects ==0.4.2.0,+ data-effects-core ==0.4.3.0,+ data-effects-th ==0.4.2.1,+ data-endian ==0.1.1,+ data-findcycle ==0.1.2.0,+ data-fix ==0.3.4,+ data-functor-logistic ==0.0,+ data-has ==0.4.0.0,+ data-hash ==0.2.0.1,+ data-interval ==2.1.2,+ data-inttrie ==0.1.4,+ data-lens-light ==0.1.2.4,+ data-memocombinators ==0.5.1,+ data-msgpack ==0.0.13,+ data-msgpack-types ==0.0.3,+ data-or ==1.0.0.12,+ data-ordlist ==0.4.7.0,+ data-prometheus ==0.1.0.0,+ data-ref ==0.1,+ data-reify ==0.6.4,+ data-serializer ==0.3.5,+ data-sketches ==0.3.1.0,+ data-sketches-core ==0.1.0.0,+ data-textual ==0.3.0.3,+ dataurl ==0.1.0.0,+ DAV ==1.3.4,+ dbcleaner ==0.1.3,+ dbus ==1.4.3,+ dbus-hslogger ==0.1.1.1,+ debian ==4.0.5,+ debian-build ==0.10.2.1,+ debug-trace-var ==0.2.0,+ dec ==0.0.6,+ decidable ==0.3.1.1,+ Decimal ==0.5.2,+ declarative ==0.5.4,+ deepseq installed,+ deepseq-generics ==0.2.0.1,+ deferred-folds ==0.9.18.10,+ defun-core ==0.1.0.1,+ dejafu ==2.4.0.8,+ delta-types ==1.0.0.0,+ dense-linear-algebra ==0.1.0.0,+ dependent-map ==0.4.0.1,+ dependent-monoidal-map ==0.1.1.5,+ dependent-sum ==0.7.2.0,+ dependent-sum-aeson-orphans ==0.3.1.2,+ dependent-sum-template ==0.2.0.2,+ depq ==0.4.2,+ deque ==0.4.4.2,+ deriveJsonNoPrefix ==0.1.0.1,+ derive-storable ==0.3.1.0,+ derive-topdown ==0.1.1.1,+ deriving-aeson ==0.2.10,+ deriving-compat ==0.6.8,+ deriving-trans ==0.9.1.0,+ detour-via-sci ==1.0.0,+ df1 ==0.4.3,+ dhall ==1.42.3,+ di ==1.3,+ diagrams ==1.4.2,+ diagrams-braille ==0.1.2,+ diagrams-builder ==0.8.0.6,+ diagrams-cairo ==1.5,+ diagrams-canvas ==1.4.2,+ diagrams-contrib ==1.4.6,+ diagrams-core ==1.5.1.2,+ diagrams-gtk ==1.4,+ diagrams-lib ==1.5.1,+ diagrams-postscript ==1.5.3,+ diagrams-rasterific ==1.5,+ diagrams-solve ==0.1.3.1,+ diagrams-svg ==1.5,+ dice ==0.1.1,+ di-core ==1.0.4,+ dictionary-sharing ==0.1.0.0,+ di-df1 ==1.2.1,+ Diff ==1.0.2,+ diff-loc ==0.1.0.0,+ digest ==0.0.2.1,+ digits ==0.3.2,+ digraph ==0.3.2,+ di-handle ==1.0.1,+ dimensional ==1.6.2,+ di-monad ==1.3.5,+ directory installed,+ directory-ospath-streaming ==0.2.2,+ directory-tree ==0.12.1,+ direct-sqlite ==2.3.29,+ dirichlet ==0.1.0.7,+ discount ==0.1.1,+ discover-instances ==0.1.0.0,+ discrimination ==0.5,+ disk-free-space ==0.1.0.1,+ distributed-closure ==0.5.0.0,+ distributed-process ==0.7.8,+ distributed-process-async ==0.2.11,+ distributed-process-client-server ==0.2.8.0,+ distributed-process-execution ==0.1.5.0,+ distributed-process-extras ==0.3.9,+ distributed-process-monad-control ==0.5.1.3,+ distributed-process-simplelocalnet ==0.3.3,+ distributed-process-supervisor ==0.2.4,+ distributed-process-systest ==0.4.2,+ distributed-process-tests ==0.5.2,+ distributed-static ==0.3.11,+ distribution-nixpkgs ==1.7.1.1,+ distribution-opensuse ==1.1.4,+ distributive ==0.6.3,+ djinn-lib ==0.0.1.4,+ djot ==0.1.4.1,+ dl-fedora ==2.0.1,+ dlist ==1.0,+ dlist-instances ==0.1.1.1,+ dns ==4.2.0,+ dobutokO2 ==0.45.3.0,+ dockerfile ==0.2.0,+ doclayout ==0.5.0.3,+ docopt ==0.7.0.8,+ doctemplates ==0.11.0.1,+ doctest ==0.24.3,+ doctest-discover ==0.2.0.0,+ doctest-driver-gen ==0.3.0.8,+ doctest-exitcode-stdio ==0.0.0.1,+ doctest-extract ==0.1.2,+ doctest-lib ==0.1.1.1,+ doctest-parallel ==0.4.1,+ doldol ==0.4.1.2,+ do-list ==1.0.1,+ domain ==0.1.1.5,+ domain-aeson ==0.1.1.3,+ domain-cereal ==0.1.0.1,+ domain-core ==0.1.0.4,+ domain-optics ==0.1.0.4,+ do-notation ==0.1.0.2,+ dot ==0.3,+ dotgen ==0.4.3,+ dotnet-timespan ==0.0.1.0,+ dotparse ==0.1.4.0,+ double-conversion ==2.0.5.0,+ download ==0.3.2.7,+ download-curl ==0.1.4,+ DPutils ==0.1.1.0,+ drifter ==0.3.0,+ drifter-postgresql ==0.2.1,+ drifter-sqlite ==0.1.0.0,+ dsp ==0.2.5.2,+ dual-tree ==0.2.3.4,+ dublincore-xml-conduit ==0.1.0.3,+ dunai ==0.14.1,+ duration ==0.2.0.0,+ dynamic-state ==0.3.2,+ dyre ==0.9.2,+ eap ==0.9.0.2,+ Earley ==0.13.0.1,+ easy-file ==0.2.5,+ easy-logger ==0.1.0.7,+ easyplot ==1.0,+ Ebnf2ps ==1.0.15,+ ech-config ==0.0.1,+ echo ==0.1.4,+ ecstasy ==0.2.1.0,+ ed25519 ==0.0.5.0,+ ede ==0.3.4.0,+ edit-distance ==0.2.2.1,+ edit-distance-vector ==1.0.0.4,+ editor-open ==0.6.0.0,+ effectful ==2.6.1.0,+ effectful-core ==2.6.1.0,+ effectful-plugin ==2.0.0.1,+ effectful-th ==1.0.0.3,+ egison-pattern-src ==0.2.1.2,+ either ==5.0.3,+ either-unwrap ==1.1,+ ekg ==0.4.1.2,+ ekg-core ==0.1.2.0,+ ekg-json ==0.1.1.1,+ ekg-statsd ==0.2.6.2,+ ekg-wai ==0.1.2.0,+ elerea ==2.9.0,+ elf ==0.31,+ eliminators ==0.9.5,+ elm2nix ==0.4.0,+ elm-bridge ==0.8.5,+ elm-core-sources ==1.0.0,+ elm-export ==0.6.0.1,+ elm-syntax ==0.3.3.0,+ elynx ==0.8.0.0,+ elynx-markov ==0.8.0.0,+ elynx-nexus ==0.8.0.0,+ elynx-seq ==0.8.0.0,+ elynx-tools ==0.8.0.0,+ elynx-tree ==0.7.2.2,+ emacs-module ==0.2.1.1,+ email-validate ==2.3.2.21,+ emd ==0.2.0.0,+ emojis ==0.1.5,+ enclosed-exceptions ==1.0.3,+ encoding ==0.10.3,+ end-of-exe ==0.1.2.0,+ ENIG ==0.0.1.0,+ entropy ==0.4.1.11,+ enummapset ==0.7.3.0,+ enumset ==0.1.0.2,+ enum-subset-generate ==0.1.0.3,+ enum-text ==0.5.3.0,+ envelope ==0.2.2.0,+ envparse ==0.6.0,+ envy ==2.1.5.0,+ epub-metadata ==5.4,+ eq ==4.3,+ equal-files ==0.0.5.4,+ equational-reasoning ==0.7.1.0,+ equivalence ==0.4.1.1,+ erf ==2.0.0.0,+ errata ==0.4.0.3,+ error ==1.0.0.0,+ errorcall-eq-instance ==0.3.0,+ error-or ==0.3.0,+ error-or-utils ==0.2.0,+ errors ==2.3.0,+ errors-ext ==0.4.2,+ ersatz ==0.6,+ esqueleto ==3.6.0.0,+ essence-of-live-coding ==0.2.9,+ essence-of-live-coding-gloss ==0.2.9,+ essence-of-live-coding-pulse ==0.2.9,+ essence-of-live-coding-quickcheck ==0.2.9,+ essence-of-live-coding-warp ==0.2.9,+ event-list ==0.1.3,+ every ==0.0.1,+ evm-opcodes ==0.2.0,+ exact-combinatorics ==0.2.0.11,+ exact-pi ==0.5.1.0,+ exception-hierarchy ==0.1.0.14,+ exception-mtl ==0.4.0.2,+ exceptions installed,+ exception-transformers ==0.4.0.12,+ executable-hash ==0.2.0.4,+ executable-path ==0.0.3.1,+ exinst ==0.9,+ exit-codes ==1.0.0,+ exomizer ==1.0.0,+ exon ==1.7.3.0,+ expiring-cache-map ==0.0.6.1,+ explicit-exception ==0.2.0.2,+ exp-pairs ==0.2.1.1,+ express ==1.0.18,+ extended-reals ==0.2.7.0,+ extensible-exceptions ==0.1.1.4,+ extra ==1.8.1,+ extractable-singleton ==0.0.1,+ extra-data-yj ==0.1.0.0,+ extrapolate ==0.4.6,+ fail ==4.9.0.0,+ FailT ==0.1.2.0,+ fakedata ==1.0.5,+ fakedata-parser ==0.1.0.0,+ fakefs ==0.3.0.2,+ fakepull ==0.3.0.2,+ faktory ==1.1.3.2,+ falsify ==0.2.0,+ fast-builder ==0.1.5.0,+ fast-digits ==0.3.2.0,+ fast-logger ==3.2.6,+ fast-math ==1.0.2,+ fast-myers-diff ==0.0.2,+ fcf-family ==0.2.0.3,+ fdo-notify ==0.3.1,+ feature-flags ==0.1.0.1,+ fedora-krb ==0.1.0,+ fedora-releases ==0.3.0,+ fedora-repoquery ==0.7.4,+ feed ==1.3.2.1,+ FenwickTree ==0.1.2.1,+ fft ==0.1.8.7,+ fftw-ffi ==0.1,+ fgl ==5.8.3.1,+ fgl-visualize ==0.1.0.1,+ fields-json ==0.4.0.0,+ filecache ==0.5.3,+ file-embed ==0.0.16.0,+ file-embed-lzma ==0.1,+ file-io ==0.2.0,+ filelock ==0.1.1.9,+ filemanip ==0.3.6.3,+ file-modules ==0.1.2.4,+ filepath installed,+ filepath-bytestring ==1.5.2.0.5,+ file-path-th ==0.1.0.0,+ filepattern ==0.1.3,+ fileplow ==0.1.0.0,+ filter-logger ==0.6.0.0,+ filtrable ==0.1.6.0,+ fin ==0.3.2,+ FindBin ==0.0.5,+ fingertree ==0.1.6.3,+ finite-typelits ==0.2.1.0,+ first-class-families ==0.8.2.0,+ fits-parse ==0.4.2,+ fitspec ==0.4.10,+ fixed ==0.3,+ fixed-generic ==0.1.0.2,+ fixed-length ==0.2.3.1,+ fixed-vector ==2.0.0.0,+ fixed-vector-hetero ==0.7.0.0,+ fix-whitespace ==0.1,+ flac ==0.2.1,+ flac-picture ==0.1.3,+ flags-applicative ==0.1.0.3,+ flat ==0.6,+ flatparse ==0.5.3.1,+ flay ==0.5,+ flexible-defaults ==0.0.3,+ FloatingHex ==0.5,+ floatshow ==0.2.4,+ flow ==2.0.0.11,+ flush-queue ==1.0.0,+ fmlist ==0.9.5,+ fmt ==0.6.3.0,+ fn ==0.3.0.2,+ focus ==1.0.3.2,+ focuslist ==0.1.1.0,+ foldable1-classes-compat ==0.1.3,+ fold-debounce ==0.2.0.17,+ fold-debounce-conduit ==0.2.0.9,+ foldl ==1.4.18,+ folds ==0.7.8,+ FontyFruity ==0.5.3.5,+ force-layout ==0.4.1,+ foreign-store ==0.2.1,+ ForestStructures ==0.0.1.1,+ forkable-monad ==0.2.0.3,+ forma ==1.2.0,+ formatn ==0.3.4.0,+ format-numbers ==0.1.0.1,+ formatting ==7.2.0,+ foundation ==0.0.30,+ free ==5.2,+ free-alacarte ==1.0.0.9,+ free-categories ==0.2.0.2,+ free-foil ==0.2.0,+ freenect ==1.2.1,+ freer-par-monad ==0.1.0.0,+ freetype2 ==0.2.0,+ free-vl ==0.1.4,+ friendly-time ==0.4.1,+ frisby ==0.2.5,+ from-sum ==0.2.3.0,+ frontmatter ==0.1.0.2,+ fsnotify ==0.4.4.0,+ ftp-client ==0.5.1.6,+ funcmp ==1.9,+ function-builder ==0.3.0.1,+ functor-combinators ==0.4.1.4,+ functor-products ==0.1.2.2,+ fused-effects ==1.1.2.7,+ fusion-plugin ==0.2.8,+ fusion-plugin-types ==0.1.0,+ fuzzcheck ==0.1.1,+ fuzzy ==0.1.1.0,+ fuzzy-dates ==0.1.1.2,+ fuzzyset ==0.3.2,+ fuzzystrmatch-pg ==0.1.0.0,+ fuzzy-time ==0.3.0.1,+ gd ==3000.7.3,+ gdp ==0.0.3.0,+ gemini-exports ==0.1.0.2,+ general-games ==1.1.1,+ generic-aeson ==0.2.0.14,+ generically ==0.1.1,+ generic-arbitrary ==1.0.1.2,+ generic-case ==0.1.1.1,+ generic-constraints ==1.1.1.1,+ generic-data ==1.1.0.2,+ generic-data-functions ==0.6.0,+ generic-data-surgery ==0.3.0.0,+ generic-deriving ==1.14.7,+ generic-enumeration ==0.1.0.5,+ generic-functor ==1.1.0.0,+ generic-lens ==2.2.2.0,+ generic-lens-core ==2.2.1.0,+ generic-lexicographic-order ==0.1.0.1,+ generic-monoid ==0.1.0.1,+ generic-optics ==2.2.1.0,+ GenericPretty ==1.2.2,+ generic-random ==1.5.0.1,+ generics-eot ==0.4.1.0,+ generics-sop ==0.5.1.4,+ generics-sop-lens ==0.2.1,+ generic-type-asserts ==0.3.0,+ generic-type-functions ==0.1.0,+ genvalidity ==1.1.1.0,+ genvalidity-aeson ==1.0.0.1,+ genvalidity-appendful ==0.1.0.0,+ genvalidity-bytestring ==1.0.0.1,+ genvalidity-case-insensitive ==0.0.0.1,+ genvalidity-containers ==1.0.0.2,+ genvalidity-criterion ==1.1.0.0,+ genvalidity-hspec ==1.0.0.4,+ genvalidity-hspec-aeson ==1.0.0.0,+ genvalidity-hspec-binary ==1.0.0.0,+ genvalidity-hspec-cereal ==1.0.0.0,+ genvalidity-hspec-hashable ==1.0.0.1,+ genvalidity-hspec-optics ==1.0.0.0,+ genvalidity-hspec-persistent ==1.0.0.0,+ genvalidity-mergeful ==0.3.0.1,+ genvalidity-mergeless ==0.3.0.0,+ genvalidity-network-uri ==0.0.0.0,+ genvalidity-path ==1.0.0.1,+ genvalidity-persistent ==1.0.0.2,+ genvalidity-property ==1.0.0.0,+ genvalidity-scientific ==1.0.0.0,+ genvalidity-sydtest ==1.0.1.0,+ genvalidity-sydtest-aeson ==1.0.0.1,+ genvalidity-sydtest-hashable ==1.0.0.1,+ genvalidity-sydtest-lens ==1.0.0.0,+ genvalidity-sydtest-persistent ==1.0.0.1,+ genvalidity-text ==1.0.0.1,+ genvalidity-time ==1.0.0.1,+ genvalidity-typed-uuid ==0.1.0.1,+ genvalidity-unordered-containers ==1.0.0.1,+ genvalidity-uuid ==1.0.0.1,+ genvalidity-vector ==1.0.0.0,+ geodetics ==1.1.0,+ geoip2 ==0.4.1.3,+ getopt-generics ==0.13.1.0,+ ghc installed,+ ghc-bignum installed,+ ghc-bignum-orphans ==0.1.1,+ ghc-boot installed,+ ghc-boot-th installed,+ ghc-byteorder ==4.11.0.0.10,+ ghc-check ==0.5.0.8,+ ghc-compact ==0.1.0.0,+ ghc-core ==0.5.6,+ ghc-events ==0.20.0.0,+ ghc-exactprint ==1.10.0.0,+ ghc-experimental installed,+ ghc-heap installed,+ ghc-hs-meta ==0.1.5.0,+ ghci4luatex ==0.1.4,+ ghcid ==0.8.9,+ ghci-hexcalc ==0.1.1.0,+ ghc-internal installed,+ ghcjs-codemirror ==0.0.0.2,+ ghcjs-dom ==0.9.9.2,+ ghcjs-dom-jsaddle ==0.9.9.1,+ ghcjs-perch ==0.3.3.3,+ ghc-lib ==9.12.3.20251228,+ ghc-lib-parser ==9.12.3.20251228,+ ghc-lib-parser-ex ==9.12.0.0,+ ghc-parser ==0.2.8.0,+ ghc-paths ==0.1.0.12,+ ghc-prim installed,+ ghc-source-gen ==0.4.7.0,+ ghc-syntax-highlighter ==0.0.13.0,+ ghc-tcplugins-extra ==0.4.6,+ ghc-trace-events ==0.1.2.10,+ ghc-typelits-extra ==0.4.8,+ ghc-typelits-knownnat ==0.7.13,+ ghc-typelits-natnormalise ==0.7.10,+ ghc-typelits-presburger ==0.7.4.2,+ ghost-buster ==0.1.1.0,+ ghostscript-parallel ==0.0.1,+ gi-atk ==2.0.28,+ gi-cairo ==1.0.30,+ gi-cairo-connector ==0.1.1,+ gi-cairo-render ==0.1.2,+ gi-dbusmenu ==0.4.14,+ gi-dbusmenugtk3 ==0.4.16,+ gi-freetype2 ==2.0.5,+ gi-gdk ==4.0.10,+ gi-gdk3 ==3.0.30,+ gi-gdk4 ==4.0.10,+ gi-gdkpixbuf ==2.0.32,+ gi-gdkx11 ==4.0.9,+ gi-gdkx113 ==3.0.17,+ gi-gdkx114 ==4.0.9,+ gi-gio ==2.0.38,+ gi-glib ==2.0.30,+ gi-gmodule ==2.0.6,+ gi-gobject ==2.0.31,+ gi-graphene ==1.0.8,+ gi-gsk ==4.0.9,+ gi-gtk ==4.0.12,+ gi-gtk3 ==3.0.44,+ gi-gtk4 ==4.0.12,+ gi-gtksource ==5.0.2,+ gi-gtksource5 ==5.0.2,+ gi-harfbuzz ==0.0.10,+ gi-javascriptcore ==6.0.5,+ gi-javascriptcore6 ==6.0.5,+ ginger ==0.10.6.0,+ gio ==0.13.12.0,+ gi-pango ==1.0.30,+ gi-soup ==3.0.4,+ gi-soup3 ==3.0.5,+ githash ==0.1.7.0,+ github ==0.30.0.2,+ github-release ==2.0.0.19,+ github-rest ==1.2.1,+ github-types ==0.2.1,+ github-webhooks ==0.18.0,+ gitlab-haskell ==1.1.0.0,+ git-lfs ==1.2.5,+ git-mediate ==1.1.0,+ gitrev ==1.3.1,+ gi-vte ==2.91.35,+ gi-xlib ==2.0.14,+ gl ==0.9.1,+ glabrous ==2.0.6.4,+ glasso ==0.1.0,+ GLFW-b ==3.3.9.1,+ glfw-group ==0.1.0.6,+ glib ==0.13.12.0,+ glib-stopgap ==0.1.0.1,+ Glob ==0.10.2,+ glob-posix ==0.2.0.1,+ gloss ==1.13.2.2,+ gloss-algorithms ==1.13.0.3,+ gloss-rendering ==1.13.2.1,+ glpk-headers ==0.5.1,+ GLURaw ==2.0.0.5,+ GLUT ==2.7.0.16,+ gnuplot ==0.5.7,+ gogol ==1.0.0.0,+ gogol-adexchange-buyer ==1.0.0,+ gogol-adexchange-seller ==1.0.0,+ gogol-admin-datatransfer ==1.0.0,+ gogol-admin-directory ==1.0.0,+ gogol-admin-reports ==1.0.0,+ gogol-adsense ==1.0.0,+ gogol-adsense-host ==1.0.0,+ gogol-analytics ==1.0.0,+ gogol-android-enterprise ==1.0.0,+ gogol-android-publisher ==1.0.0,+ gogol-appengine ==1.0.0,+ gogol-apps-activity ==1.0.0,+ gogol-apps-calendar ==1.0.0,+ gogol-apps-licensing ==1.0.0,+ gogol-apps-reseller ==1.0.0,+ gogol-apps-tasks ==1.0.0,+ gogol-appstate ==1.0.0,+ gogol-bigquery ==1.0.0,+ gogol-billing ==1.0.0,+ gogol-blogger ==1.0.0,+ gogol-books ==1.0.0,+ gogol-civicinfo ==1.0.0,+ gogol-classroom ==1.0.0,+ gogol-cloudtrace ==1.0.0,+ gogol-compute ==1.0.0,+ gogol-container ==1.0.0,+ gogol-core ==1.0.0.0,+ gogol-customsearch ==1.0.0,+ gogol-dataflow ==1.0.0,+ gogol-dataproc ==1.0.0,+ gogol-datastore ==1.0.0,+ gogol-debugger ==1.0.0,+ gogol-deploymentmanager ==1.0.0,+ gogol-dfareporting ==1.0.0,+ gogol-discovery ==1.0.0,+ gogol-dns ==1.0.0,+ gogol-doubleclick-bids ==1.0.0,+ gogol-doubleclick-search ==1.0.0,+ gogol-drive ==1.0.0,+ gogol-firebase-rules ==1.0.0,+ gogol-fitness ==1.0.0,+ gogol-fonts ==1.0.0,+ gogol-fusiontables ==1.0.0,+ gogol-games ==1.0.0,+ gogol-games-configuration ==1.0.0,+ gogol-games-management ==1.0.0,+ gogol-genomics ==1.0.0,+ gogol-gmail ==1.0.0,+ gogol-groups-migration ==1.0.0,+ gogol-groups-settings ==1.0.0,+ gogol-identity-toolkit ==1.0.0,+ gogol-kgsearch ==1.0.0,+ gogol-logging ==1.0.0,+ gogol-mirror ==1.0.0,+ gogol-monitoring ==1.0.0,+ gogol-oauth2 ==1.0.0,+ gogol-pagespeed ==1.0.0,+ gogol-partners ==1.0.0,+ gogol-people ==1.0.0,+ gogol-play-moviespartner ==1.0.0,+ gogol-plus ==1.0.0,+ gogol-plus-domains ==1.0.0,+ gogol-proximitybeacon ==1.0.0,+ gogol-pubsub ==1.0.0,+ gogol-qpxexpress ==1.0.0,+ gogol-replicapool ==1.0.0,+ gogol-replicapool-updater ==1.0.0,+ gogol-resourcemanager ==1.0.0,+ gogol-script ==1.0.0,+ gogol-sheets ==1.0.0,+ gogol-shopping-content ==1.0.0,+ gogol-siteverification ==1.0.0,+ gogol-spectrum ==1.0.0,+ gogol-sqladmin ==1.0.0,+ gogol-storage ==1.0.0,+ gogol-storage-transfer ==1.0.0,+ gogol-tagmanager ==1.0.0,+ gogol-translate ==1.0.0,+ gogol-urlshortener ==1.0.0,+ gogol-vision ==1.0.0,+ gogol-webmaster-tools ==1.0.0,+ gogol-youtube ==1.0.0,+ gogol-youtube-analytics ==1.0.0,+ gogol-youtube-reporting ==1.0.0,+ goldplate ==0.2.2.1,+ google-isbn ==1.0.3,+ google-oauth2-jwt ==0.3.3.3,+ gopher-proxy ==0.1.1.3,+ gpolyline ==0.1.0.1,+ graph-core ==0.3.0.0,+ graphite ==0.10.0.1,+ graphql ==1.5.0.2,+ graphql-client ==1.2.4,+ graphql-spice ==1.0.7.0,+ graphs ==0.7.3,+ graphula ==2.1.2.0,+ graphviz ==2999.20.2.1,+ gravatar ==0.8.1,+ greskell ==2.0.3.5,+ greskell-core ==1.0.0.8,+ greskell-websocket ==1.0.0.6,+ gridtables ==0.1.1.0,+ grisette ==0.13.0.1,+ groom ==0.1.2.1,+ group-by-date ==0.1.0.5,+ groups ==0.5.3,+ gtk ==0.15.10,+ gtk2hs-buildtools ==0.13.12.0,+ gtk3 ==0.15.10,+ guarded-allocation ==0.0.1,+ hackage-cli ==0.1.0.4,+ hackage-db ==2.1.3,+ hackage-revdeps ==0.1,+ hackage-security ==0.6.3.3,+ hackage-security-HTTP ==0.1.1.3,+ haddock-library ==1.11.0,+ haha ==0.3.1.1,+ hakyll ==4.16.8.0,+ hakyll-convert ==0.3.0.5,+ hal ==1.1,+ half ==0.3.3,+ hall-symbols ==0.1.0.6,+ hamlet ==1.2.0,+ hamtsolo ==1.0.4,+ HandsomeSoup ==0.4.2,+ happstack-jmacro ==7.0.12.6,+ happstack-server ==7.9.3,+ happstack-server-tls ==7.2.1.7,+ happy ==2.1.7,+ happy-lib ==2.1.7,+ happy-meta ==0.2.1.0,+ harpie ==0.1.4.0,+ harpie-numhask ==0.1.1.0,+ HasBigDecimal ==0.2.0.0,+ hashable ==1.5.1.0,+ hashmap ==1.3.3,+ hashtables ==1.4.2,+ haskeline installed,+ haskell-gi ==0.26.17,+ haskell-gi-base ==0.26.9,+ haskell-gi-overloading ==1.0,+ haskell-lexer ==1.2.1,+ HaskellNet ==0.6.2,+ HaskellNet-SSL ==0.4.0.2,+ haskell-src ==1.0.4.2,+ haskell-src-exts ==1.23.1,+ haskell-src-exts-simple ==1.23.1.0,+ haskell-src-exts-util ==0.2.5,+ haskell-src-meta ==0.8.16,+ haskey-btree ==0.3.0.1,+ haskintex ==0.8.0.3,+ haskoin-core ==1.2.2,+ haskoin-store-data ==1.5.16,+ hasktags ==0.73.0,+ hasql ==1.9.3.1,+ hasql-dynamic-statements ==0.3.1.8,+ hasql-implicits ==0.2.0.2,+ hasql-interpolate ==1.0.1.0,+ hasql-listen-notify ==0.1.0.1,+ hasql-migration ==0.3.1,+ hasql-optparse-applicative ==0.9,+ hasql-pool ==1.3.0.4,+ hasql-th ==0.4.0.23,+ hasql-transaction ==1.2.1,+ has-transformers ==0.1.0.4,+ Hastructure ==0.50.4,+ hasty-hamiltonian ==1.3.4,+ HaTeX ==3.23.0.2,+ haveibeenpwned ==0.2.0.3,+ HaXml ==1.25.14,+ haxr ==3000.11.6.1,+ Hclip ==3.0.0.4,+ HCodecs ==0.5.2,+ hdaemonize ==0.5.7,+ HDBC ==2.4.0.5,+ HDBC-session ==0.1.2.1,+ headed-megaparsec ==0.2.1.3,+ heap ==1.0.4,+ heaps ==0.4.1,+ heatshrink ==0.1.0.0,+ hebrew-time ==0.1.2,+ hedgehog ==1.5,+ hedgehog-classes ==0.2.5.4,+ hedgehog-corpus ==0.2.0,+ hedgehog-fakedata ==0.0.1.5,+ hedgehog-fn ==1.0,+ hedgehog-quickcheck ==0.1.1,+ hedis ==0.15.2,+ hedn ==0.3.0.4,+ heftia ==0.7.0.0,+ heftia-effects ==0.7.0.0,+ heist ==1.1.1.2,+ here ==1.2.14,+ heredoc ==0.2.0.0,+ heterocephalus ==1.0.5.7,+ hetero-parameter-list ==0.1.0.21,+ hetero-parameter-list-with-typelevel-tools ==0.1.0.1,+ hetzner ==0.7.3.0,+ hex ==0.2.0,+ hexml ==0.3.5,+ hexml-lens ==0.2.2,+ hexpat ==0.20.13,+ hex-text ==0.1.0.9,+ hformat ==0.3.3.1,+ hfsevents ==0.1.8,+ hgal ==2.0.0.3,+ hidapi ==0.1.8,+ hie-bios ==0.16.0,+ hi-file-parser ==0.1.9.1,+ hinfo ==0.0.3.0,+ hinotify ==0.4.2,+ hint ==0.9.0.9,+ histogram-fill ==0.9.1.0,+ hjsmin ==0.2.1,+ hkd-default ==1.1.0.0,+ hkgr ==0.4.8,+ hledger ==1.43.2,+ hledger-iadd ==1.3.21,+ hledger-interest ==1.6.7,+ hledger-lib ==1.43.2,+ hledger-stockquotes ==0.1.3.2,+ hledger-ui ==1.43.2,+ hledger-web ==1.43.2,+ hlibcpuid ==0.2.0,+ hlibgit2 ==0.18.0.16,+ hlibsass ==0.1.10.3,+ hlint ==3.10,+ hmatrix ==0.20.2,+ hmatrix-backprop ==0.1.3.0,+ hmatrix-gsl ==0.19.0.1,+ hmatrix-gsl-stats ==0.4.1.8,+ hmatrix-morpheus ==0.1.1.2,+ hmatrix-repa ==0.1.2.2,+ hmatrix-special ==0.19.0.0,+ hmatrix-vector-sized ==0.1.3.0,+ hmpfr ==0.4.5,+ hoare ==0.1.1.0,+ hoauth2 ==2.14.3,+ honeycomb ==0.1.0.1,+ hoogle ==5.0.18.4,+ hopenssl ==2.2.5,+ horizontal-rule ==0.7.1.0,+ hosc ==0.21.1,+ hostname ==1.0,+ hostname-validate ==1.0.0,+ hourglass ==0.2.12,+ hourglass-orphans ==0.1.0.0,+ hp2pretty ==0.10.1,+ hpack ==0.38.3,+ hpc installed,+ hpc-codecov ==0.6.4.1,+ hpc-lcov ==1.2.0,+ HPDF ==1.7,+ hpke ==0.0.0,+ hpp ==0.6.5,+ hpqtypes ==1.12.0.0,+ hpqtypes-extras ==1.18.0.0,+ hquantlib-time ==0.1.2,+ hreader ==1.1.1,+ hreader-lens ==0.1.3.0,+ hruby ==0.5.1.0,+ hsass ==0.8.0,+ hs-bibutils ==6.10.0.0,+ hsc2hs ==0.68.10,+ hs-captcha ==1.0,+ hscolour ==1.25,+ hsdns ==1.8,+ hse-cpp ==0.2,+ hsemail ==2.2.2,+ hset ==2.2.0,+ HSet ==0.0.2,+ hs-GeoIP ==0.3,+ hsignal ==0.2.7.5,+ hsini ==0.5.2.2,+ hsinstall ==2.8,+ HSlippyMap ==3.0.1,+ hslogger ==1.3.2.0,+ hslua ==2.3.1,+ hslua-aeson ==2.3.2,+ hslua-classes ==2.3.2,+ hslua-cli ==1.4.4,+ hslua-core ==2.3.2.1,+ hslua-list ==1.1.4,+ hslua-marshalling ==2.3.2,+ hslua-module-doclayout ==1.2.0.1,+ hslua-module-path ==1.1.1,+ hslua-module-system ==1.1.3,+ hslua-module-text ==1.1.1,+ hslua-module-version ==1.1.1,+ hslua-module-zip ==1.1.4,+ hslua-objectorientation ==2.3.1,+ hslua-packaging ==2.3.1,+ hslua-repl ==0.1.2,+ hslua-typing ==0.1.1,+ hsndfile ==0.8.0,+ hsndfile-vector ==0.5.2,+ HsOpenSSL ==0.11.7.11,+ HsOpenSSL-x509-system ==0.1.0.4,+ hs-opentelemetry-api ==0.3.1.0,+ hs-opentelemetry-exporter-handle ==0.0.1.3,+ hs-opentelemetry-exporter-in-memory ==0.0.1.5,+ hs-opentelemetry-exporter-otlp ==0.1.1.0,+ hs-opentelemetry-otlp ==0.2.0.0,+ hs-opentelemetry-propagator-b3 ==0.0.1.3,+ hs-opentelemetry-propagator-datadog ==0.0.1.1,+ hs-opentelemetry-propagator-w3c ==0.1.0.0,+ hs-opentelemetry-sdk ==0.1.0.1,+ hs-opentelemetry-semantic-conventions ==0.1.0.0,+ hs-opentelemetry-vendor-honeycomb ==0.0.1.2,+ hspec ==2.11.17,+ hspec-api ==2.11.17,+ hspec-attoparsec ==0.1.0.2,+ hspec-checkers ==0.1.0.2,+ hspec-contrib ==0.5.2,+ hspec-core ==2.11.17,+ hspec-discover ==2.11.17,+ hspec-expectations ==0.8.4,+ hspec-expectations-json ==1.0.2.1,+ hspec-expectations-lifted ==0.10.0,+ hspec-expectations-pretty-diff ==0.7.2.6,+ hspec-golden ==0.2.2.0,+ hspec-golden-aeson ==0.9.0.0,+ hspec-hedgehog ==0.3.0.0,+ hspec-junit-formatter ==1.1.2.1,+ hspec-leancheck ==0.0.6,+ hspec-megaparsec ==2.2.1,+ hspec-meta ==2.11.17,+ hspec-need-env ==0.1.0.13,+ hspec-parsec ==0,+ hspec-smallcheck ==0.5.3,+ hspec-tmp-proc ==0.7.0.0,+ hspec-wai ==0.11.1,+ hspec-wai-json ==0.11.0,+ hspec-webdriver ==1.2.2,+ hs-php-session ==0.0.9.3,+ hstatistics ==0.3.1,+ HStringTemplate ==0.8.8,+ HSvm ==1.0.3.35,+ HsYAML ==0.2.1.5,+ HsYAML-aeson ==0.2.0.2,+ hsyslog ==5.0.2,+ htaglib ==1.2.1,+ HTF ==0.15.0.2,+ html ==1.0.1.2,+ html-conduit ==1.3.2.2,+ html-email-validate ==0.2.0.0,+ html-entities ==1.1.4.7,+ html-entity-map ==0.1.0.0,+ html-parse ==0.2.2.0,+ HTTP ==4000.4.1,+ http2 ==5.3.10,+ http-api-data ==0.6.3,+ http-api-data-qq ==0.1.0.1,+ http-client ==0.7.19,+ http-client-openssl ==0.3.3,+ http-client-overrides ==0.1.1.0,+ http-client-restricted ==0.1.1,+ http-client-tls ==0.3.6.4,+ http-common ==0.8.3.4,+ http-conduit ==2.3.9.1,+ http-date ==0.0.11,+ http-directory ==0.1.12,+ http-download ==0.2.1.0,+ httpd-shed ==0.4.1.2,+ http-io-streams ==0.1.7.2,+ http-link-header ==1.2.3,+ http-media ==0.8.1.1,+ http-query ==0.1.3.1,+ http-reverse-proxy ==0.6.2.0,+ http-semantics ==0.3.0,+ http-streams ==0.8.9.9,+ http-types ==0.12.5,+ human-readable-duration ==0.2.1.5,+ HUnit ==1.6.2.0,+ HUnit-approx ==1.1.1.1,+ hunit-dejafu ==2.0.0.6,+ hvect ==0.4.0.1,+ hvega ==0.12.0.7,+ hw-bits ==0.7.2.2,+ hw-conduit-merges ==0.2.1.0,+ hw-diagnostics ==0.0.1.0,+ hweblib ==0.6.3,+ hw-excess ==0.2.3.0,+ hw-hedgehog ==0.1.1.1,+ hw-int ==0.0.2.0,+ hwk ==0.6,+ hw-kafka-client ==5.3.0,+ hw-mquery ==0.2.1.2,+ hw-parser ==0.1.1.0,+ hw-prim ==0.6.3.2,+ hw-rankselect-base ==0.3.4.1,+ hw-string-parse ==0.0.0.5,+ hxt ==9.3.1.22,+ hxt-charproperties ==9.5.0.0,+ hxt-css ==0.1.0.3,+ hxt-curl ==9.1.1.1,+ hxt-expat ==9.1.1,+ hxt-http ==9.1.5.2,+ hxt-regex-xmlschema ==9.2.0.7,+ hxt-tagsoup ==9.1.4,+ hxt-unicode ==9.0.2.4,+ hxt-xpath ==9.1.2.2,+ hybrid-vectors ==0.2.5,+ hyperbole ==0.4.3,+ hyperloglog ==0.5,+ hyphenation ==0.8.3,+ iconv ==0.4.1.3,+ identicon ==0.2.3,+ ieee754 ==0.8.0,+ if ==0.1.0.0,+ IfElse ==0.85,+ iff ==0.0.6.1,+ ihaskell ==0.12.0.0,+ ihaskell-hvega ==0.5.0.7,+ ihs ==0.1.0.3,+ imagesize-conduit ==1.1,+ Imlib ==0.1.2,+ immortal ==0.3,+ immortal-queue ==0.1.0.1,+ imp ==1.0.3.5,+ ImpSpec ==0.1.0.0,+ inbox ==0.2.0,+ incipit-base ==0.6.1.1,+ incipit-core ==0.6.1.1,+ include-file ==0.1.0.4,+ incremental ==0.3.1,+ incremental-parser ==0.5.1,+ indents ==0.5.0.1,+ indexed ==0.1.3,+ indexed-containers ==0.1.0.2,+ indexed-list-literals ==0.2.1.3,+ indexed-profunctors ==0.1.1.1,+ indexed-transformers ==0.1.0.4,+ indexed-traversable ==0.1.5,+ indexed-traversable-instances ==0.1.2.1,+ inf-backprop ==0.1.1.0,+ infer-license ==0.2.0,+ infinite-list ==0.1.3,+ influxdb ==1.9.3.2,+ ini ==0.4.2,+ inj ==1.0,+ inline-c ==0.9.1.10,+ inline-c-cpp ==0.5.0.2,+ input-parsers ==0.3.0.2,+ insert-ordered-containers ==0.2.7,+ inspection-testing ==0.6.3,+ int-cast ==0.2.0.0,+ integer-conversion ==0.1.1,+ integer-gmp installed,+ integer-logarithms ==1.0.5,+ integer-roots ==1.0.4.0,+ integration ==0.2.1,+ intermediate-structures ==0.1.2.0,+ intern ==0.9.6,+ interpolate ==0.2.1,+ interpolatedstring-perl6 ==1.0.2,+ interpolation ==0.1.1.2,+ Interpolation ==0.3.0,+ IntervalMap ==0.6.2.4,+ intervals ==0.9.3,+ intset-imperative ==0.1.0.0,+ int-supply ==1.0.0,+ invariant ==0.6.5,+ invertible ==0.2.0.8,+ invertible-grammar ==0.1.3.5,+ io-embed ==0.1.0.1,+ io-machine ==0.2.0.0,+ io-manager ==0.1.0.4,+ io-memoize ==1.1.1.0,+ io-region ==0.1.1,+ io-storage ==0.3,+ io-streams ==1.5.2.2,+ io-streams-haproxy ==1.0.1.0,+ ip ==1.7.8,+ ip6addr ==2.0.0.1,+ iproute ==1.7.15,+ IPv6Addr ==2.0.6.2,+ IPv6DB ==0.3.3.4,+ ipynb ==0.2,+ ipython-kernel ==0.11.0.0,+ irc ==0.6.1.1,+ irc-ctcp ==0.1.3.1,+ iri ==0.5.1.2,+ isbn ==1.1.0.5,+ islink ==0.1.0.0,+ iso3166-country-codes ==0.20140203.8,+ iso639 ==0.1.0.3,+ iso8601-time ==0.1.5,+ isocline ==1.0.9,+ isomorphism-class ==0.3.1.4,+ ix-shapable ==0.1.0,+ jack ==0.7.2.2,+ jailbreak-cabal ==1.4.1,+ jalaali ==1.0.0.0,+ java-adt ==1.0.20251105,+ jira-wiki-markup ==1.5.1,+ jmacro ==0.6.18,+ jose ==0.11,+ jose-jwt ==0.10.0,+ journalctl-stream ==0.6.0.8,+ jsaddle ==0.9.9.4,+ jsaddle-dom ==0.9.9.3,+ jsaddle-warp ==0.9.9.6,+ js-chart ==2.9.4.1,+ js-dgtable ==0.5.2,+ js-flot ==0.8.3,+ js-jquery ==3.7.1,+ json ==0.11,+ json-feed ==2.0.0.19,+ jsonifier ==0.2.1.3,+ jsonpath ==0.3.0.0,+ json-rpc ==1.1.2,+ jsonrpc-tinyclient ==1.1.0.0,+ json-spec ==1.1.1.2,+ json-spec-elm ==0.4.0.7,+ json-spec-elm-servant ==0.4.4.3,+ json-spec-openapi ==1.0.1.3,+ json-stream ==0.4.6.1,+ JuicyCairo ==0.1.0.1,+ JuicyPixels ==3.3.9,+ JuicyPixels-extra ==0.6.0,+ junit-xml ==0.1.0.4,+ justified-containers ==0.3.0.0,+ kan-extensions ==5.2.8,+ kansas-comet ==0.4.4,+ katip ==0.8.8.4,+ katip-logstash ==0.1.0.2,+ katip-wai ==0.2.0.2,+ kazura-queue ==0.1.0.4,+ kdt ==0.2.6,+ keep-alive ==0.2.1.0,+ keter ==2.1.10,+ keycode ==0.2.4,+ keyed-vals ==0.2.3.5,+ keyed-vals-hspec-tests ==0.2.3.5,+ keyed-vals-mem ==0.2.3.4,+ keyed-vals-redis ==0.2.3.5,+ keys ==3.12.5,+ ki ==1.0.1.2,+ kind-apply ==0.4.0.1,+ kind-generics ==0.5.0.0,+ ki-unlifted ==1.0.0.2,+ kmeans ==0.1.3,+ knob ==0.2.2,+ koji ==0.0.2,+ koji-tool ==1.3.1,+ kvitable ==1.1.2.0,+ labels ==0.3.3,+ lackey ==2.0.0.12,+ lambdabot-core ==5.3.1.2,+ lambdabot-irc-plugins ==5.3.1.2,+ LambdaHack ==0.11.0.1,+ lame ==0.2.2,+ language-avro ==0.1.4.0,+ language-bash ==0.11.1,+ language-c ==0.10.2,+ language-c99 ==0.2.0,+ language-c99-simple ==0.3.0,+ language-c99-util ==0.2.0,+ language-c-quote ==0.13.0.2,+ language-docker ==14.0.1,+ language-dot ==0.1.2,+ language-glsl ==0.3.0,+ language-java ==0.2.9,+ language-javascript ==0.7.1.0,+ language-lua ==0.11.0.2,+ language-nix ==2.2.0,+ language-protobuf ==1.0.1,+ lapack-carray ==0.0.3,+ lapack-comfort-array ==0.0.1.1,+ lapack-ffi ==0.0.3,+ lapack-ffi-tools ==0.1.3.2,+ large-hashable ==0.1.3.0,+ largeword ==1.2.5,+ latex ==0.1.0.4,+ lattices ==2.2.1.1,+ lawful ==0.1.0.0,+ lawful-conversions ==0.1.7,+ lazy-csv ==0.5.1,+ lazyio ==0.1.0.6,+ lazysmallcheck ==0.6,+ lca ==0.4,+ leancheck ==1.0.4,+ leancheck-instances ==0.0.8,+ leapseconds-announced ==2017.1.0.1,+ learn-physics ==0.6.7,+ leb128-cereal ==1.2,+ lens ==5.3.6,+ lens-action ==0.2.6,+ lens-aeson ==1.2.3,+ lens-csv ==0.1.1.0,+ lens-family ==2.1.3,+ lens-family-core ==2.1.3,+ lens-family-th ==0.5.3.2,+ lens-misc ==0.0.2.0,+ lens-properties ==4.11.1,+ lens-regex ==0.1.3,+ lens-regex-pcre ==1.1.2.0,+ lentil ==1.5.10.0,+ LetsBeRational ==1.0.0.0,+ leveldb-haskell ==0.6.5.1,+ lexer-applicative ==2.1.0.2,+ libBF ==0.6.8,+ libffi ==0.2.1,+ libmpd ==0.10.0.1,+ liboath-hs ==0.0.1.2,+ libsodium-bindings ==0.0.3.0,+ libyaml ==0.1.4,+ libyaml-clib ==0.2.5,+ lifted-async ==0.10.2.7,+ lifted-base ==0.2.3.12,+ lifted-threads ==1.0,+ lift-generics ==0.3.1,+ lift-type ==0.1.2.0,+ linear ==1.23.3,+ linear-base ==0.5.0,+ linear-generics ==0.2.3,+ linear-geo ==0.1.0.0,+ linear-programming ==0.0.1,+ linebreak ==1.1.0.4,+ linux-capabilities ==0.1.1.0,+ linux-file-extents ==0.2.0.1,+ linux-namespaces ==0.2.0.1,+ liquid-fixpoint ==0.9.6.3.2,+ liquidhaskell ==0.9.10.1.2,+ liquidhaskell-boot ==0.9.10.1.2,+ List ==0.6.2,+ ListLike ==4.7.8.4,+ list-predicate ==0.1.0.1,+ listsafe ==0.1.0.1,+ lists-flines ==0.1.3.0,+ list-shuffle ==1.0.0.1,+ list-t ==1.0.5.7,+ list-transformer ==1.1.1,+ ListTree ==0.2.3,+ list-witnesses ==0.1.4.1,+ ListZipper ==1.2.0.2,+ literatex ==0.4.0.0,+ lmdb ==0.2.5,+ load-env ==0.2.1.0,+ locators ==0.3.0.5,+ loch-th ==0.2.2,+ lockfree-queue ==0.2.4,+ log-base ==0.12.1.0,+ log-domain ==0.13.2,+ logfloat ==0.14.0.2,+ logger-thread ==0.1.0.2,+ logging ==3.0.6,+ logging-effect ==1.4.2,+ logging-facade ==0.3.1,+ logging-facade-syslog ==1,+ logict ==0.8.2.0,+ logstash ==0.1.0.4,+ loop ==0.3.0,+ lpeg ==1.1.0.1,+ LPFP ==1.1.5,+ LPFP-core ==1.1.5,+ lr-acts ==0.0.1,+ lrucache ==1.2.0.1,+ lsfrom ==2.0,+ lsp ==2.7.0.1,+ lsp-test ==0.17.1.1,+ lsp-types ==2.3.0.1,+ lua ==2.3.4,+ lua-arbitrary ==1.0.1.2,+ lucid ==2.11.20260427,+ lucid2 ==0.0.20260427,+ lucid-cdn ==0.2.2.0,+ lucid-extras ==0.2.2,+ lukko ==0.1.2,+ lumberjack ==1.0.3.0,+ lz4 ==0.2.3.1,+ lz4-frame-conduit ==0.1.0.2,+ lzma ==0.0.1.1,+ lzma-clib ==5.2.2,+ machines ==0.7.4,+ magic ==1.1.2,+ mail-pool ==2.3.1,+ mailtrap ==0.1.2.2,+ mainland-pretty ==0.7.1.1,+ main-tester ==0.2.0.1,+ managed ==1.0.11,+ mandrill ==0.5.8.0,+ manifolds-core ==0.6.1.1,+ Mantissa ==0.1.0.0,+ mappings ==0.3.3.0,+ map-syntax ==0.3,+ markdown ==0.1.17.5,+ markdown-unlit ==0.6.0,+ markov-chain ==0.0.3.4,+ markov-chain-usage-model ==0.0.0,+ markup-parse ==0.2.2.0,+ massiv ==1.0.5.0,+ massiv-io ==1.0.0.1,+ massiv-serialise ==1.0.0.2,+ massiv-test ==1.1.0.1,+ matchable ==0.2,+ mathexpr ==0.3.1.0,+ math-extras ==0.1.1.0,+ math-functions ==0.3.4.4,+ mathlist ==0.2.0.0,+ matplotlib ==0.7.7,+ matrices ==0.5.0,+ matrix ==0.3.6.4,+ matrix-as-xyz ==0.1.2.2,+ matrix-market-attoparsec ==0.1.1.3,+ matrix-static ==0.3,+ maximal-cliques ==0.1.1,+ mbox-utility ==0.0.3.1,+ mcmc ==0.8.3.1,+ mcmc-types ==1.0.3,+ mcp-server ==0.1.0.20,+ mealy ==0.5.1.1,+ median-stream ==0.7.0.0,+ med-module ==0.1.3,+ megaparsec ==9.7.0,+ megaparsec-tests ==9.7.0,+ melf ==1.3.1,+ membership ==0.0.1,+ memcache ==0.3.0.2,+ mem-info ==0.4.2.0,+ memory ==0.18.0,+ memory-hexstring ==1.1.0.0,+ MemoTrie ==0.6.11,+ mempack ==0.1.2.0,+ mergeful ==0.3.0.0,+ mergeful-persistent ==0.3.0.1,+ mergeless ==0.4.0.0,+ mergeless-persistent ==0.1.0.1,+ merkle-tree ==0.1.1,+ mersenne-random ==1.0.0.1,+ mersenne-random-pure64 ==0.2.2.0,+ messagepack ==0.5.5,+ metrics ==0.4.1.1,+ mfsolve ==0.3.2.2,+ microaeson ==0.1.0.3,+ microlens ==0.4.14.0,+ microlens-aeson ==2.5.2,+ microlens-contra ==0.1.0.3,+ microlens-ghc ==0.4.15.1,+ microlens-mtl ==0.2.1.0,+ microlens-platform ==0.4.4.1,+ microlens-th ==0.4.3.17,+ microspec ==0.2.1.3,+ microstache ==1.0.3.1,+ midair ==0.2.0.1,+ midi ==0.2.2.6,+ midi-alsa ==0.2.1,+ midi-music-box ==0.0.1.2,+ mighty-metropolis ==2.0.0,+ mime-mail ==0.5.1,+ mime-mail-ses ==0.4.4,+ mime-types ==0.1.2.2,+ minimal-configuration ==0.1.4,+ minimorph ==0.3.0.1,+ minisat ==0.1.4,+ minisat-solver ==0.1,+ miniterion ==0.1.2.1,+ miniutter ==0.5.1.2,+ minmax ==0.1.1.0,+ mintty ==0.1.4,+ misfortune ==0.1.2.1,+ miso ==1.8.7.0,+ missing-foreign ==0.1.1,+ MissingH ==1.6.0.3,+ mixed-types-num ==0.6.2,+ mmap ==0.5.9,+ mmark ==0.0.8.0,+ mmark-cli ==0.0.5.2,+ mmark-ext ==0.2.1.5,+ mmorph ==1.2.2,+ mmsyn2-array ==0.3.1.1,+ mmsyn7l ==0.9.2.0,+ mmsyn7ukr-array ==0.3.0.0,+ mmsyn7ukr-common ==0.3.1.0,+ mnist-idx ==0.1.3.2,+ mnist-idx-conduit ==0.4.0.0,+ mockcat ==0.5.5.0,+ mockery ==0.3.5,+ mod ==0.2.2.0,+ modern-uri ==0.3.6.1,+ modular ==0.1.0.8,+ moffy ==0.1.1.0,+ moffy-samples ==0.1.0.3,+ moffy-samples-events ==0.2.2.5,+ moffy-samples-gtk3 ==0.1.0.0,+ moffy-samples-gtk3-run ==0.1.0.7,+ monad-chronicle ==1.1.0.1,+ monad-control ==1.0.3.1,+ monad-control-aligned ==0.0.2.1,+ monad-control-identity ==0.2.0.0,+ monad-coroutine ==0.9.3,+ monad-extras ==0.6.0,+ monad-interleave ==0.2.0.1,+ monadlist ==0.0.2,+ monad-logger ==0.3.42,+ monad-logger-aeson ==0.4.1.6,+ monad-logger-extras ==0.1.1.2,+ monad-logger-json ==0.1.0.0,+ monad-logger-logstash ==0.2.0.2,+ monad-logger-syslog ==0.1.6.1,+ monad-loops ==0.4.3,+ monad-memo ==0.5.4,+ monad-metrics ==0.2.2.2,+ monadoid ==0.0.3,+ monadology ==0.4,+ monad-par ==0.3.6,+ monad-parallel ==0.8.0.1,+ monad-par-extras ==0.3.3,+ monad-peel ==0.3,+ MonadPrompt ==1.0.0.5,+ MonadRandom ==0.6.2.1,+ monad-resumption ==0.1.4.0,+ monad-schedule ==0.2.0.2,+ monad-st ==0.2.4.1,+ monads-tf ==0.3.0.1,+ monad-time ==0.4.0.0,+ mongoDB ==2.7.1.4,+ monoidal-containers ==0.6.8.0,+ monoidal-functors ==0.2.3.0,+ monoid-extras ==0.7.0.2,+ monoid-insertleft ==0.1.0.1,+ monoid-map ==0.2.0.1,+ monoidmap ==0.0.4.4,+ monoidmap-aeson ==0.0.0.6,+ monoidmap-examples ==0.0.0.2,+ monoidmap-internal ==0.0.0.1,+ monoidmap-quickcheck ==0.0.0.4,+ monoid-subclasses ==1.2.6.1,+ monoid-transformer ==0.0.4.1,+ mono-traversable ==1.0.21.0,+ mono-traversable-instances ==0.1.1.0,+ more-containers ==0.2.2.2,+ morpheus-graphql-app ==0.28.5,+ morpheus-graphql-client ==0.28.5,+ morpheus-graphql-code-gen-utils ==0.28.5,+ morpheus-graphql-core ==0.28.5,+ morpheus-graphql-server ==0.28.5,+ morpheus-graphql-subscriptions ==0.28.5,+ moss ==0.2.0.1,+ mountpoints ==1.0.2,+ mpi-hs ==0.7.3.1,+ mpi-hs-binary ==0.1.1.0,+ mpi-hs-cereal ==0.1.0.0,+ msgpack ==1.0.1.0,+ mstate ==0.2.11,+ mt19937 ==0.1.1,+ mtl installed,+ mtl-compat ==0.2.2,+ mtl-misc-yj ==0.1.0.4,+ mtl-prelude ==2.0.3.2,+ multiarg ==0.30.0.10,+ multimap ==1.2.1,+ multipart ==0.2.1,+ MultipletCombiner ==0.0.7,+ multiset ==0.3.4.3,+ multistate ==0.8.0.4,+ murmur3 ==1.0.6,+ murmur-hash ==0.1.0.11,+ MusicBrainz ==0.4.1,+ mustache ==2.4.3.1,+ mutable-containers ==0.3.4.1,+ mwc-probability ==2.3.1,+ mwc-random ==0.15.3.0,+ mx-state-codes ==1.0.0.0,+ myers-diff ==0.3.0.2,+ mysql ==0.2.1,+ mysql-json-table ==0.1.4.1,+ mysql-simple ==0.4.9,+ n2o ==0.11.1,+ n2o-nitro ==0.11.2,+ nagios-check ==0.3.2,+ named ==0.3.0.2,+ named-text ==1.2.4.0,+ names-th ==0.3.0.1,+ nano-erl ==0.1.0.1,+ NanoID ==3.4.1.2,+ nanospec ==0.2.2,+ nats ==1.1.2,+ natural-arithmetic ==0.2.4.0,+ natural-induction ==0.2.0.0,+ natural-sort ==0.1.2,+ natural-transformation ==0.4.1,+ neat-interpolation ==0.5.1.4,+ nerd-font-icons ==0.1.0.1,+ netcode-io ==0.0.3,+ netlib-carray ==0.1,+ netlib-comfort-array ==0.0.0.2,+ netlib-ffi ==0.1.2,+ netpbm ==1.0.4,+ netrc ==0.2.0.2,+ nettle ==0.3.1.1,+ netwire ==5.0.3,+ netwire-input ==0.0.7,+ netwire-input-glfw ==0.0.12,+ network ==3.2.8.0,+ network-bsd ==2.8.1.0,+ network-byte-order ==0.1.8,+ network-conduit-tls ==1.4.0.1,+ network-control ==0.1.7,+ network-house ==0.1.0.3,+ network-info ==0.2.1,+ network-ip ==0.3.0.3,+ network-messagepack-rpc ==0.1.2.0,+ network-multicast ==0.3.2,+ network-run ==0.4.4,+ network-simple ==0.4.5,+ network-simple-tls ==0.4.2,+ network-transport ==0.5.9,+ network-transport-inmemory ==0.5.42,+ network-transport-tcp ==0.8.6,+ network-transport-tests ==0.3.4,+ network-uri ==2.6.4.2,+ network-uri-template ==0.1.2.0,+ network-wait ==0.2.0.0,+ newtype ==0.2.2.1,+ newtype-generics ==0.6.3,+ nfc ==0.1.1,+ nicify-lib ==1.0.1,+ NineP ==0.0.2.1,+ nix-narinfo ==0.1.1.3,+ nix-paths ==1.0.1,+ NoHoed ==0.1.1,+ nonce ==1.0.7,+ nondeterminism ==1.5,+ non-empty ==0.3.6.1,+ nonempty-containers ==0.3.5.0,+ non-empty-sequence ==0.2.0.4,+ non-empty-text ==0.2.1,+ nonempty-vector ==0.2.4,+ nonempty-zipper ==1.0.1.1,+ non-negative ==0.1.2.1,+ no-recursion ==0.1.2.3,+ normaldistribution ==1.1.0.3,+ nothunks ==0.3.2,+ no-value ==1.0.0.0,+ nowdoc ==0.1.1.0,+ nsis ==0.3.4,+ n-tuple ==0.0.3,+ numbers ==3000.2.0.2,+ numeric-extras ==0.1,+ numeric-limits ==0.1.0.0,+ numeric-prelude ==0.4.4,+ numeric-quest ==0.2.1,+ numhask ==0.13.3.0,+ numhask-space ==0.13.3.0,+ NumInstances ==1.4,+ numtype-dk ==0.5.0.3,+ nvim-hs ==2.3.2.6,+ nvim-hs-contrib ==2.0.0.2,+ nvim-hs-ghcid ==2.0.1.0,+ ObjectName ==1.1.0.2,+ oblivious-transfer ==0.1.0,+ o-clock ==1.4.0.1,+ odbc ==0.3.0,+ ods2csv ==0.1.0.2,+ oeis ==0.3.10.2,+ oeis2 ==1.0.9,+ ofx ==0.4.4.0,+ ogma-cli ==1.7.0,+ ogma-core ==1.7.0,+ ogma-extra ==1.7.0,+ ogma-language-c ==1.7.0,+ ogma-language-copilot ==1.7.0,+ ogma-language-csv ==1.7.0,+ ogma-language-jsonspec ==1.7.0,+ ogma-language-lustre ==1.7.0,+ ogma-language-smv ==1.7.0,+ ogma-language-xlsx ==1.7.0,+ ogma-language-xmlspec ==1.7.0,+ ogma-spec ==1.7.0,+ old-locale ==1.0.0.7,+ old-time ==1.1.1.0,+ ollama-haskell ==0.2.1.0,+ om-doh ==0.1.0.6,+ om-elm ==2.0.1.2,+ om-fail ==0.1.0.7,+ om-fork ==0.7.1.13,+ om-http ==0.5.0.1,+ om-logging ==1.1.0.12,+ om-show ==0.1.2.13,+ om-time ==0.3.1.3,+ once ==0.4,+ one-liner ==2.1.1,+ one-liner-instances ==0.1.3.0,+ OneTuple ==0.4.3,+ Only ==0.1,+ oo-prototypes ==0.1.0.0,+ oops ==0.2.0.1,+ opaleye ==0.10.8.0,+ OpenAL ==1.7.0.5,+ openapi3 ==3.2.4,+ open-browser ==0.4.0.0,+ openexr-write ==0.1.0.2,+ OpenGL ==3.0.3.0,+ OpenGLRaw ==3.3.4.1,+ openpgp-asciiarmor ==0.1.2,+ opensource ==0.1.1.0,+ openssl-streams ==1.2.3.0,+ opentelemetry ==0.8.0,+ opentelemetry-extra ==0.8.0,+ opentelemetry-lightstep ==0.8.0,+ opentelemetry-wai ==0.8.0,+ open-witness ==0.7,+ operational ==0.2.4.2,+ opml-conduit ==0.9.0.0,+ opt-env-conf ==0.9.0.0,+ optics ==0.4.2.1,+ optics-core ==0.4.2,+ optics-extra ==0.4.2.1,+ optics-operators ==0.1.0.1,+ optics-th ==0.4.1,+ optics-vl ==0.2.1,+ optima ==0.4.0.7,+ optional-args ==1.0.2,+ options ==1.2.1.2,+ optparse-applicative ==0.18.1.0,+ optparse-enum ==1.0.0.0,+ optparse-generic ==1.5.3,+ optparse-simple ==0.1.1.4,+ optparse-text ==0.1.1.0,+ OrderedBits ==0.0.2.0,+ ordered-containers ==0.2.4,+ os-string installed,+ overhang ==1.0.0,+ packcheck ==0.7.1,+ pager ==0.1.1.0,+ pagination ==0.2.2,+ pagure ==0.2.1,+ pagure-cli ==0.2.3,+ palette ==0.3.0.4,+ pandoc ==3.7.0.2,+ pandoc-cli ==3.7.0.2,+ pandoc-lua-engine ==0.4.3,+ pandoc-lua-marshal ==0.3.2.1,+ pandoc-plot ==1.9.2,+ pandoc-server ==0.1.0.11,+ pandoc-throw ==0.1.0.0,+ pandoc-types ==1.23.1.2,+ pango ==0.13.12.0,+ panic ==0.4.0.1,+ pantry ==0.10.1,+ parallel ==3.2.2.0,+ parallel-io ==0.3.5,+ parameterized ==0.5.0.0,+ parameterized-utils ==2.1.11.0,+ paramtree ==0.1.2,+ park-bench ==0.1.1.0,+ parseargs ==0.2.0.9,+ parsec installed,+ parsec-class ==1.0.1.0,+ parsec-numbers ==0.1.0,+ parsec-numeric ==0.1.0.0,+ ParsecTools ==0.0.2.0,+ parser-combinators ==1.3.1,+ parser-combinators-tests ==1.3.1,+ parser-regex ==0.3.0.0,+ parsers ==0.12.12,+ partial-handler ==1.0.3,+ partial-isomorphisms ==0.2.4.0,+ partialord ==0.1.1,+ password ==3.1.0.2,+ password-instances ==3.0.0.0,+ password-types ==1.0.1.0,+ patch ==0.0.8.4,+ path ==0.9.6,+ path-binary-instance ==0.1.0.1,+ path-dhall-instance ==0.2.1.0,+ path-extensions ==0.1.1.0,+ path-extra ==0.3.1,+ path-io ==1.8.2,+ path-like ==0.2.0.2,+ path-pieces ==0.2.1,+ pathtype ==0.8.1.4,+ path-utils ==0.1.1.0,+ pathwalk ==0.3.1.2,+ patience ==0.3,+ patrol ==1.1.0.0,+ pava ==0.1.1.4,+ pcg-random ==0.1.4.0,+ pcre2 ==2.2.3,+ pcre-heavy ==1.0.0.4,+ pcre-light ==0.4.1.3,+ pcre-utils ==0.1.9,+ pdc ==0.1.1,+ pdf-toolbox-content ==0.1.2,+ pdf-toolbox-core ==0.1.3,+ pdf-toolbox-document ==0.1.4,+ peano ==0.1.1.0,+ pedersen-commitment ==0.2.0,+ pem ==0.2.4,+ percent-format ==0.0.4,+ perf ==0.14.0.3,+ perfect-hash-generator ==1.0.0,+ persistable-record ==0.6.0.6,+ persistable-types-HDBC-pg ==0.0.3.5,+ persistent ==2.17.1.0,+ persistent-discover ==0.1.0.7,+ persistent-documentation ==0.1.0.6,+ persistent-lens ==1.0.0,+ persistent-mongoDB ==2.13.1.0,+ persistent-mtl ==0.5.2,+ persistent-mysql ==2.13.1.5,+ persistent-pagination ==0.1.1.2,+ persistent-postgresql ==2.13.7.0,+ persistent-qq ==2.12.0.7,+ persistent-redis ==2.13.0.2,+ persistent-sqlite ==2.13.3.1,+ persistent-template ==2.12.0.0,+ persistent-test ==2.13.2.1,+ persistent-typed-db ==0.1.0.7,+ pg-harness-client ==0.6.0,+ pg-transact ==0.3.2.0,+ phantom-state ==0.2.1.5,+ pid1 ==0.1.3.1,+ pinch ==0.5.2.0,+ pinecone ==1.0.0,+ pipes ==4.3.16,+ pipes-aeson ==0.4.2,+ pipes-attoparsec ==0.6.0,+ pipes-binary ==0.4.4,+ pipes-bytestring ==2.1.7,+ pipes-concurrency ==2.0.14,+ pipes-csv ==1.4.3,+ pipes-extras ==1.0.15,+ pipes-fastx ==0.3.0.0,+ pipes-fluid ==0.6.0.1,+ pipes-group ==1.0.12,+ pipes-http ==1.0.6,+ pipes-mongodb ==0.1.0.0,+ pipes-ordered-zip ==1.2.1,+ pipes-parse ==3.0.9,+ pipes-random ==1.0.0.5,+ pipes-safe ==2.3.5,+ pipes-wai ==3.2.0,+ pipes-zlib ==0.4.4.2,+ pkgtreediff ==0.6.0,+ place-cursor-at ==1.0.1,+ placeholders ==0.1,+ plaid ==0.1.0.4,+ plot ==0.2.3.12,+ plotlyhs ==0.2.3,+ Plural ==0.0.2,+ pointed ==5.0.5,+ pointedlist ==0.6.1,+ pointless-fun ==1.1.0.13,+ poll ==0.0.0.2,+ poly ==0.5.1.0,+ poly-arity ==0.1.0,+ polynomials-bernstein ==1.1.2,+ polyparse ==1.13.1,+ polysemy ==1.9.2.0,+ polysemy-fs ==0.1.0.0,+ polysemy-plugin ==0.4.5.3,+ polysemy-webserver ==0.2.1.2,+ pontarius-xmpp ==0.5.7.2,+ pontarius-xmpp-extras ==0.1.0.12,+ pooled-io ==0.0.2.5,+ portable-lines ==0.1,+ port-utils ==0.2.1.0,+ posix-paths ==0.3.0.1,+ posix-pty ==0.2.2,+ possibly ==1.0.0.0,+ postgres-options ==0.2.2.0,+ postgresql-binary ==0.14.2,+ postgresql-libpq ==0.11.0.0,+ postgresql-libpq-configure ==0.11,+ postgresql-libpq-notify ==0.2.0.0,+ postgresql-migration ==0.2.1.8,+ postgresql-schema ==0.1.14,+ postgresql-simple ==0.7.0.1,+ postgresql-syntax ==0.4.5.0,+ postgresql-typed ==0.6.2.5,+ post-mess-age ==0.2.1.0,+ pptable ==0.3.0.0,+ pqueue ==1.5.0.0,+ prairie ==0.1.2.0,+ pred-set ==0.0.1,+ prefix-units ==0.3.0.1,+ prelude-compat ==0.0.0.2,+ prelude-safeenum ==0.1.1.8,+ pretty installed,+ prettychart ==0.3.0.3,+ pretty-class ==1.0.1.1,+ prettyclass ==1.0.0.0,+ pretty-hex ==1.1,+ prettyprinter ==1.7.2,+ prettyprinter-ansi-terminal ==1.1.4,+ prettyprinter-combinators ==0.1.4,+ prettyprinter-compat-annotated-wl-pprint ==1.1.1,+ prettyprinter-compat-ansi-wl-pprint ==1.0.2,+ prettyprinter-compat-wl-pprint ==1.0.2,+ prettyprinter-interp ==0.2.0.0,+ pretty-relative-time ==0.3.0.0,+ pretty-show ==1.10,+ pretty-simple ==4.1.4.0,+ pretty-sop ==0.2.0.3,+ pretty-terminal ==0.1.0.0,+ primecount ==0.1.0.2,+ primes ==0.2.1.0,+ primitive ==0.9.1.0,+ primitive-addr ==0.1.0.3,+ primitive-extras ==0.10.2.2,+ primitive-offset ==0.2.0.1,+ primitive-serial ==0.1,+ primitive-unaligned ==0.1.1.2,+ primitive-unlifted ==2.2.0.0,+ prim-uniq ==0.2,+ print-console-colors ==0.1.0.0,+ probability ==0.2.9.1,+ probability-polynomial ==1.0.1.0,+ process installed,+ process-extras ==0.7.4,+ product-isomorphic ==0.0.3.4,+ product-profunctors ==0.11.1.1,+ profunctors ==5.6.3,+ projectroot ==0.2.0.1,+ project-template ==0.2.1.0,+ prometheus ==2.3.1,+ prometheus-client ==1.1.1,+ prometheus-metrics-ghc ==1.0.1.2,+ promises ==0.3,+ prompt-hs ==1.0.3.1,+ prospect ==0.1.0.0,+ protobuf ==0.2.1.3,+ protobuf-simple ==0.1.1.1,+ protocol-radius ==0.0.1.2,+ protocol-radius-test ==0.1.0.1,+ proto-lens ==0.7.1.7,+ proto-lens-optparse ==0.1.1.14,+ proto-lens-protobuf-types ==0.7.2.3,+ proto-lens-protoc ==0.9.0.1,+ proto-lens-runtime ==0.7.0.8,+ proto-lens-setup ==0.4.0.10,+ protolude ==0.3.5,+ proxied ==0.3.2,+ pseudo-boolean ==0.1.12.0,+ psql-helpers ==0.1.0.0,+ PSQueue ==1.2.2,+ psqueues ==0.2.8.3,+ pthread ==0.2.1,+ ptr ==0.16.8.7,+ ptr-poker ==0.1.3,+ pulse-simple ==0.1.14,+ pureMD5 ==2.1.4,+ puresat ==0.1.0.1,+ purescript-bridge ==0.15.0.0,+ pusher-http-haskell ==2.1.0.21,+ pvar ==1.0.0.0,+ pwstore-fast ==2.4.4,+ PyF ==0.11.5.0,+ qchas ==1.1.0.1,+ quaalude ==0.0.0.1,+ quadratic-irrational ==0.1.2,+ quantizer ==0.4.0.0,+ QuasiText ==0.1.2.6,+ queues ==1.0.0,+ queue-sheet ==0.8.0.1,+ quickbench ==1.0.1,+ QuickCheck ==2.15.0.1,+ quickcheck-arbitrary-adt ==0.3.1.0,+ quickcheck-assertions ==0.3.0,+ quickcheck-classes ==0.6.5.0,+ quickcheck-classes-base ==0.6.2.0,+ quickcheck-dynamic ==4.0.1,+ quickcheck-groups ==0.0.1.5,+ quickcheck-higherorder ==0.1.0.1,+ quickcheck-instances ==0.3.33,+ quickcheck-io ==0.2.0,+ quickcheck-monoid-subclasses ==0.3.0.6,+ quickcheck-quid ==0.0.1.8,+ quickcheck-simple ==0.1.1.1,+ quickcheck-special ==0.1.0.6,+ quickcheck-state-machine ==0.10.4,+ quickcheck-text ==0.1.2.1,+ quickcheck-transformer ==0.3.1.3,+ quickcheck-unicode ==1.0.1.0,+ quicklz ==1.5.0.11,+ quiet ==0.2,+ quote-quot ==0.2.1.0,+ radius ==0.7.1.0,+ radix-tree ==1.1.0.0,+ rainbow ==0.34.2.2,+ rainbox ==0.26.0.0,+ ral ==0.2.2,+ rampart ==2.0.0.13,+ ramus ==0.1.2,+ rando ==0.0.0.4,+ random ==1.2.1.3,+ random-bytestring ==0.1.4,+ random-fu ==0.3.0.1,+ random-shuffle ==0.0.4,+ random-tree ==0.6.0.5,+ range ==0.3.2.2,+ ranged-list ==0.1.2.3,+ Ranged-sets ==0.5.0,+ ranges ==0.2.4,+ range-set-list ==0.1.4.1,+ rank1dynamic ==0.4.3,+ rank2classes ==1.5.5.1,+ Rasterific ==0.7.5.4,+ rasterific-svg ==0.3.3.2,+ ratel ==2.0.0.19,+ rate-limit ==1.4.3,+ ratel-wai ==2.0.0.12,+ ratio-int ==0.1.2,+ rattle ==0.2,+ rattletrap ==14.1.4,+ rawfilepath ==1.1.1,+ rawstring-qm ==0.2.3.1,+ raw-strings-qq ==1.1,+ rcu ==0.2.7,+ rdf ==0.1.0.8,+ rdtsc ==1.3.0.1,+ re2 ==0.3,+ reactive-balsa ==0.4.0.1,+ reactive-banana ==1.3.2.0,+ reactive-banana-bunch ==1.0.0.1,+ reactive-jack ==0.4.1.2,+ reactive-midyim ==0.4.1.3,+ readable ==0.3.1,+ read-editor ==0.1.0.2,+ read-env-var ==1.0.0.0,+ real-dice ==0.1.0.5,+ rebase ==1.21.2,+ rec-def ==0.2.2,+ record-hasfield ==1.0.1,+ recover-rtti ==0.5.3,+ recursion-schemes ==5.2.3,+ recv ==0.1.1,+ redact ==0.6.0.0,+ reddit-scrape ==0.0.1,+ redis-glob ==0.1.0.11,+ redis-resp ==1.0.0,+ reducers ==3.12.5,+ refact ==0.3.0.2,+ ref-fd ==0.5.0.1,+ refined ==0.8.2,+ refined-containers ==0.1.2.0,+ reflection ==2.1.9,+ reflex ==0.9.4.1,+ reflex-dom-core ==0.8.1.4,+ reflex-fsnotify ==0.3.0.2,+ reflex-gadt-api ==0.2.2.3,+ reflex-vty ==1.0.0.1,+ RefSerialize ==0.4.0,+ ref-tf ==0.5.0.1,+ regex ==1.1.0.2,+ regex-applicative ==0.3.4,+ regex-base ==0.94.0.3,+ regex-compat ==0.95.2.2,+ regex-pcre ==0.95.0.1,+ regex-pcre-builtin ==0.95.2.3.8.44,+ regex-posix ==0.96.0.2,+ regex-posix-clib ==2.7,+ regex-tdfa ==1.3.2.5,+ regex-with-pcre ==1.1.0.2,+ registry ==0.6.3.3,+ registry-aeson ==0.3.1.2,+ reinterpret-cast ==0.1.0,+ relapse ==1.0.0.1,+ relational-query ==0.12.3.1,+ relational-query-HDBC ==0.7.2.1,+ relational-record ==0.2.2.0,+ relational-schemas ==0.1.8.1,+ reliable-io ==0.0.2,+ relude ==1.2.2.2,+ renderable ==0.2.0.1,+ reorder-expression ==0.1.0.3,+ repa ==3.4.2.0,+ repa-algorithms ==3.4.2.0,+ repa-io ==3.4.2.0,+ replace-attoparsec ==1.5.0.0,+ replace-megaparsec ==1.5.0.1,+ repline ==0.4.3.0,+ req ==3.13.4,+ req-conduit ==1.0.2,+ rerebase ==1.21.2,+ rerefined ==0.8.0,+ reroute ==0.7.0.0,+ resolv ==0.2.0.3,+ resource-pool ==0.4.0.0,+ resourcet ==1.3.0,+ rest-rewrite ==0.4.5,+ result ==0.2.6.0,+ retry ==0.9.3.1,+ rev-scientific ==0.2.1.0,+ rev-state ==0.2.0.1,+ rex ==0.6.2,+ rfc1751 ==0.1.4,+ rfc5051 ==0.2,+ rg ==1.4.0.0,+ rhbzquery ==0.4.5,+ rhine ==1.5,+ rhine-gloss ==1.5,+ rhine-terminal ==1.5,+ rhythmic-sequences ==0.8.0.0,+ riak-protobuf ==0.25.0.0,+ richenv ==0.1.0.4,+ rio ==0.1.25.0,+ rio-orphans ==0.1.2.0,+ rio-prettyprint ==0.1.9.0,+ rng-utils ==0.3.1,+ roc-id ==0.2.0.6,+ rocksdb-haskell ==1.0.1,+ rocksdb-haskell-jprupp ==2.1.7,+ rocksdb-query ==0.4.3,+ roles ==0.2.1.0,+ rollbar ==1.1.3,+ rope-utf16-splay ==0.4.0.0,+ rosezipper ==0.2,+ rot13 ==0.2.0.1,+ RoundingFiasco ==0.1.0.0,+ row-types ==1.0.1.2,+ rpmbuild-order ==0.4.13,+ rpm-nvr ==0.1.2,+ rp-tree ==0.7.1,+ rrb-vector ==0.2.2.1,+ RSA ==2.4.1,+ rss ==3000.2.0.8,+ runmemo ==1.0.0.1,+ run-st ==0.1.3.3,+ rvar ==0.3.0.2,+ rzk ==0.7.7,+ s3-signer ==0.5.0.0,+ safe ==0.3.21,+ safe-coloured-text ==0.3.0.2,+ safe-coloured-text-gen ==0.0.0.3,+ safe-coloured-text-layout ==0.2.0.1,+ safe-coloured-text-layout-gen ==0.0.0.2,+ safe-coloured-text-terminfo ==0.3.0.0,+ safecopy ==0.10.4.3,+ safe-decimal ==0.2.1.0,+ safe-exceptions ==0.1.7.4,+ safe-foldable ==0.1.0.0,+ safe-gen ==1.0.1,+ safeio ==0.0.6.0,+ safe-json ==1.2.1.2,+ safe-money ==0.9.1,+ SafeSemaphore ==0.10.1,+ saltine ==0.2.2.0,+ salve ==2.0.0.10,+ sample-frame ==0.0.4,+ sample-frame-np ==0.0.5,+ sampling ==0.3.5,+ samsort ==0.1.0.0,+ sandi ==0.5,+ sandwich ==0.3.0.5,+ sandwich-contexts ==0.3.0.3,+ sandwich-hedgehog ==0.1.3.1,+ sandwich-quickcheck ==0.2.0.0,+ sandwich-slack ==0.1.2.0,+ sandwich-webdriver ==0.3.0.1,+ saturn ==1.0.0.9,+ say ==0.1.0.1,+ sayable ==1.2.7.0,+ sbp ==6.2.2,+ sbv ==11.7,+ scale ==1.1.0.0,+ scalpel ==0.6.2.2,+ scalpel-core ==0.6.2.2,+ scanf ==0.1.0.0,+ scanner ==0.3.1,+ s-cargot ==0.1.6.0,+ scheduler ==2.0.1.0,+ SciBaseTypes ==0.1.1.0,+ scientific ==0.3.8.1,+ scientist ==0.0.0.0,+ scotty ==0.22,+ scrypt ==0.5.0,+ sdl2 ==2.5.6.0,+ sdl2-gfx ==0.3.0.0,+ sdl2-image ==2.1.0.0,+ sdl2-mixer ==1.2.0.0,+ sdl2-ttf ==2.1.3,+ search-algorithms ==0.3.4,+ secp256k1-haskell ==1.4.6,+ securemem ==0.1.10,+ sel ==0.1.0.0,+ selections ==0.3.0.0,+ selective ==0.7.0.1,+ select-rpms ==0.3.1,+ semaphore-compat installed,+ semialign ==1.3.1.1,+ semigroupoids ==6.0.2,+ semigroups ==0.20.1,+ semirings ==0.7,+ semiring-simple ==1.0.0.1,+ semver ==0.4.0.1,+ sendfile ==0.7.11.6,+ sendgrid-v3 ==1.0.0.1,+ seqalign ==0.2.0.4,+ seqid ==0.6.3,+ seqid-streams ==0.7.2,+ sequence-formats ==1.11.0.2,+ sequenceTools ==1.6.0.0,+ serialise ==0.2.6.1,+ servant ==0.20.3.0,+ servant-auth ==0.4.9.2,+ servant-auth-client ==0.4.9.2,+ servant-auth-docs ==0.2.11.0,+ servant-auth-server ==0.4.9.2,+ servant-auth-swagger ==0.2.11.0,+ servant-blaze ==0.9.1,+ servant-checked-exceptions ==2.2.0.1,+ servant-checked-exceptions-core ==2.2.0.1,+ servant-cli ==0.1.1.0,+ servant-client ==0.20.3.0,+ servant-client-core ==0.20.3.0,+ servant-conduit ==0.16.1,+ servant-docs ==0.13.1,+ servant-elm ==0.7.3,+ servant-exceptions ==0.2.1,+ servant-exceptions-server ==0.2.1,+ servant-foreign ==0.16.1,+ servant-http-streams ==0.20.2,+ servant-JuicyPixels ==0.3.1.1,+ servant-lucid ==0.9.0.6,+ servant-machines ==0.16.1,+ servant-multipart ==0.12.1,+ servant-multipart-api ==0.12.1,+ servant-multipart-client ==0.12.2,+ servant-openapi3 ==2.0.2.0,+ servant-pipes ==0.16.1,+ servant-rate-limit ==0.2.0.0,+ servant-rawm ==1.0.0.0,+ servant-server ==0.20.3.0,+ servant-static-th ==1.0.0.1,+ servant-swagger ==1.2.1,+ servant-swagger-ui ==0.3.5.5.0.1,+ servant-swagger-ui-core ==0.3.5,+ servant-swagger-ui-redoc ==0.3.5,+ servant-websockets ==2.0.0,+ servant-xml ==1.0.3,+ serversession ==1.0.3,+ serversession-backend-acid-state ==1.0.5,+ serversession-backend-redis ==1.0.5,+ serversession-frontend-wai ==1.0.1,+ serversession-frontend-yesod ==1.0.1,+ servius ==1.2.3.0,+ ses-html ==0.4.0.0,+ set-cover ==0.1.2.1,+ setenv ==0.1.1.3,+ setlocale ==1.0.0.10,+ sexp-grammar ==2.3.4.2,+ SHA ==1.6.4.4,+ shake ==0.19.9,+ shake-plus ==0.3.4.0,+ shakespeare ==2.1.7.1,+ shakespeare-text ==1.1.0,+ shared-memory ==0.2.0.1,+ ShellCheck ==0.10.0,+ shell-conduit ==5.0.0,+ shell-escape ==0.2.0,+ shellify ==0.14.0.2,+ shellmet ==0.0.6.0,+ shell-monad ==0.6.10,+ shelltestrunner ==1.10,+ shell-utility ==0.1,+ shellwords ==0.1.4.6,+ shelly ==1.12.1.1,+ should-not-typecheck ==2.1.0,+ show-combinators ==0.2.0.0,+ shower ==0.2.0.5,+ siggy-chardust ==1.0.0,+ signal ==0.1.0.4,+ silently ==1.2.5.4,+ simple ==2.0.0,+ simple-affine-space ==0.2.1,+ simple-cabal ==0.1.3.1,+ simple-cairo ==0.1.0.6,+ simple-cmd ==0.2.8,+ simple-cmd-args ==0.1.8,+ simple-expr ==0.1.1.0,+ simple-media-timestamp ==0.2.1.0,+ simple-media-timestamp-attoparsec ==0.1.0.0,+ simple-pango ==0.1.0.2,+ simple-prompt ==0.2.4,+ simple-reflect ==0.3.3,+ simple-sendfile ==0.2.32,+ simple-session ==2.0.0,+ simple-templates ==2.0.0,+ simple-vec3 ==0.6.0.1,+ since ==0.0.0,+ singleraeh ==0.4.0,+ singleton-bool ==0.1.8,+ singleton-nats ==0.4.7,+ singletons ==3.0.4,+ singletons-base ==3.4,+ singletons-presburger ==0.7.4.1,+ singletons-th ==3.4,+ Sit ==0.2023.8.3,+ sitemap-gen ==0.1.0.0,+ size-based ==0.1.3.3,+ sized ==1.1.0.2,+ skein ==1.0.9.4,+ skeletest ==0.2.1,+ skews ==0.1.0.3,+ skip-var ==0.1.1.0,+ skylighting ==0.14.7,+ skylighting-core ==0.14.7,+ skylighting-format-ansi ==0.1,+ skylighting-format-blaze-html ==0.1.2.1,+ skylighting-format-context ==0.1.0.2,+ skylighting-format-latex ==0.1,+ skylighting-format-typst ==0.1,+ slack-web ==2.2.0.0,+ slave-thread ==1.1.0.3,+ slick ==1.3.1.0,+ slist ==0.2.1.0,+ slynx ==0.8.0.0,+ smallcheck ==1.2.1.1,+ smith ==0.2.0.0,+ smtlib-backends ==0.4,+ smtlib-backends-process ==0.3,+ smtlib-backends-tests ==0.3,+ smtp-mail ==0.5.0.0,+ snap ==1.1.3.3,+ snap-blaze ==0.2.1.5,+ snap-core ==1.0.5.1,+ snappy ==0.2.0.4,+ snap-server ==1.1.2.1,+ snowflake ==0.1.1.1,+ socket ==0.8.3.0,+ socks ==0.6.1,+ solana-staking-csvs ==0.1.3.0,+ some ==1.0.6,+ some-dict-of ==0.1.0.2,+ sop-core ==0.5.0.2,+ sort ==1.0.0.0,+ sorted-list ==0.2.3.1,+ sound-collage ==0.2.1.1,+ sourcemap ==0.1.7,+ sox ==0.2.3.2,+ soxlib ==0.0.3.2,+ spacecookie ==1.0.0.3,+ spdx ==1.1.0.1,+ special-values ==0.1.0.0,+ speculate ==0.4.20,+ specup ==0.2.0.6,+ speedy-slice ==0.3.2,+ sphinx ==0.6.1,+ Spintax ==0.3.7.0,+ splice ==0.6.1.1,+ split ==0.2.5,+ splitmix ==0.1.3.2,+ splitmix-distributions ==1.1.0,+ split-record ==0.1.1.5,+ Spock-api ==0.14.0.0,+ spoon ==0.3.1,+ spreadsheet ==0.1.3.10,+ sqids ==0.2.2.0,+ sqlite-simple ==0.4.19.0,+ sql-words ==0.1.6.5,+ squeather ==0.8.0.0,+ srcloc ==0.6.0.1,+ srtree ==2.0.1.8,+ stache ==2.3.4,+ stack-all ==0.7.1,+ stack-clean-old ==0.5.2,+ stack-templatizer ==0.1.1.0,+ stamina ==0.1.0.3,+ state-codes ==0.1.3,+ stateref ==0.3,+ statestack ==0.3.1.1,+ StateVar ==1.2.2,+ stateWriter ==0.4.0,+ static-bytes ==0.1.1,+ static-text ==0.2.0.7,+ statistics ==0.16.5.0,+ statistics-linreg ==0.3,+ statsd-rupp ==0.5.0.1,+ status-notifier-item ==0.3.2.16,+ step-function ==0.2.1,+ stitch ==0.6.0.0,+ stm installed,+ stm-chans ==3.0.0.11,+ stm-conduit ==4.0.1,+ stm-containers ==1.2.2,+ stm-delay ==0.1.1.2,+ stm-extras ==0.1.0.3,+ stm-hamt ==1.2.2.1,+ STMonadTrans ==0.4.8.1,+ stm-split ==0.0.2.1,+ stm-supply ==0.2.0.0,+ storable-complex ==0.2.3.0,+ storable-endian ==0.2.6.1,+ storable-generic ==0.1.0.5,+ storable-hetero-list ==0.1.0.4,+ storable-peek-poke ==0.1.0.2,+ storable-record ==0.0.7,+ storable-tuple ==0.1,+ storablevector ==0.2.13.4,+ store ==0.7.22,+ store-core ==0.4.4.7,+ store-streaming ==0.2.0.5,+ stratosphere ==0.60.0,+ Stream ==0.4.7.2,+ streaming ==0.2.4.0,+ streaming-attoparsec ==1.0.0.1,+ streaming-binary ==0.3.0.1,+ streaming-bytestring ==0.3.4,+ streaming-commons ==0.2.3.1,+ streaming-wai ==0.1.1,+ streamly ==0.10.1,+ streamly-bytestring ==0.2.3,+ streamly-core ==0.2.3,+ streamly-process ==0.3.1,+ streams ==3.3.3,+ strict ==0.5.1,+ strict-base-types ==0.8.1,+ strict-concurrency ==0.2.4.3,+ strict-lens ==0.4.1,+ strict-list ==0.1.7.6,+ strict-mutable-base ==1.1.0.0,+ strict-tuple ==0.1.5.4,+ strict-wrapper ==0.0.2.0,+ stringable ==0.1.3,+ stringbuilder ==0.5.1,+ string-class ==0.1.7.2,+ string-combinators ==0.6.0.5,+ string-conv ==0.2.0,+ string-conversions ==0.4.0.1,+ string-interpolate ==0.3.4.0,+ stringprep ==1.0.0,+ string-qq ==0.0.6,+ string-random ==0.1.4.5,+ stringsearch ==0.3.6.6,+ string-transform ==1.1.1,+ string-variants ==0.3.1.3,+ strive ==6.0.0.17,+ strongweak ==0.12.0,+ structs ==0.1.10,+ stylish-haskell ==0.15.1.0,+ subcategories ==0.2.1.2,+ sundown ==0.6,+ svg-builder ==0.1.1,+ SVGFonts ==1.8.1,+ svg-tree ==0.6.2.4,+ swagger2 ==2.8.10,+ swish ==0.10.11.0,+ swizzle ==0.1.0.4,+ swizzle-lens ==0.1.0.0,+ swizzle-modify ==0.1.0.0,+ swizzle-set ==0.2.0.0,+ syb ==0.7.2.4,+ sydtest ==0.20.0.1,+ sydtest-aeson ==0.2.0.1,+ sydtest-amqp ==0.1.0.0,+ sydtest-autodocodec ==0.0.0.0,+ sydtest-discover ==0.0.0.4,+ sydtest-hedgehog ==0.4.0.0,+ sydtest-hedis ==0.0.0.0,+ sydtest-hspec ==0.4.0.4,+ sydtest-mongo ==0.2.0.0,+ sydtest-persistent ==0.1.0.0,+ sydtest-persistent-sqlite ==0.2.0.3,+ sydtest-process ==0.0.0.0,+ sydtest-rabbitmq ==0.1.0.0,+ sydtest-servant ==0.2.0.2,+ sydtest-typed-process ==0.0.0.0,+ sydtest-wai ==0.2.0.2,+ sydtest-webdriver ==0.0.0.1,+ sydtest-webdriver-screenshot ==0.1.0.0,+ sydtest-webdriver-yesod ==0.0.1.0,+ sydtest-yesod ==0.3.1.0,+ symbol ==0.2.4.1,+ symbolize ==1.0.3.1,+ symengine ==0.1.2.0,+ symmetry-operations-symbols ==0.0.2.1,+ symparsec ==1.1.1,+ synthesizer-alsa ==0.5.0.6,+ synthesizer-core ==0.8.4,+ synthesizer-dimensional ==0.8.1.1,+ synthesizer-midi ==0.6.1.2,+ sysinfo ==0.1.1,+ system-argv0 ==0.1.1,+ systemd ==2.4.0,+ system-fileio ==0.3.16.7,+ system-filepath ==0.4.14.1,+ system-info ==0.5.2,+ system-linux-proc ==0.1.1.1,+ table-layout ==1.0.0.2,+ tabular ==0.2.2.8,+ tagchup ==0.4.1.2,+ tagged ==0.8.9,+ tagged-binary ==0.2.0.1,+ tagged-identity ==0.1.5,+ tagged-transformer ==0.8.3,+ tagsoup ==0.14.8,+ tagstream-conduit ==0.5.6,+ tao ==1.0.0,+ tao-example ==1.0.0,+ tar ==0.6.4.0,+ tar-conduit ==0.4.1,+ tardis ==0.5.0.1,+ tasty ==1.5.4,+ tasty-ant-xml ==1.1.9,+ tasty-autocollect ==0.4.4,+ tasty-bench ==0.4.1,+ tasty-checklist ==1.0.10.0,+ tasty-dejafu ==2.1.0.2,+ tasty-discover ==5.0.2,+ tasty-expected-failure ==0.12.3,+ tasty-fail-fast ==0.0.3,+ tasty-focus ==1.0.1,+ tasty-golden ==2.3.6,+ tasty-hedgehog ==1.4.0.2,+ tasty-hslua ==1.1.1.1,+ tasty-hspec ==1.2.0.4,+ tasty-html ==0.4.2.2,+ tasty-hunit ==0.10.2,+ tasty-inspection-testing ==0.2.1,+ tasty-kat ==0.0.3,+ tasty-leancheck ==0.0.2,+ tasty-lua ==1.1.2,+ tasty-papi ==0.1.2.0,+ tasty-program ==1.1.0,+ tasty-quickcheck ==0.11.1,+ tasty-rerun ==1.1.20,+ tasty-silver ==3.3.2.1,+ tasty-smallcheck ==0.8.2,+ tasty-sugar ==2.2.3.3,+ tasty-tap ==0.1.0,+ tasty-th ==0.1.7,+ tasty-wai ==0.1.2.0,+ TCache ==0.13.3,+ tce-conf ==1.3,+ tdigest ==0.3.1,+ teardown ==0.5.0.1,+ telegram-bot-api ==7.4.5,+ telegram-bot-simple ==0.14.4,+ tempgres-client ==1.0.0,+ template ==0.2.0.10,+ template-haskell installed,+ template-haskell-compat-v0208 ==0.1.9.6,+ temporary ==1.3,+ temporary-rc ==1.2.0.3,+ temporary-resourcet ==0.1.0.1,+ tensorflow-test ==0.1.0.0,+ tensort ==1.1.0.0,+ termbox ==2.0.0.2,+ termbox-banana ==2.0.0.1,+ termbox-bindings-c ==0.1.0.3,+ termbox-bindings-hs ==1.0.0.1,+ termbox-tea ==1.0.0.1,+ terminal ==0.2.0.0,+ terminal-progress-bar ==0.4.2,+ terminal-size ==0.3.4,+ terminfo installed,+ test-certs ==0.1.1.2,+ test-framework ==0.8.2.3,+ test-framework-hunit ==0.3.0.3,+ test-framework-leancheck ==0.0.4,+ test-framework-quickcheck2 ==0.3.0.7,+ test-framework-smallcheck ==0.2,+ test-fun ==0.1.0.0,+ testing-feat ==1.1.1.1,+ testing-type-modifiers ==0.1.0.1,+ texmath ==0.12.10.3,+ text installed,+ text-ansi ==0.3.0.1,+ text-binary ==0.2.1.1,+ text-builder ==1.0.0.4,+ text-builder-core ==0.1.1.1,+ text-builder-dev ==0.4.0.1,+ text-builder-linear ==0.1.3,+ text-conversions ==0.3.1.1,+ text-convert ==0.1.0.1,+ text-display ==1.0.0.0,+ text-encode ==0.2.0.0,+ text-icu ==0.8.0.5,+ text-iso8601 ==0.1.1.1,+ text-latin1 ==0.3.1,+ text-ldap ==0.1.1.14,+ textlocal ==0.1.0.5,+ text-manipulate ==0.3.1.0,+ text-metrics ==0.3.3,+ text-misc-yj ==0.1.0.2,+ text-postgresql ==0.0.3.1,+ text-printer ==0.5.0.2,+ text-regex-replace ==0.1.1.5,+ text-rope ==0.3,+ text-short ==0.1.6.1,+ text-show ==3.11.4,+ text-show-instances ==3.9.11,+ text-zipper ==0.13,+ tfp ==1.0.2,+ tf-random ==0.5,+ th-abstraction ==0.7.2.0,+ th-bang-compat ==0.0.1.0,+ th-compat ==0.1.7,+ th-constraint-compat ==0.0.1.0,+ th-data-compat ==0.1.3.1,+ th-deepstrict ==0.1.1.0,+ th-desugar ==1.17,+ th-env ==0.1.1,+ these ==1.2.1,+ these-lens ==1.0.2,+ these-optics ==1.0.2,+ these-skinny ==0.7.6,+ th-expand-syns ==0.4.12.0,+ th-extras ==0.0.0.9,+ th-lego ==0.3.0.3,+ th-lift ==0.8.7,+ th-lift-instances ==0.1.20,+ th-nowq ==0.1.0.5,+ th-orphans ==0.13.17,+ th-printf ==0.8,+ thread-hierarchy ==0.3.0.2,+ thread-local-storage ==0.2,+ threads ==0.5.1.8,+ threads-extras ==0.1.0.3,+ thread-supervisor ==0.2.0.0,+ thread-utils-context ==0.3.0.4,+ thread-utils-finalizers ==0.1.1.0,+ threepenny-gui ==0.9.4.2,+ th-reify-compat ==0.0.1.5,+ th-reify-many ==0.1.10,+ th-strict-compat ==0.1.0.1,+ th-test-utils ==1.2.3,+ th-utilities ==0.2.5.2,+ thyme ==0.4.1,+ tidal ==1.10.3,+ tidal-core ==1.10.2,+ tidal-link ==1.2.2,+ tile ==0.3.0.0,+ time installed,+ time-compat ==1.9.9,+ time-domain ==0.1.0.5,+ timeit ==2.0,+ time-lens ==0.4.0.2,+ timelens ==0.2.0.2,+ time-locale-compat ==0.1.1.5,+ time-locale-vietnamese ==1.0.0.0,+ time-manager ==0.2.4,+ timerep ==2.1.0.0,+ timers-tick ==0.5.0.4,+ timer-wheel ==1.0.0.1,+ timespan ==0.4.0.0,+ time-units ==1.0.0,+ time-units-types ==0.2.0.1,+ timezone-olson ==0.2.1,+ timezone-olson-th ==0.1.0.11,+ timezone-series ==0.1.13,+ titlecase ==1.0.1,+ tldr ==0.9.3,+ tls ==2.1.8,+ tls-session-manager ==0.0.9,+ tlynx ==0.8.0.0,+ tmapchan ==0.0.3,+ tmapmvar ==0.0.4,+ tmp-proc ==0.7.2.7,+ tmp-proc-postgres ==0.7.2.4,+ tmp-proc-rabbitmq ==0.7.2.4,+ tmp-proc-redis ==0.7.2.5,+ token-bucket ==0.1.0.1,+ tokenize ==0.3.0.1,+ tomland ==1.3.3.3,+ toml-parser ==2.0.2.0,+ toml-reader ==0.3.0.0,+ toml-reader-parse ==0.1.1.1,+ tools-yj ==0.1.0.45,+ tophat ==1.0.8.0,+ topograph ==1.0.1,+ torrent ==10000.1.3,+ torsor ==0.1.0.1,+ tracing ==0.0.7.4,+ transaction ==0.1.1.4,+ transformers installed,+ transformers-base ==0.4.6.1,+ transformers-compat ==0.7.2,+ transformers-either ==0.1.4,+ traverse-with-class ==1.0.1.1,+ tree-diff ==0.3.4.1,+ tree-fun ==0.8.1.0,+ tree-view ==0.5.1,+ trie-simple ==0.4.4,+ trifecta ==2.1.4,+ trimdent ==0.1.0.0,+ trivial-constraint ==0.7.0.0,+ tsv2csv ==0.1.0.2,+ ttc ==1.5.0.1,+ ttrie ==0.1.2.2,+ tuple ==0.3.0.2,+ tuples ==0.1.0.0,+ tuples-homogenous-h98 ==0.1.1.0,+ tuple-sop ==0.3.1.0,+ tuple-th ==0.2.5,+ turtle ==1.6.2,+ twitter-types ==0.11.0,+ twitter-types-lens ==0.11.0,+ typecheck-plugin-nat-simple ==0.1.0.11,+ typed-process ==0.2.13.0,+ typed-uuid ==0.2.0.0,+ type-equality ==1.0.1,+ type-errors ==0.2.0.2,+ type-flip ==0.1.0.0,+ type-fun ==0.1.3,+ type-hint ==0.1,+ type-level-bytestrings ==0.2.0,+ type-level-integers ==0.0.1,+ type-level-kv-list ==2.0.2.0,+ type-level-natural-number ==2.0,+ type-level-numbers ==0.1.1.2,+ type-level-show ==0.3.0,+ typelevel-tools-yj ==0.1.0.9,+ typelits-witnesses ==0.4.1.0,+ type-map ==0.1.7.0,+ type-natural ==1.3.0.2,+ typenums ==0.1.4,+ type-of-html ==1.6.2.0,+ type-of-html-static ==0.1.0.2,+ type-rig ==0.1,+ type-set ==0.1.0.0,+ type-spec ==0.4.0.0,+ typography-geometry ==1.0.1.0,+ typst ==0.8.0.2,+ typst-symbols ==0.1.8.1,+ tz ==0.1.3.6,+ tzdata ==0.2.20260708.0,+ tztime ==0.1.1.0,+ ua-parser ==0.7.7.0,+ uglymemo ==0.1.0.1,+ ulid ==0.3.3.0,+ unagi-chan ==0.4.1.4,+ unbounded-delays ==0.1.1.1,+ unbound-generics ==0.4.5,+ unboxed-ref ==0.4.0.0,+ unboxing-vector ==0.2.0.0,+ uncaught-exception ==0.1.0,+ uncertain ==0.4.0.1,+ unconditional-jump ==1.0.0,+ unconstrained ==0.1.0.2,+ unexceptionalio ==0.5.1,+ unexceptionalio-trans ==0.5.2,+ unicode ==0.0.1.3,+ unicode-collation ==0.1.3.7,+ unicode-data ==0.6.0,+ unicode-show ==0.1.1.1,+ unicode-transforms ==0.4.0.1,+ unidecode ==0.1.0.4,+ unification-fd ==0.12.0.3,+ union ==0.1.3.2,+ union-angle ==0.1.0.1,+ union-color ==0.1.4.0,+ union-find-array ==0.1.0.5,+ unipatterns ==0.0.0.0,+ uniplate ==1.6.13,+ uniq-deep ==1.2.1,+ unique-logic ==0.4.1.1,+ unique-logic-tf ==0.5.1.3,+ uniqueness-periods-vector-stats ==0.4.0.0,+ unit-constraint ==0.0.0,+ units ==2.4.1.5,+ units-defs ==2.2.1,+ units-parser ==0.1.1.5,+ universe ==1.2.3,+ universe-base ==1.1.4,+ universe-dependent-sum ==1.3.1,+ universe-instances-extended ==1.1.4,+ universe-reverse-instances ==1.1.2,+ universe-some ==1.2.2.1,+ unix installed,+ unix-bytestring ==0.4.0.4,+ unix-compat ==0.7.4.1,+ unix-time ==0.4.17,+ unjson ==0.15.4,+ unlifted ==0.2.4.0,+ unliftio ==0.2.25.1,+ unliftio-core ==0.2.1.0,+ unliftio-path ==0.0.2.0,+ unliftio-pool ==0.4.3.1,+ unliftio-streams ==0.2.0.0,+ unlit ==0.4.0.0,+ unordered-containers ==0.2.20.1,+ unsafe ==0.0,+ uri-bytestring ==0.4.0.1,+ uri-bytestring-aeson ==0.1.0.9,+ uri-encode ==1.5.0.7,+ url ==2.1.3,+ urlpath ==11.0.2,+ users ==0.5.0.0,+ users-test ==0.5.0.1,+ utf8-light ==0.4.4.0,+ utf8-string ==1.0.2,+ utility-ht ==0.0.17.2,+ uuid ==1.3.16.1,+ uuid-types ==1.0.6.1,+ valida ==1.1.0,+ valida-base ==0.2.0,+ validate-input ==0.5.0.0,+ validation ==1.1.5,+ validation-selective ==0.2.0.0,+ validity ==0.12.1.0,+ validity-aeson ==0.2.0.5,+ validity-bytestring ==0.4.1.1,+ validity-case-insensitive ==0.0.0.0,+ validity-containers ==0.5.0.5,+ validity-network-uri ==0.0.0.1,+ validity-path ==0.4.0.1,+ validity-persistent ==0.0.0.0,+ validity-primitive ==0.0.0.1,+ validity-scientific ==0.2.0.3,+ validity-text ==0.3.1.3,+ validity-time ==0.5.0.0,+ validity-unordered-containers ==0.2.0.3,+ validity-uuid ==0.1.0.3,+ validity-vector ==0.2.0.3,+ valor ==1.0.0.1,+ vary ==0.1.1.3,+ varying ==0.8.1.0,+ vault ==0.3.2.0,+ vcr ==0.1.0,+ vcs-ignore ==0.0.2.0,+ vec ==0.5.1.1,+ vector ==0.13.2.0,+ vector-algorithms ==0.9.1.0,+ vector-binary-instances ==0.2.5.2,+ vector-buffer ==0.4.1,+ vector-builder ==0.3.8.7,+ vector-bytes-instances ==0.1.1,+ vector-extras ==0.3,+ vector-fftw ==0.1.4.1,+ vector-hashtables ==0.1.2.1,+ vector-instances ==3.4.3,+ vector-mmap ==0.0.3,+ vector-quicksort ==0.2,+ vector-rotcev ==0.1.0.2,+ vector-sized ==1.6.1,+ vector-space ==0.19,+ vector-split ==1.0.0.4,+ vector-stream ==0.1.0.1,+ vector-th-unbox ==0.2.2,+ verbosity ==0.4.0.0,+ verset ==0.0.1.11,+ versions ==6.0.8,+ vessel ==0.3.0.2,+ vformat ==0.14.1.0,+ vformat-time ==0.1.0.0,+ ViennaRNAParser ==1.3.3,+ vinyl ==0.14.3,+ vinyl-loeb ==0.0.1.0,+ Vis ==1.0.0,+ vivid-osc ==0.5.0.0,+ vivid-supercollider ==0.4.1.2,+ void ==0.7.4,+ vty ==6.4,+ vty-crossplatform ==0.4.0.0,+ vty-unix ==0.2.0.0,+ vty-windows ==0.2.0.3,+ wai ==3.2.4,+ wai-app-static ==3.1.9.1,+ wai-cli ==0.2.3,+ wai-conduit ==3.0.0.4,+ wai-cors ==0.2.7,+ wai-enforce-https ==1.0.0.0,+ wai-eventsource ==3.0.0,+ wai-extra ==3.1.18,+ wai-feature-flags ==0.1.0.9,+ wai-handler-launch ==3.0.3.1,+ wai-logger ==2.5.0,+ wai-middleware-bearer ==1.0.3,+ wai-middleware-caching ==0.1.0.2,+ wai-middleware-caching-lru ==0.1.0.0,+ wai-middleware-caching-redis ==0.2.0.0,+ wai-middleware-clacks ==0.1.0.1,+ wai-middleware-delegate ==0.2.0.2,+ wai-middleware-metrics ==0.2.4,+ wai-middleware-prometheus ==1.0.1.0,+ wai-middleware-static ==0.9.4,+ wai-middleware-throttle ==0.3.0.1,+ wai-rate-limit ==0.3.0.0,+ wai-rate-limit-redis ==0.2.0.1,+ wai-saml2 ==0.6,+ wai-session ==0.3.3,+ wai-session-postgresql ==0.2.1.3,+ wai-slack-middleware ==0.2.0,+ wai-transformers ==0.1.0,+ wai-websockets ==3.0.1.2,+ wakame ==0.1.0.0,+ warp ==3.4.9,+ warp-tls ==3.4.14,+ wave ==0.2.1,+ wcwidth ==0.0.2,+ web3 ==1.1.0.0,+ web3-bignum ==1.1.0.0,+ web3-crypto ==1.1.0.0,+ web3-ethereum ==1.1.0.1,+ web3-polkadot ==1.1.0.1,+ web3-provider ==1.1.0.0,+ web3-solidity ==1.1.0.0,+ web-cookiejar ==0.1.3.2,+ webdriver ==0.12.0.1,+ webdriver-precore ==0.1.0.2,+ webdriver-wrapper ==0.2.0.1,+ webex-teams-api ==0.2.0.1,+ webex-teams-conduit ==0.2.0.1,+ webgear-core ==1.4.0,+ webgear-openapi ==1.4.0,+ webgear-server ==1.4.0,+ webgear-swagger ==1.4.0,+ webgear-swagger-ui ==1.4.0,+ webpage ==0.0.5.1,+ web-rep ==0.14.1.0,+ web-routes ==0.27.16,+ web-routes-th ==0.22.8.3,+ webrtc-vad ==0.1.0.3,+ websockets ==0.13.0.0,+ websockets-simple ==0.2.0,+ websockets-snap ==0.10.3.1,+ web-view ==0.7.0,+ weigh ==0.0.18,+ welford-online-mean-variance ==0.2.0.0,+ what4 ==1.6.3,+ wherefrom-compat ==0.1.1.1,+ which ==0.2.0.3,+ wide-word ==0.1.9.0,+ wild-bind ==0.1.2.15,+ wild-bind-x11 ==0.2.0.18,+ Win32 installed,+ Win32-notify ==0.3.0.3,+ windns ==0.1.0.1,+ witch ==1.3.1.0,+ withdependencies ==0.3.1,+ witherable ==0.5,+ within ==0.2.0.1,+ with-utf8 ==1.1.0.0,+ witness ==0.7,+ wizards ==1.0.3,+ wkt-types ==0.1.0.0,+ wled-json ==0.1.0.5,+ wl-pprint ==1.2.1,+ wl-pprint-annotated ==0.1.0.2,+ wl-pprint-text ==1.2.0.2,+ word8 ==0.1.3,+ word-compat ==0.0.6,+ word-trie ==0.3.0,+ word-wrap ==0.5,+ world-peace ==1.0.2.0,+ wrap ==0.0.0,+ wraxml ==0.5,+ wreq ==0.5.4.4,+ wreq-stringless ==0.5.9.1,+ writer-cps-transformers ==0.5.6.1,+ ws ==0.0.6,+ wuss ==2.0.2.7,+ X11 ==1.10.3,+ X11-xft ==0.3.4,+ x11-xim ==0.0.9.0,+ Xauth ==0.1,+ xdg-basedir ==0.2.2,+ xdg-desktop-entry ==0.1.1.5,+ xdg-userdirs ==0.1.0.2,+ xeno ==0.6,+ xhtml installed,+ xls ==0.1.3,+ xlsx ==1.1.4,+ xml ==1.3.14,+ xml-basic ==0.1.3.3,+ xmlbf ==0.7,+ xmlbf-xeno ==0.2.2,+ xmlbf-xmlhtml ==0.2.2,+ xml-conduit ==1.10.1.0,+ xmlgen ==0.6.2.2,+ xml-hamlet ==0.5.0.3,+ xml-helpers ==1.0.0,+ xmlhtml ==0.2.5.4,+ xml-html-qq ==0.1.0.1,+ xml-indexed-cursor ==0.1.1.0,+ xml-parser ==0.1.1.2,+ xml-picklers ==0.3.6,+ xml-to-json-fast ==2.0.0,+ xml-types ==0.3.8,+ xmonad ==0.18.1,+ xmonad-contrib ==0.18.2,+ xor ==0.0.1.4,+ xss-sanitize ==0.3.7.2,+ xxhash-ffi ==0.3.1,+ yaml ==0.11.11.2,+ yaml-unscrambler ==0.1.0.21,+ Yampa ==0.15,+ yarn-lock ==0.6.5,+ yaya ==0.6.2.3,+ yaya-containers ==0.1.2.2,+ yaya-hedgehog ==0.3.0.5,+ yaya-quickcheck ==0.2.0.3,+ yaya-unsafe ==0.4.1.4,+ yeshql-core ==4.2.0.0,+ yesod ==1.6.2.3,+ yesod-auth ==1.6.12.1,+ yesod-auth-basic ==0.1.0.3,+ yesod-auth-hashdb ==1.7.1.7,+ yesod-auth-oauth2 ==0.7.4.0,+ yesod-bin ==1.6.2.4,+ yesod-core ==1.6.29.1,+ yesod-eventsource ==1.6.0.2,+ yesod-form ==1.7.10,+ yesod-form-bootstrap4 ==3.0.1.1,+ yesod-gitrepo ==0.3.0,+ yesod-gitrev ==0.2.2,+ yesod-markdown ==0.12.6.14,+ yesod-newsfeed ==1.7.0.1,+ yesod-page-cursor ==2.0.1.0,+ yesod-paginator ==1.1.2.2,+ yesod-persistent ==1.6.0.9,+ yesod-recaptcha2 ==1.0.2.1,+ yesod-routes-flow ==3.0.0.2,+ yesod-sitemap ==1.6.0.1,+ yesod-static ==1.6.1.3,+ yesod-test ==1.6.19,+ yesod-websockets ==0.3.0.4,+ yes-precure5-command ==5.5.3,+ yggdrasil-schema ==1.0.0.6,+ yi ==0.19.3,+ yi-core ==0.19.4,+ yi-frontend-pango ==0.19.2,+ yi-frontend-vty ==0.19.1,+ yi-keymap-cua ==0.19.0,+ yi-keymap-emacs ==0.19.0,+ yi-keymap-vim ==0.19.0,+ yi-language ==0.19.2,+ yi-misc-modes ==0.19.1,+ yi-mode-haskell ==0.19.1,+ yi-mode-javascript ==0.19.1,+ yi-rope ==0.11,+ yjsvg ==0.2.0.1,+ yjtools ==0.9.18,+ yoga ==0.0.0.8,+ youtube ==0.2.1.1,+ zenacy-html ==2.1.2,+ zenacy-unicode ==1.0.3,+ zenc ==0.1.2,+ zeromq4-haskell ==0.8.0,+ zeromq4-patterns ==0.3.1.0,+ zigzag ==0.1.0.0,+ zim-parser ==0.2.1.0,+ zip ==2.2.2,+ zip-archive ==0.4.3.2,+ zippers ==0.3.2,+ zip-stream ==0.2.2.0,+ zlib ==0.7.1.1,+ zlib-bindings ==0.1.1.5,+ zlib-clib ==1.3.2,+ zot ==0.0.3,+ zstd ==0.1.3.0
+ cabal-stackage.project view
@@ -0,0 +1,9 @@+-- cabal.project file that is equivilant to building with stack.yaml,+-- with package versions from stackage.+packages:+ .+jobs: $ncpus+semaphore: True+import: cabal-stackage.config+constraints: blake3 ==0.3, libmagic ==1.3.2, ram ==0.22.0, botan-low ==0.2.0.1, botan-bindings ==0.3.0.0+flags: +Botan +MagicMime +Blake3 +XXH3 +OsPath +Dbus
cabal.project view
@@ -1,3 +1,5 @@+-- cabal.project file that is equivilant to building with stack.yaml,+-- with package versions from stackage. packages: . jobs: $ncpus
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 10.20261026+Version: 10.20261113 Cabal-Version: 1.12 License: AGPL-3 Maintainer: Joey Hess <id@joeyh.name>@@ -35,9 +35,10 @@ -- Include only files that are needed make cabal install git-annex work. Extra-Source-Files: stack.yaml- stack-botan.yaml stack-NoLLMDependencies.yaml cabal.project+ cabal-stackage.project+ cabal-stackage.config README CHANGELOG NEWS@@ -161,10 +162,6 @@ Flag Production Description: Enable production build (slower build; faster binary) -Flag Botan- Description: Build with the Botan C++ library for faster hashing- Default: False- Flag TorrentParser Description: Use haskell torrent library to parse torrent files @@ -297,7 +294,8 @@ warp-tls (>= 3.2.2), crypton-connection (>= 0.4.3), crypton-x509-store,- aws (>= 0.24.1)+ aws (>= 0.24.1),+ botan-low (< 0.3) CC-Options: -Wall GHC-Options: -Wall -fno-warn-tabs -Wincomplete-uni-patterns Default-Language: Haskell2010@@ -311,9 +309,10 @@ Build-Depends: base (>= 4.18.2.1 && < 4.23), ram (< 0.21.0),+ network (< 3.2.9.0), persistent (>= 2.13.3) && (< 2.15.0.0), warp (< 3.4.11),- magic (<= 1.1),+ http-semantics (< 0.4.2), crypton (< 1.1.0), tls (< 2.4.4) else@@ -326,7 +325,7 @@ if flag(Memory) Build-Depends: memory, crypton (< 1.1.0) else- Build-Depends: ram, crypton (>= 1.1.0)+ Build-Depends: memory, ram, crypton (>= 1.1.0) -- Fully optimize for production. if flag(Production)@@ -354,13 +353,6 @@ Build-Depends: filepath-bytestring (>= 1.4.2.1.1) - if flag(Botan)- Build-Depends:- botan-low (< 0.3)- CPP-Options: -DWITH_BOTAN- Other-Modules:- Utility.Hash.Botan- -- Disabled on arm until this issue is resolved: -- https://github.com/k0001/hs-blake3/issues/8 if flag(Blake3) && (! arch(aarch64) && ! arch(arm))@@ -386,7 +378,8 @@ Win32 (>= 2.13.4.0), setenv, process (>= 1.6.2.0),- silently (>= 1.2.5.1)+ silently (>= 1.2.5.1),+ nsis else Build-Depends: unix (>= 2.8.4) @@ -551,7 +544,9 @@ CPP-Options: -DWITH_TORRENTPARSER if flag(MagicMime)- Build-Depends: magic (<= 1.1)+ Build-Depends:+ libmagic (>= 1.3),+ os-string (>= 2.0.0) CPP-Options: -DWITH_MAGICMIME if flag(Benchmark)@@ -673,6 +668,7 @@ Build.Configure Build.DesktopFile Build.Mans+ Build.NullSoftInstaller Build.TestConfig Build.Version BuildInfo@@ -800,6 +796,7 @@ Command.TestRemote Command.Transferrer Command.TransferKey+ Command.Transfers Command.Trust Command.Unannex Command.Undo@@ -1136,6 +1133,7 @@ Utility.Glob Utility.Gpg Utility.Hash+ Utility.Hash.Botan Utility.Hash.Crypton Utility.Hash.Incremental Utility.Hash.Types@@ -1150,6 +1148,7 @@ Utility.LockPool.LockHandle Utility.LockPool.STM Utility.LogFile+ Utility.LRU Utility.Lsof Utility.MagicWormhole Utility.Matcher
git-annex.hs view
@@ -7,7 +7,7 @@ {-# LANGUAGE CPP #-} -import System.Environment (getArgs, getProgName)+import System.Environment (getArgs) import System.FilePath import Network.Socket (withSocketsDo) import qualified Data.Map as M@@ -27,6 +27,7 @@ import Utility.UserInfo import Utility.Env.Set #endif+import qualified Build.NullSoftInstaller main :: IO () main = sanitizeTopLevelExceptionMessages $ withSocketsDo $ do@@ -35,13 +36,14 @@ #ifdef mingw32_HOST_OS winEnv #endif- run ps =<< getProgName+ run ps =<< getCommandName where run ps n = case M.lookup (takeFileName n) otherMulticallCommands of Just GitAnnexShell -> CmdLine.GitAnnexShell.run ps Just GitRemoteAnnex -> CmdLine.GitRemoteAnnex.run ps Just GitRemoteP2PAnnex -> CmdLine.GitRemoteP2PAnnex.run ps Just GitRemoteTorAnnex -> CmdLine.GitRemoteTorAnnex.run ps+ Just NullSoftInstaller -> Build.NullSoftInstaller.main Nothing -> CmdLine.GitAnnex.run Test.optParser Test.runner
stack-NoLLMDependencies.yaml view
@@ -9,7 +9,6 @@ debuglocks: false benchmark: true ospath: true- botan: false blake3: true xxh3: true file-io:@@ -28,6 +27,8 @@ - persistent-sqlite-2.13.3.0 - yesod-form-1.7.9.2 - yesod-static-1.6.1.2-- magic-1.1+- libmagic-1.3.2 - crypton-1.0.6 - tls-2.1.8+- botan-low-0.2.0.1+- botan-bindings-0.3.0.0
− stack-botan.yaml
@@ -1,29 +0,0 @@-flags:- git-annex:- NoLLMDependencies: false- production: true- assistant: true- torrentparser: true- magicmime: false- dbus: false- debuglocks: false- benchmark: true- ospath: true- botan: true- blake3: true- xxh3: true- file-io:- os-string: true- xxhash-ffi:- pkg-config: false-packages:-- '.'-resolver: lts-24.52-extra-deps:-- aws-0.25.2-- file-io-0.2.0-- botan-low-0.2.0.1-- botan-bindings-0.3.0.0-- blake3-0.3-- magic-1.1-- ram-0.22.0
stack.yaml view
@@ -9,7 +9,6 @@ debuglocks: false benchmark: true ospath: true- botan: false blake3: true xxh3: true file-io:@@ -23,5 +22,7 @@ - aws-0.25.2 - file-io-0.2.0 - blake3-0.3-- magic-1.1+- libmagic-1.3.2 - ram-0.22.0+- botan-low-0.2.0.1+- botan-bindings-0.3.0.0