Compare commits
26 Commits
v0.1.12-rc
...
chmod-fix
| Author | SHA1 | Date | |
|---|---|---|---|
| b0f90c096f | |||
| e8361c564a | |||
|
|
54db9c9a92 | ||
|
|
73db341dc8 | ||
| 5fd30b412b | |||
|
|
bbe2e87640 | ||
|
|
67f59f6895 | ||
|
|
3e2df2e111 | ||
| 824d2149c6 | |||
|
|
c86dbe043b | ||
|
|
8043ac7f51 | ||
| b20371c3ac | |||
| 0589a7cbcc | |||
| cf48961063 | |||
| 6046582b9c | |||
| 82aa6c70ea | |||
| e829bd8235 | |||
| 66f989e691 | |||
| eebb91fbb0 | |||
| 1d3e88bdfe | |||
| fbb03dee7e | |||
|
|
88e5afb70f | ||
| 67eabfd3af | |||
| cd1dd8c29e | |||
| 08ddb591b7 | |||
| 3e841b3c68 |
@@ -60,7 +60,7 @@ variables:
|
|||||||
script:
|
script:
|
||||||
- ./.gitlab/script/ghcup_version.sh
|
- ./.gitlab/script/ghcup_version.sh
|
||||||
variables:
|
variables:
|
||||||
JSON_VERSION: "0.0.3"
|
JSON_VERSION: "0.0.4"
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 2 week
|
expire_in: 2 week
|
||||||
paths:
|
paths:
|
||||||
|
|||||||
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,13 +1,23 @@
|
|||||||
# Revision history for ghcup
|
# Revision history for ghcup
|
||||||
|
|
||||||
## 0.1.12 -- ????-??-??
|
## WIP
|
||||||
|
|
||||||
|
* Fix to `ghcup` directory creation and placement for the XDG install mode.
|
||||||
|
|
||||||
|
## 0.1.12 -- 2020-11-21
|
||||||
|
|
||||||
|
* Fix disappearing HLS symlinks wrt #91
|
||||||
* improve TUI:
|
* improve TUI:
|
||||||
- separators between tools sections
|
- separators between tools sections
|
||||||
- reverse list order so latest is on top
|
- reverse list order so latest is on top
|
||||||
- expand the blues selected bar
|
- expand the blues selected bar
|
||||||
- show new latest versions in bright white
|
- show new latest versions in bright white
|
||||||
* allow configuration file and settings TUI hotkeys wrt #41
|
* allow configuration file and setting TUI hotkeys wrt #41
|
||||||
|
- see https://gitlab.haskell.org/haskell/ghcup-hs#configuration for a more in-depth explanation
|
||||||
|
* add a `--set` switch to `ghcup install ghc` to automatically set as default after install
|
||||||
|
* emit warnings when CC/LD is set wrt #82
|
||||||
|
* add support for version ranges in distro specifiers wrt #84
|
||||||
|
- e.g. `"(>= 19 && <= 20) || ==0.2.2"` is a valid version key for distro
|
||||||
|
|
||||||
## 0.1.11 -- 2020-09-23
|
## 0.1.11 -- 2020-09-23
|
||||||
|
|
||||||
|
|||||||
@@ -119,9 +119,10 @@ To enable XDG style directories, set the environment variable `GHCUP_USE_XDG_DIR
|
|||||||
|
|
||||||
Then you can control the locations via XDG environment variables as such:
|
Then you can control the locations via XDG environment variables as such:
|
||||||
|
|
||||||
* `XDG_DATA_HOME`: GHCs will be unpacked in `ghcup/ghc` subdir
|
* `XDG_DATA_HOME`: GHCs will be unpacked in `ghcup/ghc` subdir (default: `~/.local/share`)
|
||||||
* `XDG_CACHE_HOME`: logs and download files will be stored in `ghcup` subdir
|
* `XDG_CACHE_HOME`: logs and download files will be stored in `ghcup` subdir (default: `~/.cache`)
|
||||||
* `XDG_BIN_HOME`: binaries end up here (default: `~/.local/bin`)
|
* `XDG_BIN_HOME`: binaries end up here (default: `~/.local/bin`)
|
||||||
|
* `XDG_CONFIG_HOME`: the config file is stored in `ghcup` subdir as `config.yaml` (default: `~/.config`)
|
||||||
|
|
||||||
### Installing custom bindists
|
### Installing custom bindists
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ import System.Exit
|
|||||||
import System.IO.Unsafe
|
import System.IO.Unsafe
|
||||||
import URI.ByteString
|
import URI.ByteString
|
||||||
|
|
||||||
|
import qualified GHCup.Types as GT
|
||||||
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Graphics.Vty as Vty
|
import qualified Graphics.Vty as Vty
|
||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
@@ -480,11 +482,6 @@ changelog' BrickState { appData = BrickData {..} } (_, ListResult {..}) = do
|
|||||||
Left e -> pure $ Left [i|#{e}|]
|
Left e -> pure $ Left [i|#{e}|]
|
||||||
|
|
||||||
|
|
||||||
uri' :: IORef (Maybe URI)
|
|
||||||
{-# NOINLINE uri' #-}
|
|
||||||
uri' = unsafePerformIO (newIORef Nothing)
|
|
||||||
|
|
||||||
|
|
||||||
settings' :: IORef AppState
|
settings' :: IORef AppState
|
||||||
{-# NOINLINE settings' #-}
|
{-# NOINLINE settings' #-}
|
||||||
settings' = unsafePerformIO $ do
|
settings' = unsafePerformIO $ do
|
||||||
@@ -513,13 +510,11 @@ logger' = unsafePerformIO
|
|||||||
|
|
||||||
|
|
||||||
brickMain :: AppState
|
brickMain :: AppState
|
||||||
-> Maybe URI
|
|
||||||
-> LoggerConfig
|
-> LoggerConfig
|
||||||
-> GHCupDownloads
|
-> GHCupDownloads
|
||||||
-> PlatformRequest
|
-> PlatformRequest
|
||||||
-> IO ()
|
-> IO ()
|
||||||
brickMain s muri l av pfreq' = do
|
brickMain s l av pfreq' = do
|
||||||
writeIORef uri' muri
|
|
||||||
writeIORef settings' s
|
writeIORef settings' s
|
||||||
-- logger interpreter
|
-- logger interpreter
|
||||||
writeIORef logger' l
|
writeIORef logger' l
|
||||||
@@ -548,7 +543,6 @@ defaultAppSettings = BrickSettings { showAll = False }
|
|||||||
|
|
||||||
getDownloads' :: IO (Either String GHCupDownloads)
|
getDownloads' :: IO (Either String GHCupDownloads)
|
||||||
getDownloads' = do
|
getDownloads' = do
|
||||||
muri <- readIORef uri'
|
|
||||||
settings <- readIORef settings'
|
settings <- readIORef settings'
|
||||||
l <- readIORef logger'
|
l <- readIORef logger'
|
||||||
let runLogger = myLoggerT l
|
let runLogger = myLoggerT l
|
||||||
@@ -559,7 +553,7 @@ getDownloads' = do
|
|||||||
. runE @'[JSONError , DownloadFailed , FileDoesNotExistError]
|
. runE @'[JSONError , DownloadFailed , FileDoesNotExistError]
|
||||||
$ fmap _ghcupDownloads
|
$ fmap _ghcupDownloads
|
||||||
$ liftE
|
$ liftE
|
||||||
$ getDownloadsF (maybe GHCupURL OwnSource muri)
|
$ getDownloadsF (urlSource . GT.settings $ settings)
|
||||||
|
|
||||||
case r of
|
case r of
|
||||||
VRight a -> pure $ Right a
|
VRight a -> pure $ Right a
|
||||||
|
|||||||
@@ -752,9 +752,9 @@ cabalCompileOpts =
|
|||||||
|
|
||||||
|
|
||||||
toolVersionParser :: Parser ToolVersion
|
toolVersionParser :: Parser ToolVersion
|
||||||
toolVersionParser = verP <|> toolP
|
toolVersionParser = verP' <|> toolP
|
||||||
where
|
where
|
||||||
verP = ToolVersion <$> versionParser
|
verP' = ToolVersion <$> versionParser
|
||||||
toolP =
|
toolP =
|
||||||
ToolTag
|
ToolTag
|
||||||
<$> (option
|
<$> (option
|
||||||
@@ -882,17 +882,6 @@ platformParser s' = case MP.parse (platformP <* MP.eof) "" (T.pack s') of
|
|||||||
, MP.chunk "exherbo" $> Exherbo
|
, MP.chunk "exherbo" $> Exherbo
|
||||||
, MP.chunk "unknown" $> UnknownLinux
|
, MP.chunk "unknown" $> UnknownLinux
|
||||||
]
|
]
|
||||||
verP :: MP.Parsec Void Text Text -> MP.Parsec Void Text Versioning
|
|
||||||
verP suffix = do
|
|
||||||
ver <- parseUntil suffix
|
|
||||||
if T.null ver
|
|
||||||
then fail "empty version"
|
|
||||||
else do
|
|
||||||
rest <- MP.getInput
|
|
||||||
MP.setInput ver
|
|
||||||
v <- versioning'
|
|
||||||
MP.setInput rest
|
|
||||||
pure v
|
|
||||||
|
|
||||||
|
|
||||||
bindistParser :: String -> Either String URI
|
bindistParser :: String -> Either String URI
|
||||||
@@ -1349,7 +1338,7 @@ Report bugs at <https://gitlab.haskell.org/haskell/ghcup-hs/issues>|]
|
|||||||
|
|
||||||
res <- case optCommand of
|
res <- case optCommand of
|
||||||
#if defined(BRICK)
|
#if defined(BRICK)
|
||||||
Interactive -> liftIO $ brickMain appstate optUrlSource loggerConfig dls pfreq >> pure ExitSuccess
|
Interactive -> liftIO $ brickMain appstate loggerConfig dls pfreq >> pure ExitSuccess
|
||||||
#endif
|
#endif
|
||||||
Install (Right iopts) -> do
|
Install (Right iopts) -> do
|
||||||
runLogger ($(logWarn) [i|This is an old-style command for installing GHC. Use 'ghcup install ghc' instead.|])
|
runLogger ($(logWarn) [i|This is an old-style command for installing GHC. Use 'ghcup install ghc' instead.|])
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Main settings:
|
||||||
|
# * BOOTSTRAP_HASKELL_NONINTERACTIVE - any nonzero value for noninteractive installation
|
||||||
|
# * BOOTSTRAP_HASKELL_NO_UPGRADE - any nonzero value to not trigger the upgrade
|
||||||
|
# * GHCUP_USE_XDG_DIRS - any nonzero value to respect The XDG Base Directory Specification
|
||||||
|
# * BOOTSTRAP_HASKELL_VERBOSE - any nonzero value for more verbose installation
|
||||||
|
# * BOOTSTRAP_HASKELL_GHC_VERSION
|
||||||
|
# * BOOTSTRAP_HASKELL_CABAL_VERSION
|
||||||
|
|
||||||
|
# License: LGPL-3.0
|
||||||
|
|
||||||
|
|
||||||
# safety subshell to avoid executing anything in case this script is not downloaded properly
|
# safety subshell to avoid executing anything in case this script is not downloaded properly
|
||||||
(
|
(
|
||||||
|
|
||||||
@@ -8,7 +19,7 @@
|
|||||||
export GHCUP_USE_XDG_DIRS
|
export GHCUP_USE_XDG_DIRS
|
||||||
|
|
||||||
if [ -n "${GHCUP_USE_XDG_DIRS}" ] ; then
|
if [ -n "${GHCUP_USE_XDG_DIRS}" ] ; then
|
||||||
GHCUP_DIR=${XDG_DATA_HOME:=$HOME/.local}/ghcup
|
GHCUP_DIR=${XDG_DATA_HOME:=$HOME/.local/share}/ghcup
|
||||||
GHCUP_BIN=${XDG_BIN_HOME:=$HOME/.local/bin}
|
GHCUP_BIN=${XDG_BIN_HOME:=$HOME/.local/bin}
|
||||||
else
|
else
|
||||||
GHCUP_DIR=${GHCUP_INSTALL_BASE_PREFIX}/.ghcup
|
GHCUP_DIR=${GHCUP_INSTALL_BASE_PREFIX}/.ghcup
|
||||||
@@ -23,8 +34,7 @@ die() {
|
|||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
|
|
||||||
edo()
|
edo() {
|
||||||
{
|
|
||||||
"$@" || die "\"$*\" failed!"
|
"$@" || die "\"$*\" failed!"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +69,7 @@ _done() {
|
|||||||
download_ghcup() {
|
download_ghcup() {
|
||||||
_plat="$(uname -s)"
|
_plat="$(uname -s)"
|
||||||
_arch=$(uname -m)
|
_arch=$(uname -m)
|
||||||
_ghver="0.1.11"
|
_ghver="0.1.12"
|
||||||
_base_url="https://downloads.haskell.org/~ghcup"
|
_base_url="https://downloads.haskell.org/~ghcup"
|
||||||
|
|
||||||
case "${_plat}" in
|
case "${_plat}" in
|
||||||
@@ -114,6 +124,7 @@ download_ghcup() {
|
|||||||
|
|
||||||
edo chmod +x "${GHCUP_BIN}"/ghcup
|
edo chmod +x "${GHCUP_BIN}"/ghcup
|
||||||
|
|
||||||
|
edo mkdir -p "${GHCUP_DIR}"
|
||||||
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
|
cat <<-EOF > "${GHCUP_DIR}"/env || die "Failed to create env file"
|
||||||
export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH"
|
export PATH="\$HOME/.cabal/bin:${GHCUP_BIN}:\$PATH"
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ ghcupDownloads:
|
|||||||
7.10.3:
|
7.10.3:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.8.2.0
|
- base-4.8.2.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/7.10.3/docs/html/users_guide/release-7-10-1.html
|
viChangeLog: https://downloads.haskell.org/~ghc/7.10.3/docs/html/users_guide/release-7-10-1.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/7.10.3/ghc-7.10.3-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/7.10.3/ghc-7.10.3-src.tar.xz
|
||||||
@@ -158,7 +157,6 @@ ghcupDownloads:
|
|||||||
8.0.2:
|
8.0.2:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.9.1.0
|
- base-4.9.1.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/8.0.1-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/8.0.1-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.0.2/ghc-8.0.2-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.0.2/ghc-8.0.2-src.tar.xz
|
||||||
@@ -216,7 +214,6 @@ ghcupDownloads:
|
|||||||
8.2.2:
|
8.2.2:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.10.1.0
|
- base-4.10.1.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.2.2/docs/html/users_guide/8.2.2-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.2.2/docs/html/users_guide/8.2.2-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.2.2/ghc-8.2.2-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.2.2/ghc-8.2.2-src.tar.xz
|
||||||
@@ -283,7 +280,6 @@ ghcupDownloads:
|
|||||||
8.4.1:
|
8.4.1:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.11.0.0
|
- base-4.11.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/8.4.1-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/8.4.1-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.4.1/ghc-8.4.1-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.4.1/ghc-8.4.1-src.tar.xz
|
||||||
@@ -332,7 +328,6 @@ ghcupDownloads:
|
|||||||
8.4.2:
|
8.4.2:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.11.1.0
|
- base-4.11.1.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.4.2/docs/html/users_guide/8.4.2-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.4.2/docs/html/users_guide/8.4.2-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.4.2/ghc-8.4.2-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.4.2/ghc-8.4.2-src.tar.xz
|
||||||
@@ -387,7 +382,6 @@ ghcupDownloads:
|
|||||||
8.4.3:
|
8.4.3:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.11.1.0
|
- base-4.11.1.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.4.3/docs/html/users_guide/8.4.3-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.4.3/docs/html/users_guide/8.4.3-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.4.3/ghc-8.4.3-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.4.3/ghc-8.4.3-src.tar.xz
|
||||||
@@ -510,7 +504,6 @@ ghcupDownloads:
|
|||||||
8.6.1:
|
8.6.1:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.12.0.0
|
- base-4.12.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.6.1/docs/html/users_guide/8.6.1-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.6.1/docs/html/users_guide/8.6.1-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.6.1/ghc-8.6.1-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.6.1/ghc-8.6.1-src.tar.xz
|
||||||
@@ -565,7 +558,6 @@ ghcupDownloads:
|
|||||||
8.6.2:
|
8.6.2:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.12.0.0
|
- base-4.12.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.6.2/docs/html/users_guide/8.6.2-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.6.2/docs/html/users_guide/8.6.2-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.6.2/ghc-8.6.2-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.6.2/ghc-8.6.2-src.tar.xz
|
||||||
@@ -611,7 +603,6 @@ ghcupDownloads:
|
|||||||
8.6.3:
|
8.6.3:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.12.0.0
|
- base-4.12.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.6.3/docs/html/users_guide/8.6.3-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.6.3/docs/html/users_guide/8.6.3-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.6.3/ghc-8.6.3-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.6.3/ghc-8.6.3-src.tar.xz
|
||||||
@@ -675,7 +666,6 @@ ghcupDownloads:
|
|||||||
8.6.4:
|
8.6.4:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.12.0.0
|
- base-4.12.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.6.4/docs/html/users_guide/8.6.4-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.6.4/docs/html/users_guide/8.6.4-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.6.4/ghc-8.6.4-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.6.4/ghc-8.6.4-src.tar.xz
|
||||||
@@ -798,7 +788,6 @@ ghcupDownloads:
|
|||||||
8.8.1:
|
8.8.1:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.13.0.0
|
- base-4.13.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.8.1/docs/html/users_guide/8.8.1-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.8.1/docs/html/users_guide/8.8.1-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.8.1/ghc-8.8.1-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.8.1/ghc-8.8.1-src.tar.xz
|
||||||
@@ -857,7 +846,6 @@ ghcupDownloads:
|
|||||||
8.8.2:
|
8.8.2:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.13.0.0
|
- base-4.13.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.8.2/docs/html/users_guide/8.8.2-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.8.2/docs/html/users_guide/8.8.2-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.8.2/ghc-8.8.2-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.8.2/ghc-8.8.2-src.tar.xz
|
||||||
@@ -916,7 +904,6 @@ ghcupDownloads:
|
|||||||
8.8.3:
|
8.8.3:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.13.0.0
|
- base-4.13.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.8.3/docs/html/users_guide/8.8.3-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.8.3/docs/html/users_guide/8.8.3-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.8.3/ghc-8.8.3-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.8.3/ghc-8.8.3-src.tar.xz
|
||||||
@@ -1054,7 +1041,6 @@ ghcupDownloads:
|
|||||||
8.10.1:
|
8.10.1:
|
||||||
viTags:
|
viTags:
|
||||||
- base-4.14.0.0
|
- base-4.14.0.0
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~ghc/8.10.1/docs/html/users_guide/8.10.1-notes.html
|
viChangeLog: https://downloads.haskell.org/~ghc/8.10.1/docs/html/users_guide/8.10.1-notes.html
|
||||||
viSourceDL:
|
viSourceDL:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.10.1/ghc-8.10.1-src.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.10.1/ghc-8.10.1-src.tar.xz
|
||||||
@@ -1281,8 +1267,7 @@ ghcupDownloads:
|
|||||||
unknown_versioning: *ghc-901a1-32-deb9
|
unknown_versioning: *ghc-901a1-32-deb9
|
||||||
Cabal:
|
Cabal:
|
||||||
2.4.1.0:
|
2.4.1.0:
|
||||||
viTags:
|
viTags: []
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~cabal/cabal-install-2.4.1.0/changelog
|
viChangeLog: https://downloads.haskell.org/~cabal/cabal-install-2.4.1.0/changelog
|
||||||
viArch:
|
viArch:
|
||||||
A_64:
|
A_64:
|
||||||
@@ -1313,8 +1298,7 @@ ghcupDownloads:
|
|||||||
dlSubdir:
|
dlSubdir:
|
||||||
dlHash: b2da736cc27609442b10f77fc1a687aba603a7a33045b722dbf1a0066fade198
|
dlHash: b2da736cc27609442b10f77fc1a687aba603a7a33045b722dbf1a0066fade198
|
||||||
3.0.0.0:
|
3.0.0.0:
|
||||||
viTags:
|
viTags: []
|
||||||
- old
|
|
||||||
viChangeLog: https://downloads.haskell.org/~cabal/cabal-install-3.0.0.0/changelog
|
viChangeLog: https://downloads.haskell.org/~cabal/cabal-install-3.0.0.0/changelog
|
||||||
viArch:
|
viArch:
|
||||||
A_64:
|
A_64:
|
||||||
@@ -1400,7 +1384,7 @@ ghcupDownloads:
|
|||||||
dlUri: https://oleg.fi/cabal-install-3.4.0.0-rc4/cabal-install-3.4.0.0-x86_64-freebsd-12.1-release.tar.xz
|
dlUri: https://oleg.fi/cabal-install-3.4.0.0-rc4/cabal-install-3.4.0.0-x86_64-freebsd-12.1-release.tar.xz
|
||||||
dlHash: 9705e16d03497b46be4ad477e6c64d10890af853eafa8a9adf6dba89aa9e05f7
|
dlHash: 9705e16d03497b46be4ad477e6c64d10890af853eafa8a9adf6dba89aa9e05f7
|
||||||
GHCup:
|
GHCup:
|
||||||
0.1.11:
|
0.1.12:
|
||||||
viTags:
|
viTags:
|
||||||
- Recommended
|
- Recommended
|
||||||
- Latest
|
- Latest
|
||||||
@@ -1410,40 +1394,40 @@ ghcupDownloads:
|
|||||||
A_64:
|
A_64:
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: &ghcup-64
|
unknown_versioning: &ghcup-64
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.11/x86_64-linux-ghcup-0.1.11
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.12/x86_64-linux-ghcup-0.1.12
|
||||||
dlHash: 99d97c9a1dce76892001e5cffd50cc23bf804f2282998c546d1b965aa2179699
|
dlHash: 83088569ddf2d35df494f440dedd9c8eb2a53276d665f7de731f6554986c2ddb
|
||||||
Darwin:
|
Darwin:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.11/x86_64-apple-darwin-ghcup-0.1.11
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.12/x86_64-apple-darwin-ghcup-0.1.12
|
||||||
dlHash: 4b91dcd9bfdc40534156b8fadea3f317b3c44af1255169895f4911a221f819c6
|
dlHash: 1336efb0851e1ed267838f97f6c36cbceb5363ad0ae359f04f1bc43d0c5f2cef
|
||||||
FreeBSD:
|
FreeBSD:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.11/x86_64-portbld-freebsd-ghcup-0.1.11
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.12/x86_64-portbld-freebsd-ghcup-0.1.12
|
||||||
dlHash: 6f04ce98d3f3eb9299ce74f8264aa956f0dc38a64a3bd12ee048b7f146e9e1b4
|
dlHash: a72123e972a53d667574c7d276a81842701a07fce2b434e4d856e561c34772fe
|
||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning: *ghcup-64
|
unknown_versioning: *ghcup-64
|
||||||
A_32:
|
A_32:
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: &ghcup-32
|
unknown_versioning: &ghcup-32
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.11/i386-linux-ghcup-0.1.11
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.12/i386-linux-ghcup-0.1.12
|
||||||
dlHash: ec339e4c2b8b4d502f66a03c0d3f112cb68cd922dd3c4a6f66323628cf6a76c2
|
dlHash: 4bc79a272dfcd16143f08d9f8e33f2fef66dc53f3a0659bdab56ac3cbecf9e84
|
||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning: *ghcup-32
|
unknown_versioning: *ghcup-32
|
||||||
HLS:
|
HLS:
|
||||||
0.5.1:
|
0.7.1:
|
||||||
viTags:
|
viTags:
|
||||||
- Recommended
|
- Recommended
|
||||||
- Latest
|
- Latest
|
||||||
viChangeLog: https://github.com/haskell/haskell-language-server/blob/master/ChangeLog.md#051
|
viChangeLog: https://github.com/haskell/haskell-language-server/blob/master/ChangeLog.md#071
|
||||||
viArch:
|
viArch:
|
||||||
A_64:
|
A_64:
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: &hls-64
|
unknown_versioning: &hls-64
|
||||||
dlUri: https://github.com/haskell/haskell-language-server/releases/download/0.5.1/haskell-language-server-Linux-0.5.1.tar.gz
|
dlUri: https://github.com/haskell/haskell-language-server/releases/download/0.7.1/haskell-language-server-Linux-0.7.1.tar.gz
|
||||||
dlHash: 8f80a663823033b1d9322de6f86b329e6f7b3f93ba2faea4677989767cb844eb
|
dlHash: e74f3bd1f91613a1859a411f369dc34afce9e3e9b7c99ea4f251d81111627f62
|
||||||
Darwin:
|
Darwin:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://github.com/haskell/haskell-language-server/releases/download/0.5.1/haskell-language-server-macOS-0.5.1.tar.gz
|
dlUri: https://github.com/haskell/haskell-language-server/releases/download/0.7.1/haskell-language-server-macOS-0.7.1.tar.gz
|
||||||
dlHash: a4e557a754df6d2e668714909554a15fea9803f3ff5883268bcf92bf009b45b2
|
dlHash: 87ac37cfc74abb4f348a799ee6e76266fe1972dead72b7b11ee1411cc83924ed
|
||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning: *hls-64
|
unknown_versioning: *hls-64
|
||||||
|
|||||||
1446
ghcup-0.0.4.yaml
Normal file
1446
ghcup-0.0.4.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@ maintainer: hasufell@posteo.de
|
|||||||
copyright: Julian Ospald 2020
|
copyright: Julian Ospald 2020
|
||||||
category: System
|
category: System
|
||||||
build-type: Simple
|
build-type: Simple
|
||||||
extra-source-files: CHANGELOG.md
|
extra-doc-files: CHANGELOG.md
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
|
|||||||
23326
golden/GHCupInfo.json
23326
golden/GHCupInfo.json
File diff suppressed because it is too large
Load Diff
38
lib/GHCup.hs
38
lib/GHCup.hs
@@ -74,7 +74,7 @@ import Prelude hiding ( abs
|
|||||||
)
|
)
|
||||||
import Safe hiding ( at )
|
import Safe hiding ( at )
|
||||||
import System.IO.Error
|
import System.IO.Error
|
||||||
import System.Posix.Env.ByteString ( getEnvironment )
|
import System.Posix.Env.ByteString ( getEnvironment, getEnv )
|
||||||
import System.Posix.FilePath ( getSearchPath, takeExtension )
|
import System.Posix.FilePath ( getSearchPath, takeExtension )
|
||||||
import System.Posix.Files.ByteString
|
import System.Posix.Files.ByteString
|
||||||
import Text.Regex.Posix
|
import Text.Regex.Posix
|
||||||
@@ -134,10 +134,23 @@ installGHCBindist dlinfo ver pfreq = do
|
|||||||
-- prepare paths
|
-- prepare paths
|
||||||
ghcdir <- lift $ ghcupGHCDir tver
|
ghcdir <- lift $ ghcupGHCDir tver
|
||||||
|
|
||||||
|
toolchainSanityChecks
|
||||||
|
|
||||||
liftE $ installPackedGHC dl (view dlSubdir dlinfo) ghcdir ver pfreq
|
liftE $ installPackedGHC dl (view dlSubdir dlinfo) ghcdir ver pfreq
|
||||||
|
|
||||||
liftE $ postGHCInstall tver
|
liftE $ postGHCInstall tver
|
||||||
|
|
||||||
|
where
|
||||||
|
toolchainSanityChecks = do
|
||||||
|
r <- forM ["CC", "LD"] (liftIO . getEnv)
|
||||||
|
case catMaybes r of
|
||||||
|
[] -> pure ()
|
||||||
|
_ -> do
|
||||||
|
lift $ $(logWarn) "CC/LD environment variable is set. This will change the compiler/linker"
|
||||||
|
lift $ $(logWarn) "GHC uses internally and can cause defunct GHC in some cases (e.g. in Anaconda"
|
||||||
|
lift $ $(logWarn) "environments). If you encounter problems, unset CC and LD and reinstall."
|
||||||
|
|
||||||
|
|
||||||
-- | Install a packed GHC distribution. This only deals with unpacking and the GHC
|
-- | Install a packed GHC distribution. This only deals with unpacking and the GHC
|
||||||
-- build system and nothing else.
|
-- build system and nothing else.
|
||||||
installPackedGHC :: ( MonadMask m
|
installPackedGHC :: ( MonadMask m
|
||||||
@@ -320,7 +333,7 @@ installCabalBindist dlinfo ver (PlatformRequest {..}) = do
|
|||||||
(path </> cabalFile)
|
(path </> cabalFile)
|
||||||
(destPath)
|
(destPath)
|
||||||
Overwrite
|
Overwrite
|
||||||
lift $ chmod_777 destPath
|
lift $ chmod_755 destPath
|
||||||
|
|
||||||
|
|
||||||
-- | Installs cabal into @~\/.ghcup\/bin/cabal-\<ver\>@ and
|
-- | Installs cabal into @~\/.ghcup\/bin/cabal-\<ver\>@ and
|
||||||
@@ -436,7 +449,7 @@ installHLSBindist dlinfo ver (PlatformRequest {..}) = do
|
|||||||
(path </> f)
|
(path </> f)
|
||||||
(inst </> toF)
|
(inst </> toF)
|
||||||
Overwrite
|
Overwrite
|
||||||
lift $ chmod_777 (inst </> toF)
|
lift $ chmod_755 (inst </> toF)
|
||||||
|
|
||||||
-- install haskell-language-server-wrapper
|
-- install haskell-language-server-wrapper
|
||||||
let wrapper = [rel|haskell-language-server-wrapper|]
|
let wrapper = [rel|haskell-language-server-wrapper|]
|
||||||
@@ -445,7 +458,7 @@ installHLSBindist dlinfo ver (PlatformRequest {..}) = do
|
|||||||
(path </> wrapper)
|
(path </> wrapper)
|
||||||
(inst </> toF)
|
(inst </> toF)
|
||||||
Overwrite
|
Overwrite
|
||||||
lift $ chmod_777 (inst </> toF)
|
lift $ chmod_755 (inst </> toF)
|
||||||
|
|
||||||
|
|
||||||
-- | Installs hls binaries @haskell-language-server-\<ghcver\>@
|
-- | Installs hls binaries @haskell-language-server-\<ghcver\>@
|
||||||
@@ -522,8 +535,8 @@ setGHC ver sghc = do
|
|||||||
-- with old ghcup)
|
-- with old ghcup)
|
||||||
case sghc of
|
case sghc of
|
||||||
SetGHCOnly -> liftE $ rmPlain (_tvTarget ver)
|
SetGHCOnly -> liftE $ rmPlain (_tvTarget ver)
|
||||||
SetGHC_XY -> lift $ rmMajorSymlinks ver
|
SetGHC_XY -> liftE $ rmMajorSymlinks ver
|
||||||
SetGHC_XYZ -> lift $ rmMinorSymlinks ver
|
SetGHC_XYZ -> liftE $ rmMinorSymlinks ver
|
||||||
|
|
||||||
-- for ghc tools (ghc, ghci, haddock, ...)
|
-- for ghc tools (ghc, ghci, haddock, ...)
|
||||||
verfiles <- ghcToolFiles ver
|
verfiles <- ghcToolFiles ver
|
||||||
@@ -924,16 +937,17 @@ rmGHCVer ver = do
|
|||||||
lift $ $(logInfo) [i|Removing ghc symlinks|]
|
lift $ $(logInfo) [i|Removing ghc symlinks|]
|
||||||
liftE $ rmPlain (_tvTarget ver)
|
liftE $ rmPlain (_tvTarget ver)
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing directory recursively: #{toFilePath dir}|]
|
|
||||||
liftIO $ deleteDirRecursive dir
|
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing ghc-x.y.z symlinks|]
|
lift $ $(logInfo) [i|Removing ghc-x.y.z symlinks|]
|
||||||
lift $ rmMinorSymlinks ver
|
liftE $ rmMinorSymlinks ver
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing/rewiring ghc-x.y symlinks|]
|
lift $ $(logInfo) [i|Removing/rewiring ghc-x.y symlinks|]
|
||||||
-- first remove
|
-- first remove
|
||||||
handle (\(_ :: ParseError) -> pure ()) $ lift $ rmMajorSymlinks ver
|
handle (\(_ :: ParseError) -> pure ()) $ liftE $ rmMajorSymlinks ver
|
||||||
-- then fix them (e.g. with an earlier version)
|
-- then fix them (e.g. with an earlier version)
|
||||||
|
|
||||||
|
lift $ $(logInfo) [i|Removing directory recursively: #{toFilePath dir}|]
|
||||||
|
liftIO $ deleteDirRecursive dir
|
||||||
|
|
||||||
v' <-
|
v' <-
|
||||||
handle
|
handle
|
||||||
(\(e :: ParseError) -> lift $ $(logWarn) [i|#{e}|] >> pure Nothing)
|
(\(e :: ParseError) -> lift $ $(logWarn) [i|#{e}|] >> pure Nothing)
|
||||||
@@ -1305,7 +1319,7 @@ upgradeGHCup dls mtarget force pfreq = do
|
|||||||
handleIO (throwE . CopyError . show) $ liftIO $ copyFile p
|
handleIO (throwE . CopyError . show) $ liftIO $ copyFile p
|
||||||
fullDest
|
fullDest
|
||||||
Overwrite
|
Overwrite
|
||||||
lift $ chmod_777 fullDest
|
lift $ chmod_755 fullDest
|
||||||
pure latestVer
|
pure latestVer
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ import Data.ByteString ( ByteString )
|
|||||||
#if defined(INTERNAL_DOWNLOADER)
|
#if defined(INTERNAL_DOWNLOADER)
|
||||||
import Data.CaseInsensitive ( CI )
|
import Data.CaseInsensitive ( CI )
|
||||||
#endif
|
#endif
|
||||||
|
import Data.List ( find )
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.String.Interpolate
|
import Data.String.Interpolate
|
||||||
import Data.Time.Clock
|
import Data.Time.Clock
|
||||||
@@ -292,7 +293,8 @@ getDownloadInfo t v (PlatformRequest a p mv) dls = maybe
|
|||||||
(case p of
|
(case p of
|
||||||
-- non-musl won't work on alpine
|
-- non-musl won't work on alpine
|
||||||
Linux Alpine -> with_distro <|> without_distro_ver
|
Linux Alpine -> with_distro <|> without_distro_ver
|
||||||
_ -> with_distro <|> without_distro_ver <|> without_distro)
|
_ -> with_distro <|> without_distro_ver <|> without_distro
|
||||||
|
)
|
||||||
|
|
||||||
where
|
where
|
||||||
with_distro = distro_preview id id
|
with_distro = distro_preview id id
|
||||||
@@ -300,7 +302,18 @@ getDownloadInfo t v (PlatformRequest a p mv) dls = maybe
|
|||||||
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
||||||
|
|
||||||
distro_preview f g =
|
distro_preview f g =
|
||||||
preview (ix t % ix v % viArch % ix a % ix (f p) % ix (g mv)) dls
|
let platformVersionSpec =
|
||||||
|
preview (ix t % ix v % viArch % ix a % ix (f p)) dls
|
||||||
|
mv' = g mv
|
||||||
|
in fmap snd
|
||||||
|
. find
|
||||||
|
(\(mverRange, _) -> maybe
|
||||||
|
(mv' == Nothing)
|
||||||
|
(\range -> maybe False (flip versionRange range) mv')
|
||||||
|
mverRange
|
||||||
|
)
|
||||||
|
. M.toList
|
||||||
|
=<< platformVersionSpec
|
||||||
|
|
||||||
|
|
||||||
-- | Tries to download from the given http or https url
|
-- | Tries to download from the given http or https url
|
||||||
|
|||||||
@@ -14,8 +14,10 @@ module GHCup.Requirements where
|
|||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import GHCup.Types.JSON ( )
|
import GHCup.Types.JSON ( )
|
||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
|
import GHCup.Version
|
||||||
|
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
|
import Data.List ( find )
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Optics
|
import Optics
|
||||||
import Prelude hiding ( abs
|
import Prelude hiding ( abs
|
||||||
@@ -23,6 +25,7 @@ import Prelude hiding ( abs
|
|||||||
, writeFile
|
, writeFile
|
||||||
)
|
)
|
||||||
|
|
||||||
|
import qualified Data.Map.Strict as M
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
|
|
||||||
|
|
||||||
@@ -33,15 +36,25 @@ getCommonRequirements :: PlatformResult
|
|||||||
-> ToolRequirements
|
-> ToolRequirements
|
||||||
-> Maybe Requirements
|
-> Maybe Requirements
|
||||||
getCommonRequirements pr tr =
|
getCommonRequirements pr tr =
|
||||||
preview (ix GHC % ix Nothing % ix (_platform pr) % ix (_distroVersion pr)) tr
|
with_distro <|> without_distro_ver <|> without_distro
|
||||||
<|> preview (ix GHC % ix Nothing % ix (_platform pr) % ix Nothing) tr
|
where
|
||||||
<|> preview
|
with_distro = distro_preview _platform _distroVersion
|
||||||
( ix GHC
|
without_distro_ver = distro_preview _platform (const Nothing)
|
||||||
% ix Nothing
|
without_distro = distro_preview (set _Linux UnknownLinux . _platform) (const Nothing)
|
||||||
% ix (set _Linux UnknownLinux $ _platform pr)
|
|
||||||
% ix Nothing
|
distro_preview f g =
|
||||||
)
|
let platformVersionSpec =
|
||||||
tr
|
preview (ix GHC % ix Nothing % ix (f pr)) tr
|
||||||
|
mv' = g pr
|
||||||
|
in fmap snd
|
||||||
|
. find
|
||||||
|
(\(mverRange, _) -> maybe
|
||||||
|
(mv' == Nothing)
|
||||||
|
(\range -> maybe False (flip versionRange range) mv')
|
||||||
|
mverRange
|
||||||
|
)
|
||||||
|
. M.toList
|
||||||
|
=<< platformVersionSpec
|
||||||
|
|
||||||
|
|
||||||
prettyRequirements :: Requirements -> T.Text
|
prettyRequirements :: Requirements -> T.Text
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ Portability : POSIX
|
|||||||
module GHCup.Types where
|
module GHCup.Types where
|
||||||
|
|
||||||
import Data.Map.Strict ( Map )
|
import Data.Map.Strict ( Map )
|
||||||
|
import Data.List.NonEmpty ( NonEmpty (..) )
|
||||||
import Data.Text ( Text )
|
import Data.Text ( Text )
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
import HPath
|
import HPath
|
||||||
@@ -46,7 +47,7 @@ data GHCupInfo = GHCupInfo
|
|||||||
type ToolRequirements = Map Tool ToolReqVersionSpec
|
type ToolRequirements = Map Tool ToolReqVersionSpec
|
||||||
type ToolReqVersionSpec = Map (Maybe Version) PlatformReqSpec
|
type ToolReqVersionSpec = Map (Maybe Version) PlatformReqSpec
|
||||||
type PlatformReqSpec = Map Platform PlatformReqVersionSpec
|
type PlatformReqSpec = Map Platform PlatformReqVersionSpec
|
||||||
type PlatformReqVersionSpec = Map (Maybe Versioning) Requirements
|
type PlatformReqVersionSpec = Map (Maybe VersionRange) Requirements
|
||||||
|
|
||||||
|
|
||||||
data Requirements = Requirements
|
data Requirements = Requirements
|
||||||
@@ -70,7 +71,7 @@ type GHCupDownloads = Map Tool ToolVersionSpec
|
|||||||
type ToolVersionSpec = Map Version VersionInfo
|
type ToolVersionSpec = Map Version VersionInfo
|
||||||
type ArchitectureSpec = Map Architecture PlatformSpec
|
type ArchitectureSpec = Map Architecture PlatformSpec
|
||||||
type PlatformSpec = Map Platform PlatformVersionSpec
|
type PlatformSpec = Map Platform PlatformVersionSpec
|
||||||
type PlatformVersionSpec = Map (Maybe Versioning) DownloadInfo
|
type PlatformVersionSpec = Map (Maybe VersionRange) DownloadInfo
|
||||||
|
|
||||||
|
|
||||||
-- | An installable tool.
|
-- | An installable tool.
|
||||||
@@ -307,7 +308,7 @@ data PlatformResult = PlatformResult
|
|||||||
|
|
||||||
prettyPlatform :: PlatformResult -> String
|
prettyPlatform :: PlatformResult -> String
|
||||||
prettyPlatform PlatformResult { _platform = plat, _distroVersion = Just v' }
|
prettyPlatform PlatformResult { _platform = plat, _distroVersion = Just v' }
|
||||||
= show plat <> ", " <> show v'
|
= show plat <> ", " <> T.unpack (prettyV v')
|
||||||
prettyPlatform PlatformResult { _platform = plat, _distroVersion = Nothing }
|
prettyPlatform PlatformResult { _platform = plat, _distroVersion = Nothing }
|
||||||
= show plat
|
= show plat
|
||||||
|
|
||||||
@@ -344,3 +345,19 @@ prettyTVer :: GHCTargetVersion -> Text
|
|||||||
prettyTVer (GHCTargetVersion (Just t) v') = t <> "-" <> prettyVer v'
|
prettyTVer (GHCTargetVersion (Just t) v') = t <> "-" <> prettyVer v'
|
||||||
prettyTVer (GHCTargetVersion Nothing v') = prettyVer v'
|
prettyTVer (GHCTargetVersion Nothing v') = prettyVer v'
|
||||||
|
|
||||||
|
|
||||||
|
-- | A comparator and a version.
|
||||||
|
data VersionCmp = VR_gt Versioning
|
||||||
|
| VR_gteq Versioning
|
||||||
|
| VR_lt Versioning
|
||||||
|
| VR_lteq Versioning
|
||||||
|
| VR_eq Versioning
|
||||||
|
deriving (Eq, GHC.Generic, Ord, Show)
|
||||||
|
|
||||||
|
|
||||||
|
-- | A version range. Supports && and ||, but not arbitrary
|
||||||
|
-- combinations. This is a little simplified.
|
||||||
|
data VersionRange = SimpleRange (NonEmpty VersionCmp) -- And
|
||||||
|
| OrRange (NonEmpty VersionCmp) VersionRange
|
||||||
|
deriving (Eq, GHC.Generic, Ord, Show)
|
||||||
|
|
||||||
|
|||||||
@@ -22,22 +22,28 @@ Portability : POSIX
|
|||||||
module GHCup.Types.JSON where
|
module GHCup.Types.JSON where
|
||||||
|
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
|
import GHCup.Utils.MegaParsec
|
||||||
import GHCup.Utils.Prelude
|
import GHCup.Utils.Prelude
|
||||||
|
|
||||||
import Control.Applicative ( (<|>) )
|
import Control.Applicative ( (<|>) )
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
import Data.Aeson.Types
|
import Data.Aeson.Types
|
||||||
|
import Data.List.NonEmpty ( NonEmpty(..) )
|
||||||
import Data.Text.Encoding as E
|
import Data.Text.Encoding as E
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
|
import Data.Void
|
||||||
import Data.Word8
|
import Data.Word8
|
||||||
import HPath
|
import HPath
|
||||||
import URI.ByteString
|
import URI.ByteString
|
||||||
import Text.Casing
|
import Text.Casing
|
||||||
|
|
||||||
import qualified Data.ByteString as BS
|
import qualified Data.ByteString as BS
|
||||||
|
import qualified Data.List.NonEmpty as NE
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Graphics.Vty as Vty
|
import qualified Graphics.Vty as Vty
|
||||||
|
import qualified Text.Megaparsec as MP
|
||||||
|
import qualified Text.Megaparsec.Char as MPC
|
||||||
|
|
||||||
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
||||||
@@ -111,10 +117,10 @@ instance ToJSONKey (Maybe Versioning) where
|
|||||||
|
|
||||||
instance FromJSONKey (Maybe Versioning) where
|
instance FromJSONKey (Maybe Versioning) where
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
||||||
if t == T.pack "unknown_versioning" then pure Nothing else pure $ just t
|
if t == T.pack "unknown_versioning" then pure Nothing else just t
|
||||||
where
|
where
|
||||||
just t = case versioning t of
|
just t = case versioning t of
|
||||||
Right x -> pure x
|
Right x -> pure $ Just x
|
||||||
Left e -> fail $ "Failure in (Maybe Versioning) (FromJSONKey)" <> show e
|
Left e -> fail $ "Failure in (Maybe Versioning) (FromJSONKey)" <> show e
|
||||||
|
|
||||||
instance ToJSONKey Platform where
|
instance ToJSONKey Platform where
|
||||||
@@ -157,10 +163,10 @@ instance ToJSONKey (Maybe Version) where
|
|||||||
|
|
||||||
instance FromJSONKey (Maybe Version) where
|
instance FromJSONKey (Maybe Version) where
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
||||||
if t == T.pack "unknown_version" then pure Nothing else pure $ just t
|
if t == T.pack "unknown_version" then pure Nothing else just t
|
||||||
where
|
where
|
||||||
just t = case version t of
|
just t = case version t of
|
||||||
Right x -> pure x
|
Right x -> pure $ Just x
|
||||||
Left e -> fail $ "Failure in (Maybe Version) (FromJSONKey)" <> show e
|
Left e -> fail $ "Failure in (Maybe Version) (FromJSONKey)" <> show e
|
||||||
|
|
||||||
instance ToJSON Version where
|
instance ToJSON Version where
|
||||||
@@ -220,3 +226,101 @@ instance FromJSON TarDir where
|
|||||||
regexDir = withObject "TarDir" $ \o -> do
|
regexDir = withObject "TarDir" $ \o -> do
|
||||||
r <- o .: "RegexDir"
|
r <- o .: "RegexDir"
|
||||||
pure $ RegexDir r
|
pure $ RegexDir r
|
||||||
|
|
||||||
|
|
||||||
|
instance ToJSON VersionCmp where
|
||||||
|
toJSON = String . versionCmpToText
|
||||||
|
|
||||||
|
instance FromJSON VersionCmp where
|
||||||
|
parseJSON = withText "VersionCmp" $ \t -> do
|
||||||
|
case MP.parse versionCmpP "" t of
|
||||||
|
Right r -> pure r
|
||||||
|
Left e -> fail (MP.errorBundlePretty e)
|
||||||
|
|
||||||
|
versionCmpToText :: VersionCmp -> T.Text
|
||||||
|
versionCmpToText (VR_gt ver') = "> " <> prettyV ver'
|
||||||
|
versionCmpToText (VR_gteq ver') = ">= " <> prettyV ver'
|
||||||
|
versionCmpToText (VR_lt ver') = "< " <> prettyV ver'
|
||||||
|
versionCmpToText (VR_lteq ver') = "<= " <> prettyV ver'
|
||||||
|
versionCmpToText (VR_eq ver') = "== " <> prettyV ver'
|
||||||
|
|
||||||
|
versionCmpP :: MP.Parsec Void T.Text VersionCmp
|
||||||
|
versionCmpP =
|
||||||
|
fmap VR_gt (MP.try $ MPC.space *> MP.chunk ">" *> MPC.space *> versioningEnd)
|
||||||
|
<|> fmap
|
||||||
|
VR_gteq
|
||||||
|
(MP.try $ MPC.space *> MP.chunk ">=" *> MPC.space *> versioningEnd)
|
||||||
|
<|> fmap
|
||||||
|
VR_lt
|
||||||
|
(MP.try $ MPC.space *> MP.chunk "<" *> MPC.space *> versioningEnd)
|
||||||
|
<|> fmap
|
||||||
|
VR_lteq
|
||||||
|
(MP.try $ MPC.space *> MP.chunk "<=" *> MPC.space *> versioningEnd)
|
||||||
|
<|> fmap
|
||||||
|
VR_eq
|
||||||
|
(MP.try $ MPC.space *> MP.chunk "==" *> MPC.space *> versioningEnd)
|
||||||
|
<|> fmap
|
||||||
|
VR_eq
|
||||||
|
(MP.try $ MPC.space *> versioningEnd)
|
||||||
|
|
||||||
|
instance ToJSON VersionRange where
|
||||||
|
toJSON = String . verRangeToText
|
||||||
|
|
||||||
|
verRangeToText :: VersionRange -> T.Text
|
||||||
|
verRangeToText (SimpleRange cmps) =
|
||||||
|
let inner = foldr1 (\x y -> x <> " && " <> y)
|
||||||
|
(versionCmpToText <$> NE.toList cmps)
|
||||||
|
in "( " <> inner <> " )"
|
||||||
|
verRangeToText (OrRange cmps range) =
|
||||||
|
let left = verRangeToText $ (SimpleRange cmps)
|
||||||
|
right = verRangeToText range
|
||||||
|
in left <> " || " <> right
|
||||||
|
|
||||||
|
instance FromJSON VersionRange where
|
||||||
|
parseJSON = withText "VersionRange" $ \t -> do
|
||||||
|
case MP.parse versionRangeP "" t of
|
||||||
|
Right r -> pure r
|
||||||
|
Left e -> fail (MP.errorBundlePretty e)
|
||||||
|
|
||||||
|
versionRangeP :: MP.Parsec Void T.Text VersionRange
|
||||||
|
versionRangeP = go <* MP.eof
|
||||||
|
where
|
||||||
|
go =
|
||||||
|
MP.try orParse
|
||||||
|
<|> MP.try (fmap SimpleRange andParse)
|
||||||
|
<|> (fmap (SimpleRange . pure) versionCmpP)
|
||||||
|
|
||||||
|
orParse :: MP.Parsec Void T.Text VersionRange
|
||||||
|
orParse =
|
||||||
|
(\a o -> OrRange a o)
|
||||||
|
<$> (MP.try andParse <|> fmap pure versionCmpP)
|
||||||
|
<*> (MPC.space *> MP.chunk "||" *> MPC.space *> go)
|
||||||
|
|
||||||
|
andParse :: MP.Parsec Void T.Text (NonEmpty VersionCmp)
|
||||||
|
andParse =
|
||||||
|
fmap (\h t -> h :| t)
|
||||||
|
(MPC.space *> MP.chunk "(" *> MPC.space *> versionCmpP)
|
||||||
|
<*> ( MP.try
|
||||||
|
$ MP.many (MPC.space *> MP.chunk "&&" *> MPC.space *> versionCmpP)
|
||||||
|
)
|
||||||
|
<* MPC.space
|
||||||
|
<* MP.chunk ")"
|
||||||
|
<* MPC.space
|
||||||
|
|
||||||
|
versioningEnd :: MP.Parsec Void T.Text Versioning
|
||||||
|
versioningEnd =
|
||||||
|
MP.try (verP (MP.chunk " " <|> MP.chunk ")" <|> MP.chunk "&&") <* MPC.space)
|
||||||
|
<|> versioning'
|
||||||
|
|
||||||
|
instance ToJSONKey (Maybe VersionRange) where
|
||||||
|
toJSONKey = toJSONKeyText $ \case
|
||||||
|
Just x -> verRangeToText x
|
||||||
|
Nothing -> "unknown_versioning"
|
||||||
|
|
||||||
|
instance FromJSONKey (Maybe VersionRange) where
|
||||||
|
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
||||||
|
if t == T.pack "unknown_versioning" then pure Nothing else just t
|
||||||
|
where
|
||||||
|
just t = case MP.parse versionRangeP "" t of
|
||||||
|
Right x -> pure $ Just x
|
||||||
|
Left e -> fail $ "Failure in (Maybe VersionRange) (FromJSONKey)" <> MP.errorBundlePretty e
|
||||||
|
|||||||
@@ -112,33 +112,40 @@ ghcLinkDestination tool ver = do
|
|||||||
|
|
||||||
|
|
||||||
-- | Removes the minor GHC symlinks, e.g. ghc-8.6.5.
|
-- | Removes the minor GHC symlinks, e.g. ghc-8.6.5.
|
||||||
rmMinorSymlinks :: (MonadReader AppState m, MonadIO m, MonadLogger m) => GHCTargetVersion -> m ()
|
rmMinorSymlinks :: ( MonadReader AppState m
|
||||||
rmMinorSymlinks GHCTargetVersion {..} = do
|
, MonadIO m
|
||||||
AppState { dirs = Dirs {..} } <- ask
|
, MonadLogger m
|
||||||
|
, MonadThrow m
|
||||||
files <- liftIO $ findFiles'
|
, MonadFail m
|
||||||
binDir
|
, MonadReader AppState m
|
||||||
( maybe mempty (\x -> MP.chunk (x <> "-")) _tvTarget
|
)
|
||||||
*> parseUntil1 (MP.chunk $ prettyVer _tvVersion)
|
=> GHCTargetVersion
|
||||||
*> (MP.chunk $ prettyVer _tvVersion)
|
-> Excepts '[NotInstalled] m ()
|
||||||
*> MP.eof
|
rmMinorSymlinks tv@(GHCTargetVersion {..}) = do
|
||||||
)
|
AppState { dirs = Dirs {..} } <- lift ask
|
||||||
|
|
||||||
|
files <- liftE $ ghcToolFiles tv
|
||||||
forM_ files $ \f -> do
|
forM_ files $ \f -> do
|
||||||
let fullF = (binDir </> f)
|
f_xyz <- liftIO $ parseRel (toFilePath f <> B.singleton _hyphen <> verToBS _tvVersion)
|
||||||
$(logDebug) [i|rm -f #{toFilePath fullF}|]
|
let fullF = (binDir </> f_xyz)
|
||||||
|
lift $ $(logDebug) [i|rm -f #{toFilePath fullF}|]
|
||||||
liftIO $ hideError doesNotExistErrorType $ deleteFile fullF
|
liftIO $ hideError doesNotExistErrorType $ deleteFile fullF
|
||||||
|
|
||||||
|
|
||||||
-- | Removes the set ghc version for the given target, if any.
|
-- | Removes the set ghc version for the given target, if any.
|
||||||
rmPlain :: (MonadReader AppState m, MonadLogger m, MonadThrow m, MonadFail m, MonadIO m)
|
rmPlain :: ( MonadReader AppState m
|
||||||
=> Maybe Text -- ^ target
|
, MonadLogger m
|
||||||
|
, MonadThrow m
|
||||||
|
, MonadFail m
|
||||||
|
, MonadIO m
|
||||||
|
)
|
||||||
|
=> Maybe Text -- ^ target
|
||||||
-> Excepts '[NotInstalled] m ()
|
-> Excepts '[NotInstalled] m ()
|
||||||
rmPlain target = do
|
rmPlain target = do
|
||||||
AppState { dirs = Dirs {..} } <- lift ask
|
AppState { dirs = Dirs {..} } <- lift ask
|
||||||
mtv <- lift $ ghcSet target
|
mtv <- lift $ ghcSet target
|
||||||
forM_ mtv $ \tv -> do
|
forM_ mtv $ \tv -> do
|
||||||
files <- liftE $ ghcToolFiles tv
|
files <- liftE $ ghcToolFiles tv
|
||||||
forM_ files $ \f -> do
|
forM_ files $ \f -> do
|
||||||
let fullF = (binDir </> f)
|
let fullF = (binDir </> f)
|
||||||
lift $ $(logDebug) [i|rm -f #{toFilePath fullF}|]
|
lift $ $(logDebug) [i|rm -f #{toFilePath fullF}|]
|
||||||
@@ -150,25 +157,25 @@ rmPlain target = do
|
|||||||
|
|
||||||
|
|
||||||
-- | Remove the major GHC symlink, e.g. ghc-8.6.
|
-- | Remove the major GHC symlink, e.g. ghc-8.6.
|
||||||
rmMajorSymlinks :: (MonadReader AppState m, MonadThrow m, MonadLogger m, MonadIO m)
|
rmMajorSymlinks :: ( MonadReader AppState m
|
||||||
|
, MonadIO m
|
||||||
|
, MonadLogger m
|
||||||
|
, MonadThrow m
|
||||||
|
, MonadFail m
|
||||||
|
, MonadReader AppState m
|
||||||
|
)
|
||||||
=> GHCTargetVersion
|
=> GHCTargetVersion
|
||||||
-> m ()
|
-> Excepts '[NotInstalled] m ()
|
||||||
rmMajorSymlinks GHCTargetVersion {..} = do
|
rmMajorSymlinks tv@(GHCTargetVersion {..}) = do
|
||||||
AppState { dirs = Dirs {..} } <- ask
|
AppState { dirs = Dirs {..} } <- lift ask
|
||||||
(mj, mi) <- getMajorMinorV _tvVersion
|
(mj, mi) <- getMajorMinorV _tvVersion
|
||||||
let v' = intToText mj <> "." <> intToText mi
|
let v' = intToText mj <> "." <> intToText mi
|
||||||
|
|
||||||
files <- liftIO $ findFiles'
|
files <- liftE $ ghcToolFiles tv
|
||||||
binDir
|
|
||||||
( maybe mempty (\x -> MP.chunk (x <> "-")) _tvTarget
|
|
||||||
*> parseUntil1 (MP.chunk v')
|
|
||||||
*> MP.chunk v'
|
|
||||||
*> MP.eof
|
|
||||||
)
|
|
||||||
|
|
||||||
forM_ files $ \f -> do
|
forM_ files $ \f -> do
|
||||||
let fullF = (binDir </> f)
|
f_xyz <- liftIO $ parseRel (toFilePath f <> B.singleton _hyphen <> E.encodeUtf8 v')
|
||||||
$(logDebug) [i|rm -f #{toFilePath fullF}|]
|
let fullF = (binDir </> f_xyz)
|
||||||
|
lift $ $(logDebug) [i|rm -f #{toFilePath fullF}|]
|
||||||
liftIO $ hideError doesNotExistErrorType $ deleteFile fullF
|
liftIO $ hideError doesNotExistErrorType $ deleteFile fullF
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -440,13 +440,16 @@ isBrokenSymlink p =
|
|||||||
pure False
|
pure False
|
||||||
|
|
||||||
|
|
||||||
chmod_777 :: (MonadLogger m, MonadIO m) => Path a -> m ()
|
chmod_755 :: (MonadLogger m, MonadIO m) => Path a -> m ()
|
||||||
chmod_777 (toFilePath -> fp) = do
|
chmod_755 (toFilePath -> fp) = do
|
||||||
let exe_mode =
|
let exe_mode =
|
||||||
newFilePerms
|
nullFileMode
|
||||||
`unionFileModes` ownerExecuteMode
|
`unionFileModes` ownerExecuteMode
|
||||||
|
`unionFileModes` ownerReadMode
|
||||||
|
`unionFileModes` ownerWriteMode
|
||||||
`unionFileModes` groupExecuteMode
|
`unionFileModes` groupExecuteMode
|
||||||
|
`unionFileModes` groupReadMode
|
||||||
`unionFileModes` otherExecuteMode
|
`unionFileModes` otherExecuteMode
|
||||||
$(logDebug) [i|chmod 777 #{fp}|]
|
`unionFileModes` otherReadMode
|
||||||
|
$(logDebug) [i|chmod 755 #{fp}|]
|
||||||
liftIO $ setFileMode fp exe_mode
|
liftIO $ setFileMode fp exe_mode
|
||||||
|
|
||||||
|
|||||||
@@ -74,13 +74,13 @@ ghcTargetBinP t =
|
|||||||
ghcTargetVerP :: MP.Parsec Void Text GHCTargetVersion
|
ghcTargetVerP :: MP.Parsec Void Text GHCTargetVersion
|
||||||
ghcTargetVerP =
|
ghcTargetVerP =
|
||||||
(\x y -> GHCTargetVersion x y)
|
(\x y -> GHCTargetVersion x y)
|
||||||
<$> (MP.try (Just <$> (parseUntil1 (MP.chunk "-" *> verP)) <* MP.chunk "-")
|
<$> (MP.try (Just <$> (parseUntil1 (MP.chunk "-" *> verP')) <* MP.chunk "-")
|
||||||
<|> (flip const Nothing <$> mempty)
|
<|> (flip const Nothing <$> mempty)
|
||||||
)
|
)
|
||||||
<*> (version' <* MP.eof)
|
<*> (version' <* MP.eof)
|
||||||
where
|
where
|
||||||
verP :: MP.Parsec Void Text Text
|
verP' :: MP.Parsec Void Text Text
|
||||||
verP = do
|
verP' = do
|
||||||
v <- version'
|
v <- version'
|
||||||
let startsWithDigists =
|
let startsWithDigists =
|
||||||
and
|
and
|
||||||
@@ -97,3 +97,16 @@ ghcTargetVerP =
|
|||||||
if startsWithDigists && not (isJust (_vEpoch v))
|
if startsWithDigists && not (isJust (_vEpoch v))
|
||||||
then pure $ prettyVer v
|
then pure $ prettyVer v
|
||||||
else fail "Oh"
|
else fail "Oh"
|
||||||
|
|
||||||
|
|
||||||
|
verP :: MP.Parsec Void Text Text -> MP.Parsec Void Text Versioning
|
||||||
|
verP suffix = do
|
||||||
|
ver <- parseUntil suffix
|
||||||
|
if T.null ver
|
||||||
|
then fail "empty version"
|
||||||
|
else do
|
||||||
|
rest <- MP.getInput
|
||||||
|
MP.setInput ver
|
||||||
|
v <- versioning'
|
||||||
|
MP.setInput rest
|
||||||
|
pure v
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
{-|
|
{-|
|
||||||
Module : GHCup.Version
|
Module : GHCup.Version
|
||||||
Description : Static version information
|
Description : Version information and version handling.
|
||||||
Copyright : (c) Julian Ospald, 2020
|
Copyright : (c) Julian Ospald, 2020
|
||||||
License : LGPL-3.0
|
License : LGPL-3.0
|
||||||
Maintainer : hasufell@hasufell.de
|
Maintainer : hasufell@hasufell.de
|
||||||
@@ -13,6 +13,7 @@ Portability : POSIX
|
|||||||
module GHCup.Version where
|
module GHCup.Version where
|
||||||
|
|
||||||
import GHCup.Utils.Version.QQ
|
import GHCup.Utils.Version.QQ
|
||||||
|
import GHCup.Types
|
||||||
|
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
import URI.ByteString
|
import URI.ByteString
|
||||||
@@ -22,7 +23,7 @@ import qualified Data.Text as T
|
|||||||
|
|
||||||
-- | This reflects the API version of the YAML.
|
-- | This reflects the API version of the YAML.
|
||||||
ghcupURL :: URI
|
ghcupURL :: URI
|
||||||
ghcupURL = [uri|https://www.haskell.org/ghcup/data/ghcup-0.0.3.yaml|]
|
ghcupURL = [uri|https://www.haskell.org/ghcup/data/ghcup-0.0.4.yaml|]
|
||||||
|
|
||||||
-- | The current ghcup version.
|
-- | The current ghcup version.
|
||||||
ghcUpVer :: PVP
|
ghcUpVer :: PVP
|
||||||
@@ -31,3 +32,16 @@ ghcUpVer = [pver|0.1.12|]
|
|||||||
-- | ghcup version as numeric string.
|
-- | ghcup version as numeric string.
|
||||||
numericVer :: String
|
numericVer :: String
|
||||||
numericVer = T.unpack . prettyPVP $ ghcUpVer
|
numericVer = T.unpack . prettyPVP $ ghcUpVer
|
||||||
|
|
||||||
|
versionCmp :: Versioning -> VersionCmp -> Bool
|
||||||
|
versionCmp ver1 (VR_gt ver2) = ver1 > ver2
|
||||||
|
versionCmp ver1 (VR_gteq ver2) = ver1 >= ver2
|
||||||
|
versionCmp ver1 (VR_lt ver2) = ver1 < ver2
|
||||||
|
versionCmp ver1 (VR_lteq ver2) = ver1 <= ver2
|
||||||
|
versionCmp ver1 (VR_eq ver2) = ver1 == ver2
|
||||||
|
|
||||||
|
versionRange :: Versioning -> VersionRange -> Bool
|
||||||
|
versionRange ver' (SimpleRange cmps) = and $ fmap (versionCmp ver') cmps
|
||||||
|
versionRange ver' (OrRange cmps range) =
|
||||||
|
versionRange ver' (SimpleRange cmps) || versionRange ver' range
|
||||||
|
|
||||||
|
|||||||
@@ -159,6 +159,18 @@ instance Arbitrary VersionInfo where
|
|||||||
arbitrary = genericArbitrary
|
arbitrary = genericArbitrary
|
||||||
shrink = genericShrink
|
shrink = genericShrink
|
||||||
|
|
||||||
|
instance Arbitrary VersionRange where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
shrink = genericShrink
|
||||||
|
|
||||||
|
instance Arbitrary (NonEmpty VersionCmp) where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
shrink = genericShrink
|
||||||
|
|
||||||
|
instance Arbitrary VersionCmp where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
shrink = genericShrink
|
||||||
|
|
||||||
instance Arbitrary (Path Rel) where
|
instance Arbitrary (Path Rel) where
|
||||||
arbitrary =
|
arbitrary =
|
||||||
(either (error . show) id . parseRel . E.encodeUtf8 . T.pack)
|
(either (error . show) id . parseRel . E.encodeUtf8 . T.pack)
|
||||||
|
|||||||
Reference in New Issue
Block a user