Compare commits
1 Commits
fix-optpar
...
v0.1.19.5
| Author | SHA1 | Date | |
|---|---|---|---|
| f7bd5ef45a |
@@ -1,11 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
end_of_line = LF
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
|
|
||||||
[*.hs]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
max_line_length = 80
|
|
||||||
2
.github/scripts/build.sh
vendored
2
.github/scripts/build.sh
vendored
@@ -27,11 +27,9 @@ build_with_cache --project-file=cabal.project.release -w "${GHC}" --enable-tests
|
|||||||
mkdir -p out
|
mkdir -p out
|
||||||
binary=$(cabal --project-file=cabal.project.release list-bin ghcup)
|
binary=$(cabal --project-file=cabal.project.release list-bin ghcup)
|
||||||
binary_test=$(cabal --project-file=cabal.project.release list-bin ghcup-test)
|
binary_test=$(cabal --project-file=cabal.project.release list-bin ghcup-test)
|
||||||
binary_opttest=$(cabal --project-file=cabal.project.release list-bin ghcup-optparse-test)
|
|
||||||
ver=$("${binary}" --numeric-version)
|
ver=$("${binary}" --numeric-version)
|
||||||
strip_binary "${binary}"
|
strip_binary "${binary}"
|
||||||
cp "${binary}" "out/${ARTIFACT}-${ver}${ext}"
|
cp "${binary}" "out/${ARTIFACT}-${ver}${ext}"
|
||||||
cp "${binary_test}" "out/test-${ARTIFACT}-${ver}${ext}"
|
cp "${binary_test}" "out/test-${ARTIFACT}-${ver}${ext}"
|
||||||
cp "${binary_opttest}" "out/test-optparse-${ARTIFACT}-${ver}${ext}"
|
|
||||||
cp ./dist-newstyle/cache/plan.json "out/${ARTIFACT}.plan.json"
|
cp ./dist-newstyle/cache/plan.json "out/${ARTIFACT}.plan.json"
|
||||||
|
|
||||||
|
|||||||
74
.github/scripts/cross.sh
vendored
74
.github/scripts/cross.sh
vendored
@@ -1,74 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
. .github/scripts/common.sh
|
|
||||||
|
|
||||||
run() {
|
|
||||||
"$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "${OS}" = "Windows" ] ; then
|
|
||||||
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/ghcup
|
|
||||||
else
|
|
||||||
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup
|
|
||||||
fi
|
|
||||||
|
|
||||||
git_describe
|
|
||||||
|
|
||||||
rm -rf "${GHCUP_DIR}"
|
|
||||||
mkdir -p "${GHCUP_BIN}"
|
|
||||||
|
|
||||||
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
|
||||||
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
|
||||||
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
|
||||||
chmod +x "ghcup-test${ext}"
|
|
||||||
|
|
||||||
"$GHCUP_BIN/ghcup${ext}" --version
|
|
||||||
eghcup --version
|
|
||||||
sha_sum "$GHCUP_BIN/ghcup${ext}"
|
|
||||||
sha_sum "$(raw_eghcup --offline whereis ghcup)"
|
|
||||||
|
|
||||||
|
|
||||||
### cross build
|
|
||||||
|
|
||||||
eghcup --numeric-version
|
|
||||||
|
|
||||||
eghcup install ghc "${GHC_VER}"
|
|
||||||
eghcup set ghc "${GHC_VER}"
|
|
||||||
eghcup install cabal "${CABAL_VER}"
|
|
||||||
|
|
||||||
cabal --version
|
|
||||||
|
|
||||||
eghcup debug-info
|
|
||||||
|
|
||||||
ecabal update
|
|
||||||
|
|
||||||
"${WRAPPER}" "$GHCUP_BIN/ghcup${ext}" -c -s "file://$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" -v \
|
|
||||||
compile ghc \
|
|
||||||
$(if [ -n "${HADRIAN_FLAVOUR}" ] ; then printf "%s" "--flavour=${HADRIAN_FLAVOUR}" ; else true ; fi) \
|
|
||||||
-j "$(nproc)" \
|
|
||||||
-v "${GHC_TARGET_VERSION}" \
|
|
||||||
-b "${GHC_VER}" \
|
|
||||||
-x "${CROSS}" \
|
|
||||||
-- ${BUILD_CONF_ARGS}
|
|
||||||
eghcup set ghc "${CROSS}-${GHC_TARGET_VERSION}"
|
|
||||||
|
|
||||||
[ "$($(eghcup whereis ghc "${CROSS}-${GHC_TARGET_VERSION}") --numeric-version)" = "${GHC_TARGET_VERSION}" ]
|
|
||||||
|
|
||||||
# test that doing fishy symlinks into GHCup dir doesn't cause weird stuff on 'ghcup nuke'
|
|
||||||
mkdir no_nuke/
|
|
||||||
mkdir no_nuke/bar
|
|
||||||
echo 'foo' > no_nuke/file
|
|
||||||
echo 'bar' > no_nuke/bar/file
|
|
||||||
ln -s "$CI_PROJECT_DIR"/no_nuke/ "${GHCUP_DIR}"/cache/no_nuke
|
|
||||||
ln -s "$CI_PROJECT_DIR"/no_nuke/ "${GHCUP_DIR}"/logs/no_nuke
|
|
||||||
|
|
||||||
# nuke
|
|
||||||
eghcup nuke
|
|
||||||
[ ! -e "${GHCUP_DIR}" ]
|
|
||||||
|
|
||||||
# make sure nuke doesn't resolve symlinks
|
|
||||||
[ -e "$CI_PROJECT_DIR"/no_nuke/file ]
|
|
||||||
[ -e "$CI_PROJECT_DIR"/no_nuke/bar/file ]
|
|
||||||
|
|
||||||
5
.github/scripts/test.sh
vendored
5
.github/scripts/test.sh
vendored
@@ -18,10 +18,8 @@ mkdir -p "${GHCUP_BIN}"
|
|||||||
|
|
||||||
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
||||||
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
||||||
cp "out/test-optparse-${ARTIFACT}"-* "ghcup-test-optparse${ext}"
|
|
||||||
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
||||||
chmod +x "ghcup-test${ext}"
|
chmod +x "ghcup-test${ext}"
|
||||||
chmod +x "ghcup-test-optparse${ext}"
|
|
||||||
|
|
||||||
"$GHCUP_BIN/ghcup${ext}" --version
|
"$GHCUP_BIN/ghcup${ext}" --version
|
||||||
eghcup --version
|
eghcup --version
|
||||||
@@ -31,8 +29,7 @@ sha_sum "$(raw_eghcup --offline whereis ghcup)"
|
|||||||
### Haskell test suite
|
### Haskell test suite
|
||||||
|
|
||||||
./ghcup-test${ext}
|
./ghcup-test${ext}
|
||||||
./ghcup-test-optparse${ext}
|
rm ghcup-test${ext}
|
||||||
rm ghcup-test${ext} ghcup-test-optparse${ext}
|
|
||||||
|
|
||||||
### manual cli based testing
|
### manual cli based testing
|
||||||
|
|
||||||
|
|||||||
140
.github/workflows/cross.yaml
vendored
140
.github/workflows/cross.yaml
vendored
@@ -1,140 +0,0 @@
|
|||||||
name: Test cross bindists
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *'
|
|
||||||
|
|
||||||
env:
|
|
||||||
CABAL_CACHE_DISABLE: ${{ vars.CABAL_CACHE_DISABLE }}
|
|
||||||
CABAL_CACHE_NONFATAL: yes
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build linux binary
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
CABAL_VER: 3.10.1.0
|
|
||||||
JSON_VERSION: "0.0.7"
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
||||||
S3_HOST: ${{ secrets.S3_HOST }}
|
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
|
||||||
GHC_VER: 8.10.7
|
|
||||||
ARCH: 64
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: 'true'
|
|
||||||
|
|
||||||
- name: Run build
|
|
||||||
uses: docker://hasufell/alpine-haskell:3.12
|
|
||||||
with:
|
|
||||||
args: sh .github/scripts/build.sh
|
|
||||||
env:
|
|
||||||
ARTIFACT: ${{ env.ARTIFACT }}
|
|
||||||
ARCH: ${{ env.ARCH }}
|
|
||||||
GHC_VER: ${{ env.GHC_VER }}
|
|
||||||
DISTRO: Alpine
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }}
|
|
||||||
S3_HOST: ${{ env.S3_HOST }}
|
|
||||||
|
|
||||||
- if: always()
|
|
||||||
name: Upload artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: artifacts
|
|
||||||
path: |
|
|
||||||
./out/*
|
|
||||||
|
|
||||||
test-cross-linux:
|
|
||||||
name: Test linux cross
|
|
||||||
needs: "build"
|
|
||||||
runs-on: [self-hosted, Linux, X64]
|
|
||||||
container:
|
|
||||||
image: registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:8d0224e6b2a08157649651e69302380b2bd24e11
|
|
||||||
options: --user root
|
|
||||||
env:
|
|
||||||
CABAL_VER: 3.6.2.0
|
|
||||||
BUILD_CONF_ARGS: "--enable-unregisterised"
|
|
||||||
HADRIAN_FLAVOUR: ""
|
|
||||||
JSON_VERSION: "0.0.7"
|
|
||||||
GHC_VER: 8.10.6
|
|
||||||
GHC_TARGET_VERSION: "8.10.7"
|
|
||||||
ARCH: 64
|
|
||||||
DISTRO: Debian
|
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
|
||||||
CROSS: "arm-linux-gnueabihf"
|
|
||||||
WRAPPER: "run"
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: 'true'
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: artifacts
|
|
||||||
path: ./out
|
|
||||||
|
|
||||||
- name: Run test (64 bit linux)
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -y
|
|
||||||
sudo apt-get install -y libnuma-dev zlib1g-dev libgmp-dev libgmp10 libssl-dev liblzma-dev libbz2-dev git wget lsb-release software-properties-common gnupg2 apt-transport-https gcc autoconf automake build-essential curl gzip
|
|
||||||
sudo apt-get install -y gcc-arm-linux-gnueabihf
|
|
||||||
sudo dpkg --add-architecture armhf
|
|
||||||
sudo apt-get update -y
|
|
||||||
sudo apt-get install -y libncurses-dev:armhf
|
|
||||||
sh .github/scripts/cross.sh
|
|
||||||
|
|
||||||
test-cross-js:
|
|
||||||
name: Test GHC JS cross
|
|
||||||
needs: "build"
|
|
||||||
runs-on: [self-hosted, Linux, X64]
|
|
||||||
container:
|
|
||||||
image: registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:8d0224e6b2a08157649651e69302380b2bd24e11
|
|
||||||
options: --user root
|
|
||||||
env:
|
|
||||||
CABAL_VER: 3.6.2.0
|
|
||||||
BUILD_CONF_ARGS: ""
|
|
||||||
HADRIAN_FLAVOUR: "default+native_bignum"
|
|
||||||
JSON_VERSION: "0.0.7"
|
|
||||||
GHC_VER: 9.6.2
|
|
||||||
GHC_TARGET_VERSION: "9.6.2"
|
|
||||||
ARCH: 64
|
|
||||||
DISTRO: Debian
|
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
|
||||||
CROSS: "javascript-unknown-ghcjs"
|
|
||||||
WRAPPER: "emconfigure"
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: 'true'
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: artifacts
|
|
||||||
path: ./out
|
|
||||||
|
|
||||||
- name: Run test (64 bit linux)
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -y
|
|
||||||
sudo apt-get install -y libnuma-dev zlib1g-dev libgmp-dev libgmp10 libssl-dev liblzma-dev libbz2-dev git wget lsb-release software-properties-common gnupg2 apt-transport-https gcc autoconf automake build-essential curl gzip
|
|
||||||
git clone https://github.com/emscripten-core/emsdk.git
|
|
||||||
cd emsdk
|
|
||||||
./emsdk install latest
|
|
||||||
./emsdk activate latest
|
|
||||||
. ./emsdk_env.sh
|
|
||||||
cd ..
|
|
||||||
bash .github/scripts/cross.sh
|
|
||||||
|
|
||||||
@@ -218,6 +218,7 @@ ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
|||||||
printNotes ListResult {..} =
|
printNotes ListResult {..} =
|
||||||
(if hlsPowered then [withAttr (attrName "hls-powered") $ str "hls-powered"] else mempty
|
(if hlsPowered then [withAttr (attrName "hls-powered") $ str "hls-powered"] else mempty
|
||||||
)
|
)
|
||||||
|
++ (if fromSrc then [withAttr (attrName "compiled") $ str "compiled"] else mempty)
|
||||||
++ (if lStray then [withAttr (attrName "stray") $ str "stray"] else mempty)
|
++ (if lStray then [withAttr (attrName "stray") $ str "stray"] else mempty)
|
||||||
++ (case lReleaseDay of
|
++ (case lReleaseDay of
|
||||||
Nothing -> mempty
|
Nothing -> mempty
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ data ChangeLogOptions = ChangeLogOptions
|
|||||||
{ clOpen :: Bool
|
{ clOpen :: Bool
|
||||||
, clTool :: Maybe Tool
|
, clTool :: Maybe Tool
|
||||||
, clToolVer :: Maybe ToolVersion
|
, clToolVer :: Maybe ToolVersion
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ changelogP =
|
|||||||
e -> Left e
|
e -> Left e
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(short 't' <> long "tool" <> metavar "<ghc|cabal|hls|ghcup|stack>" <> help
|
(short 't' <> long "tool" <> metavar "<ghc|cabal|hls|ghcup>" <> help
|
||||||
"Open changelog for given tool (default: ghc)"
|
"Open changelog for given tool (default: ghc)"
|
||||||
<> completer toolCompleter
|
<> completer toolCompleter
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ data SetToolVersion = SetGHCVersion GHCTargetVersion
|
|||||||
| SetToolDay Day
|
| SetToolDay Day
|
||||||
| SetRecommended
|
| SetRecommended
|
||||||
| SetNext
|
| SetNext
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
prettyToolVer :: ToolVersion -> String
|
prettyToolVer :: ToolVersion -> String
|
||||||
prettyToolVer (GHCVersion v') = T.unpack $ tVerToText v'
|
prettyToolVer (GHCVersion v') = T.unpack $ tVerToText v'
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ import Text.Read (readEither)
|
|||||||
|
|
||||||
data CompileCommand = CompileGHC GHCCompileOptions
|
data CompileCommand = CompileGHC GHCCompileOptions
|
||||||
| CompileHLS HLSCompileOptions
|
| CompileHLS HLSCompileOptions
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -77,9 +76,9 @@ data GHCCompileOptions = GHCCompileOptions
|
|||||||
, setCompile :: Bool
|
, setCompile :: Bool
|
||||||
, ovewrwiteVer :: Maybe Version
|
, ovewrwiteVer :: Maybe Version
|
||||||
, buildFlavour :: Maybe String
|
, buildFlavour :: Maybe String
|
||||||
, buildSystem :: Maybe BuildSystem
|
, hadrian :: Bool
|
||||||
, isolateDir :: Maybe FilePath
|
, isolateDir :: Maybe FilePath
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
data HLSCompileOptions = HLSCompileOptions
|
data HLSCompileOptions = HLSCompileOptions
|
||||||
@@ -94,7 +93,7 @@ data HLSCompileOptions = HLSCompileOptions
|
|||||||
, patches :: Maybe (Either FilePath [URI])
|
, patches :: Maybe (Either FilePath [URI])
|
||||||
, targetGHCs :: [ToolVersion]
|
, targetGHCs :: [ToolVersion]
|
||||||
, cabalArgs :: [Text]
|
, cabalArgs :: [Text]
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -269,22 +268,16 @@ ghcCompileOpts =
|
|||||||
"Set the compile build flavour (this value depends on the build system type: 'make' vs 'hadrian')"
|
"Set the compile build flavour (this value depends on the build system type: 'make' vs 'hadrian')"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
<*> (
|
<*> switch
|
||||||
(\b -> if b then Just Hadrian else Nothing) <$> switch
|
(long "hadrian" <> help "Use the hadrian build system instead of make (only git versions seem to be properly supported atm)"
|
||||||
(long "hadrian" <> help "Use the hadrian build system instead of make. Tries to detect by default."
|
|
||||||
)
|
)
|
||||||
<|>
|
|
||||||
(\b -> if b then Just Make else Nothing) <$> switch
|
|
||||||
(long "make" <> help "Use the make build system instead of hadrian. Tries to detect by default."
|
|
||||||
)
|
|
||||||
)
|
|
||||||
<*> optional
|
<*> optional
|
||||||
(option
|
(option
|
||||||
(eitherReader isolateParser)
|
(eitherReader isolateParser)
|
||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated absolute directory instead of the default one, no symlinks to this installation will be made"
|
<> help "install in an isolated directory instead of the default one, no symlinks to this installation will be made"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -367,7 +360,7 @@ hlsCompileOpts =
|
|||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated absolute directory instead of the default one, no symlinks to this installation will be made"
|
<> help "install in an isolated directory instead of the default one, no symlinks to this installation will be made"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -584,7 +577,7 @@ compile compileCommand settings Dirs{..} runAppState runLogger = do
|
|||||||
patches
|
patches
|
||||||
addConfArgs
|
addConfArgs
|
||||||
buildFlavour
|
buildFlavour
|
||||||
buildSystem
|
hadrian
|
||||||
(maybe GHCupInternal IsolateDir isolateDir)
|
(maybe GHCupInternal IsolateDir isolateDir)
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
let vi = getVersionInfo targetVer GHC dls
|
let vi = getVersionInfo targetVer GHC dls
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ data ConfigCommand
|
|||||||
| SetConfig String (Maybe String)
|
| SetConfig String (Maybe String)
|
||||||
| InitConfig
|
| InitConfig
|
||||||
| AddReleaseChannel Bool URI
|
| AddReleaseChannel Bool URI
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ data GCOptions = GCOptions
|
|||||||
, gcHLSNoGHC :: Bool
|
, gcHLSNoGHC :: Bool
|
||||||
, gcCache :: Bool
|
, gcCache :: Bool
|
||||||
, gcTmp :: Bool
|
, gcTmp :: Bool
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ data InstallCommand = InstallGHC InstallOptions
|
|||||||
| InstallCabal InstallOptions
|
| InstallCabal InstallOptions
|
||||||
| InstallHLS InstallOptions
|
| InstallHLS InstallOptions
|
||||||
| InstallStack InstallOptions
|
| InstallStack InstallOptions
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@ data InstallOptions = InstallOptions
|
|||||||
, isolateDir :: Maybe FilePath
|
, isolateDir :: Maybe FilePath
|
||||||
, forceInstall :: Bool
|
, forceInstall :: Bool
|
||||||
, addConfArgs :: [T.Text]
|
, addConfArgs :: [T.Text]
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -197,7 +196,7 @@ installOpts tool =
|
|||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated absolute directory instead of the default one"
|
<> help "install in an isolated dir instead of the default one"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ data ListOptions = ListOptions
|
|||||||
, lHideOld :: Bool
|
, lHideOld :: Bool
|
||||||
, lShowNightly :: Bool
|
, lShowNightly :: Bool
|
||||||
, lRawFormat :: Bool
|
, lRawFormat :: Bool
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -180,6 +180,7 @@ printListResult no_color raw lr = do
|
|||||||
then [color Green "hls-powered"]
|
then [color Green "hls-powered"]
|
||||||
else mempty
|
else mempty
|
||||||
)
|
)
|
||||||
|
++ (if fromSrc then [color Blue "compiled"] else mempty)
|
||||||
++ (if lStray then [color Yellow "stray"] else mempty)
|
++ (if lStray then [color Yellow "stray"] else mempty)
|
||||||
++ (case lReleaseDay of
|
++ (case lReleaseDay of
|
||||||
Nothing -> mempty
|
Nothing -> mempty
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ data RmCommand = RmGHC RmOptions
|
|||||||
| RmCabal Version
|
| RmCabal Version
|
||||||
| RmHLS Version
|
| RmHLS Version
|
||||||
| RmStack Version
|
| RmStack Version
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ data RmCommand = RmGHC RmOptions
|
|||||||
|
|
||||||
data RmOptions = RmOptions
|
data RmOptions = RmOptions
|
||||||
{ ghcVer :: GHCTargetVersion
|
{ ghcVer :: GHCTargetVersion
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ data RunOptions = RunOptions
|
|||||||
, runBinDir :: Maybe FilePath
|
, runBinDir :: Maybe FilePath
|
||||||
, runQuick :: Bool
|
, runQuick :: Bool
|
||||||
, runCOMMAND :: [String]
|
, runCOMMAND :: [String]
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ data SetCommand = SetGHC SetOptions
|
|||||||
| SetCabal SetOptions
|
| SetCabal SetOptions
|
||||||
| SetHLS SetOptions
|
| SetHLS SetOptions
|
||||||
| SetStack SetOptions
|
| SetStack SetOptions
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -65,7 +64,7 @@ data SetCommand = SetGHC SetOptions
|
|||||||
|
|
||||||
data SetOptions = SetOptions
|
data SetOptions = SetOptions
|
||||||
{ sToolVer :: SetToolVersion
|
{ sToolVer :: SetToolVersion
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ data UnsetCommand = UnsetGHC UnsetOptions
|
|||||||
| UnsetCabal UnsetOptions
|
| UnsetCabal UnsetOptions
|
||||||
| UnsetHLS UnsetOptions
|
| UnsetHLS UnsetOptions
|
||||||
| UnsetStack UnsetOptions
|
| UnsetStack UnsetOptions
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -60,7 +59,7 @@ data UnsetCommand = UnsetGHC UnsetOptions
|
|||||||
|
|
||||||
data UnsetOptions = UnsetOptions
|
data UnsetOptions = UnsetOptions
|
||||||
{ sToolVer :: Maybe T.Text -- target platform triple
|
{ sToolVer :: Maybe T.Text -- target platform triple
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -69,7 +68,7 @@ data UnsetOptions = UnsetOptions
|
|||||||
--[ Parsers ]--
|
--[ Parsers ]--
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
||||||
unsetParser :: Parser UnsetCommand
|
unsetParser :: Parser UnsetCommand
|
||||||
unsetParser =
|
unsetParser =
|
||||||
subparser
|
subparser
|
||||||
@@ -114,14 +113,7 @@ unsetParser =
|
|||||||
unsetGHCFooter :: String
|
unsetGHCFooter :: String
|
||||||
unsetGHCFooter = [s|Discussion:
|
unsetGHCFooter = [s|Discussion:
|
||||||
Unsets the the current GHC version. That means there won't
|
Unsets the the current GHC version. That means there won't
|
||||||
be a ~/.ghcup/bin/ghc anymore.
|
be a ~/.ghcup/bin/ghc anymore.|]
|
||||||
|
|
||||||
Examples:
|
|
||||||
# unset ghc
|
|
||||||
ghcup unset ghc
|
|
||||||
|
|
||||||
# unset ghc for the target version
|
|
||||||
ghcup unset ghc armv7-unknown-linux-gnueabihf|]
|
|
||||||
|
|
||||||
unsetCabalFooter :: String
|
unsetCabalFooter :: String
|
||||||
unsetCabalFooter = [s|Discussion:
|
unsetCabalFooter = [s|Discussion:
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ import Data.Versions hiding (str)
|
|||||||
data UpgradeOpts = UpgradeInplace
|
data UpgradeOpts = UpgradeInplace
|
||||||
| UpgradeAt FilePath
|
| UpgradeAt FilePath
|
||||||
| UpgradeGHCupDir
|
| UpgradeGHCupDir
|
||||||
deriving (Eq, Show)
|
deriving Show
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ data WhereisCommand = WhereisTool Tool (Maybe ToolVersion)
|
|||||||
| WhereisCacheDir
|
| WhereisCacheDir
|
||||||
| WhereisLogsDir
|
| WhereisLogsDir
|
||||||
| WhereisConfDir
|
| WhereisConfDir
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -67,7 +66,7 @@ data WhereisCommand = WhereisTool Tool (Maybe ToolVersion)
|
|||||||
|
|
||||||
data WhereisOptions = WhereisOptions {
|
data WhereisOptions = WhereisOptions {
|
||||||
directory :: Bool
|
directory :: Bool
|
||||||
} deriving (Eq, Show)
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,5 +23,3 @@ package aeson
|
|||||||
package streamly
|
package streamly
|
||||||
flags: +use-unliftio
|
flags: +use-unliftio
|
||||||
|
|
||||||
package *
|
|
||||||
test-show-details: direct
|
|
||||||
@@ -37,8 +37,8 @@ RUN apk add --no-cache \
|
|||||||
xz-dev \
|
xz-dev \
|
||||||
ncurses-static
|
ncurses-static
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.18.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -37,9 +37,8 @@ RUN apk add --no-cache \
|
|||||||
xz-dev \
|
xz-dev \
|
||||||
ncurses-static
|
ncurses-static
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.18.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
RUN update_opt.sh 11 1
|
RUN update_opt.sh 11 1
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.17.8
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
RUN update_opt.sh 9 1
|
RUN update_opt.sh 9 1
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.17.8
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
RUN update_opt.sh 11 1
|
RUN update_opt.sh 11 1
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.18.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ RUN apt-get update && \
|
|||||||
|
|
||||||
RUN update_opt.sh 9 1
|
RUN update_opt.sh 9 1
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.19.4
|
ARG GHCUP_VERSION=0.1.18.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY=7784930957807690A66EBDBE3786C5262ECB4A3F
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ url-source:
|
|||||||
|
|
||||||
### Nightlies
|
### Nightlies
|
||||||
|
|
||||||
Nightlies are just another release channel. Currently, only GHC supports nightlies, which are binary releases
|
Nightlies are just a nother release channel. Currently, only GHC supports nightlies, which are binary releases
|
||||||
that are built every night from `master`.
|
that are built every night from `master`.
|
||||||
|
|
||||||
To add the nightly channel, run:
|
To add the nightly channel, run:
|
||||||
@@ -491,7 +491,6 @@ First, obtain the gpg keys:
|
|||||||
```sh
|
```sh
|
||||||
gpg --batch --keyserver keys.openpgp.org --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
gpg --batch --keyserver keys.openpgp.org --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Then verify the gpg key in one of these ways:
|
Then verify the gpg key in one of these ways:
|
||||||
|
|||||||
@@ -104,19 +104,14 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>GHC Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>GHC Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>9.6.2</td><td><span style="color:blue">latest</span>, base-4.18.0.0</td></tr>
|
<tr><td>9.6.1</td><td><span style="color:blue">latest</span>, base-4.18.0.0</td></tr>
|
||||||
<tr><td>9.6.1</td><td>base-4.18.0.0</td></tr>
|
|
||||||
<tr><td>9.4.7</td><td>base-4.17.2.0</td></tr>
|
|
||||||
<tr><td>9.4.6</td><td>base-4.17.2.0</td></tr>
|
|
||||||
<tr><td>9.4.5</td><td>base-4.17.1.0</td></tr>
|
|
||||||
<tr><td>9.4.4</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.4</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.3</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.3</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.2</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.2</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.1</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.1</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.2.8</td><td><span style="color:green">recommended</span>, base-4.16.4.0</td></tr>
|
|
||||||
<tr><td>9.2.7</td><td>base-4.16.4.0</td></tr>
|
<tr><td>9.2.7</td><td>base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.6</td><td>base-4.16.4.0</td></tr>
|
<tr><td>9.2.6</td><td>base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.5</td><td>base-4.16.4.0</td></tr>
|
<tr><td>9.2.5</td><td><span style="color:green">recommended</span>, base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.4</td><td>base-4.16.3.0</td></tr>
|
<tr><td>9.2.4</td><td>base-4.16.3.0</td></tr>
|
||||||
<tr><td>9.2.3</td><td>base-4.16.2.0</td></tr>
|
<tr><td>9.2.3</td><td>base-4.16.2.0</td></tr>
|
||||||
<tr><td>9.2.2</td><td>base-4.16.1.0</td></tr>
|
<tr><td>9.2.2</td><td>base-4.16.1.0</td></tr>
|
||||||
@@ -171,13 +166,8 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>HLS Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>HLS Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>2.2.0.0</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
<tr><td>1.9.1.0</td><td><span style="color:blue">latest</span></td></tr>
|
||||||
<tr><td>2.1.0.0</td><td></td></tr>
|
<tr><td>1.9.0.0</td><td><span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>2.0.0.1</td><td></td></tr>
|
|
||||||
<tr><td>2.0.0.0</td><td></td></tr>
|
|
||||||
<tr><td>1.10.0.0</td><td></td></tr>
|
|
||||||
<tr><td>1.9.1.0</td><td></td></tr>
|
|
||||||
<tr><td>1.9.0.0</td><td></td></tr>
|
|
||||||
<tr><td>1.8.0.0</td><td></td></tr>
|
<tr><td>1.8.0.0</td><td></td></tr>
|
||||||
<tr><td>1.7.0.0</td><td></td></tr>
|
<tr><td>1.7.0.0</td><td></td></tr>
|
||||||
<tr><td>1.6.1.0</td><td></td></tr>
|
<tr><td>1.6.1.0</td><td></td></tr>
|
||||||
@@ -196,8 +186,7 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>Stack Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>Stack Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>2.11.1</td><td><span style="color:blue">latest</span></td></tr>
|
<tr><td>2.9.3</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>2.9.3</td><td><span style="color:green">recommended</span></td></tr>
|
|
||||||
<tr><td>2.9.1</td><td></td></tr>
|
<tr><td>2.9.1</td><td></td></tr>
|
||||||
<tr><td>2.7.5</td><td></td></tr>
|
<tr><td>2.7.5</td><td></td></tr>
|
||||||
<tr><td>2.7.3</td><td></td></tr>
|
<tr><td>2.7.3</td><td></td></tr>
|
||||||
@@ -211,7 +200,7 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
|
|
||||||
This list may not be exhaustive and specifies support for bindists only.
|
This list may not be exhaustive and specifies support for bindists only.
|
||||||
|
|
||||||
| Platform | Architecture | ghcup | GHC | cabal | HLS | stack |
|
| Platform | Architecture | ghcup | GHC | cabal | HLS | stack |
|
||||||
| ------ | ------ | ------ | ------ | ------ | ------ | ------ |
|
| ------ | ------ | ------ | ------ | ------ | ------ | ------ |
|
||||||
| Windows 7 | amd64 | ❔ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 7 | amd64 | ❔ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
@@ -329,24 +318,6 @@ export PATH="$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH"
|
|||||||
|
|
||||||
All set. You can run `cabal init` now in an empty directory to start a project.
|
All set. You can run `cabal init` now in an empty directory to start a project.
|
||||||
|
|
||||||
## Esoteric distros
|
|
||||||
|
|
||||||
### Void Linux
|
|
||||||
|
|
||||||
Since void linux can be installed with glibc and musl, it's hard to support correctly with ghcup.
|
|
||||||
One way to make ghcup work on **Void Linux musl** is to follow the [Overriding distro detection](../guide/#overriding-distro-detection)
|
|
||||||
section and tell it to consider Alpine bindists only. E.g.:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | BOOTSTRAP_HASKELL_MINIMAL=1 sh
|
|
||||||
source ~/.ghcup/env
|
|
||||||
ghcup config set platform-override '{ "arch": "A_64", "platform": { "contents": "Alpine", "tag": "Linux" }, "version": "3.17" }'
|
|
||||||
ghcup install cabal --set latest
|
|
||||||
ghcup install ghc --set latest
|
|
||||||
ghcup install stack --set latest
|
|
||||||
ghcup install hls --set latest
|
|
||||||
```
|
|
||||||
|
|
||||||
## Vim integration
|
## Vim integration
|
||||||
|
|
||||||
See [ghcup.vim](https://github.com/hasufell/ghcup.vim).
|
See [ghcup.vim](https://github.com/hasufell/ghcup.vim).
|
||||||
|
|||||||
176
ghcup.cabal
176
ghcup.cabal
@@ -53,43 +53,6 @@ flag no-exe
|
|||||||
default: False
|
default: False
|
||||||
manual: True
|
manual: True
|
||||||
|
|
||||||
common app-common-depends
|
|
||||||
build-depends:
|
|
||||||
, aeson >=1.4
|
|
||||||
, aeson-pretty ^>=0.8.8
|
|
||||||
, async ^>=2.2.3
|
|
||||||
, base >=4.12 && <5
|
|
||||||
, bytestring >=0.10 && <0.12
|
|
||||||
, cabal-install-parsers >=0.4.5
|
|
||||||
, cabal-plan ^>=0.7.2
|
|
||||||
, containers ^>=0.6
|
|
||||||
, deepseq ^>=1.4
|
|
||||||
, directory ^>=1.3.6.0
|
|
||||||
, filepath ^>=1.4.2.1
|
|
||||||
, haskus-utils-types ^>=1.5
|
|
||||||
, haskus-utils-variant ^>=3.2.1
|
|
||||||
, libarchive ^>=3.0.3.0
|
|
||||||
, megaparsec >=8.0.0 && <9.3
|
|
||||||
, mtl ^>=2.2
|
|
||||||
, optparse-applicative >=0.15.1.0 && <0.18
|
|
||||||
, pretty ^>=1.1.3.1
|
|
||||||
, pretty-terminal ^>=0.1.0.0
|
|
||||||
, process ^>=1.6.11.0
|
|
||||||
, resourcet ^>=1.2.2
|
|
||||||
, safe ^>=0.3.18
|
|
||||||
, safe-exceptions ^>=0.1
|
|
||||||
, tagsoup ^>=0.14
|
|
||||||
, template-haskell >=2.7 && <2.20
|
|
||||||
, temporary ^>=1.3
|
|
||||||
, text ^>=2.0
|
|
||||||
, time >=1.9.3 && <1.12
|
|
||||||
, unordered-containers ^>=0.2
|
|
||||||
, uri-bytestring ^>=0.3.2.2
|
|
||||||
, utf8-string ^>=1.0
|
|
||||||
, vector ^>=0.12
|
|
||||||
, versions >=4.0.1 && <5.1
|
|
||||||
, yaml-streamly ^>=0.12.0
|
|
||||||
|
|
||||||
library
|
library
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
GHCup
|
GHCup
|
||||||
@@ -174,7 +137,7 @@ library
|
|||||||
, pretty-terminal ^>=0.1.0.0
|
, pretty-terminal ^>=0.1.0.0
|
||||||
, regex-posix ^>=0.96
|
, regex-posix ^>=0.96
|
||||||
, resourcet ^>=1.2.2
|
, resourcet ^>=1.2.2
|
||||||
, retry >=0.8.1.2 && <0.10
|
, retry ^>=0.8.1.2 || ^>=0.9
|
||||||
, safe ^>=0.3.18
|
, safe ^>=0.3.18
|
||||||
, safe-exceptions ^>=0.1
|
, safe-exceptions ^>=0.1
|
||||||
, split ^>=0.2.3.4
|
, split ^>=0.2.3.4
|
||||||
@@ -183,7 +146,7 @@ library
|
|||||||
, template-haskell >=2.7 && <2.20
|
, template-haskell >=2.7 && <2.20
|
||||||
, temporary ^>=1.3
|
, temporary ^>=1.3
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time >=1.9.3 && <1.12
|
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, unliftio-core ^>=0.2.0.1
|
, unliftio-core ^>=0.2.0.1
|
||||||
, unordered-containers ^>=0.2.10.0
|
, unordered-containers ^>=0.2.10.0
|
||||||
@@ -238,67 +201,7 @@ library
|
|||||||
cpp-options: -DBRICK
|
cpp-options: -DBRICK
|
||||||
build-depends: vty ^>=5.37
|
build-depends: vty ^>=5.37
|
||||||
|
|
||||||
library ghcup-optparse
|
|
||||||
import: app-common-depends
|
|
||||||
exposed-modules:
|
|
||||||
GHCup.OptParse
|
|
||||||
GHCup.OptParse.ChangeLog
|
|
||||||
GHCup.OptParse.Common
|
|
||||||
GHCup.OptParse.Compile
|
|
||||||
GHCup.OptParse.Config
|
|
||||||
GHCup.OptParse.DInfo
|
|
||||||
GHCup.OptParse.GC
|
|
||||||
GHCup.OptParse.Install
|
|
||||||
GHCup.OptParse.List
|
|
||||||
GHCup.OptParse.Nuke
|
|
||||||
GHCup.OptParse.Prefetch
|
|
||||||
GHCup.OptParse.Rm
|
|
||||||
GHCup.OptParse.Run
|
|
||||||
GHCup.OptParse.Set
|
|
||||||
GHCup.OptParse.Test
|
|
||||||
GHCup.OptParse.ToolRequirements
|
|
||||||
GHCup.OptParse.UnSet
|
|
||||||
GHCup.OptParse.Upgrade
|
|
||||||
GHCup.OptParse.Whereis
|
|
||||||
|
|
||||||
hs-source-dirs: app/ghcup
|
|
||||||
default-language: Haskell2010
|
|
||||||
default-extensions:
|
|
||||||
LambdaCase
|
|
||||||
MultiWayIf
|
|
||||||
NamedFieldPuns
|
|
||||||
PackageImports
|
|
||||||
RecordWildCards
|
|
||||||
ScopedTypeVariables
|
|
||||||
StrictData
|
|
||||||
TupleSections
|
|
||||||
|
|
||||||
ghc-options:
|
|
||||||
-Wall -fwarn-tabs -fwarn-incomplete-uni-patterns
|
|
||||||
-fwarn-incomplete-record-updates
|
|
||||||
|
|
||||||
build-depends: ghcup
|
|
||||||
|
|
||||||
if flag(internal-downloader)
|
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
|
||||||
|
|
||||||
if (flag(tui) && !os(windows))
|
|
||||||
cpp-options: -DBRICK
|
|
||||||
other-modules: BrickMain
|
|
||||||
build-depends:
|
|
||||||
, brick ^>=1.5
|
|
||||||
, transformers ^>=0.5
|
|
||||||
, unix ^>=2.7
|
|
||||||
, vty ^>=5.37
|
|
||||||
|
|
||||||
if os(windows)
|
|
||||||
cpp-options: -DIS_WINDOWS
|
|
||||||
|
|
||||||
else
|
|
||||||
build-depends: unix ^>=2.7
|
|
||||||
|
|
||||||
executable ghcup
|
executable ghcup
|
||||||
import: app-common-depends
|
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
other-modules:
|
other-modules:
|
||||||
GHCup.OptParse
|
GHCup.OptParse
|
||||||
@@ -338,8 +241,41 @@ executable ghcup
|
|||||||
-fwarn-incomplete-record-updates -threaded
|
-fwarn-incomplete-record-updates -threaded
|
||||||
|
|
||||||
build-depends:
|
build-depends:
|
||||||
|
, aeson >=1.4
|
||||||
|
, aeson-pretty ^>=0.8.8
|
||||||
|
, async ^>=2.2.3
|
||||||
|
, base >=4.12 && <5
|
||||||
|
, bytestring >=0.10 && <0.12
|
||||||
|
, cabal-install-parsers >=0.4.5
|
||||||
|
, cabal-plan ^>=0.7.2
|
||||||
|
, containers ^>=0.6
|
||||||
|
, deepseq ^>=1.4
|
||||||
|
, directory ^>=1.3.6.0
|
||||||
|
, filepath ^>=1.4.2.1
|
||||||
, ghcup
|
, ghcup
|
||||||
, ghcup-optparse
|
, haskus-utils-types ^>=1.5
|
||||||
|
, haskus-utils-variant ^>=3.2.1
|
||||||
|
, libarchive ^>=3.0.3.0
|
||||||
|
, megaparsec >=8.0.0 && <9.3
|
||||||
|
, mtl ^>=2.2
|
||||||
|
, optparse-applicative >=0.15.1.0 && <0.18
|
||||||
|
, pretty ^>=1.1.3.1
|
||||||
|
, pretty-terminal ^>=0.1.0.0
|
||||||
|
, process ^>=1.6.11.0
|
||||||
|
, resourcet ^>=1.2.2
|
||||||
|
, safe ^>=0.3.18
|
||||||
|
, safe-exceptions ^>=0.1
|
||||||
|
, tagsoup ^>=0.14
|
||||||
|
, template-haskell >=2.7 && <2.20
|
||||||
|
, temporary ^>=1.3
|
||||||
|
, text ^>=2.0
|
||||||
|
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
||||||
|
, unordered-containers ^>=0.2
|
||||||
|
, uri-bytestring ^>=0.3.2.2
|
||||||
|
, utf8-string ^>=1.0
|
||||||
|
, vector ^>=0.12
|
||||||
|
, versions >=4.0.1 && <5.1
|
||||||
|
, yaml-streamly ^>=0.12.0
|
||||||
|
|
||||||
if flag(internal-downloader)
|
if flag(internal-downloader)
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
@@ -366,7 +302,7 @@ test-suite ghcup-test
|
|||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
build-tool-depends: hspec-discover:hspec-discover -any
|
build-tool-depends: hspec-discover:hspec-discover -any
|
||||||
hs-source-dirs: test/ghcup-test
|
hs-source-dirs: test
|
||||||
other-modules:
|
other-modules:
|
||||||
GHCup.ArbitraryTypes
|
GHCup.ArbitraryTypes
|
||||||
GHCup.Prelude.File.Posix.TraversalsSpec
|
GHCup.Prelude.File.Posix.TraversalsSpec
|
||||||
@@ -400,8 +336,8 @@ test-suite ghcup-test
|
|||||||
, QuickCheck ^>=2.14.1
|
, QuickCheck ^>=2.14.1
|
||||||
, quickcheck-arbitrary-adt ^>=0.3.1.0
|
, quickcheck-arbitrary-adt ^>=0.3.1.0
|
||||||
, streamly ^>=0.8.2
|
, streamly ^>=0.8.2
|
||||||
|
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time >=1.9.3 && <1.12
|
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, versions >=4.0.1 && <5.1
|
, versions >=4.0.1 && <5.1
|
||||||
|
|
||||||
@@ -410,39 +346,3 @@ test-suite ghcup-test
|
|||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
test-suite ghcup-optparse-test
|
|
||||||
type: exitcode-stdio-1.0
|
|
||||||
hs-source-dirs: test/optparse-test
|
|
||||||
main-is: Main.hs
|
|
||||||
other-modules:
|
|
||||||
ChangeLogTest
|
|
||||||
CompileTest
|
|
||||||
ConfigTest
|
|
||||||
GCTest
|
|
||||||
InstallTest
|
|
||||||
ListTest
|
|
||||||
OtherCommandTest
|
|
||||||
RmTest
|
|
||||||
RunTest
|
|
||||||
SetTest
|
|
||||||
UnsetTest
|
|
||||||
UpgradeTest
|
|
||||||
Utils
|
|
||||||
WhereisTest
|
|
||||||
|
|
||||||
if os(windows)
|
|
||||||
cpp-options: -DIS_WINDOWS
|
|
||||||
|
|
||||||
default-language: Haskell2010
|
|
||||||
ghc-options: -Wall
|
|
||||||
build-depends:
|
|
||||||
, base
|
|
||||||
, ghcup
|
|
||||||
, ghcup-optparse
|
|
||||||
, optparse-applicative
|
|
||||||
, tasty
|
|
||||||
, tasty-hunit
|
|
||||||
, text
|
|
||||||
, uri-bytestring
|
|
||||||
, versions
|
|
||||||
|
|||||||
4
hie.yaml
4
hie.yaml
@@ -5,6 +5,4 @@ cradle:
|
|||||||
- component: "ghcup:exe:ghcup"
|
- component: "ghcup:exe:ghcup"
|
||||||
path: ./app/ghcup
|
path: ./app/ghcup
|
||||||
- component: "ghcup:test:ghcup-test"
|
- component: "ghcup:test:ghcup-test"
|
||||||
path: ./test/ghcup-test
|
path: ./test
|
||||||
- component: "ghcup:test:ghcup-optparse-test"
|
|
||||||
path: ./test/optparse-test
|
|
||||||
|
|||||||
23
lib/GHCup.hs
23
lib/GHCup.hs
@@ -134,24 +134,15 @@ rmTool :: ( MonadReader env m
|
|||||||
=> ListResult
|
=> ListResult
|
||||||
-> Excepts '[NotInstalled, UninstallFailed] m ()
|
-> Excepts '[NotInstalled, UninstallFailed] m ()
|
||||||
rmTool ListResult {lVer, lTool, lCross} = do
|
rmTool ListResult {lVer, lTool, lCross} = do
|
||||||
let printRmTool = logInfo $ "removing " <> T.pack (show lTool) <> " version " <> prettyVer lVer
|
logInfo $ "removing " <> T.pack (show lTool) <> " version " <> prettyVer lVer
|
||||||
case lTool of
|
case lTool of
|
||||||
GHC -> do
|
GHC ->
|
||||||
let ghcTargetVersion = GHCTargetVersion lCross lVer
|
let ghcTargetVersion = GHCTargetVersion lCross lVer
|
||||||
logInfo $ "removing " <> T.pack (show lTool) <> " version " <> tVerToText ghcTargetVersion
|
in rmGHCVer ghcTargetVersion
|
||||||
rmGHCVer ghcTargetVersion
|
HLS -> rmHLSVer lVer
|
||||||
HLS -> do
|
Cabal -> liftE $ rmCabalVer lVer
|
||||||
printRmTool
|
Stack -> liftE $ rmStackVer lVer
|
||||||
rmHLSVer lVer
|
GHCup -> lift rmGhcup
|
||||||
Cabal -> do
|
|
||||||
printRmTool
|
|
||||||
liftE $ rmCabalVer lVer
|
|
||||||
Stack -> do
|
|
||||||
printRmTool
|
|
||||||
liftE $ rmStackVer lVer
|
|
||||||
GHCup -> do
|
|
||||||
printRmTool
|
|
||||||
lift rmGhcup
|
|
||||||
|
|
||||||
|
|
||||||
rmGhcupDirs :: ( MonadReader env m
|
rmGhcupDirs :: ( MonadReader env m
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ getDownloadInfo' :: ( MonadReader env m
|
|||||||
m
|
m
|
||||||
DownloadInfo
|
DownloadInfo
|
||||||
getDownloadInfo' t v = do
|
getDownloadInfo' t v = do
|
||||||
pfreq@(PlatformRequest a p mv) <- lift getPlatformReq
|
(PlatformRequest a p mv) <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
|
|
||||||
let distro_preview f g =
|
let distro_preview f g =
|
||||||
@@ -317,7 +317,7 @@ getDownloadInfo' t v = do
|
|||||||
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
||||||
|
|
||||||
maybe
|
maybe
|
||||||
(throwE $ NoDownload v t (Just pfreq))
|
(throwE NoDownload)
|
||||||
pure
|
pure
|
||||||
(case p of
|
(case p of
|
||||||
-- non-musl won't work on alpine
|
-- non-musl won't work on alpine
|
||||||
|
|||||||
@@ -206,26 +206,12 @@ instance HFErrorProject NoCompatiblePlatform where
|
|||||||
eDesc _ = "No compatible platform could be found"
|
eDesc _ = "No compatible platform could be found"
|
||||||
|
|
||||||
-- | Unable to find a download for the requested version/distro.
|
-- | Unable to find a download for the requested version/distro.
|
||||||
data NoDownload = NoDownload GHCTargetVersion Tool (Maybe PlatformRequest)
|
data NoDownload = NoDownload
|
||||||
| NoDownload' GlobalTool
|
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
instance Pretty NoDownload where
|
instance Pretty NoDownload where
|
||||||
pPrint (NoDownload tver@(GHCTargetVersion mtarget vv) tool mpfreq)
|
pPrint NoDownload =
|
||||||
| (Just target) <- mtarget
|
text (eDesc (Proxy :: Proxy NoDownload))
|
||||||
, target `elem` (T.pack . prettyShow <$> enumFromTo (minBound :: Tool) (maxBound :: Tool))
|
|
||||||
= text $ "Unable to find a download for "
|
|
||||||
<> show tool
|
|
||||||
<> " version '"
|
|
||||||
<> T.unpack (tVerToText tver)
|
|
||||||
<> maybe "'\n" (\pfreq -> "' on detected platform " <> pfReqToString pfreq <> "\n") mpfreq
|
|
||||||
<> "Perhaps you meant: 'ghcup <command> "
|
|
||||||
<> T.unpack target
|
|
||||||
<> " "
|
|
||||||
<> T.unpack (prettyVer vv)
|
|
||||||
<> "'"
|
|
||||||
| otherwise = text $ "Unable to find a download for " <> T.unpack (tVerToText tver)
|
|
||||||
pPrint (NoDownload' globalTool) = text $ "Unable to find a download for " <> prettyShow globalTool
|
|
||||||
|
|
||||||
instance HFErrorProject NoDownload where
|
instance HFErrorProject NoDownload where
|
||||||
eBase _ = 10
|
eBase _ = 10
|
||||||
|
|||||||
220
lib/GHCup/GHC.hs
220
lib/GHCup/GHC.hs
@@ -83,7 +83,6 @@ import qualified Text.Megaparsec as MP
|
|||||||
data GHCVer = SourceDist Version
|
data GHCVer = SourceDist Version
|
||||||
| GitDist GitBranch
|
| GitDist GitBranch
|
||||||
| RemoteDist URI
|
| RemoteDist URI
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -126,7 +125,7 @@ testGHCVer ver addMakeArgs = do
|
|||||||
|
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix ver % viTestDL % _Just) dls
|
preview (ix GHC % ix ver % viTestDL % _Just) dls
|
||||||
?? NoDownload ver GHC Nothing
|
?? NoDownload
|
||||||
|
|
||||||
liftE $ testGHCBindist dlInfo ver addMakeArgs
|
liftE $ testGHCBindist dlInfo ver addMakeArgs
|
||||||
|
|
||||||
@@ -261,7 +260,7 @@ fetchGHCSrc v mfp = do
|
|||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix v % viSourceDL % _Just) dls
|
preview (ix GHC % ix v % viSourceDL % _Just) dls
|
||||||
?? NoDownload v GHC Nothing
|
?? NoDownload
|
||||||
liftE $ downloadCached' dlInfo Nothing mfp
|
liftE $ downloadCached' dlInfo Nothing mfp
|
||||||
|
|
||||||
|
|
||||||
@@ -434,7 +433,11 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
-- Windows bindists are relocatable and don't need
|
-- Windows bindists are relocatable and don't need
|
||||||
-- to run configure.
|
-- to run configure.
|
||||||
-- We also must make sure to preserve mtime to not confuse ghc-pkg.
|
-- We also must make sure to preserve mtime to not confuse ghc-pkg.
|
||||||
liftE $ mergeGHCFileTree path inst tver forceInstall
|
liftE $ mergeFileTree path inst GHC tver $ \source dest -> do
|
||||||
|
mtime <- liftIO $ ifM (pathIsSymbolicLink source) (pure Nothing) (Just <$> getModificationTime source)
|
||||||
|
when forceInstall $ hideError doesNotExistErrorType $ hideError InappropriateType $ recycleFile dest
|
||||||
|
liftIO $ moveFilePortable source dest
|
||||||
|
forM_ mtime $ liftIO . setModificationTime dest
|
||||||
| otherwise = do
|
| otherwise = do
|
||||||
PlatformRequest {..} <- lift getPlatformReq
|
PlatformRequest {..} <- lift getPlatformReq
|
||||||
|
|
||||||
@@ -456,36 +459,7 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
tmpInstallDest <- lift withGHCupTmpDir
|
tmpInstallDest <- lift withGHCupTmpDir
|
||||||
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just $ fromGHCupPath path)
|
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just $ fromGHCupPath path)
|
||||||
liftE $ catchWarn $ lEM @_ @'[ProcessError] $ darwinNotarization _rPlatform (fromGHCupPath tmpInstallDest)
|
liftE $ catchWarn $ lEM @_ @'[ProcessError] $ darwinNotarization _rPlatform (fromGHCupPath tmpInstallDest)
|
||||||
liftE $ mergeGHCFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir inst)) inst tver forceInstall
|
liftE $ mergeFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir inst))
|
||||||
pure ()
|
|
||||||
|
|
||||||
|
|
||||||
mergeGHCFileTree :: ( MonadReader env m
|
|
||||||
, HasPlatformReq env
|
|
||||||
, HasDirs env
|
|
||||||
, HasSettings env
|
|
||||||
, MonadThrow m
|
|
||||||
, HasLog env
|
|
||||||
, MonadIO m
|
|
||||||
, MonadUnliftIO m
|
|
||||||
, MonadMask m
|
|
||||||
, MonadResource m
|
|
||||||
, MonadFail m
|
|
||||||
)
|
|
||||||
=> GHCupPath -- ^ Path to the root of the tree
|
|
||||||
-> InstallDirResolved -- ^ Path to install to
|
|
||||||
-> GHCTargetVersion -- ^ The GHC version
|
|
||||||
-> Bool -- ^ Force install
|
|
||||||
-> Excepts '[MergeFileTreeError] m ()
|
|
||||||
mergeGHCFileTree root inst tver forceInstall
|
|
||||||
| isWindows = do
|
|
||||||
liftE $ mergeFileTree root inst GHC tver $ \source dest -> do
|
|
||||||
mtime <- liftIO $ ifM (pathIsSymbolicLink source) (pure Nothing) (Just <$> getModificationTime source)
|
|
||||||
when forceInstall $ hideError doesNotExistErrorType $ hideError InappropriateType $ recycleFile dest
|
|
||||||
liftIO $ moveFilePortable source dest
|
|
||||||
forM_ mtime $ liftIO . setModificationTime dest
|
|
||||||
| otherwise = do
|
|
||||||
liftE $ mergeFileTree root
|
|
||||||
inst
|
inst
|
||||||
GHC
|
GHC
|
||||||
tver
|
tver
|
||||||
@@ -494,6 +468,8 @@ mergeGHCFileTree root inst tver forceInstall
|
|||||||
install f t (not forceInstall)
|
install f t (not forceInstall)
|
||||||
forM_ mtime $ setModificationTime t)
|
forM_ mtime $ setModificationTime t)
|
||||||
|
|
||||||
|
pure ()
|
||||||
|
|
||||||
|
|
||||||
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
||||||
-- following symlinks in @~\/.ghcup\/bin@:
|
-- following symlinks in @~\/.ghcup\/bin@:
|
||||||
@@ -732,7 +708,7 @@ rmGHCVer ver = do
|
|||||||
Just files -> do
|
Just files -> do
|
||||||
lift $ logInfo $ "Removing files safely from: " <> T.pack dir
|
lift $ logInfo $ "Removing files safely from: " <> T.pack dir
|
||||||
forM_ files (lift . hideError NoSuchThing . recycleFile . (\f -> dir </> dropDrive f))
|
forM_ files (lift . hideError NoSuchThing . recycleFile . (\f -> dir </> dropDrive f))
|
||||||
hideError UnsatisfiedConstraints $ removeEmptyDirsRecursive dir
|
removeEmptyDirsRecursive dir
|
||||||
survivors <- liftIO $ hideErrorDef [doesNotExistErrorType] [] $ listDirectory dir
|
survivors <- liftIO $ hideErrorDef [doesNotExistErrorType] [] $ listDirectory dir
|
||||||
f <- recordedInstallationFile GHC ver
|
f <- recordedInstallationFile GHC ver
|
||||||
lift $ recycleFile f
|
lift $ recycleFile f
|
||||||
@@ -788,7 +764,7 @@ compileGHC :: ( MonadMask m
|
|||||||
-> Maybe (Either FilePath [URI]) -- ^ patches
|
-> Maybe (Either FilePath [URI]) -- ^ patches
|
||||||
-> [Text] -- ^ additional args to ./configure
|
-> [Text] -- ^ additional args to ./configure
|
||||||
-> Maybe String -- ^ build flavour
|
-> Maybe String -- ^ build flavour
|
||||||
-> Maybe BuildSystem
|
-> Bool
|
||||||
-> InstallDir
|
-> InstallDir
|
||||||
-> Excepts
|
-> Excepts
|
||||||
'[ AlreadyInstalled
|
'[ AlreadyInstalled
|
||||||
@@ -817,9 +793,9 @@ compileGHC :: ( MonadMask m
|
|||||||
]
|
]
|
||||||
m
|
m
|
||||||
GHCTargetVersion
|
GHCTargetVersion
|
||||||
compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs buildFlavour buildSystem installDir
|
compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs buildFlavour hadrian installDir
|
||||||
= do
|
= do
|
||||||
pfreq@PlatformRequest { .. } <- lift getPlatformReq
|
PlatformRequest { .. } <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
|
|
||||||
(workdir, tmpUnpack, tver) <- case targetGhc of
|
(workdir, tmpUnpack, tver) <- case targetGhc of
|
||||||
@@ -828,10 +804,9 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
lift $ logDebug $ "Requested to compile: " <> prettyVer ver <> " with " <> either prettyVer T.pack bstrap
|
lift $ logDebug $ "Requested to compile: " <> prettyVer ver <> " with " <> either prettyVer T.pack bstrap
|
||||||
|
|
||||||
-- download source tarball
|
-- download source tarball
|
||||||
let tver = mkTVer ver
|
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix tver % viSourceDL % _Just) dls
|
preview (ix GHC % ix (mkTVer ver) % viSourceDL % _Just) dls
|
||||||
?? NoDownload tver GHC (Just pfreq)
|
?? NoDownload
|
||||||
dl <- liftE $ downloadCached dlInfo Nothing
|
dl <- liftE $ downloadCached dlInfo Nothing
|
||||||
|
|
||||||
-- unpack
|
-- unpack
|
||||||
@@ -930,7 +905,7 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
-- compiled version, so the user can overwrite it
|
-- compiled version, so the user can overwrite it
|
||||||
installVer <- if | Just ov' <- ov -> pure (GHCTargetVersion crossTarget ov')
|
installVer <- if | Just ov' <- ov -> pure (GHCTargetVersion crossTarget ov')
|
||||||
| Just tver' <- tver -> pure tver'
|
| Just tver' <- tver -> pure tver'
|
||||||
| otherwise -> fail "No GHC version given and couldn't detect version. Giving up..."
|
| otherwise -> fail "Newer GHCs don't support discovering the version in git. Complain to GHC devs: https://gitlab.haskell.org/ghc/ghc/-/issues/22322"
|
||||||
|
|
||||||
alreadyInstalled <- lift $ ghcInstalled installVer
|
alreadyInstalled <- lift $ ghcInstalled installVer
|
||||||
alreadySet <- fmap (== Just installVer) $ lift $ ghcSet (_tvTarget installVer)
|
alreadySet <- fmap (== Just installVer) $ lift $ ghcSet (_tvTarget installVer)
|
||||||
@@ -949,31 +924,16 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
IsolateDir isoDir -> pure $ IsolateDirResolved isoDir
|
IsolateDir isoDir -> pure $ IsolateDirResolved isoDir
|
||||||
GHCupInternal -> GHCupDir <$> lift (ghcupGHCDir installVer)
|
GHCupInternal -> GHCupDir <$> lift (ghcupGHCDir installVer)
|
||||||
|
|
||||||
mBindist <- liftE $ runBuildAction
|
(mBindist, bmk) <- liftE $ runBuildAction
|
||||||
tmpUnpack
|
tmpUnpack
|
||||||
(do
|
(do
|
||||||
-- prefer 'tver', because the real version carries out compatibility checks
|
b <- if hadrian
|
||||||
-- we don't want the user to do funny things with it
|
-- prefer 'tver', because the real version carries out compatibility checks
|
||||||
let doHadrian = compileHadrianBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
-- we don't want the user to do funny things with it
|
||||||
doMake = compileMakeBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
then compileHadrianBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
||||||
case buildSystem of
|
else compileMakeBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
||||||
Just Hadrian -> do
|
bmk <- liftIO $ handleIO (\_ -> pure "") $ B.readFile (build_mk $ fromGHCupPath workdir)
|
||||||
lift $ logInfo "Requested to use Hadrian"
|
pure (b, bmk)
|
||||||
liftE doHadrian
|
|
||||||
Just Make -> do
|
|
||||||
lift $ logInfo "Requested to use Make"
|
|
||||||
doMake
|
|
||||||
Nothing -> do
|
|
||||||
supportsHadrian <- liftE $ catchE @HadrianNotFound @'[HadrianNotFound] @'[] (\_ -> return False)
|
|
||||||
$ fmap (const True)
|
|
||||||
$ findHadrianFile (fromGHCupPath workdir)
|
|
||||||
if supportsHadrian
|
|
||||||
then do
|
|
||||||
lift $ logInfo "Detected Hadrian"
|
|
||||||
liftE doHadrian
|
|
||||||
else do
|
|
||||||
lift $ logInfo "Detected Make"
|
|
||||||
doMake
|
|
||||||
)
|
)
|
||||||
|
|
||||||
case installDir of
|
case installDir of
|
||||||
@@ -993,6 +953,8 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
False -- not a force install, since we already overwrite when compiling.
|
False -- not a force install, since we already overwrite when compiling.
|
||||||
[]
|
[]
|
||||||
|
|
||||||
|
liftIO $ B.writeFile (fromInstallDir ghcdir </> ghcUpSrcBuiltFile) bmk
|
||||||
|
|
||||||
case installDir of
|
case installDir of
|
||||||
-- set and make symlinks for regular (non-isolated) installs
|
-- set and make symlinks for regular (non-isolated) installs
|
||||||
GHCupInternal -> do
|
GHCupInternal -> do
|
||||||
@@ -1015,22 +977,13 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
=> GHCupPath
|
=> GHCupPath
|
||||||
-> Excepts '[ProcessError, ParseError] m Version
|
-> Excepts '[ProcessError, ParseError] m Version
|
||||||
getGHCVer tmpUnpack = do
|
getGHCVer tmpUnpack = do
|
||||||
lEM $ execLogged "python3" ["./boot"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap" Nothing
|
lEM $ execWithGhcEnv "python3" ["./boot"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
||||||
lEM $ configureWithGhcBoot Nothing [] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
lEM $ execWithGhcEnv "sh" ["./configure"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
||||||
let versionFile = fromGHCupPath tmpUnpack </> "VERSION"
|
CapturedProcess {..} <- lift $ makeOut
|
||||||
hasVersionFile <- liftIO $ doesFileExist versionFile
|
["show!", "--quiet", "VALUE=ProjectVersion" ] (Just $ fromGHCupPath tmpUnpack)
|
||||||
if hasVersionFile
|
case _exitCode of
|
||||||
then do
|
ExitSuccess -> either (throwE . ParseError . show) pure . MP.parse ghcProjectVersion "" . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ _stdOut
|
||||||
lift $ logDebug "Detected VERSION file, trying to extract"
|
ExitFailure c -> throwE $ NonZeroExit c "make" ["show!", "--quiet", "VALUE=ProjectVersion" ]
|
||||||
contents <- liftIO $ readFile versionFile
|
|
||||||
either (throwE . ParseError . show) pure . MP.parse version' "" . T.pack . stripNewlineEnd $ contents
|
|
||||||
else do
|
|
||||||
lift $ logDebug "Didn't detect VERSION file, trying to extract via legacy 'make'"
|
|
||||||
CapturedProcess {..} <- lift $ makeOut
|
|
||||||
["show!", "--quiet", "VALUE=ProjectVersion" ] (Just $ fromGHCupPath tmpUnpack)
|
|
||||||
case _exitCode of
|
|
||||||
ExitSuccess -> either (throwE . ParseError . show) pure . MP.parse ghcProjectVersion "" . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ _stdOut
|
|
||||||
ExitFailure c -> throwE $ NonZeroExit c "make" ["show!", "--quiet", "VALUE=ProjectVersion" ]
|
|
||||||
|
|
||||||
defaultConf =
|
defaultConf =
|
||||||
let cross_mk = $(LitE . StringL <$> (qAddDependentFile "data/build_mk/cross" >> runIO (readFile "data/build_mk/cross")))
|
let cross_mk = $(LitE . StringL <$> (qAddDependentFile "data/build_mk/cross" >> runIO (readFile "data/build_mk/cross")))
|
||||||
@@ -1067,13 +1020,12 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
|
|
||||||
lift $ logInfo "Building (this may take a while)..."
|
lift $ logInfo "Building (this may take a while)..."
|
||||||
hadrian_build <- liftE $ findHadrianFile workdir
|
hadrian_build <- liftE $ findHadrianFile workdir
|
||||||
lEM $ execLogged hadrian_build
|
lEM $ execWithGhcEnv hadrian_build
|
||||||
( maybe [] (\j -> ["-j" <> show j] ) jobs
|
( maybe [] (\j -> ["-j" <> show j] ) jobs
|
||||||
++ maybe [] (\bf -> ["--flavour=" <> bf]) buildFlavour
|
++ maybe [] (\bf -> ["--flavour=" <> bf]) buildFlavour
|
||||||
++ ["binary-dist"]
|
++ ["binary-dist"]
|
||||||
)
|
)
|
||||||
(Just workdir) "ghc-make"
|
(Just workdir) "ghc-make"
|
||||||
Nothing
|
|
||||||
[tar] <- liftIO $ findFiles
|
[tar] <- liftIO $ findFiles
|
||||||
(workdir </> "_build" </> "bindist")
|
(workdir </> "_build" </> "bindist")
|
||||||
(makeRegexOpts compExtended
|
(makeRegexOpts compExtended
|
||||||
@@ -1106,9 +1058,6 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
, HasLog env
|
, HasLog env
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadFail m
|
, MonadFail m
|
||||||
, MonadMask m
|
|
||||||
, MonadUnliftIO m
|
|
||||||
, MonadResource m
|
|
||||||
)
|
)
|
||||||
=> GHCTargetVersion
|
=> GHCTargetVersion
|
||||||
-> FilePath
|
-> FilePath
|
||||||
@@ -1120,7 +1069,6 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
, PatchFailed
|
, PatchFailed
|
||||||
, ProcessError
|
, ProcessError
|
||||||
, NotFoundInPATH
|
, NotFoundInPATH
|
||||||
, MergeFileTreeError
|
|
||||||
, CopyError]
|
, CopyError]
|
||||||
m
|
m
|
||||||
(Maybe FilePath) -- ^ output path of bindist, None for cross
|
(Maybe FilePath) -- ^ output path of bindist, None for cross
|
||||||
@@ -1142,9 +1090,7 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
|
|
||||||
if | isCross tver -> do
|
if | isCross tver -> do
|
||||||
lift $ logInfo "Installing cross toolchain..."
|
lift $ logInfo "Installing cross toolchain..."
|
||||||
tmpInstallDest <- lift withGHCupTmpDir
|
lEM $ make ["install"] (Just workdir)
|
||||||
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just workdir)
|
|
||||||
liftE $ mergeGHCFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir ghcdir)) ghcdir tver True
|
|
||||||
pure Nothing
|
pure Nothing
|
||||||
| otherwise -> do
|
| otherwise -> do
|
||||||
lift $ logInfo "Creating bindist..."
|
lift $ logInfo "Creating bindist..."
|
||||||
@@ -1262,50 +1208,64 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
()
|
()
|
||||||
configureBindist tver workdir (fromInstallDir -> ghcdir) = do
|
configureBindist tver workdir (fromInstallDir -> ghcdir) = do
|
||||||
lift $ logInfo [s|configuring build|]
|
lift $ logInfo [s|configuring build|]
|
||||||
lEM $ configureWithGhcBoot (Just tver)
|
|
||||||
(maybe mempty
|
if | _tvVersion tver >= [vver|8.8.0|] -> do
|
||||||
(\x -> ["--target=" <> T.unpack x])
|
lEM $ execWithGhcEnv
|
||||||
(_tvTarget tver)
|
"sh"
|
||||||
++ ["--prefix=" <> ghcdir]
|
("./configure" : maybe mempty
|
||||||
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
(\x -> ["--target=" <> T.unpack x])
|
||||||
++ fmap T.unpack aargs
|
(_tvTarget tver)
|
||||||
)
|
++ ["--prefix=" <> ghcdir]
|
||||||
(Just workdir)
|
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
||||||
"ghc-conf"
|
++ fmap T.unpack aargs
|
||||||
|
)
|
||||||
|
(Just workdir)
|
||||||
|
"ghc-conf"
|
||||||
|
| otherwise -> do
|
||||||
|
lEM $ execLogged
|
||||||
|
"sh"
|
||||||
|
( [ "./configure", "--with-ghc=" <> either id id bghc
|
||||||
|
]
|
||||||
|
++ maybe mempty
|
||||||
|
(\x -> ["--target=" <> T.unpack x])
|
||||||
|
(_tvTarget tver)
|
||||||
|
++ ["--prefix=" <> ghcdir]
|
||||||
|
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
||||||
|
++ fmap T.unpack aargs
|
||||||
|
)
|
||||||
|
(Just workdir)
|
||||||
|
"ghc-conf"
|
||||||
|
Nothing
|
||||||
pure ()
|
pure ()
|
||||||
|
|
||||||
configureWithGhcBoot :: ( MonadReader env m
|
execWithGhcEnv :: ( MonadReader env m
|
||||||
, HasSettings env
|
, HasSettings env
|
||||||
, HasDirs env
|
, HasDirs env
|
||||||
, HasLog env
|
, HasLog env
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadThrow m)
|
, MonadThrow m)
|
||||||
=> Maybe GHCTargetVersion
|
=> FilePath -- ^ thing to execute
|
||||||
-> [String] -- ^ args for configure
|
-> [String] -- ^ args for the thing
|
||||||
-> Maybe FilePath -- ^ optionally chdir into this
|
-> Maybe FilePath -- ^ optionally chdir into this
|
||||||
-> FilePath -- ^ log filename (opened in append mode)
|
-> FilePath -- ^ log filename (opened in append mode)
|
||||||
-> m (Either ProcessError ())
|
-> m (Either ProcessError ())
|
||||||
configureWithGhcBoot mtver args dir logf = do
|
execWithGhcEnv fp args dir logf = do
|
||||||
let execNew = execLogged
|
env <- ghcEnv
|
||||||
"sh"
|
execLogged fp args dir logf (Just env)
|
||||||
("./configure" : ("GHC=" <> bghc) : args)
|
|
||||||
dir
|
|
||||||
logf
|
|
||||||
Nothing
|
|
||||||
execOld = execLogged
|
|
||||||
"sh"
|
|
||||||
("./configure" : ("--with-ghc=" <> bghc) : args)
|
|
||||||
dir
|
|
||||||
logf
|
|
||||||
Nothing
|
|
||||||
if | Just tver <- mtver
|
|
||||||
, _tvVersion tver >= [vver|8.8.0|] -> execNew
|
|
||||||
| Nothing <- mtver -> execNew -- need some default for git checkouts where we don't know yet
|
|
||||||
| otherwise -> execOld
|
|
||||||
|
|
||||||
bghc = case bstrap of
|
bghc = case bstrap of
|
||||||
Right g -> g
|
Right g -> Right g
|
||||||
Left bver -> "ghc-" <> (T.unpack . prettyVer $ bver) <> exeExt
|
Left bver -> Left ("ghc-" <> (T.unpack . prettyVer $ bver) <> exeExt)
|
||||||
|
|
||||||
|
ghcEnv :: (MonadThrow m, MonadIO m) => m [(String, String)]
|
||||||
|
ghcEnv = do
|
||||||
|
cEnv <- liftIO getEnvironment
|
||||||
|
bghcPath <- case bghc of
|
||||||
|
Right ghc' -> pure ghc'
|
||||||
|
Left bver -> do
|
||||||
|
spaths <- liftIO getSearchPath
|
||||||
|
throwMaybeM (NotFoundInPATH bver) $ liftIO (searchPath spaths bver)
|
||||||
|
pure (("GHC", bghcPath) : cEnv)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ data HLSVer = SourceDist Version
|
|||||||
| GitDist GitBranch
|
| GitDist GitBranch
|
||||||
| HackageDist Version
|
| HackageDist Version
|
||||||
| RemoteDist URI
|
| RemoteDist URI
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -355,7 +354,7 @@ compileHLS :: ( MonadMask m
|
|||||||
, NotInstalled
|
, NotInstalled
|
||||||
] m Version
|
] m Version
|
||||||
compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal updateCabal patches cabalArgs = do
|
compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal updateCabal patches cabalArgs = do
|
||||||
pfreq@PlatformRequest { .. } <- lift getPlatformReq
|
PlatformRequest { .. } <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
Dirs { .. } <- lift getDirs
|
Dirs { .. } <- lift getDirs
|
||||||
|
|
||||||
@@ -371,7 +370,7 @@ compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal upda
|
|||||||
-- download source tarball
|
-- download source tarball
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix HLS % ix (mkTVer tver) % viSourceDL % _Just) dls
|
preview (ix HLS % ix (mkTVer tver) % viSourceDL % _Just) dls
|
||||||
?? NoDownload (mkTVer tver) HLS (Just pfreq)
|
?? NoDownload
|
||||||
dl <- liftE $ downloadCached dlInfo Nothing
|
dl <- liftE $ downloadCached dlInfo Nothing
|
||||||
|
|
||||||
-- unpack
|
-- unpack
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ import qualified Data.Text as T
|
|||||||
data ListCriteria = ListInstalled Bool
|
data ListCriteria = ListInstalled Bool
|
||||||
| ListSet Bool
|
| ListSet Bool
|
||||||
| ListAvailable Bool
|
| ListAvailable Bool
|
||||||
deriving (Eq, Show)
|
deriving Show
|
||||||
|
|
||||||
-- | A list result describes a single tool version
|
-- | A list result describes a single tool version
|
||||||
-- and various of its properties.
|
-- and various of its properties.
|
||||||
@@ -76,6 +76,7 @@ data ListResult = ListResult
|
|||||||
, lTag :: [Tag]
|
, lTag :: [Tag]
|
||||||
, lInstalled :: Bool
|
, lInstalled :: Bool
|
||||||
, lSet :: Bool -- ^ currently active version
|
, lSet :: Bool -- ^ currently active version
|
||||||
|
, fromSrc :: Bool -- ^ compiled from source
|
||||||
, lStray :: Bool -- ^ not in download info
|
, lStray :: Bool -- ^ not in download info
|
||||||
, lNoBindist :: Bool -- ^ whether the version is available for this platform/arch
|
, lNoBindist :: Bool -- ^ whether the version is available for this platform/arch
|
||||||
, hlsPowered :: Bool
|
, hlsPowered :: Bool
|
||||||
@@ -168,6 +169,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
Just _ -> pure Nothing
|
Just _ -> pure Nothing
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
lSet <- fmap (maybe False (\(GHCTargetVersion _ v ) -> v == _tvVersion)) $ ghcSet _tvTarget
|
lSet <- fmap (maybe False (\(GHCTargetVersion _ v ) -> v == _tvVersion)) $ ghcSet _tvTarget
|
||||||
|
fromSrc <- ghcSrcInstalled tver
|
||||||
hlsPowered <- fmap (elem _tvVersion) hlsGHCVersions
|
hlsPowered <- fmap (elem _tvVersion) hlsGHCVersions
|
||||||
pure $ Just $ ListResult
|
pure $ Just $ ListResult
|
||||||
{ lTool = GHC
|
{ lTool = GHC
|
||||||
@@ -211,6 +213,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
|
, fromSrc = False -- actually, we don't know :>
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -245,6 +248,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
|
, fromSrc = False -- actually, we don't know :>
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -280,6 +284,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
|
, fromSrc = False -- actually, we don't know :>
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -301,6 +306,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lTag = maybe (if isOld then [Old] else []) _viTags listVer
|
, lTag = maybe (if isOld then [Old] else []) _viTags listVer
|
||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTool = GHCup
|
, lTool = GHCup
|
||||||
|
, fromSrc = False
|
||||||
, lStray = isNothing listVer
|
, lStray = isNothing listVer
|
||||||
, lSet = True
|
, lSet = True
|
||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
@@ -334,6 +340,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
lNoBindist <- fmap (isLeft . veitherToEither) $ runE @'[NoDownload] $ getDownloadInfo' GHC tver
|
lNoBindist <- fmap (isLeft . veitherToEither) $ runE @'[NoDownload] $ getDownloadInfo' GHC tver
|
||||||
lSet <- fmap (== Just tver) $ ghcSet (_tvTarget tver)
|
lSet <- fmap (== Just tver) $ ghcSet (_tvTarget tver)
|
||||||
lInstalled <- ghcInstalled tver
|
lInstalled <- ghcInstalled tver
|
||||||
|
fromSrc <- ghcSrcInstalled tver
|
||||||
hlsPowered <- fmap (elem tver) (fmap mkTVer <$> hlsGHCVersions)
|
hlsPowered <- fmap (elem tver) (fmap mkTVer <$> hlsGHCVersions)
|
||||||
pure ListResult { lVer = _tvVersion tver , lCross = _tvTarget tver , lTag = _viTags, lTool = t, lStray = False, lReleaseDay = _viReleaseDay, .. }
|
pure ListResult { lVer = _tvVersion tver , lCross = _tvTarget tver , lTag = _viTags, lTool = t, lStray = False, lReleaseDay = _viReleaseDay, .. }
|
||||||
Cabal -> do
|
Cabal -> do
|
||||||
@@ -344,6 +351,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
|
, fromSrc = False
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
@@ -356,6 +364,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTool = t
|
, lTool = t
|
||||||
|
, fromSrc = False
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
@@ -370,6 +379,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
|
, fromSrc = False
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
@@ -383,6 +393,7 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
|
, fromSrc = False
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
|
|||||||
@@ -45,8 +45,7 @@ import Graphics.Vty ( Key(..) )
|
|||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified GHC.Generics as GHC
|
import qualified GHC.Generics as GHC
|
||||||
import qualified Data.List.NonEmpty as NE
|
|
||||||
import Data.Foldable (foldMap)
|
|
||||||
|
|
||||||
#if !defined(BRICK)
|
#if !defined(BRICK)
|
||||||
data Key = KEsc | KChar Char | KBS | KEnter
|
data Key = KEsc | KChar Char | KBS | KEnter
|
||||||
@@ -133,9 +132,6 @@ data GlobalTool = ShimGen
|
|||||||
|
|
||||||
instance NFData GlobalTool
|
instance NFData GlobalTool
|
||||||
|
|
||||||
instance Pretty GlobalTool where
|
|
||||||
pPrint ShimGen = text "shimgen"
|
|
||||||
|
|
||||||
|
|
||||||
-- | All necessary information of a tool version, including
|
-- | All necessary information of a tool version, including
|
||||||
-- source download and per-architecture downloads.
|
-- source download and per-architecture downloads.
|
||||||
@@ -638,17 +634,6 @@ data VersionRange = SimpleRange (NonEmpty VersionCmp) -- And
|
|||||||
|
|
||||||
instance NFData VersionRange
|
instance NFData VersionRange
|
||||||
|
|
||||||
instance Pretty VersionCmp where
|
|
||||||
pPrint (VR_gt v) = text "> " <> pPrint v
|
|
||||||
pPrint (VR_gteq v) = text ">= " <> pPrint v
|
|
||||||
pPrint (VR_lt v) = text "< " <> pPrint v
|
|
||||||
pPrint (VR_lteq v) = text "<= " <> pPrint v
|
|
||||||
pPrint (VR_eq v) = text "= " <> pPrint v
|
|
||||||
|
|
||||||
instance Pretty VersionRange where
|
|
||||||
pPrint (SimpleRange xs) = foldl1 (\x y -> x <> text " && " <> y) $ NE.map pPrint xs
|
|
||||||
pPrint (OrRange xs vr) = foldMap pPrint xs <> " || " <> pPrint vr
|
|
||||||
|
|
||||||
instance Pretty Versioning where
|
instance Pretty Versioning where
|
||||||
pPrint = text . T.unpack . prettyV
|
pPrint = text . T.unpack . prettyV
|
||||||
|
|
||||||
@@ -725,7 +710,6 @@ data ToolVersion = GHCVersion GHCTargetVersion
|
|||||||
| ToolVersion Version
|
| ToolVersion Version
|
||||||
| ToolTag Tag
|
| ToolTag Tag
|
||||||
| ToolDay Day
|
| ToolDay Day
|
||||||
deriving (Eq, Show)
|
|
||||||
|
|
||||||
instance Pretty ToolVersion where
|
instance Pretty ToolVersion where
|
||||||
pPrint (GHCVersion v) = pPrint v
|
pPrint (GHCVersion v) = pPrint v
|
||||||
@@ -735,6 +719,4 @@ instance Pretty ToolVersion where
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
data BuildSystem = Hadrian
|
|
||||||
| Make
|
|
||||||
deriving (Show, Eq)
|
|
||||||
|
|||||||
@@ -288,6 +288,13 @@ ghcInstalled ver = do
|
|||||||
liftIO $ doesDirectoryExist (fromGHCupPath ghcdir)
|
liftIO $ doesDirectoryExist (fromGHCupPath ghcdir)
|
||||||
|
|
||||||
|
|
||||||
|
-- | Whether the given GHC version is installed from source.
|
||||||
|
ghcSrcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
|
||||||
|
ghcSrcInstalled ver = do
|
||||||
|
ghcdir <- ghcupGHCDir ver
|
||||||
|
liftIO $ doesFileExist (fromGHCupPath ghcdir </> ghcUpSrcBuiltFile)
|
||||||
|
|
||||||
|
|
||||||
-- | Whether the given GHC version is set as the current.
|
-- | Whether the given GHC version is set as the current.
|
||||||
ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m)
|
ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m)
|
||||||
=> Maybe Text -- ^ the target of the GHC version, if any
|
=> Maybe Text -- ^ the target of the GHC version, if any
|
||||||
@@ -968,6 +975,11 @@ ghcToolFiles ver = do
|
|||||||
isNotAnyInfix xs t = foldr (\a b -> not (a `isInfixOf` t) && b) True xs
|
isNotAnyInfix xs t = foldr (\a b -> not (a `isInfixOf` t) && b) True xs
|
||||||
|
|
||||||
|
|
||||||
|
-- | This file, when residing in @~\/.ghcup\/ghc\/\<ver\>\/@ signals that
|
||||||
|
-- this GHC was built from source. It contains the build config.
|
||||||
|
ghcUpSrcBuiltFile :: FilePath
|
||||||
|
ghcUpSrcBuiltFile = ".ghcup_src_built"
|
||||||
|
|
||||||
|
|
||||||
-- | Calls gmake if it exists in PATH, otherwise make.
|
-- | Calls gmake if it exists in PATH, otherwise make.
|
||||||
make :: ( MonadThrow m
|
make :: ( MonadThrow m
|
||||||
@@ -1212,7 +1224,7 @@ ensureGlobalTools
|
|||||||
(GHCupInfo _ _ gTools) <- lift getGHCupInfo
|
(GHCupInfo _ _ gTools) <- lift getGHCupInfo
|
||||||
dirs <- lift getDirs
|
dirs <- lift getDirs
|
||||||
shimDownload <- liftE $ lE @_ @'[NoDownload]
|
shimDownload <- liftE $ lE @_ @'[NoDownload]
|
||||||
$ maybe (Left (NoDownload' ShimGen)) Right $ Map.lookup ShimGen gTools
|
$ maybe (Left NoDownload) Right $ Map.lookup ShimGen gTools
|
||||||
let dl = downloadCached' shimDownload (Just "gs.exe") Nothing
|
let dl = downloadCached' shimDownload (Just "gs.exe") Nothing
|
||||||
void $ (\DigestError{} -> do
|
void $ (\DigestError{} -> do
|
||||||
lift $ logWarn "Digest doesn't match, redownloading gs.exe..."
|
lift $ logWarn "Digest doesn't match, redownloading gs.exe..."
|
||||||
|
|||||||
@@ -40,13 +40,10 @@ param (
|
|||||||
# Whether to disable use of curl.exe
|
# Whether to disable use of curl.exe
|
||||||
[switch]$DisableCurl,
|
[switch]$DisableCurl,
|
||||||
# The Msys2 version to download (e.g. 20221216)
|
# The Msys2 version to download (e.g. 20221216)
|
||||||
[string]$Msys2Version,
|
[string]$Msys2Version
|
||||||
# The Msys2 sha256sum hash
|
|
||||||
[string]$Msys2Hash
|
|
||||||
)
|
)
|
||||||
|
|
||||||
$DefaultMsys2Version = "20221216"
|
$DefaultMsys2Version = "20221216"
|
||||||
$DefaultMsys2Hash = "18370d32b0264915c97e3d7c618f7b32d48ad80858923883fde5145acd32ca0f"
|
|
||||||
|
|
||||||
$Silent = !$Interactive
|
$Silent = !$Interactive
|
||||||
|
|
||||||
@@ -433,12 +430,9 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
if (!($Msys2Version)) {
|
if (!($Msys2Version)) {
|
||||||
$Msys2Version = $DefaultMsys2Version
|
$Msys2Version = $DefaultMsys2Version
|
||||||
}
|
}
|
||||||
if (!($Msys2Hash)) {
|
|
||||||
$Msys2Hash = $DefaultMsys2Hash
|
|
||||||
}
|
|
||||||
Print-Msg -msg ('Downloading Msys2 archive {0}...' -f $Msys2Version)
|
Print-Msg -msg ('Downloading Msys2 archive {0}...' -f $Msys2Version)
|
||||||
$archive = ('msys2-base-x86_64-{0}.sfx.exe' -f $Msys2Version)
|
$archive = ('msys2-base-x86_64-{0}.sfx.exe' -f $Msys2Version)
|
||||||
$msysUrl = ('https://downloads.haskell.org/ghcup/msys2/{0}' -f "$archive")
|
$msysUrl = ('https://repo.msys2.org/distrib/x86_64/{0}' -f "$archive")
|
||||||
$archivePath = ('{0}\{1}' -f ([IO.Path]::GetTempPath()), "$archive")
|
$archivePath = ('{0}\{1}' -f ([IO.Path]::GetTempPath()), "$archive")
|
||||||
|
|
||||||
if ((Get-Command -Name 'curl.exe' -ErrorAction SilentlyContinue) -and !($DisableCurl)) {
|
if ((Get-Command -Name 'curl.exe' -ErrorAction SilentlyContinue) -and !($DisableCurl)) {
|
||||||
@@ -446,11 +440,6 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
} else {
|
} else {
|
||||||
Get-FileWCSynchronous -url "$msysUrl" -destinationFolder ([IO.Path]::GetTempPath()) -includeStats
|
Get-FileWCSynchronous -url "$msysUrl" -destinationFolder ([IO.Path]::GetTempPath()) -includeStats
|
||||||
}
|
}
|
||||||
$Msys2HashChecked = Get-FileHash -Algorithm SHA256 "${archivePath}"
|
|
||||||
if (!($Msys2HashChecked.Hash -eq $Msys2Hash)) {
|
|
||||||
Print-Msg -color Red -msg ("Hashes don't match, got {0}, but expected {1}" -f $Msys2HashChecked, $Msys2Hash)
|
|
||||||
Exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
Print-Msg -msg 'Extracting Msys2 archive...'
|
Print-Msg -msg 'Extracting Msys2 archive...'
|
||||||
$null = & "$archivePath" '-y' ('-o{0}' -f $GhcupDir) # Extract
|
$null = & "$archivePath" '-y' ('-o{0}' -f $GhcupDir) # Extract
|
||||||
@@ -459,7 +448,7 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
Print-Msg -msg 'Processing MSYS2 bash for first time use...'
|
Print-Msg -msg 'Processing MSYS2 bash for first time use...'
|
||||||
Exec "$Bash" '-lc' 'exit'
|
Exec "$Bash" '-lc' 'exit'
|
||||||
|
|
||||||
Exec "$env:windir\system32\taskkill.exe" /F /FI "MODULES eq msys-2.0.dll"
|
Exec "$env:windir\system32\taskkill.exe" /F /FI `"MODULES eq msys-2.0.dll`"
|
||||||
|
|
||||||
Print-Msg -msg 'Upgrading full system...'
|
Print-Msg -msg 'Upgrading full system...'
|
||||||
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ gh release download "$RELEASE"
|
|||||||
|
|
||||||
# cirrus
|
# cirrus
|
||||||
curl -L -o "x86_64-portbld-freebsd-ghcup-${TAG}" \
|
curl -L -o "x86_64-portbld-freebsd-ghcup-${TAG}" \
|
||||||
"https://api.cirrus-ci.com/v1/artifact/github/haskell/ghcup-hs/build/binaries/out/x86_64-portbld-freebsd-ghcup-${TAG}?branch=${RELEASE}"
|
"https://api.cirrus-ci.com/v1/artifact/github/haskell/ghcup-hs/build/binaries/out/x86_64-portbld-freebsd-ghcup-${RELEASE}?branch=${RELEASE}"
|
||||||
|
|
||||||
sha256sum ./*-ghcup-* > SHA256SUMS
|
sha256sum ./*-ghcup-* > SHA256SUMS
|
||||||
gpg --detach-sign -u "${SIGNER}" SHA256SUMS
|
gpg --detach-sign -u "${SIGNER}" SHA256SUMS
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec = do
|
|||||||
-- https://github.com/haskell/ghcup-hs/issues/415
|
-- https://github.com/haskell/ghcup-hs/issues/415
|
||||||
describe "GHCup.Prelude.File.Posix.Traversals" $ do
|
describe "GHCup.Prelude.File.Posix.Traversals" $ do
|
||||||
it "readDirEnt" $ do
|
it "readDirEnt" $ do
|
||||||
dirstream <- liftIO $ openDirStreamPortable "test/ghcup-test/data"
|
dirstream <- liftIO $ openDirStreamPortable "test/data"
|
||||||
(dt1, fp1) <- readDirEntPortable dirstream
|
(dt1, fp1) <- readDirEntPortable dirstream
|
||||||
(dt2, fp2) <- readDirEntPortable dirstream
|
(dt2, fp2) <- readDirEntPortable dirstream
|
||||||
(dt3, fp3) <- readDirEntPortable dirstream
|
(dt3, fp3) <- readDirEntPortable dirstream
|
||||||
@@ -17,6 +17,6 @@ spec = do
|
|||||||
roundtripAndGoldenSpecsWithSettings (defaultSettings { goldenDirectoryOption = CustomDirectoryName goldenDir }) (Proxy @GHCupInfo)
|
roundtripAndGoldenSpecsWithSettings (defaultSettings { goldenDirectoryOption = CustomDirectoryName goldenDir }) (Proxy @GHCupInfo)
|
||||||
where
|
where
|
||||||
goldenDir
|
goldenDir
|
||||||
| isWindows = "test/ghcup-test/golden/windows"
|
| isWindows = "test/golden/windows"
|
||||||
| otherwise = "test/ghcup-test/golden/unix"
|
| otherwise = "test/golden/unix"
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
module ChangeLogTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import Test.Tasty.HUnit
|
|
||||||
import Control.Monad.IO.Class
|
|
||||||
import GHCup.Types
|
|
||||||
import Data.Versions
|
|
||||||
import Data.List.NonEmpty (NonEmpty ((:|)))
|
|
||||||
|
|
||||||
changeLogTests :: TestTree
|
|
||||||
changeLogTests = testGroup "changelog" $ map (uncurry check) checkList
|
|
||||||
where
|
|
||||||
check :: String -> ChangeLogOptions -> TestTree
|
|
||||||
check args expected = testCase args $ do
|
|
||||||
res <- changeLogParseWith (words args)
|
|
||||||
liftIO $ res @?= expected
|
|
||||||
|
|
||||||
checkList :: [(String, ChangeLogOptions)]
|
|
||||||
checkList =
|
|
||||||
[ ("changelog", ChangeLogOptions False Nothing Nothing)
|
|
||||||
, ("changelog -o", ChangeLogOptions True Nothing Nothing)
|
|
||||||
, ("changelog -t ghc", ChangeLogOptions False (Just GHC) Nothing)
|
|
||||||
, ("changelog -t cabal", ChangeLogOptions False (Just Cabal) Nothing)
|
|
||||||
, ("changelog -t hls", ChangeLogOptions False (Just HLS) Nothing)
|
|
||||||
, ("changelog -t stack", ChangeLogOptions False (Just Stack) Nothing)
|
|
||||||
, ("changelog -t ghcup", ChangeLogOptions False (Just GHCup) Nothing)
|
|
||||||
, ("changelog 9.2", ChangeLogOptions False Nothing
|
|
||||||
(Just $ GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []]))
|
|
||||||
)
|
|
||||||
, ("changelog recommended", ChangeLogOptions False Nothing (Just $ ToolTag Recommended))
|
|
||||||
, ("changelog -t cabal recommended", ChangeLogOptions False (Just Cabal) (Just $ ToolTag Recommended))
|
|
||||||
, ("changelog -t cabal 3.10.1.0", ChangeLogOptions False (Just Cabal)
|
|
||||||
(Just $ GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| [],Digits 1 :| [],Digits 0 :| []]))
|
|
||||||
)
|
|
||||||
, ("changelog 2023-07-22", ChangeLogOptions False Nothing (Just (ToolDay (read "2023-07-22"))))
|
|
||||||
]
|
|
||||||
|
|
||||||
changeLogParseWith :: [String] -> IO ChangeLogOptions
|
|
||||||
changeLogParseWith args = do
|
|
||||||
ChangeLog a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
|
||||||
{-# LANGUAGE CPP #-}
|
|
||||||
|
|
||||||
module CompileTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import Data.Versions
|
|
||||||
import GHCup.Types
|
|
||||||
import URI.ByteString.QQ
|
|
||||||
import qualified GHCup.OptParse.Compile as GHC (GHCCompileOptions(..))
|
|
||||||
import qualified GHCup.OptParse.Compile as HLS (HLSCompileOptions(..))
|
|
||||||
import GHCup.GHC as GHC
|
|
||||||
import GHCup.HLS as HLS
|
|
||||||
|
|
||||||
|
|
||||||
compileTests :: TestTree
|
|
||||||
compileTests = testGroup "compile"
|
|
||||||
$ map (buildTestTree compileParseWith)
|
|
||||||
[ ("ghc", compileGhcCheckList)
|
|
||||||
, ("hls", compileHlsCheckList)
|
|
||||||
]
|
|
||||||
|
|
||||||
mkDefaultGHCCompileOptions :: GHCVer -> Either Version FilePath -> GHCCompileOptions
|
|
||||||
mkDefaultGHCCompileOptions target boot =
|
|
||||||
GHCCompileOptions
|
|
||||||
target
|
|
||||||
boot
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
(Just $ Right [])
|
|
||||||
Nothing
|
|
||||||
[]
|
|
||||||
False
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
mkDefaultHLSCompileOptions :: HLSVer -> [ToolVersion] -> HLSCompileOptions
|
|
||||||
mkDefaultHLSCompileOptions target ghcs =
|
|
||||||
HLSCompileOptions
|
|
||||||
target
|
|
||||||
Nothing
|
|
||||||
True
|
|
||||||
False
|
|
||||||
(Left False)
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
(Just $ Right [])
|
|
||||||
ghcs
|
|
||||||
[]
|
|
||||||
|
|
||||||
compileGhcCheckList :: [(String, CompileCommand)]
|
|
||||||
compileGhcCheckList = mapSecond CompileGHC
|
|
||||||
[ ("compile ghc -v 9.4.5 -b 9.2.8", baseOptions)
|
|
||||||
, ("compile ghc -g a32db0b -b 9.2.8", mkDefaultGHCCompileOptions
|
|
||||||
(GHC.GitDist $ GitBranch "a32db0b" Nothing)
|
|
||||||
(Left $ mkVersion' "9.2.8")
|
|
||||||
)
|
|
||||||
, ("compile ghc -g a32db0b -b 9.2.8 -r https://gitlab.haskell.org/ghc/ghc.git",
|
|
||||||
mkDefaultGHCCompileOptions
|
|
||||||
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
|
||||||
(Left $ mkVersion' "9.2.8")
|
|
||||||
)
|
|
||||||
, ("compile ghc -g a32db0b -r https://gitlab.haskell.org/ghc/ghc.git -b /usr/bin/ghc-9.2.2",
|
|
||||||
mkDefaultGHCCompileOptions
|
|
||||||
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
|
||||||
(Right "/usr/bin/ghc-9.2.2")
|
|
||||||
)
|
|
||||||
, ("compile ghc --remote-source-dist https://gitlab.haskell.org/ghc/ghc.git -b 9.2.8", mkDefaultGHCCompileOptions
|
|
||||||
(GHC.RemoteDist [uri|https://gitlab.haskell.org/ghc/ghc.git|])
|
|
||||||
(Left $ mkVersion' "9.2.8")
|
|
||||||
)
|
|
||||||
, (baseCmd <> "-j20", baseOptions{GHC.jobs = Just 20})
|
|
||||||
, (baseCmd <> "--jobs 10", baseOptions{GHC.jobs = Just 10})
|
|
||||||
, (baseCmd <> "-c build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
|
||||||
, (baseCmd <> "--config build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
|
||||||
, (baseCmd <> "--patch file:///example.patch", baseOptions{GHC.patches = Just $ Right [[uri|file:///example.patch|]]})
|
|
||||||
, (baseCmd <> "-p patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
|
||||||
, (baseCmd <> "--patchdir patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
|
||||||
, (baseCmd <> "-x armv7-unknown-linux-gnueabihf", baseOptions{GHC.crossTarget = Just "armv7-unknown-linux-gnueabihf"})
|
|
||||||
, (baseCmd <> "--cross-target armv7-unknown-linux-gnueabihf", baseOptions{GHC.crossTarget = Just "armv7-unknown-linux-gnueabihf"})
|
|
||||||
, (baseCmd <> "-- --enable-unregisterised", baseOptions{GHC.addConfArgs = ["--enable-unregisterised"]})
|
|
||||||
, (baseCmd <> "--set", baseOptions{GHC.setCompile = True})
|
|
||||||
, (baseCmd <> "-o 9.4.5-p1", baseOptions{GHC.ovewrwiteVer = Just $ mkVersion' "9.4.5-p1"})
|
|
||||||
, (baseCmd <> "--overwrite-version 9.4.5-p1", baseOptions{GHC.ovewrwiteVer = Just $ mkVersion' "9.4.5-p1"})
|
|
||||||
, (baseCmd <> "-f make", baseOptions{GHC.buildFlavour = Just "make"})
|
|
||||||
, (baseCmd <> "--flavour make", baseOptions{GHC.buildFlavour = Just "make"})
|
|
||||||
, (baseCmd <> "--hadrian", baseOptions{GHC.buildSystem = Just Hadrian})
|
|
||||||
, (baseCmd <> "--make", baseOptions{GHC.buildSystem = Just Make})
|
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{GHC.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
|
||||||
, (baseCmd <> "--isolate C:\\\\tmp\\out_dir", baseOptions{GHC.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "-i /tmp/out_dir", baseOptions{GHC.isolateDir = Just "/tmp/out_dir"})
|
|
||||||
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{GHC.isolateDir = Just "/tmp/out_dir"})
|
|
||||||
#endif
|
|
||||||
]
|
|
||||||
where
|
|
||||||
baseCmd :: String
|
|
||||||
baseCmd = "compile ghc -v 9.4.5 -b 9.2.8 "
|
|
||||||
|
|
||||||
baseOptions :: GHCCompileOptions
|
|
||||||
baseOptions =
|
|
||||||
mkDefaultGHCCompileOptions
|
|
||||||
(GHC.SourceDist $ mkVersion' "9.4.5")
|
|
||||||
(Left $ mkVersion' "9.2.8")
|
|
||||||
|
|
||||||
compileHlsCheckList :: [(String, CompileCommand)]
|
|
||||||
compileHlsCheckList = mapSecond CompileHLS
|
|
||||||
[ ("compile hls -v 2.0.0.0 --ghc 9.2.8", baseOptions)
|
|
||||||
, ("compile hls --version 2.0.0.0 --ghc 9.2.8", baseOptions)
|
|
||||||
, ("compile hls -g a32db0b --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Nothing})
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls --git-ref a32db0b --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Nothing})
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls -g a32db0b -r https://github.com/haskell/haskell-language-server.git --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Just "https://github.com/haskell/haskell-language-server.git"})
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls -g a32db0b --repository https://github.com/haskell/haskell-language-server.git --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Just "https://github.com/haskell/haskell-language-server.git"})
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls --source-dist 2.0.0.0 --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.SourceDist $ mkVersion' "2.0.0.0")
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls --remote-source-dist https://github.com/haskell/haskell-language-server/archive/refs/tags/2.0.0.1.tar.gz --ghc 9.2.8",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.RemoteDist [uri|https://github.com/haskell/haskell-language-server/archive/refs/tags/2.0.0.1.tar.gz|])
|
|
||||||
[ghc928]
|
|
||||||
)
|
|
||||||
, ("compile hls -v 2.0.0.0 --ghc latest",
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.HackageDist $ mkVersion' "2.0.0.0")
|
|
||||||
[ToolTag Latest]
|
|
||||||
)
|
|
||||||
, (baseCmd <> "-j20", baseOptions{HLS.jobs = Just 20})
|
|
||||||
, (baseCmd <> "--jobs 10", baseOptions{HLS.jobs = Just 10})
|
|
||||||
, (baseCmd <> "--no-set", baseOptions{HLS.setCompile = False})
|
|
||||||
, (baseCmd <> "--cabal-update", baseOptions{HLS.updateCabal = True})
|
|
||||||
, (baseCmd <> "-o 2.0.0.0-p1", baseOptions{HLS.ovewrwiteVer = Right $ mkVersion' "2.0.0.0-p1"})
|
|
||||||
, (baseCmd <> "--overwrite-version 2.0.0.0-p1", baseOptions{HLS.ovewrwiteVer = Right $ mkVersion' "2.0.0.0-p1"})
|
|
||||||
, (baseCmd <> "--git-describe-version", baseOptions{HLS.ovewrwiteVer = Left True})
|
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
|
||||||
, (baseCmd <> "--isolate C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "-i /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
|
||||||
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
|
||||||
#endif
|
|
||||||
, (baseCmd <> "--cabal-project file:///tmp/cabal.project", baseOptions{HLS.cabalProject = Just $ Right [uri|file:///tmp/cabal.project|]})
|
|
||||||
, (baseCmd <> "--cabal-project cabal.ghc8107.project", baseOptions{HLS.cabalProject = Just $ Left "cabal.ghc8107.project"})
|
|
||||||
, (baseCmd <> "--cabal-project-local file:///tmp/cabal.project.local", baseOptions{HLS.cabalProjectLocal = Just [uri|file:///tmp/cabal.project.local|]})
|
|
||||||
, (baseCmd <> "--patch file:///example.patch", baseOptions{HLS.patches = Just $ Right [[uri|file:///example.patch|]]})
|
|
||||||
, (baseCmd <> "-p patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
|
||||||
, (baseCmd <> "--patchdir patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
|
||||||
, (baseCmd <> "-- --enable-tests", baseOptions{HLS.cabalArgs = ["--enable-tests"]})
|
|
||||||
]
|
|
||||||
where
|
|
||||||
baseCmd :: String
|
|
||||||
baseCmd = "compile hls -v 2.0.0.0 --ghc 9.2.8 "
|
|
||||||
|
|
||||||
baseOptions :: HLSCompileOptions
|
|
||||||
baseOptions =
|
|
||||||
mkDefaultHLSCompileOptions
|
|
||||||
(HLS.HackageDist $ mkVersion' "2.0.0.0")
|
|
||||||
[ghc928]
|
|
||||||
|
|
||||||
ghc928 :: ToolVersion
|
|
||||||
ghc928 = GHCVersion $ GHCTargetVersion Nothing (mkVersion' "9.2.8")
|
|
||||||
|
|
||||||
compileParseWith :: [String] -> IO CompileCommand
|
|
||||||
compileParseWith args = do
|
|
||||||
Compile a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{-# LANGUAGE QuasiQuotes #-}
|
|
||||||
|
|
||||||
module ConfigTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import Test.Tasty.HUnit
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import Control.Monad.IO.Class
|
|
||||||
import URI.ByteString.QQ
|
|
||||||
|
|
||||||
configTests :: TestTree
|
|
||||||
configTests = testGroup "config" $ map (uncurry check) checkList
|
|
||||||
where
|
|
||||||
check :: String -> ConfigCommand -> TestTree
|
|
||||||
check args expected = testCase args $ do
|
|
||||||
res <- configParseWith (words args)
|
|
||||||
liftIO $ res @?= expected
|
|
||||||
|
|
||||||
checkList :: [(String, ConfigCommand)]
|
|
||||||
checkList =
|
|
||||||
[ ("config", ShowConfig)
|
|
||||||
, ("config init", InitConfig)
|
|
||||||
, ("config show", ShowConfig)
|
|
||||||
, ("config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
|
||||||
, AddReleaseChannel False [uri|https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml|]
|
|
||||||
)
|
|
||||||
, ("config set cache true", SetConfig "cache" (Just "true"))
|
|
||||||
]
|
|
||||||
|
|
||||||
configParseWith :: [String] -> IO ConfigCommand
|
|
||||||
configParseWith args = do
|
|
||||||
Config a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
module GCTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
|
|
||||||
|
|
||||||
gcTests :: TestTree
|
|
||||||
gcTests = buildTestTree gcParseWith ("gc", gcCheckList)
|
|
||||||
|
|
||||||
defaultOptions :: GCOptions
|
|
||||||
defaultOptions =
|
|
||||||
GCOptions
|
|
||||||
False
|
|
||||||
False
|
|
||||||
False
|
|
||||||
False
|
|
||||||
False
|
|
||||||
False
|
|
||||||
|
|
||||||
gcCheckList :: [(String, GCOptions)]
|
|
||||||
gcCheckList =
|
|
||||||
[ ("gc", defaultOptions)
|
|
||||||
, ("gc -o", defaultOptions{gcOldGHC = True})
|
|
||||||
, ("gc --ghc-old", defaultOptions{gcOldGHC = True})
|
|
||||||
, ("gc -p", defaultOptions{gcProfilingLibs = True})
|
|
||||||
, ("gc --profiling-libs", defaultOptions{gcProfilingLibs = True})
|
|
||||||
, ("gc -s", defaultOptions{gcShareDir = True})
|
|
||||||
, ("gc --share-dir", defaultOptions{gcShareDir = True})
|
|
||||||
, ("gc -h", defaultOptions{gcHLSNoGHC = True})
|
|
||||||
, ("gc --hls-no-ghc", defaultOptions{gcHLSNoGHC = True})
|
|
||||||
, ("gc -c", defaultOptions{gcCache = True})
|
|
||||||
, ("gc --cache", defaultOptions{gcCache = True})
|
|
||||||
, ("gc -t", defaultOptions{gcTmp = True})
|
|
||||||
, ("gc --tmpdirs", defaultOptions{gcTmp = True})
|
|
||||||
, ("gc -o -p -s -h -c -t", GCOptions True True True True True True)
|
|
||||||
]
|
|
||||||
|
|
||||||
gcParseWith :: [String] -> IO GCOptions
|
|
||||||
gcParseWith args = do
|
|
||||||
GC a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
{-# LANGUAGE CPP #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
|
||||||
|
|
||||||
module InstallTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse hiding (HLSCompileOptions(isolateDir))
|
|
||||||
import Utils
|
|
||||||
import GHCup.Types
|
|
||||||
import Data.Versions
|
|
||||||
import Data.List.NonEmpty (NonEmpty ((:|)))
|
|
||||||
import GHCup.OptParse.Install as Install
|
|
||||||
import URI.ByteString.QQ
|
|
||||||
|
|
||||||
-- Some interests:
|
|
||||||
-- install ghc *won't* select `set as activate version` as default
|
|
||||||
-- install cabal *will* select `set as activate version` as default
|
|
||||||
-- install hls *will* select `set as activate version` as default
|
|
||||||
-- install stack *will* select `set as activate version` as default
|
|
||||||
|
|
||||||
installTests :: TestTree
|
|
||||||
installTests = testGroup "install"
|
|
||||||
$ map
|
|
||||||
(buildTestTree installParseWith)
|
|
||||||
[ ("old-style", oldStyleCheckList)
|
|
||||||
, ("ghc", installGhcCheckList)
|
|
||||||
, ("cabal", installCabalCheckList)
|
|
||||||
, ("hls", installHlsCheckList)
|
|
||||||
, ("stack", installStackCheckList)
|
|
||||||
]
|
|
||||||
|
|
||||||
defaultOptions :: InstallOptions
|
|
||||||
defaultOptions = InstallOptions Nothing Nothing False Nothing False []
|
|
||||||
|
|
||||||
-- | Don't set as active version
|
|
||||||
mkInstallOptions :: ToolVersion -> InstallOptions
|
|
||||||
mkInstallOptions ver = InstallOptions (Just ver) Nothing False Nothing False []
|
|
||||||
|
|
||||||
-- | Set as active version
|
|
||||||
mkInstallOptions' :: ToolVersion -> InstallOptions
|
|
||||||
mkInstallOptions' ver = InstallOptions (Just ver) Nothing True Nothing False []
|
|
||||||
|
|
||||||
oldStyleCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|
||||||
oldStyleCheckList =
|
|
||||||
("install", Right defaultOptions)
|
|
||||||
: ("install --set", Right defaultOptions{instSet = True})
|
|
||||||
: ("install --force", Right defaultOptions{forceInstall = True})
|
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
: ("install -i C:\\\\", Right defaultOptions{Install.isolateDir = Just "C:\\\\"})
|
|
||||||
#else
|
|
||||||
: ("install -i /", Right defaultOptions{Install.isolateDir = Just "/"})
|
|
||||||
#endif
|
|
||||||
: ("install -u https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz head"
|
|
||||||
, Right defaultOptions
|
|
||||||
{ instBindist = Just [uri|https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz|]
|
|
||||||
, instVer = Just $ GHCVersion $ GHCTargetVersion Nothing (mkVersion $ (Str "head" :| []) :| [])
|
|
||||||
}
|
|
||||||
)
|
|
||||||
: mapSecond
|
|
||||||
(Right . mkInstallOptions)
|
|
||||||
[ ("install ghc-9.2", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
-- invalid
|
|
||||||
, ("install next", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "next" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install latest", ToolTag Latest)
|
|
||||||
, ("install nightly", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install recommended", ToolTag Recommended)
|
|
||||||
, ("install prerelease", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install latest-prerelease", ToolTag LatestPrerelease)
|
|
||||||
, ("install latest-nightly", ToolTag LatestNightly)
|
|
||||||
, ("install ghc-javascript-unknown-ghcjs-9.6", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc-javascript-unknown-ghcjs")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
|
||||||
)
|
|
||||||
, ("install base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("install cabal-3.10", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "cabal")
|
|
||||||
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
)
|
|
||||||
, ("install hls-2.0.0.0", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "hls")
|
|
||||||
(mkVersion $ (Digits 2 :| []) :| [Digits 0 :| [], Digits 0 :| [], Digits 0 :| []])
|
|
||||||
)
|
|
||||||
, ("install stack-2.9.3", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "stack")
|
|
||||||
(mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 3 :| []])
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
installGhcCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|
||||||
installGhcCheckList =
|
|
||||||
("install ghc", Left $ InstallGHC defaultOptions)
|
|
||||||
: mapSecond (Left . InstallGHC . mkInstallOptions)
|
|
||||||
[ ("install ghc 9.2", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
, ("install ghc next", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "next" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install ghc latest", ToolTag Latest)
|
|
||||||
, ("install ghc nightly", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install ghc recommended", ToolTag Recommended)
|
|
||||||
, ("install ghc prerelease", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("install ghc latest-prerelease", ToolTag LatestPrerelease)
|
|
||||||
, ("install ghc latest-nightly", ToolTag LatestNightly)
|
|
||||||
, ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "javascript-unknown-ghcjs")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
|
||||||
)
|
|
||||||
, ("install ghc base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("install ghc ghc-9.2", GHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
installCabalCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|
||||||
installCabalCheckList =
|
|
||||||
("install cabal", Left $ InstallCabal defaultOptions{instSet = True})
|
|
||||||
: mapSecond (Left . InstallCabal . mkInstallOptions')
|
|
||||||
[ ("install cabal 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
, ("install cabal next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
|
||||||
, ("install cabal latest", ToolTag Latest)
|
|
||||||
, ("install cabal nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("install cabal recommended", ToolTag Recommended)
|
|
||||||
, ("install cabal prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("install cabal latest-prerelease", ToolTag LatestPrerelease)
|
|
||||||
, ("install cabal latest-nightly", ToolTag LatestNightly)
|
|
||||||
, ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("install cabal cabal-3.10", ToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "cabal" :| []) :| []
|
|
||||||
, _vRel = [Digits 3 :| [], Digits 10 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
installHlsCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|
||||||
installHlsCheckList =
|
|
||||||
("install hls", Left $ InstallHLS defaultOptions{instSet = True})
|
|
||||||
: mapSecond (Left . InstallHLS . mkInstallOptions')
|
|
||||||
[ ("install hls 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
, ("install hls next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
|
||||||
, ("install hls latest", ToolTag Latest)
|
|
||||||
, ("install hls nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("install hls recommended", ToolTag Recommended)
|
|
||||||
, ("install hls prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("install hls latest-prerelease", ToolTag LatestPrerelease)
|
|
||||||
, ("install hls latest-nightly", ToolTag LatestNightly)
|
|
||||||
, ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("install hls hls-2.0", ToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "hls" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 0 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
installStackCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|
||||||
installStackCheckList =
|
|
||||||
("install stack", Left $ InstallStack defaultOptions{instSet = True})
|
|
||||||
: mapSecond (Left . InstallStack . mkInstallOptions')
|
|
||||||
[ ("install stack 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
, ("install stack next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
|
||||||
, ("install stack latest", ToolTag Latest)
|
|
||||||
, ("install stack nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("install stack recommended", ToolTag Recommended)
|
|
||||||
, ("install stack prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("install stack latest-prerelease", ToolTag LatestPrerelease)
|
|
||||||
, ("install stack latest-nightly", ToolTag LatestNightly)
|
|
||||||
, ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("install stack stack-2.9", ToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "stack" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 9 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
installParseWith :: [String] -> IO (Either InstallCommand InstallOptions)
|
|
||||||
installParseWith args = do
|
|
||||||
Install a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
module ListTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import GHCup.List
|
|
||||||
import GHCup.Types
|
|
||||||
|
|
||||||
|
|
||||||
listTests :: TestTree
|
|
||||||
listTests = buildTestTree listParseWith ("list", listCheckList)
|
|
||||||
|
|
||||||
defaultOptions :: ListOptions
|
|
||||||
defaultOptions = ListOptions Nothing Nothing Nothing Nothing False False False
|
|
||||||
|
|
||||||
listCheckList :: [(String, ListOptions)]
|
|
||||||
listCheckList =
|
|
||||||
[ ("list", defaultOptions)
|
|
||||||
, ("list -t ghc", defaultOptions{loTool = Just GHC})
|
|
||||||
, ("list -t cabal", defaultOptions{loTool = Just Cabal})
|
|
||||||
, ("list -t hls", defaultOptions{loTool = Just HLS})
|
|
||||||
, ("list -t stack", defaultOptions{loTool = Just Stack})
|
|
||||||
, ("list -c installed", defaultOptions{lCriteria = Just $ ListInstalled True})
|
|
||||||
, ("list -c +installed", defaultOptions{lCriteria = Just $ ListInstalled True})
|
|
||||||
, ("list -c -installed", defaultOptions{lCriteria = Just $ ListInstalled False})
|
|
||||||
, ("list -c set", defaultOptions{lCriteria = Just $ ListSet True})
|
|
||||||
, ("list -c +set", defaultOptions{lCriteria = Just $ ListSet True})
|
|
||||||
, ("list -c -set", defaultOptions{lCriteria = Just $ ListSet False})
|
|
||||||
, ("list -c available", defaultOptions{lCriteria = Just $ ListAvailable True})
|
|
||||||
, ("list -c +available", defaultOptions{lCriteria = Just $ ListAvailable True})
|
|
||||||
, ("list -c -available", defaultOptions{lCriteria = Just $ ListAvailable False})
|
|
||||||
, ("list -s 2023-07-22", defaultOptions{lFrom = Just $ read "2023-07-22"})
|
|
||||||
, ("list -u 2023-07-22", defaultOptions{lTo = Just $ read "2023-07-22"})
|
|
||||||
, ("list --since 2023-07-22 --until 2023-07-22", defaultOptions{lFrom = Just $ read "2023-07-22", lTo = Just $ read "2023-07-22"})
|
|
||||||
, ("list -o", defaultOptions{lHideOld = True})
|
|
||||||
, ("list --hide-old", defaultOptions{lHideOld = True})
|
|
||||||
, ("list -n", defaultOptions{lShowNightly = True})
|
|
||||||
, ("list --show-nightly", defaultOptions{lShowNightly = True})
|
|
||||||
, ("list -r", defaultOptions{lRawFormat = True})
|
|
||||||
, ("list --raw-format", defaultOptions{lRawFormat = True})
|
|
||||||
]
|
|
||||||
|
|
||||||
listParseWith :: [String] -> IO ListOptions
|
|
||||||
listParseWith args = do
|
|
||||||
List a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
module Main where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import qualified SetTest
|
|
||||||
import qualified OtherCommandTest
|
|
||||||
import qualified ChangeLogTest
|
|
||||||
import qualified ConfigTest
|
|
||||||
import qualified InstallTest
|
|
||||||
import qualified UnsetTest
|
|
||||||
import qualified RmTest
|
|
||||||
import qualified ListTest
|
|
||||||
import qualified UpgradeTest
|
|
||||||
import qualified CompileTest
|
|
||||||
import qualified WhereisTest
|
|
||||||
import qualified GCTest
|
|
||||||
import qualified RunTest
|
|
||||||
|
|
||||||
main :: IO ()
|
|
||||||
main = defaultMain $ testGroup "ghcup"
|
|
||||||
[ SetTest.setTests
|
|
||||||
, OtherCommandTest.otherCommandTests
|
|
||||||
, ChangeLogTest.changeLogTests
|
|
||||||
, ConfigTest.configTests
|
|
||||||
, InstallTest.installTests
|
|
||||||
, UnsetTest.unsetTests
|
|
||||||
, RmTest.rmTests
|
|
||||||
, ListTest.listTests
|
|
||||||
, UpgradeTest.upgradeTests
|
|
||||||
, CompileTest.compileTests
|
|
||||||
, WhereisTest.whereisTests
|
|
||||||
, GCTest.gcTests
|
|
||||||
, RunTest.runTests
|
|
||||||
]
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
module OtherCommandTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import Test.Tasty.HUnit
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import Control.Monad.IO.Class
|
|
||||||
|
|
||||||
otherCommandTests :: TestTree
|
|
||||||
otherCommandTests = testGroup "other command"
|
|
||||||
[ testCase "debug-info" $ do
|
|
||||||
res <- parseWith ["debug-info"]
|
|
||||||
liftIO $ assertBool "debug-info parse failed" (isDInfo res)
|
|
||||||
, testCase "tool-requirements" $ do
|
|
||||||
ToolRequirements opt <- parseWith ["tool-requirements"]
|
|
||||||
liftIO $ tlrRaw opt @?= False
|
|
||||||
, testCase "tool-requirements -r" $ do
|
|
||||||
ToolRequirements opt <- parseWith ["tool-requirements", "--raw-format"]
|
|
||||||
liftIO $ tlrRaw opt @?= True
|
|
||||||
, testCase "nuke" $ do
|
|
||||||
res <- parseWith ["nuke"]
|
|
||||||
liftIO $ assertBool "nuke parse failed" (isNuke res)
|
|
||||||
, testCase "test ghc" $ do
|
|
||||||
res <- parseWith ["test", "ghc"]
|
|
||||||
liftIO $ assertBool "test parse failed" (isTest res)
|
|
||||||
]
|
|
||||||
|
|
||||||
isDInfo :: Command -> Bool
|
|
||||||
isDInfo DInfo = True
|
|
||||||
isDInfo _ = False
|
|
||||||
|
|
||||||
isNuke :: Command -> Bool
|
|
||||||
isNuke Nuke = True
|
|
||||||
isNuke _ = False
|
|
||||||
|
|
||||||
isTest :: Command -> Bool
|
|
||||||
isTest (Test _) = True
|
|
||||||
isTest _ = False
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
module RmTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import GHCup.Types
|
|
||||||
import Data.List.NonEmpty (NonEmpty ((:|)))
|
|
||||||
import Data.Versions
|
|
||||||
|
|
||||||
|
|
||||||
rmTests :: TestTree
|
|
||||||
rmTests =
|
|
||||||
testGroup "rm"
|
|
||||||
$ map (buildTestTree rmParseWith)
|
|
||||||
[ ("old-style", oldStyleCheckList)
|
|
||||||
, ("ghc", rmGhcCheckList)
|
|
||||||
, ("cabal", rmCabalCheckList)
|
|
||||||
, ("hls", rmHlsCheckList)
|
|
||||||
, ("stack", rmStackCheckList)
|
|
||||||
]
|
|
||||||
|
|
||||||
oldStyleCheckList :: [(String, Either RmCommand RmOptions)]
|
|
||||||
oldStyleCheckList = mapSecond (Right . RmOptions)
|
|
||||||
[ -- failed with ("rm", xxx)
|
|
||||||
("rm 9.2.8", mkTVer (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
|
||||||
, ("rm ghc-9.2.8", GHCTargetVersion (Just "ghc") (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
|
||||||
]
|
|
||||||
|
|
||||||
rmGhcCheckList :: [(String, Either RmCommand RmOptions)]
|
|
||||||
rmGhcCheckList = mapSecond (Left . RmGHC . RmOptions)
|
|
||||||
[ -- failed with ("rm ghc", xxx)
|
|
||||||
("rm ghc 9.2.8", mkTVer (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
|
||||||
, ("rm ghc ghc-9.2.8", GHCTargetVersion (Just "ghc") (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
|
||||||
]
|
|
||||||
|
|
||||||
rmCabalCheckList :: [(String, Either RmCommand RmOptions)]
|
|
||||||
rmCabalCheckList = mapSecond (Left . RmCabal)
|
|
||||||
[ -- failed with ("rm cabal", xxx)
|
|
||||||
("rm cabal 3.10", mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
, ("rm cabal cabal-3.10", Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "cabal" :| []) :| []
|
|
||||||
, _vRel = [Digits 3 :| [], Digits 10 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
rmHlsCheckList :: [(String, Either RmCommand RmOptions)]
|
|
||||||
rmHlsCheckList = mapSecond (Left . RmHLS)
|
|
||||||
[ -- failed with ("rm hls", xxx)
|
|
||||||
("rm hls 2.0", mkVersion $ (Digits 2 :| []) :| [Digits 0 :| []])
|
|
||||||
, ("rm hls hls-2.0", Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "hls" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 0 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
rmStackCheckList :: [(String, Either RmCommand RmOptions)]
|
|
||||||
rmStackCheckList = mapSecond (Left . RmStack)
|
|
||||||
[ -- failed with ("rm stack", xxx)
|
|
||||||
("rm stack 2.9.1", mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 1 :| []])
|
|
||||||
, ("rm stack stack-2.9.1", Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "stack" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 9 :| [], Digits 1 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
rmParseWith :: [String] -> IO (Either RmCommand RmOptions)
|
|
||||||
rmParseWith args = do
|
|
||||||
Rm a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
{-# LANGUAGE CPP #-}
|
|
||||||
|
|
||||||
module RunTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import GHCup.Types
|
|
||||||
|
|
||||||
|
|
||||||
runTests :: TestTree
|
|
||||||
runTests = buildTestTree runParseWith ("run", runCheckList)
|
|
||||||
|
|
||||||
defaultOptions :: RunOptions
|
|
||||||
defaultOptions =
|
|
||||||
RunOptions
|
|
||||||
False
|
|
||||||
False
|
|
||||||
False
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
Nothing
|
|
||||||
False
|
|
||||||
[]
|
|
||||||
|
|
||||||
runCheckList :: [(String, RunOptions)]
|
|
||||||
runCheckList =
|
|
||||||
[ ("run", defaultOptions)
|
|
||||||
, ("run -a", defaultOptions{runAppendPATH = True})
|
|
||||||
, ("run --append", defaultOptions{runAppendPATH = True})
|
|
||||||
, ("run -i", defaultOptions{runInstTool' = True})
|
|
||||||
, ("run --install", defaultOptions{runInstTool' = True})
|
|
||||||
, ("run -m", defaultOptions{runMinGWPath = True})
|
|
||||||
, ("run --mingw-path", defaultOptions{runMinGWPath = True})
|
|
||||||
, ("run --ghc 9.2.8", defaultOptions{runGHCVer = Just $ GHCVersion $ mkTVer $ mkVersion' "9.2.8"})
|
|
||||||
, ("run --ghc latest", defaultOptions{runGHCVer = Just $ ToolTag Latest})
|
|
||||||
, ("run --cabal 3.10", defaultOptions{runCabalVer = Just $ ToolVersion $ mkVersion' "3.10"})
|
|
||||||
, ("run --hls 2.0", defaultOptions{runHLSVer = Just $ ToolVersion $ mkVersion' "2.0"})
|
|
||||||
, ("run --stack 2.9", defaultOptions{runStackVer = Just $ ToolVersion $ mkVersion' "2.9"})
|
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, ("run -b C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
|
||||||
, ("run --bindir C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
|
||||||
#else
|
|
||||||
, ("run -b /tmp/dir", defaultOptions{runBinDir = Just "/tmp/dir"})
|
|
||||||
, ("run --bindir /tmp/dir", defaultOptions{runBinDir = Just "/tmp/dir"})
|
|
||||||
#endif
|
|
||||||
, ("run -q", defaultOptions{runQuick = True})
|
|
||||||
, ("run --quick", defaultOptions{runQuick = True})
|
|
||||||
, ("run --ghc latest --cabal 3.10 --stack 2.9 --hls 2.0 --install",
|
|
||||||
defaultOptions
|
|
||||||
{ runGHCVer = Just $ ToolTag Latest
|
|
||||||
, runCabalVer = Just $ ToolVersion $ mkVersion' "3.10"
|
|
||||||
, runHLSVer = Just $ ToolVersion $ mkVersion' "2.0"
|
|
||||||
, runStackVer = Just $ ToolVersion $ mkVersion' "2.9"
|
|
||||||
, runInstTool' = True
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
runParseWith :: [String] -> IO RunOptions
|
|
||||||
runParseWith args = do
|
|
||||||
Run a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
module SetTest where
|
|
||||||
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.Types
|
|
||||||
import Data.Versions
|
|
||||||
import Data.List.NonEmpty (NonEmpty ((:|)))
|
|
||||||
import Utils
|
|
||||||
|
|
||||||
setTests :: TestTree
|
|
||||||
setTests =
|
|
||||||
testGroup "set"
|
|
||||||
$ map
|
|
||||||
(buildTestTree setParseWith)
|
|
||||||
[ ("old-style", oldStyleCheckList)
|
|
||||||
, ("ghc", setGhcCheckList)
|
|
||||||
, ("cabal", setCabalCheckList)
|
|
||||||
, ("hls", setHlsCheckList)
|
|
||||||
, ("stack", setStackCheckList)
|
|
||||||
]
|
|
||||||
|
|
||||||
oldStyleCheckList :: [(String, Either SetCommand SetOptions)]
|
|
||||||
oldStyleCheckList = mapSecond (Right . SetOptions)
|
|
||||||
[ ("set", SetRecommended)
|
|
||||||
, ("set ghc-9.2", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
, ("set next", SetNext)
|
|
||||||
, ("set latest", SetToolTag Latest)
|
|
||||||
, ("set nightly", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
)
|
|
||||||
-- different from `set`
|
|
||||||
, ("set recommended", SetToolTag Recommended)
|
|
||||||
, ("set prerelease", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("set latest-prerelease", SetToolTag LatestPrerelease)
|
|
||||||
, ("set latest-nightly", SetToolTag LatestNightly)
|
|
||||||
, ("set ghc-javascript-unknown-ghcjs-9.6", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc-javascript-unknown-ghcjs")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
|
||||||
)
|
|
||||||
, ("set base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("set cabal-3.10", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "cabal")
|
|
||||||
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
)
|
|
||||||
, ("set hls-2.0.0.0", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "hls")
|
|
||||||
(mkVersion $ (Digits 2 :| []) :| [Digits 0 :| [], Digits 0 :| [], Digits 0 :| []])
|
|
||||||
)
|
|
||||||
, ("set stack-2.9.3", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "stack")
|
|
||||||
(mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 3 :| []])
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
setGhcCheckList :: [(String, Either SetCommand SetOptions)]
|
|
||||||
setGhcCheckList = mapSecond (Left . SetGHC . SetOptions)
|
|
||||||
[ ("set ghc", SetRecommended)
|
|
||||||
, ("set ghc 9.2", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
, ("set ghc next", SetNext)
|
|
||||||
, ("set ghc latest", SetToolTag Latest)
|
|
||||||
, ("set ghc nightly", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("set ghc recommended", SetToolTag Recommended)
|
|
||||||
, ("set ghc prerelease", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
Nothing
|
|
||||||
(mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
)
|
|
||||||
, ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
|
|
||||||
, ("set ghc latest-nightly", SetToolTag LatestNightly)
|
|
||||||
, ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "javascript-unknown-ghcjs")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
|
||||||
)
|
|
||||||
, ("set ghc base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("set ghc ghc-9.2", SetGHCVersion
|
|
||||||
$ GHCTargetVersion
|
|
||||||
(Just "ghc")
|
|
||||||
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
setCabalCheckList :: [(String, Either SetCommand SetOptions)]
|
|
||||||
setCabalCheckList = mapSecond (Left . SetCabal . SetOptions)
|
|
||||||
[ ("set cabal", SetRecommended)
|
|
||||||
, ("set cabal 3.10", SetToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
|
||||||
, ("set cabal next", SetNext)
|
|
||||||
, ("set cabal latest", SetToolTag Latest)
|
|
||||||
, ("set cabal nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("set cabal recommended", SetToolTag Recommended)
|
|
||||||
, ("set cabal prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
|
|
||||||
, ("set cabal latest-nightly", SetToolTag LatestNightly)
|
|
||||||
, ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("set cabal cabal-3.10", SetToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "cabal" :| []) :| []
|
|
||||||
, _vRel = [Digits 3 :| [], Digits 10 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
setHlsCheckList :: [(String, Either SetCommand SetOptions)]
|
|
||||||
setHlsCheckList = mapSecond (Left . SetHLS . SetOptions)
|
|
||||||
[ ("set hls", SetRecommended)
|
|
||||||
, ("set hls 2.0", SetToolVersion $ mkVersion $ (Digits 2 :| []) :| [Digits 0 :| []])
|
|
||||||
, ("set hls next", SetNext)
|
|
||||||
, ("set hls latest", SetToolTag Latest)
|
|
||||||
, ("set hls nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("set hls recommended", SetToolTag Recommended)
|
|
||||||
, ("set hls prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("set hls latest-prerelease", SetToolTag LatestPrerelease)
|
|
||||||
, ("set hls latest-nightly", SetToolTag LatestNightly)
|
|
||||||
, ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("set hls hls-2.0", SetToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "hls" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 0 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
setStackCheckList :: [(String, Either SetCommand SetOptions)]
|
|
||||||
setStackCheckList = mapSecond (Left . SetStack . SetOptions)
|
|
||||||
[ ("set stack", SetRecommended)
|
|
||||||
, ("set stack 2.9", SetToolVersion $ mkVersion $ (Digits 2 :| []) :| [Digits 9 :| []])
|
|
||||||
, ("set stack next", SetNext)
|
|
||||||
, ("set stack latest", SetToolTag Latest)
|
|
||||||
, ("set stack nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
|
||||||
, ("set stack recommended", SetToolTag Recommended)
|
|
||||||
, ("set stack prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
|
||||||
, ("set stack latest-prerelease", SetToolTag LatestPrerelease)
|
|
||||||
, ("set stack latest-nightly", SetToolTag LatestNightly)
|
|
||||||
, ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
|
||||||
, ("set stack stack-2.9", SetToolVersion
|
|
||||||
$ Version
|
|
||||||
{ _vEpoch = Nothing
|
|
||||||
, _vChunks = (Str "stack" :| []) :| []
|
|
||||||
, _vRel = [Digits 2 :| [], Digits 9 :| []]
|
|
||||||
, _vMeta = Nothing
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
setParseWith :: [String] -> IO (Either SetCommand SetOptions)
|
|
||||||
setParseWith args = do
|
|
||||||
Set a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
module UnsetTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
|
|
||||||
|
|
||||||
unsetTests :: TestTree
|
|
||||||
unsetTests =
|
|
||||||
testGroup "unset"
|
|
||||||
$ map (buildTestTree unsetParseWith)
|
|
||||||
[ ("ghc", unsetGhcCheckList)
|
|
||||||
, ("cabal", unsetCabalCheckList)
|
|
||||||
, ("hls", unsetHlsCheckList)
|
|
||||||
, ("stack", unsetStackCheckList)
|
|
||||||
]
|
|
||||||
|
|
||||||
unsetGhcCheckList :: [(String, UnsetCommand)]
|
|
||||||
unsetGhcCheckList = mapSecond (UnsetGHC . UnsetOptions)
|
|
||||||
[ ("unset ghc", Nothing)
|
|
||||||
, ("unset ghc armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
|
||||||
]
|
|
||||||
|
|
||||||
unsetCabalCheckList :: [(String, UnsetCommand)]
|
|
||||||
unsetCabalCheckList = mapSecond (UnsetCabal . UnsetOptions)
|
|
||||||
[ ("unset cabal", Nothing)
|
|
||||||
-- This never used
|
|
||||||
, ("unset cabal armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
|
||||||
]
|
|
||||||
|
|
||||||
unsetHlsCheckList :: [(String, UnsetCommand)]
|
|
||||||
unsetHlsCheckList = mapSecond (UnsetHLS . UnsetOptions)
|
|
||||||
[ ("unset hls", Nothing)
|
|
||||||
-- This never used
|
|
||||||
, ("unset hls armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
|
||||||
]
|
|
||||||
|
|
||||||
unsetStackCheckList :: [(String, UnsetCommand)]
|
|
||||||
unsetStackCheckList = mapSecond (UnsetStack . UnsetOptions)
|
|
||||||
[ ("unset stack", Nothing)
|
|
||||||
-- This never used
|
|
||||||
, ("unset stack armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
|
||||||
]
|
|
||||||
|
|
||||||
unsetParseWith :: [String] -> IO UnsetCommand
|
|
||||||
unsetParseWith args = do
|
|
||||||
UnSet a <- parseWith args
|
|
||||||
pure a
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{-# LANGUAGE TupleSections #-}
|
|
||||||
|
|
||||||
module UpgradeTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
|
|
||||||
|
|
||||||
upgradeTests :: TestTree
|
|
||||||
upgradeTests = buildTestTree upgradeParseWith ("upgrade", upgradeCheckList)
|
|
||||||
|
|
||||||
type FullUpgradeOpts =
|
|
||||||
( UpgradeOpts
|
|
||||||
, Bool -- ^Force update
|
|
||||||
, Bool -- ^Fails after upgrading if the upgraded ghcup binary is shadowed by something else in PATH (useful for CI)
|
|
||||||
)
|
|
||||||
|
|
||||||
mkDefaultOptions :: UpgradeOpts -> FullUpgradeOpts
|
|
||||||
mkDefaultOptions = (, False, False)
|
|
||||||
|
|
||||||
upgradeCheckList :: [(String, FullUpgradeOpts)]
|
|
||||||
upgradeCheckList =
|
|
||||||
[ ("upgrade", mkDefaultOptions UpgradeGHCupDir)
|
|
||||||
, ("upgrade -f", (UpgradeGHCupDir, True, False))
|
|
||||||
, ("upgrade --force", (UpgradeGHCupDir, True, False))
|
|
||||||
, ("upgrade --fail-if-shadowed", (UpgradeGHCupDir, False, True))
|
|
||||||
, ("upgrade -i", mkDefaultOptions UpgradeInplace)
|
|
||||||
, ("upgrade --inplace", mkDefaultOptions UpgradeInplace)
|
|
||||||
, ("upgrade -t ~", mkDefaultOptions $ UpgradeAt "~")
|
|
||||||
, ("upgrade --target ~", mkDefaultOptions $ UpgradeAt "~")
|
|
||||||
, ("upgrade -t ~ -f", (UpgradeAt "~", True, False))
|
|
||||||
]
|
|
||||||
|
|
||||||
upgradeParseWith :: [String] -> IO FullUpgradeOpts
|
|
||||||
upgradeParseWith args = do
|
|
||||||
Upgrade a b c <- parseWith args
|
|
||||||
pure (a, b, c)
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
|
|
||||||
module Utils where
|
|
||||||
|
|
||||||
import GHCup.OptParse as GHCup
|
|
||||||
import Options.Applicative
|
|
||||||
import Data.Bifunctor
|
|
||||||
import Data.Versions
|
|
||||||
import Data.List.NonEmpty (NonEmpty)
|
|
||||||
import Test.Tasty
|
|
||||||
import Test.Tasty.HUnit
|
|
||||||
import Control.Monad.IO.Class
|
|
||||||
import qualified Data.Text as T
|
|
||||||
|
|
||||||
parseWith :: [String] -> IO Command
|
|
||||||
parseWith args =
|
|
||||||
optCommand <$> handleParseResult
|
|
||||||
(execParserPure defaultPrefs (info GHCup.opts fullDesc) args)
|
|
||||||
|
|
||||||
padLeft :: Int -> String -> String
|
|
||||||
padLeft desiredLength s = padding ++ s
|
|
||||||
where padding = replicate (desiredLength - length s) ' '
|
|
||||||
|
|
||||||
mapSecond :: (b -> c) -> [(a,b)] -> [(a,c)]
|
|
||||||
mapSecond = map . second
|
|
||||||
|
|
||||||
mkVersion :: NonEmpty VChunk -> Version
|
|
||||||
mkVersion chunks = Version Nothing chunks [] Nothing
|
|
||||||
|
|
||||||
mkVersion' :: T.Text -> Version
|
|
||||||
mkVersion' txt =
|
|
||||||
let Right ver = version txt
|
|
||||||
in ver
|
|
||||||
|
|
||||||
buildTestTree
|
|
||||||
:: (Eq a, Show a)
|
|
||||||
=> ([String] -> IO a) -- ^ The parse function
|
|
||||||
-> (String, [(String, a)]) -- ^ The check list @(test group, [(cli command, expected value)])@
|
|
||||||
-> TestTree
|
|
||||||
buildTestTree parse (title, checkList) =
|
|
||||||
testGroup title
|
|
||||||
$ zipWith (uncurry . check) [1 :: Int ..] checkList
|
|
||||||
where
|
|
||||||
check idx args expected = testCase (padLeft 2 (show idx) ++ "." ++ args) $ do
|
|
||||||
res <- parse (words args)
|
|
||||||
liftIO $ res @?= expected
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
module WhereisTest where
|
|
||||||
|
|
||||||
import Test.Tasty
|
|
||||||
import GHCup.OptParse
|
|
||||||
import Utils
|
|
||||||
import GHCup.Types
|
|
||||||
|
|
||||||
whereisTests :: TestTree
|
|
||||||
whereisTests = buildTestTree whereisParseWith ("whereis", whereisCheckList)
|
|
||||||
|
|
||||||
whereisCheckList :: [(String, (WhereisOptions, WhereisCommand))]
|
|
||||||
whereisCheckList = concatMap mk
|
|
||||||
[ ("whereis ghc", WhereisTool GHC Nothing)
|
|
||||||
, ("whereis ghc 9.2.8", WhereisTool GHC (Just $ GHCVersion $ mkTVer $ mkVersion' "9.2.8"))
|
|
||||||
, ("whereis ghc ghc-9.2.8", WhereisTool GHC (Just $ GHCVersion $ GHCTargetVersion (Just "ghc") (mkVersion' "9.2.8")))
|
|
||||||
, ("whereis ghc latest", WhereisTool GHC (Just $ ToolTag Latest))
|
|
||||||
, ("whereis cabal", WhereisTool Cabal Nothing)
|
|
||||||
, ("whereis hls", WhereisTool HLS Nothing)
|
|
||||||
, ("whereis stack", WhereisTool Stack Nothing)
|
|
||||||
, ("whereis ghcup", WhereisTool GHCup Nothing)
|
|
||||||
, ("whereis basedir", WhereisBaseDir)
|
|
||||||
, ("whereis bindir", WhereisBinDir)
|
|
||||||
, ("whereis cachedir", WhereisCacheDir)
|
|
||||||
, ("whereis logsdir", WhereisLogsDir)
|
|
||||||
, ("whereis confdir", WhereisConfDir)
|
|
||||||
]
|
|
||||||
where
|
|
||||||
mk :: (String, WhereisCommand) -> [(String, (WhereisOptions, WhereisCommand))]
|
|
||||||
mk (cmd, res) =
|
|
||||||
[ (cmd, (WhereisOptions False, res))
|
|
||||||
, (cmd <> " -d", (WhereisOptions True, res))
|
|
||||||
, (cmd <> " --directory", (WhereisOptions True, res))
|
|
||||||
]
|
|
||||||
|
|
||||||
whereisParseWith :: [String] -> IO (WhereisOptions, WhereisCommand)
|
|
||||||
whereisParseWith args = do
|
|
||||||
Whereis a b <- parseWith args
|
|
||||||
pure (a, b)
|
|
||||||
Reference in New Issue
Block a user