Compare commits
1 Commits
arm64-dock
...
bryans-pgp
| Author | SHA1 | Date | |
|---|---|---|---|
| d6ee392eab |
@@ -4,8 +4,8 @@ freebsd_instance:
|
|||||||
build_task:
|
build_task:
|
||||||
name: build
|
name: build
|
||||||
env:
|
env:
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.4
|
||||||
CABAL_VER: 3.10.2.0
|
CABAL_VER: 3.8.1.0
|
||||||
ARTIFACT: "x86_64-portbld-freebsd-ghcup"
|
ARTIFACT: "x86_64-portbld-freebsd-ghcup"
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
RUNNER_OS: FreeBSD
|
RUNNER_OS: FreeBSD
|
||||||
|
|||||||
2
.github/scripts/common.sh
vendored
2
.github/scripts/common.sh
vendored
@@ -44,7 +44,7 @@ raw_eghcup() {
|
|||||||
|
|
||||||
eghcup() {
|
eghcup() {
|
||||||
if [ "${OS}" = "Windows" ] ; then
|
if [ "${OS}" = "Windows" ] ; then
|
||||||
"$GHCUP_BIN/ghcup${ext}" -c -s "file:${GITHUB_WORKSPACE//\\//}/data/metadata/ghcup-${JSON_VERSION}.yaml" "$@"
|
"$GHCUP_BIN/ghcup${ext}" -c -s "file:/$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$@"
|
||||||
else
|
else
|
||||||
"$GHCUP_BIN/ghcup${ext}" -c -s "file://$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$@"
|
"$GHCUP_BIN/ghcup${ext}" -c -s "file://$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$@"
|
||||||
fi
|
fi
|
||||||
|
|||||||
49
.github/scripts/test.sh
vendored
49
.github/scripts/test.sh
vendored
@@ -11,7 +11,6 @@ else
|
|||||||
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup
|
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup
|
||||||
fi
|
fi
|
||||||
|
|
||||||
env
|
|
||||||
git_describe
|
git_describe
|
||||||
|
|
||||||
rm -rf "${GHCUP_DIR}"
|
rm -rf "${GHCUP_DIR}"
|
||||||
@@ -31,32 +30,32 @@ sha_sum "$(raw_eghcup --offline whereis ghcup)"
|
|||||||
|
|
||||||
### Haskell test suite
|
### Haskell test suite
|
||||||
|
|
||||||
./"ghcup-test${ext}"
|
./ghcup-test${ext}
|
||||||
./"ghcup-test-optparse${ext}"
|
./ghcup-test-optparse${ext}
|
||||||
rm "ghcup-test${ext}" "ghcup-test-optparse${ext}"
|
rm ghcup-test${ext} ghcup-test-optparse${ext}
|
||||||
|
|
||||||
### manual cli based testing
|
### manual cli based testing
|
||||||
|
|
||||||
eghcup --numeric-version
|
eghcup --numeric-version
|
||||||
|
|
||||||
eghcup install ghc "${GHC_VER}"
|
eghcup install ghc ${GHC_VER}
|
||||||
eghcup unset ghc "${GHC_VER}"
|
eghcup unset ghc ${GHC_VER}
|
||||||
ls -lah "$(eghcup whereis -d ghc "${GHC_VER}")"
|
ls -lah "$(eghcup whereis -d ghc ${GHC_VER})"
|
||||||
[ "$($(eghcup whereis ghc "${GHC_VER}") --numeric-version)" = "${GHC_VER}" ]
|
[ "`$(eghcup whereis ghc ${GHC_VER}) --numeric-version`" = "${GHC_VER}" ]
|
||||||
[ "$(eghcup run -q --ghc "${GHC_VER}" -- ghc --numeric-version)" = "${GHC_VER}" ]
|
[ "`eghcup run --ghc ${GHC_VER} -- ghc --numeric-version`" = "${GHC_VER}" ]
|
||||||
[ "$(ghcup run -q --ghc "${GHC_VER}" -- ghc -e 'Control.Monad.join (Control.Monad.fmap System.IO.putStr System.Environment.getExecutablePath)')" = "$($(ghcup whereis ghc "${GHC_VER}") -e 'Control.Monad.join (Control.Monad.fmap System.IO.putStr System.Environment.getExecutablePath)')" ]
|
[ "`ghcup run --ghc ${GHC_VER} -- ghc -e 'Control.Monad.join (Control.Monad.fmap System.IO.putStr System.Environment.getExecutablePath)'`" = "`$(ghcup whereis ghc ${GHC_VER}) -e 'Control.Monad.join (Control.Monad.fmap System.IO.putStr System.Environment.getExecutablePath)'`" ]
|
||||||
eghcup set ghc "${GHC_VER}"
|
eghcup set ghc ${GHC_VER}
|
||||||
eghcup install cabal "${CABAL_VER}"
|
eghcup install cabal ${CABAL_VER}
|
||||||
[ "$($(eghcup whereis cabal "${CABAL_VER}") --numeric-version)" = "${CABAL_VER}" ]
|
[ "`$(eghcup whereis cabal ${CABAL_VER}) --numeric-version`" = "${CABAL_VER}" ]
|
||||||
eghcup unset cabal
|
eghcup unset cabal
|
||||||
"$GHCUP_BIN"/cabal --version && exit 1 || echo yes
|
"$GHCUP_BIN"/cabal --version && exit 1 || echo yes
|
||||||
|
|
||||||
# make sure no cabal is set when running 'ghcup run' to check that PATH propagages properly
|
# make sure no cabal is set when running 'ghcup run' to check that PATH propagages properly
|
||||||
# https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/375
|
# https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/375
|
||||||
[ "$(eghcup run -q --cabal "${CABAL_VER}" -- cabal --numeric-version)" = "${CABAL_VER}" ]
|
[ "`eghcup run --cabal ${CABAL_VER} -- cabal --numeric-version`" = "${CABAL_VER}" ]
|
||||||
eghcup set cabal "${CABAL_VER}"
|
eghcup set cabal ${CABAL_VER}
|
||||||
|
|
||||||
[ "$($(eghcup whereis cabal "${CABAL_VER}") --numeric-version)" = "${CABAL_VER}" ]
|
[ "`$(eghcup whereis cabal ${CABAL_VER}) --numeric-version`" = "${CABAL_VER}" ]
|
||||||
|
|
||||||
if [ "${OS}" != "FreeBSD" ] ; then
|
if [ "${OS}" != "FreeBSD" ] ; then
|
||||||
if [ "${ARCH}" = "64" ] && [ "${DISTRO}" != "Alpine" ] ; then
|
if [ "${ARCH}" = "64" ] && [ "${DISTRO}" != "Alpine" ] ; then
|
||||||
@@ -86,10 +85,10 @@ eghcup list -t cabal
|
|||||||
|
|
||||||
ghc_ver=$(ghc --numeric-version)
|
ghc_ver=$(ghc --numeric-version)
|
||||||
ghc --version
|
ghc --version
|
||||||
"ghc-${ghc_ver}" --version
|
ghc-${ghc_ver} --version
|
||||||
if [ "${OS}" != "Windows" ] ; then
|
if [ "${OS}" != "Windows" ] ; then
|
||||||
ghci --version
|
ghci --version
|
||||||
"ghci-${ghc_ver}" --version
|
ghci-${ghc_ver} --version
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -133,11 +132,11 @@ else
|
|||||||
eghcup --offline set 8.10.3
|
eghcup --offline set 8.10.3
|
||||||
eghcup set 8.10.3
|
eghcup set 8.10.3
|
||||||
[ "$(ghc --numeric-version)" = "8.10.3" ]
|
[ "$(ghc --numeric-version)" = "8.10.3" ]
|
||||||
eghcup set "${GHC_VER}"
|
eghcup set ${GHC_VER}
|
||||||
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
||||||
eghcup unset ghc
|
eghcup unset ghc
|
||||||
"$GHCUP_BIN"/ghc --numeric-version && exit 1 || echo yes
|
"$GHCUP_BIN"/ghc --numeric-version && exit 1 || echo yes
|
||||||
eghcup set "${GHC_VER}"
|
eghcup set ${GHC_VER}
|
||||||
eghcup --offline rm 8.10.3
|
eghcup --offline rm 8.10.3
|
||||||
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
||||||
|
|
||||||
@@ -170,10 +169,10 @@ fi
|
|||||||
# check that lazy loading works for 'whereis'
|
# check that lazy loading works for 'whereis'
|
||||||
cp "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml.bak"
|
cp "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml.bak"
|
||||||
echo '**' > "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml"
|
echo '**' > "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml"
|
||||||
eghcup whereis ghc "$(ghc --numeric-version)"
|
eghcup whereis ghc $(ghc --numeric-version)
|
||||||
mv -f "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml.bak" "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml"
|
mv -f "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml.bak" "$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml"
|
||||||
|
|
||||||
eghcup rm "$(ghc --numeric-version)"
|
eghcup rm $(ghc --numeric-version)
|
||||||
|
|
||||||
# https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/116
|
# https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/116
|
||||||
if [ "${OS}" = "Linux" ] ; then
|
if [ "${OS}" = "Linux" ] ; then
|
||||||
@@ -187,14 +186,14 @@ eghcup gc -c
|
|||||||
|
|
||||||
# test etags
|
# test etags
|
||||||
rm -f "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
rm -f "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
||||||
raw_eghcup -s "https://www.haskell.org/ghcup/data/ghcup-${JSON_VERSION}.yaml" list
|
raw_eghcup -s https://www.haskell.org/ghcup/data/ghcup-${JSON_VERSION}.yaml list
|
||||||
# snapshot yaml and etags file
|
# snapshot yaml and etags file
|
||||||
etag=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
etag=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
||||||
sha=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
sha=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
||||||
# invalidate access time timer, which is 5minutes, so we re-download
|
# invalidate access time timer, which is 5minutes, so we re-download
|
||||||
touch -a -m -t '199901010101' "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
touch -a -m -t '199901010101' "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
||||||
# redownload same file with some newlines added
|
# redownload same file with some newlines added
|
||||||
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-${JSON_VERSION}.yaml list
|
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-0.0.7.yaml list
|
||||||
# snapshot new yaml and etags file
|
# snapshot new yaml and etags file
|
||||||
etag2=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
etag2=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
||||||
sha2=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
sha2=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
||||||
@@ -204,7 +203,7 @@ sha2=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
|||||||
# invalidate access time timer, which is 5minutes, but don't expect a re-download
|
# invalidate access time timer, which is 5minutes, but don't expect a re-download
|
||||||
touch -a -m -t '199901010101' "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
touch -a -m -t '199901010101' "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml"
|
||||||
# this time, we expect the same hash and etag
|
# this time, we expect the same hash and etag
|
||||||
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-${JSON_VERSION}.yaml list
|
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-0.0.7.yaml list
|
||||||
etag3=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
etag3=$(cat "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml.etags")
|
||||||
sha3=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
sha3=$(sha_sum "${GHCUP_DIR}/cache/ghcup-${JSON_VERSION}.yaml")
|
||||||
[ "${etag2}" = "${etag3}" ]
|
[ "${etag2}" = "${etag3}" ]
|
||||||
|
|||||||
2
.github/workflows/docker.yaml
vendored
2
.github/workflows/docker.yaml
vendored
@@ -57,7 +57,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/ubuntu:focal
|
- uses: docker://arm64v8/ubuntu:focal
|
||||||
name: Cleanup (aarch64 linux)
|
name: Cleanup (aarch64 linux)
|
||||||
continue-on-error: true
|
|
||||||
with:
|
with:
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
||||||
|
|
||||||
@@ -94,7 +93,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/ubuntu:focal
|
- uses: docker://arm64v8/ubuntu:focal
|
||||||
name: Cleanup (aarch64 linux)
|
name: Cleanup (aarch64 linux)
|
||||||
continue-on-error: true
|
|
||||||
with:
|
with:
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
||||||
|
|
||||||
|
|||||||
74
.github/workflows/release.yaml
vendored
74
.github/workflows/release.yaml
vendored
@@ -21,8 +21,8 @@ jobs:
|
|||||||
name: Build linux binary
|
name: Build linux binary
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
S3_HOST: ${{ secrets.S3_HOST }}
|
S3_HOST: ${{ secrets.S3_HOST }}
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
ARCH: 32
|
ARCH: 32
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 8.10.7
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
@@ -85,8 +85,8 @@ jobs:
|
|||||||
name: Build ARM binary
|
name: Build ARM binary
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.6.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
S3_HOST: ${{ secrets.S3_HOST }}
|
S3_HOST: ${{ secrets.S3_HOST }}
|
||||||
@@ -96,16 +96,15 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- os: [self-hosted, Linux, ARM64]
|
- os: [self-hosted, Linux, ARM64]
|
||||||
ARTIFACT: "armv7-linux-ghcup"
|
ARTIFACT: "armv7-linux-ghcup"
|
||||||
GHC_VER: 9.2.8
|
GHC_VER: 9.2.2
|
||||||
ARCH: ARM
|
ARCH: ARM
|
||||||
- os: [self-hosted, Linux, ARM64]
|
- os: [self-hosted, Linux, ARM64]
|
||||||
ARTIFACT: "aarch64-linux-ghcup"
|
ARTIFACT: "aarch64-linux-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/debian:10
|
- uses: docker://arm64v8/debian:10
|
||||||
name: Cleanup (aarch64 linux)
|
name: Cleanup (aarch64 linux)
|
||||||
continue-on-error: true
|
|
||||||
with:
|
with:
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
||||||
|
|
||||||
@@ -159,9 +158,9 @@ jobs:
|
|||||||
name: Build binary (Mac/Win)
|
name: Build binary (Mac/Win)
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.13
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
S3_HOST: ${{ secrets.S3_HOST }}
|
S3_HOST: ${{ secrets.S3_HOST }}
|
||||||
@@ -171,15 +170,15 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- os: [self-hosted, macOS, ARM64]
|
- os: [self-hosted, macOS, ARM64]
|
||||||
ARTIFACT: "aarch64-apple-darwin-ghcup"
|
ARTIFACT: "aarch64-apple-darwin-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
- os: macOS-11
|
- os: macOS-11
|
||||||
ARTIFACT: "x86_64-apple-darwin-ghcup"
|
ARTIFACT: "x86_64-apple-darwin-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
ARTIFACT: "x86_64-mingw64-ghcup"
|
ARTIFACT: "x86_64-mingw64-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 8.10.7
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
@@ -190,13 +189,13 @@ jobs:
|
|||||||
- if: matrix.ARCH == 'ARM64' && runner.os == 'macOS'
|
- if: matrix.ARCH == 'ARM64' && runner.os == 'macOS'
|
||||||
name: Run build
|
name: Run build
|
||||||
run: |
|
run: |
|
||||||
bash .github/scripts/brew.sh git coreutils llvm@13 autoconf automake
|
bash .github/scripts/brew.sh git coreutils llvm@11 autoconf automake
|
||||||
export PATH="$HOME/.brew/bin:$HOME/.brew/sbin:$HOME/.brew/opt/llvm@13/bin:$PATH"
|
export PATH="$HOME/.brew/bin:$HOME/.brew/sbin:$HOME/.brew/opt/llvm@11/bin:$PATH"
|
||||||
export CC="$HOME/.brew/opt/llvm@13/bin/clang"
|
export CC="$HOME/.brew/opt/llvm@11/bin/clang"
|
||||||
export CXX="$HOME/.brew/opt/llvm@13/bin/clang++"
|
export CXX="$HOME/.brew/opt/llvm@11/bin/clang++"
|
||||||
export LD=ld
|
export LD=ld
|
||||||
export AR="$HOME/.brew/opt/llvm@13/bin/llvm-ar"
|
export AR="$HOME/.brew/opt/llvm@11/bin/llvm-ar"
|
||||||
export RANLIB="$HOME/.brew/opt/llvm@13/bin/llvm-ranlib"
|
export RANLIB="$HOME/.brew/opt/llvm@11/bin/llvm-ranlib"
|
||||||
bash .github/scripts/build.sh
|
bash .github/scripts/build.sh
|
||||||
env:
|
env:
|
||||||
ARTIFACT: ${{ matrix.ARTIFACT }}
|
ARTIFACT: ${{ matrix.ARTIFACT }}
|
||||||
@@ -252,8 +251,8 @@ jobs:
|
|||||||
needs: "build-linux"
|
needs: "build-linux"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
@@ -264,12 +263,12 @@ jobs:
|
|||||||
DISTRO: Alpine
|
DISTRO: Alpine
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 8.10.7
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: Alpine
|
DISTRO: Alpine
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 8.10.7
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
|
|
||||||
@@ -323,33 +322,32 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: testfiles
|
name: testfiles
|
||||||
path: |
|
path: |
|
||||||
./test/ghcup-test/golden/unix/GHCupInfo*json
|
./test/golden/unix/GHCupInfo*json
|
||||||
|
|
||||||
test-arm:
|
test-arm:
|
||||||
name: Test ARM
|
name: Test ARM
|
||||||
needs: "build-arm"
|
needs: "build-arm"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.6.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: [self-hosted, Linux, ARM64]
|
- os: [self-hosted, Linux, ARM64]
|
||||||
ARTIFACT: "armv7-linux-ghcup"
|
ARTIFACT: "armv7-linux-ghcup"
|
||||||
GHC_VER: 9.2.8
|
GHC_VER: 9.2.2
|
||||||
ARCH: ARM
|
ARCH: ARM
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
- os: [self-hosted, Linux, ARM64]
|
- os: [self-hosted, Linux, ARM64]
|
||||||
ARTIFACT: "aarch64-linux-ghcup"
|
ARTIFACT: "aarch64-linux-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/debian:10
|
- uses: docker://arm64v8/debian:10
|
||||||
name: Cleanup (aarch64 linux)
|
name: Cleanup (aarch64 linux)
|
||||||
continue-on-error: true
|
|
||||||
with:
|
with:
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
||||||
|
|
||||||
@@ -391,32 +389,32 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: testfiles
|
name: testfiles
|
||||||
path: |
|
path: |
|
||||||
./test/ghcup-test/golden/unix/GHCupInfo*json
|
./test/golden/unix/GHCupInfo*json
|
||||||
|
|
||||||
test-macwin:
|
test-macwin:
|
||||||
name: Test Mac/Win
|
name: Test Mac/Win
|
||||||
needs: "build-macwin"
|
needs: "build-macwin"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.2.0
|
CABAL_VER: 3.10.1.0
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.13
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: [self-hosted, macOS, ARM64]
|
- os: [self-hosted, macOS, ARM64]
|
||||||
ARTIFACT: "aarch64-apple-darwin-ghcup"
|
ARTIFACT: "aarch64-apple-darwin-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
DISTRO: na
|
DISTRO: na
|
||||||
- os: macOS-11
|
- os: macOS-11
|
||||||
ARTIFACT: "x86_64-apple-darwin-ghcup"
|
ARTIFACT: "x86_64-apple-darwin-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 9.2.6
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: na
|
DISTRO: na
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
ARTIFACT: "x86_64-mingw64-ghcup"
|
ARTIFACT: "x86_64-mingw64-ghcup"
|
||||||
GHC_VER: 9.4.8
|
GHC_VER: 8.10.7
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: na
|
DISTRO: na
|
||||||
|
|
||||||
@@ -460,7 +458,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: testfiles
|
name: testfiles
|
||||||
path: |
|
path: |
|
||||||
./test/ghcup-test/golden/windows/GHCupInfo*json
|
./test/golden/windows/GHCupInfo*json
|
||||||
|
|
||||||
- if: failure() && runner.os != 'Windows'
|
- if: failure() && runner.os != 'Windows'
|
||||||
name: Upload artifact
|
name: Upload artifact
|
||||||
@@ -468,7 +466,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: testfiles
|
name: testfiles
|
||||||
path: |
|
path: |
|
||||||
./test/ghcup-test/golden/unix/GHCupInfo*json
|
./test/golden/unix/GHCupInfo*json
|
||||||
hls:
|
hls:
|
||||||
name: hls
|
name: hls
|
||||||
needs: build-linux
|
needs: build-linux
|
||||||
@@ -477,7 +475,7 @@ jobs:
|
|||||||
GHC_VERSION: "8.10.7"
|
GHC_VERSION: "8.10.7"
|
||||||
HLS_TARGET_VERSION: "1.8.0.0"
|
HLS_TARGET_VERSION: "1.8.0.0"
|
||||||
CABAL_VERSION: "3.8.1.0"
|
CABAL_VERSION: "3.8.1.0"
|
||||||
JSON_VERSION: "0.0.8"
|
JSON_VERSION: "0.0.7"
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,7 +4,6 @@ codex.tags
|
|||||||
dist-newstyle/
|
dist-newstyle/
|
||||||
cabal.project.local
|
cabal.project.local
|
||||||
.stack-work/
|
.stack-work/
|
||||||
.hiefiles/
|
|
||||||
bin/
|
bin/
|
||||||
/*.prof
|
/*.prof
|
||||||
/*.ps
|
/*.ps
|
||||||
|
|||||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
|||||||
[submodule "data/metadata"]
|
[submodule "data/metadata"]
|
||||||
path = data/metadata
|
path = data/metadata
|
||||||
url = https://github.com/haskell/ghcup-metadata.git
|
url = https://github.com/haskell/ghcup-metadata.git
|
||||||
branch = develop
|
branch = master
|
||||||
|
|||||||
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,20 +1,8 @@
|
|||||||
# Revision history for ghcup
|
# Revision history for ghcup
|
||||||
|
|
||||||
## 0.1.20.0 -- 2023-11-10
|
## 0.1.19.5 -- ????-?-??
|
||||||
|
|
||||||
### New features
|
* support JS cross compilers wrt [#838](https://github.com/haskell/ghcup-hs/issues/838)
|
||||||
|
|
||||||
* support TUI on windows thanks to the work from vty and brick maintainers (Chris Hackett, Timofey Zakrevskiy, Jonathan Daugherty, ...), wrt [#912](https://github.com/haskell/ghcup-hs/pull/912)
|
|
||||||
* support JS and wasm cross compilers wrt [#838](https://github.com/haskell/ghcup-hs/issues/838), thanks to Sylvain Henry and IOG
|
|
||||||
* Support stacks installation strategy and metadata wrt [#892](https://github.com/haskell/ghcup-hs/issues/892)
|
|
||||||
- you can now enable stacks installation method via `ghcup config set url-source '["GHCupURL", "StackSetupURL"]'`... for more information, check the [documentation](https://www.haskell.org/ghcup/guide/#using-stacks-setup-info-metadata-to-install-ghc)
|
|
||||||
|
|
||||||
### Improvements and bug fixes
|
|
||||||
|
|
||||||
* fix segfault in TUI when hitting enter early wrt [#887](https://github.com/haskell/ghcup-hs/issues/887)
|
|
||||||
* Improve key handling in TUI, fixes [#875](https://github.com/haskell/ghcup-hs/issues/875)
|
|
||||||
* add explicit support for Void Linux and Rocky Linux (this requires a metadata version bump to `ghcup-0.0.8.yaml`)
|
|
||||||
* optparse cli interface now has a test suite thanks to Lei Zhu, wrt [#862](https://github.com/haskell/ghcup-hs/pull/862)
|
|
||||||
|
|
||||||
## 0.1.19.4 -- 2023-7-02
|
## 0.1.19.4 -- 2023-7-02
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -57,13 +57,16 @@ import GHCup.Types
|
|||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
#endif
|
#endif
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
|
import Data.Bifunctor
|
||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Options.Applicative.Help.Pretty ( text )
|
import Options.Applicative.Help.Pretty ( text )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
|
import URI.ByteString
|
||||||
|
|
||||||
|
import qualified Data.ByteString.UTF8 as UTF8
|
||||||
|
|
||||||
|
|
||||||
data Options = Options
|
data Options = Options
|
||||||
@@ -74,13 +77,12 @@ data Options = Options
|
|||||||
, optMetaCache :: Maybe Integer
|
, optMetaCache :: Maybe Integer
|
||||||
, optMetaMode :: Maybe MetaMode
|
, optMetaMode :: Maybe MetaMode
|
||||||
, optPlatform :: Maybe PlatformRequest
|
, optPlatform :: Maybe PlatformRequest
|
||||||
, optUrlSource :: Maybe URLSource
|
, optUrlSource :: Maybe URI
|
||||||
, optNoVerify :: Maybe Bool
|
, optNoVerify :: Maybe Bool
|
||||||
, optKeepDirs :: Maybe KeepDirs
|
, optKeepDirs :: Maybe KeepDirs
|
||||||
, optsDownloader :: Maybe Downloader
|
, optsDownloader :: Maybe Downloader
|
||||||
, optNoNetwork :: Maybe Bool
|
, optNoNetwork :: Maybe Bool
|
||||||
, optGpg :: Maybe GPGSetting
|
, optGpg :: Maybe GPGSetting
|
||||||
, optStackSetup :: Maybe Bool
|
|
||||||
-- commands
|
-- commands
|
||||||
, optCommand :: Command
|
, optCommand :: Command
|
||||||
}
|
}
|
||||||
@@ -132,13 +134,13 @@ opts =
|
|||||||
)
|
)
|
||||||
<*> optional
|
<*> optional
|
||||||
(option
|
(option
|
||||||
(eitherReader parseUrlSource)
|
(eitherReader parseUri)
|
||||||
( short 's'
|
( short 's'
|
||||||
<> long "url-source"
|
<> long "url-source"
|
||||||
<> metavar "URL_SOURCE"
|
<> metavar "URL"
|
||||||
<> help "Alternative ghcup download info"
|
<> help "Alternative ghcup download info url"
|
||||||
<> internal
|
<> internal
|
||||||
<> completer urlSourceCompleter
|
<> completer fileUri
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
<*> (fmap . fmap) not (invertableSwitch "verify" (Just 'n') True (help "Disable tarball checksum verification (default: enabled)"))
|
<*> (fmap . fmap) not (invertableSwitch "verify" (Just 'n') True (help "Disable tarball checksum verification (default: enabled)"))
|
||||||
@@ -176,9 +178,10 @@ opts =
|
|||||||
"GPG verification (default: none)"
|
"GPG verification (default: none)"
|
||||||
<> completer (listCompleter ["strict", "lax", "none"])
|
<> completer (listCompleter ["strict", "lax", "none"])
|
||||||
))
|
))
|
||||||
<*> invertableSwitch "stack-setup" (Just 's') False (help "Use stack's setup info for discovering and installing GHC versions")
|
|
||||||
<*> com
|
<*> com
|
||||||
|
where
|
||||||
|
parseUri s' =
|
||||||
|
first show $ parseURI strictURIParserOptions (UTF8.fromString s')
|
||||||
|
|
||||||
|
|
||||||
com :: Parser Command
|
com :: Parser Command
|
||||||
@@ -29,7 +29,6 @@ import Data.Maybe
|
|||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
import System.Exit
|
import System.Exit
|
||||||
import System.Process ( system )
|
|
||||||
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
||||||
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
@@ -129,22 +128,21 @@ changelog ChangeLogOptions{..} runAppState runLogger = do
|
|||||||
Just uri -> do
|
Just uri -> do
|
||||||
pfreq <- runAppState getPlatformReq
|
pfreq <- runAppState getPlatformReq
|
||||||
let uri' = T.unpack . decUTF8Safe . serializeURIRef' $ uri
|
let uri' = T.unpack . decUTF8Safe . serializeURIRef' $ uri
|
||||||
|
cmd = case _rPlatform pfreq of
|
||||||
|
Darwin -> "open"
|
||||||
|
Linux _ -> "xdg-open"
|
||||||
|
FreeBSD -> "xdg-open"
|
||||||
|
Windows -> "start"
|
||||||
|
|
||||||
if clOpen
|
if clOpen
|
||||||
then do
|
then do
|
||||||
runAppState $
|
runAppState $
|
||||||
case _rPlatform pfreq of
|
exec cmd
|
||||||
Darwin -> exec "open" [T.unpack $ decUTF8Safe $ serializeURIRef' uri] Nothing Nothing
|
[T.unpack $ decUTF8Safe $ serializeURIRef' uri]
|
||||||
Linux _ -> exec "xdg-open" [T.unpack $ decUTF8Safe $ serializeURIRef' uri] Nothing Nothing
|
Nothing
|
||||||
FreeBSD -> exec "xdg-open" [T.unpack $ decUTF8Safe $ serializeURIRef' uri] Nothing Nothing
|
Nothing
|
||||||
Windows -> do
|
|
||||||
let args = "start \"\" " ++ (T.unpack $ decUTF8Safe $ serializeURIRef' uri)
|
|
||||||
c <- liftIO $ system $ args
|
|
||||||
case c of
|
|
||||||
(ExitFailure xi) -> pure $ Left $ NonZeroExit xi "cmd.exe" [args]
|
|
||||||
ExitSuccess -> pure $ Right ()
|
|
||||||
>>= \case
|
>>= \case
|
||||||
Right _ -> pure ExitSuccess
|
Right _ -> pure ExitSuccess
|
||||||
Left e -> logError (T.pack $ prettyHFError e)
|
Left e -> logError (T.pack $ prettyHFError e)
|
||||||
>> pure (ExitFailure 13)
|
>> pure (ExitFailure 13)
|
||||||
else liftIO $ putStrLn uri' >> pure ExitSuccess
|
else liftIO $ putStrLn uri' >> pure ExitSuccess
|
||||||
|
|
||||||
@@ -17,7 +17,6 @@ import GHCup.Platform
|
|||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
import GHCup.Utils
|
import GHCup.Utils
|
||||||
import GHCup.Utils.URI
|
|
||||||
import GHCup.Prelude
|
import GHCup.Prelude
|
||||||
import GHCup.Prelude.Process
|
import GHCup.Prelude.Process
|
||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
@@ -49,7 +48,7 @@ import Data.Maybe
|
|||||||
import Data.Text ( Text )
|
import Data.Text ( Text )
|
||||||
import Data.Time.Calendar ( Day )
|
import Data.Time.Calendar ( Day )
|
||||||
import Data.Time.Format ( parseTimeM, defaultTimeLocale )
|
import Data.Time.Format ( parseTimeM, defaultTimeLocale )
|
||||||
import Data.Versions
|
import Data.Versions hiding ( str )
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
import GHC.IO.Exception
|
import GHC.IO.Exception
|
||||||
@@ -60,13 +59,11 @@ import Safe
|
|||||||
import System.Process ( readProcess )
|
import System.Process ( readProcess )
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
import Text.HTML.TagSoup hiding ( Tag )
|
import Text.HTML.TagSoup hiding ( Tag )
|
||||||
import URI.ByteString hiding (parseURI)
|
import URI.ByteString
|
||||||
|
|
||||||
import qualified Data.ByteString.UTF8 as UTF8
|
import qualified Data.ByteString.UTF8 as UTF8
|
||||||
import qualified Data.Map.Strict as M
|
import qualified Data.Map.Strict as M
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Lazy.Encoding as LE
|
|
||||||
import qualified Data.Text.Lazy as LT
|
|
||||||
import qualified Text.Megaparsec as MP
|
import qualified Text.Megaparsec as MP
|
||||||
import qualified System.FilePath.Posix as FP
|
import qualified System.FilePath.Posix as FP
|
||||||
import GHCup.Version
|
import GHCup.Version
|
||||||
@@ -212,11 +209,23 @@ platformParser s' = case MP.parse (platformP <* MP.eof) "" (T.pack s') of
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
distroP :: MP.Parsec Void Text LinuxDistro
|
distroP :: MP.Parsec Void Text LinuxDistro
|
||||||
distroP = choice' ((\d -> MP.chunk (T.pack $ distroToString d) $> d) <$> allDistros)
|
distroP = choice'
|
||||||
|
[ MP.chunk "debian" $> Debian
|
||||||
|
, MP.chunk "deb" $> Debian
|
||||||
|
, MP.chunk "ubuntu" $> Ubuntu
|
||||||
|
, MP.chunk "mint" $> Mint
|
||||||
|
, MP.chunk "fedora" $> Fedora
|
||||||
|
, MP.chunk "centos" $> CentOS
|
||||||
|
, MP.chunk "redhat" $> RedHat
|
||||||
|
, MP.chunk "alpine" $> Alpine
|
||||||
|
, MP.chunk "gentoo" $> Gentoo
|
||||||
|
, MP.chunk "exherbo" $> Exherbo
|
||||||
|
, MP.chunk "unknown" $> UnknownLinux
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
uriParser :: String -> Either String URI
|
uriParser :: String -> Either String URI
|
||||||
uriParser = first show . parseURI . UTF8.fromString
|
uriParser = first show . parseURI strictURIParserOptions . UTF8.fromString
|
||||||
|
|
||||||
|
|
||||||
absolutePathParser :: FilePath -> Either String FilePath
|
absolutePathParser :: FilePath -> Either String FilePath
|
||||||
@@ -325,15 +334,6 @@ toolCompleter = listCompleter ["ghc", "cabal", "hls", "stack"]
|
|||||||
gitFileUri :: [String] -> Completer
|
gitFileUri :: [String] -> Completer
|
||||||
gitFileUri add = mkCompleter $ fileUri' (["git://"] <> add)
|
gitFileUri add = mkCompleter $ fileUri' (["git://"] <> add)
|
||||||
|
|
||||||
urlSourceCompleter :: Completer
|
|
||||||
urlSourceCompleter = mkCompleter $ urlSourceCompleter' []
|
|
||||||
|
|
||||||
urlSourceCompleter' :: [String] -> String -> IO [String]
|
|
||||||
urlSourceCompleter' add str' = do
|
|
||||||
let static = ["GHCupURL", "StackSetupURL"]
|
|
||||||
file <- fileUri' add str'
|
|
||||||
pure $ static ++ file
|
|
||||||
|
|
||||||
fileUri :: Completer
|
fileUri :: Completer
|
||||||
fileUri = mkCompleter $ fileUri' []
|
fileUri = mkCompleter $ fileUri' []
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ fileUri' add = \case
|
|||||||
-- We need to do this so bash doesn't expand out any ~ or other
|
-- We need to do this so bash doesn't expand out any ~ or other
|
||||||
-- chars we want to complete on, or emit an end of line error
|
-- chars we want to complete on, or emit an end of line error
|
||||||
-- when seeking the close to the quote.
|
-- when seeking the close to the quote.
|
||||||
--
|
--
|
||||||
-- NOTE: copied from https://hackage.haskell.org/package/optparse-applicative-0.17.0.0/docs/src/Options.Applicative.Builder.Completer.html#requote
|
-- NOTE: copied from https://hackage.haskell.org/package/optparse-applicative-0.17.0.0/docs/src/Options.Applicative.Builder.Completer.html#requote
|
||||||
requote :: String -> String
|
requote :: String -> String
|
||||||
requote s =
|
requote s =
|
||||||
@@ -462,15 +462,13 @@ tagCompleter tool add = listIOCompleter $ do
|
|||||||
defaultKeyBindings
|
defaultKeyBindings
|
||||||
loggerConfig
|
loggerConfig
|
||||||
|
|
||||||
mpFreq <- flip runReaderT appState . runE $ platformRequest
|
mGhcUpInfo <- flip runReaderT appState . runE $ getDownloadsF
|
||||||
forFold mpFreq $ \pfreq -> do
|
case mGhcUpInfo of
|
||||||
mGhcUpInfo <- flip runReaderT appState . runE $ getDownloadsF pfreq
|
VRight ghcupInfo -> do
|
||||||
case mGhcUpInfo of
|
let allTags = filter (/= Old)
|
||||||
VRight ghcupInfo -> do
|
$ _viTags =<< M.elems (availableToolVersions (_ghcupDownloads ghcupInfo) tool)
|
||||||
let allTags = filter (/= Old)
|
pure $ nub $ (add ++) $ fmap tagToString allTags
|
||||||
$ _viTags =<< M.elems (availableToolVersions (_ghcupDownloads ghcupInfo) tool)
|
VLeft _ -> pure (nub $ ["recommended", "latest", "latest-prerelease"] ++ add)
|
||||||
pure $ nub $ (add ++) $ fmap tagToString allTags
|
|
||||||
VLeft _ -> pure (nub $ ["recommended", "latest", "latest-prerelease"] ++ add)
|
|
||||||
|
|
||||||
versionCompleter :: [ListCriteria] -> Tool -> Completer
|
versionCompleter :: [ListCriteria] -> Tool -> Completer
|
||||||
versionCompleter criteria tool = versionCompleter' criteria tool (const True)
|
versionCompleter criteria tool = versionCompleter' criteria tool (const True)
|
||||||
@@ -491,8 +489,8 @@ versionCompleter' criteria tool filter' = listIOCompleter $ do
|
|||||||
defaultKeyBindings
|
defaultKeyBindings
|
||||||
loggerConfig
|
loggerConfig
|
||||||
mpFreq <- flip runReaderT leanAppState . runE $ platformRequest
|
mpFreq <- flip runReaderT leanAppState . runE $ platformRequest
|
||||||
|
mGhcUpInfo <- flip runReaderT leanAppState . runE $ getDownloadsF
|
||||||
forFold mpFreq $ \pfreq -> do
|
forFold mpFreq $ \pfreq -> do
|
||||||
mGhcUpInfo <- flip runReaderT leanAppState . runE $ getDownloadsF pfreq
|
|
||||||
forFold mGhcUpInfo $ \ghcupInfo -> do
|
forFold mGhcUpInfo $ \ghcupInfo -> do
|
||||||
let appState = AppState
|
let appState = AppState
|
||||||
settings
|
settings
|
||||||
@@ -826,20 +824,8 @@ checkForUpdates = do
|
|||||||
|
|
||||||
logGHCPostRm :: (MonadReader env m, HasLog env, MonadIO m) => GHCTargetVersion -> m ()
|
logGHCPostRm :: (MonadReader env m, HasLog env, MonadIO m) => GHCTargetVersion -> m ()
|
||||||
logGHCPostRm ghcVer = do
|
logGHCPostRm ghcVer = do
|
||||||
cabalStore <- liftIO $ handleIO (\_ -> if isWindows then pure "C:\\cabal\\store" else pure "~/.cabal/store or ~/.local/state/cabal/store")
|
cabalStore <- liftIO $ handleIO (\_ -> if isWindows then pure "C:\\cabal\\store" else pure "~/.cabal/store")
|
||||||
(runIdentity . CC.cfgStoreDir <$> CC.readConfig)
|
(runIdentity . CC.cfgStoreDir <$> CC.readConfig)
|
||||||
let storeGhcDir = cabalStore </> ("ghc-" <> T.unpack (prettyVer $ _tvVersion ghcVer))
|
let storeGhcDir = cabalStore </> ("ghc-" <> T.unpack (prettyVer $ _tvVersion ghcVer))
|
||||||
logInfo $ T.pack $ "After removing GHC you might also want to clean up your cabal store at: " <> storeGhcDir
|
logInfo $ T.pack $ "After removing GHC you might also want to clean up your cabal store at: " <> storeGhcDir
|
||||||
|
|
||||||
parseUrlSource :: String -> Either String URLSource
|
|
||||||
parseUrlSource "GHCupURL" = pure GHCupURL
|
|
||||||
parseUrlSource "StackSetupURL" = pure StackSetupURL
|
|
||||||
parseUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
|
||||||
<|> (fmap (OwnSource . (:[]) . Right) . first show . parseURI .UTF8.fromString $ s')
|
|
||||||
|
|
||||||
parseNewUrlSource :: String -> Either String NewURLSource
|
|
||||||
parseNewUrlSource "GHCupURL" = pure NewGHCupURL
|
|
||||||
parseNewUrlSource "StackSetupURL" = pure NewStackSetupURL
|
|
||||||
parseNewUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
|
||||||
<|> (fmap NewURI . first show . parseURI .UTF8.fromString $ s')
|
|
||||||
|
|
||||||
@@ -25,6 +25,7 @@ import GHCup.OptParse.Common
|
|||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
#endif
|
#endif
|
||||||
|
import Codec.Archive ( ArchiveResult )
|
||||||
import Control.Concurrent (threadDelay)
|
import Control.Concurrent (threadDelay)
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
@@ -157,7 +158,7 @@ Examples:
|
|||||||
ghcup compile hls --version 1.7.0.0 --ghc 8.10.7 --cabal-update
|
ghcup compile hls --version 1.7.0.0 --ghc 8.10.7 --cabal-update
|
||||||
# compile from master for ghc 9.2.3 using 'git describe' to name the binary and ignore the pinned index state
|
# compile from master for ghc 9.2.3 using 'git describe' to name the binary and ignore the pinned index state
|
||||||
ghcup compile hls -g master --git-describe-version --ghc 9.2.3 -- --index-state=@(date '+%s')
|
ghcup compile hls -g master --git-describe-version --ghc 9.2.3 -- --index-state=@(date '+%s')
|
||||||
# compile a specific commit for ghc 9.2.3 and set a specific version for the binary name
|
# compile a specific commit for ghc 9.2.3 and set a specifc version for the binary name
|
||||||
ghcup compile hls -g a32db0b -o 1.7.0.0-p1 --ghc 9.2.3|]
|
ghcup compile hls -g a32db0b -o 1.7.0.0-p1 --ghc 9.2.3|]
|
||||||
|
|
||||||
|
|
||||||
@@ -32,6 +32,7 @@ import Options.Applicative hiding ( style, ParseError )
|
|||||||
import Options.Applicative.Help.Pretty ( text )
|
import Options.Applicative.Help.Pretty ( text )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
import System.Exit
|
import System.Exit
|
||||||
|
import URI.ByteString hiding ( uriParser )
|
||||||
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.ByteString.UTF8 as UTF8
|
import qualified Data.ByteString.UTF8 as UTF8
|
||||||
@@ -50,7 +51,7 @@ data ConfigCommand
|
|||||||
= ShowConfig
|
= ShowConfig
|
||||||
| SetConfig String (Maybe String)
|
| SetConfig String (Maybe String)
|
||||||
| InitConfig
|
| InitConfig
|
||||||
| AddReleaseChannel Bool NewURLSource
|
| AddReleaseChannel Bool URI
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
@@ -67,14 +68,15 @@ configP = subparser
|
|||||||
<> command "show" showP
|
<> command "show" showP
|
||||||
<> command "add-release-channel" addP
|
<> command "add-release-channel" addP
|
||||||
)
|
)
|
||||||
|
<|> argsP -- add show for a single option
|
||||||
<|> pure ShowConfig
|
<|> pure ShowConfig
|
||||||
where
|
where
|
||||||
initP = info (pure InitConfig) (progDesc "Write default config to ~/.ghcup/config.yaml")
|
initP = info (pure InitConfig) (progDesc "Write default config to ~/.ghcup/config.yaml")
|
||||||
showP = info (pure ShowConfig) (progDesc "Show current config (default)")
|
showP = info (pure ShowConfig) (progDesc "Show current config (default)")
|
||||||
setP = info argsP (progDesc "Set config KEY to VALUE (or specify as single json value)" <> footerDoc (Just $ text configSetFooter))
|
setP = info argsP (progDesc "Set config KEY to VALUE (or specify as single json value)" <> footerDoc (Just $ text configSetFooter))
|
||||||
argsP = SetConfig <$> argument str (metavar "<JSON_VALUE | YAML_KEY>") <*> optional (argument str (metavar "YAML_VALUE"))
|
argsP = SetConfig <$> argument str (metavar "<JSON_VALUE | YAML_KEY>") <*> optional (argument str (metavar "YAML_VALUE"))
|
||||||
addP = info (AddReleaseChannel <$> switch (long "force" <> help "Delete existing entry (if any) and append instead of failing") <*> argument (eitherReader parseNewUrlSource) (metavar "URL_SOURCE" <> completer urlSourceCompleter))
|
addP = info (AddReleaseChannel <$> switch (long "force" <> help "Delete existing entry (if any) and append instead of failing") <*> argument (eitherReader uriParser) (metavar "URI" <> completer fileUri))
|
||||||
(progDesc "Add a release channel, e.g. from a URI")
|
(progDesc "Add a release channel from a URI")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -149,6 +151,7 @@ updateSettings usl usr =
|
|||||||
, kSet = kSet kbl <|> kSet kbr
|
, kSet = kSet kbl <|> kSet kbr
|
||||||
, kChangelog = kChangelog kbl <|> kChangelog kbr
|
, kChangelog = kChangelog kbl <|> kChangelog kbr
|
||||||
, kShowAll = kShowAll kbl <|> kShowAll kbr
|
, kShowAll = kShowAll kbl <|> kShowAll kbr
|
||||||
|
, kShowAllTools = kShowAllTools kbl <|> kShowAllTools kbr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -191,14 +194,10 @@ config configCommand settings userConf keybindings runLogger = case configComman
|
|||||||
throwE $ ParseError "Empty values are not allowed"
|
throwE $ ParseError "Empty values are not allowed"
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
usersettings <- decodeSettings k
|
usersettings <- decodeSettings k
|
||||||
when (usersettings == defaultUserSettings)
|
|
||||||
$ throwE $ ParseError ("Failed to parse setting (maybe typo?): " <> k)
|
|
||||||
lift $ doConfig usersettings
|
lift $ doConfig usersettings
|
||||||
pure ()
|
pure ()
|
||||||
Just v -> do
|
Just v -> do
|
||||||
usersettings <- decodeSettings (k <> ": " <> v <> "\n")
|
usersettings <- decodeSettings (k <> ": " <> v <> "\n")
|
||||||
when (usersettings == defaultUserSettings)
|
|
||||||
$ throwE $ ParseError ("Failed to parse key '" <> k <> "' with value '" <> v <> "' as user setting. Maybe typo?")
|
|
||||||
lift $ doConfig usersettings
|
lift $ doConfig usersettings
|
||||||
pure ()
|
pure ()
|
||||||
case r of
|
case r of
|
||||||
@@ -206,19 +205,29 @@ config configCommand settings userConf keybindings runLogger = case configComman
|
|||||||
VLeft (V (JSONDecodeError e)) -> do
|
VLeft (V (JSONDecodeError e)) -> do
|
||||||
runLogger $ logError $ "Error decoding config: " <> T.pack e
|
runLogger $ logError $ "Error decoding config: " <> T.pack e
|
||||||
pure $ ExitFailure 65
|
pure $ ExitFailure 65
|
||||||
VLeft e -> do
|
VLeft _ -> pure $ ExitFailure 65
|
||||||
runLogger (logError $ T.pack $ prettyHFError e)
|
|
||||||
pure $ ExitFailure 65
|
|
||||||
|
|
||||||
AddReleaseChannel force new -> do
|
AddReleaseChannel force uri -> do
|
||||||
r <- runE @'[DuplicateReleaseChannel] $ do
|
r <- runE @'[DuplicateReleaseChannel] $ do
|
||||||
let oldSources = fromURLSource (urlSource settings)
|
case urlSource settings of
|
||||||
let merged = oldSources ++ [new]
|
AddSource xs -> do
|
||||||
case checkDuplicate oldSources new of
|
case checkDuplicate xs (Right uri) of
|
||||||
Duplicate
|
Duplicate
|
||||||
| not force -> throwE (DuplicateReleaseChannel new)
|
| not force -> throwE (DuplicateReleaseChannel uri)
|
||||||
DuplicateLast -> pure ()
|
DuplicateLast -> pure ()
|
||||||
_ -> lift $ doConfig (defaultUserSettings { uUrlSource = Just $ SimpleList merged })
|
_ -> lift $ doConfig (defaultUserSettings { uUrlSource = Just $ AddSource (appendUnique xs (Right uri)) })
|
||||||
|
GHCupURL -> do
|
||||||
|
lift $ doConfig (defaultUserSettings { uUrlSource = Just $ AddSource [Right uri] })
|
||||||
|
pure ()
|
||||||
|
OwnSource xs -> do
|
||||||
|
case checkDuplicate xs (Right uri) of
|
||||||
|
Duplicate
|
||||||
|
| not force -> throwE (DuplicateReleaseChannel uri)
|
||||||
|
DuplicateLast -> pure ()
|
||||||
|
_ -> lift $ doConfig (defaultUserSettings { uUrlSource = Just $ OwnSource (appendUnique xs (Right uri)) })
|
||||||
|
OwnSpec spec -> do
|
||||||
|
lift $ doConfig (defaultUserSettings { uUrlSource = Just $ OwnSource [Left spec, Right uri] })
|
||||||
|
pure ()
|
||||||
case r of
|
case r of
|
||||||
VRight _ -> do
|
VRight _ -> do
|
||||||
pure ExitSuccess
|
pure ExitSuccess
|
||||||
@@ -233,6 +242,15 @@ config configCommand settings userConf keybindings runLogger = case configComman
|
|||||||
| a `elem` xs = Duplicate
|
| a `elem` xs = Duplicate
|
||||||
| otherwise = NoDuplicate
|
| otherwise = NoDuplicate
|
||||||
|
|
||||||
|
-- appends the element to the end of the list, but also removes it from the existing list
|
||||||
|
appendUnique :: Eq a => [a] -> a -> [a]
|
||||||
|
appendUnique xs' e = go xs'
|
||||||
|
where
|
||||||
|
go [] = [e]
|
||||||
|
go (x:xs)
|
||||||
|
| x == e = go xs -- skip
|
||||||
|
| otherwise = x : go xs
|
||||||
|
|
||||||
doConfig :: MonadIO m => UserSettings -> m ()
|
doConfig :: MonadIO m => UserSettings -> m ()
|
||||||
doConfig usersettings = do
|
doConfig usersettings = do
|
||||||
let settings' = updateSettings usersettings userConf
|
let settings' = updateSettings usersettings userConf
|
||||||
@@ -24,6 +24,7 @@ import GHCup.Prelude
|
|||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
|
|
||||||
|
import Codec.Archive
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
#endif
|
#endif
|
||||||
@@ -62,6 +63,7 @@ data InstallCommand = InstallGHC InstallOptions
|
|||||||
--[ Options ]--
|
--[ Options ]--
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
||||||
data InstallOptions = InstallOptions
|
data InstallOptions = InstallOptions
|
||||||
{ instVer :: Maybe ToolVersion
|
{ instVer :: Maybe ToolVersion
|
||||||
, instBindist :: Maybe URI
|
, instBindist :: Maybe URI
|
||||||
@@ -132,7 +134,7 @@ installParser =
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
<|> (Right <$> installOpts (Just GHC))
|
<|> (Right <$> installOpts Nothing)
|
||||||
where
|
where
|
||||||
installHLSFooter :: String
|
installHLSFooter :: String
|
||||||
installHLSFooter = [s|Discussion:
|
installHLSFooter = [s|Discussion:
|
||||||
@@ -289,11 +291,6 @@ type InstallGHCEffects = '[ AlreadyInstalled
|
|||||||
, UninstallFailed
|
, UninstallFailed
|
||||||
, UnknownArchive
|
, UnknownArchive
|
||||||
, InstallSetError
|
, InstallSetError
|
||||||
, NoCompatiblePlatform
|
|
||||||
, GHCup.Errors.ParseError
|
|
||||||
, UnsupportedSetupCombo
|
|
||||||
, DistroNotFound
|
|
||||||
, NoCompatibleArch
|
|
||||||
]
|
]
|
||||||
|
|
||||||
runInstGHC :: AppState
|
runInstGHC :: AppState
|
||||||
@@ -313,13 +310,13 @@ runInstGHC appstate' =
|
|||||||
|
|
||||||
install :: Either InstallCommand InstallOptions -> Settings -> IO AppState -> (ReaderT LeanAppState IO () -> IO ()) -> IO ExitCode
|
install :: Either InstallCommand InstallOptions -> Settings -> IO AppState -> (ReaderT LeanAppState IO () -> IO ()) -> IO ExitCode
|
||||||
install installCommand settings getAppState' runLogger = case installCommand of
|
install installCommand settings getAppState' runLogger = case installCommand of
|
||||||
(Right iGHCopts) -> do
|
(Right iopts) -> do
|
||||||
runLogger (logWarn "This is an old-style command for installing GHC. Use 'ghcup install ghc' instead.")
|
runLogger (logWarn "This is an old-style command for installing GHC. Use 'ghcup install ghc' instead.")
|
||||||
installGHC iGHCopts
|
installGHC iopts
|
||||||
(Left (InstallGHC iGHCopts)) -> installGHC iGHCopts
|
(Left (InstallGHC iopts)) -> installGHC iopts
|
||||||
(Left (InstallCabal iopts)) -> installCabal iopts
|
(Left (InstallCabal iopts)) -> installCabal iopts
|
||||||
(Left (InstallHLS iopts)) -> installHLS iopts
|
(Left (InstallHLS iopts)) -> installHLS iopts
|
||||||
(Left (InstallStack iopts)) -> installStack iopts
|
(Left (InstallStack iopts)) -> installStack iopts
|
||||||
where
|
where
|
||||||
installGHC :: InstallOptions -> IO ExitCode
|
installGHC :: InstallOptions -> IO ExitCode
|
||||||
installGHC InstallOptions{..} = do
|
installGHC InstallOptions{..} = do
|
||||||
@@ -27,7 +27,7 @@ import Data.List ( intercalate, sort )
|
|||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Time.Calendar ( Day )
|
import Data.Time.Calendar ( Day )
|
||||||
import Data.Versions
|
import Data.Versions hiding ( str )
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
@@ -14,7 +14,6 @@ module GHCup.OptParse.Prefetch where
|
|||||||
import GHCup
|
import GHCup
|
||||||
import GHCup.Errors
|
import GHCup.Errors
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import GHCup.Types.Optics
|
|
||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
@@ -158,9 +157,7 @@ type PrefetchEffects = '[ TagNotFound
|
|||||||
, GPGError
|
, GPGError
|
||||||
, DownloadFailed
|
, DownloadFailed
|
||||||
, JSONError
|
, JSONError
|
||||||
, FileDoesNotExistError
|
, FileDoesNotExistError ]
|
||||||
, StackPlatformDetectError
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
runPrefetch :: MonadUnliftIO m
|
runPrefetch :: MonadUnliftIO m
|
||||||
@@ -199,22 +196,21 @@ prefetch prefetchCommand runAppState runLogger =
|
|||||||
(v, _) <- liftE $ fromVersion mt GHC
|
(v, _) <- liftE $ fromVersion mt GHC
|
||||||
if pfGHCSrc
|
if pfGHCSrc
|
||||||
then liftE $ fetchGHCSrc v pfCacheDir
|
then liftE $ fetchGHCSrc v pfCacheDir
|
||||||
else liftE $ fetchToolBindist v GHC pfCacheDir
|
else liftE $ fetchToolBindist (_tvVersion v) GHC pfCacheDir
|
||||||
PrefetchCabal PrefetchOptions {pfCacheDir} mt -> do
|
PrefetchCabal PrefetchOptions {pfCacheDir} mt -> do
|
||||||
forM_ pfCacheDir (liftIO . createDirRecursive')
|
forM_ pfCacheDir (liftIO . createDirRecursive')
|
||||||
(v, _) <- liftE $ fromVersion mt Cabal
|
(v, _) <- liftE $ fromVersion mt Cabal
|
||||||
liftE $ fetchToolBindist v Cabal pfCacheDir
|
liftE $ fetchToolBindist (_tvVersion v) Cabal pfCacheDir
|
||||||
PrefetchHLS PrefetchOptions {pfCacheDir} mt -> do
|
PrefetchHLS PrefetchOptions {pfCacheDir} mt -> do
|
||||||
forM_ pfCacheDir (liftIO . createDirRecursive')
|
forM_ pfCacheDir (liftIO . createDirRecursive')
|
||||||
(v, _) <- liftE $ fromVersion mt HLS
|
(v, _) <- liftE $ fromVersion mt HLS
|
||||||
liftE $ fetchToolBindist v HLS pfCacheDir
|
liftE $ fetchToolBindist (_tvVersion v) HLS pfCacheDir
|
||||||
PrefetchStack PrefetchOptions {pfCacheDir} mt -> do
|
PrefetchStack PrefetchOptions {pfCacheDir} mt -> do
|
||||||
forM_ pfCacheDir (liftIO . createDirRecursive')
|
forM_ pfCacheDir (liftIO . createDirRecursive')
|
||||||
(v, _) <- liftE $ fromVersion mt Stack
|
(v, _) <- liftE $ fromVersion mt Stack
|
||||||
liftE $ fetchToolBindist v Stack pfCacheDir
|
liftE $ fetchToolBindist (_tvVersion v) Stack pfCacheDir
|
||||||
PrefetchMetadata -> do
|
PrefetchMetadata -> do
|
||||||
pfreq <- lift getPlatformReq
|
_ <- liftE getDownloadsF
|
||||||
_ <- liftE $ getDownloadsF pfreq
|
|
||||||
pure ""
|
pure ""
|
||||||
) >>= \case
|
) >>= \case
|
||||||
VRight _ -> do
|
VRight _ -> do
|
||||||
@@ -29,7 +29,7 @@ import Control.Monad.Reader
|
|||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Versions
|
import Data.Versions hiding ( str )
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
@@ -28,6 +28,7 @@ import Control.Exception.Safe ( MonadMask, MonadCatch )
|
|||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
#endif
|
#endif
|
||||||
|
import Codec.Archive
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
@@ -186,11 +187,6 @@ type RunEffects = '[ AlreadyInstalled
|
|||||||
, ProcessError
|
, ProcessError
|
||||||
, UninstallFailed
|
, UninstallFailed
|
||||||
, MergeFileTreeError
|
, MergeFileTreeError
|
||||||
, NoCompatiblePlatform
|
|
||||||
, GHCup.Errors.ParseError
|
|
||||||
, UnsupportedSetupCombo
|
|
||||||
, DistroNotFound
|
|
||||||
, NoCompatibleArch
|
|
||||||
]
|
]
|
||||||
|
|
||||||
runLeanRUN :: (MonadUnliftIO m, MonadIO m)
|
runLeanRUN :: (MonadUnliftIO m, MonadIO m)
|
||||||
@@ -230,7 +226,6 @@ run :: forall m .
|
|||||||
, MonadCatch m
|
, MonadCatch m
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
, Alternative m
|
|
||||||
)
|
)
|
||||||
=> RunOptions
|
=> RunOptions
|
||||||
-> IO AppState
|
-> IO AppState
|
||||||
@@ -260,9 +255,7 @@ run RunOptions{..} runAppState leanAppstate runLogger = do
|
|||||||
liftIO $ putStr tmp
|
liftIO $ putStr tmp
|
||||||
pure ExitSuccess
|
pure ExitSuccess
|
||||||
(cmd:args) -> do
|
(cmd:args) -> do
|
||||||
newEnv <- liftIO $ addToPath [tmp] runAppendPATH
|
newEnv <- liftIO $ addToPath tmp runAppendPATH
|
||||||
let pathVar = if isWindows then "Path" else "PATH"
|
|
||||||
forM_ (Map.lookup pathVar . Map.fromList $ newEnv) $ liftIO . setEnv pathVar
|
|
||||||
#ifndef IS_WINDOWS
|
#ifndef IS_WINDOWS
|
||||||
void $ liftIO $ SPP.executeFile cmd True args (Just newEnv)
|
void $ liftIO $ SPP.executeFile cmd True args (Just newEnv)
|
||||||
pure ExitSuccess
|
pure ExitSuccess
|
||||||
@@ -336,7 +329,6 @@ run RunOptions{..} runAppState leanAppstate runLogger = do
|
|||||||
, MonadThrow m
|
, MonadThrow m
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadCatch m
|
, MonadCatch m
|
||||||
, Alternative m
|
|
||||||
)
|
)
|
||||||
=> Toolchain
|
=> Toolchain
|
||||||
-> FilePath
|
-> FilePath
|
||||||
@@ -362,11 +354,6 @@ run RunOptions{..} runAppState leanAppstate runLogger = do
|
|||||||
, CopyError
|
, CopyError
|
||||||
, UninstallFailed
|
, UninstallFailed
|
||||||
, MergeFileTreeError
|
, MergeFileTreeError
|
||||||
, NoCompatiblePlatform
|
|
||||||
, GHCup.Errors.ParseError
|
|
||||||
, UnsupportedSetupCombo
|
|
||||||
, DistroNotFound
|
|
||||||
, NoCompatibleArch
|
|
||||||
] (ResourceT (ReaderT AppState m)) ()
|
] (ResourceT (ReaderT AppState m)) ()
|
||||||
installToolChainFull Toolchain{..} tmp = do
|
installToolChainFull Toolchain{..} tmp = do
|
||||||
case ghcVer of
|
case ghcVer of
|
||||||
@@ -28,7 +28,7 @@ import Control.Monad.Trans.Resource
|
|||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Versions
|
import Data.Versions hiding ( str )
|
||||||
import GHC.Unicode
|
import GHC.Unicode
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
@@ -23,6 +23,7 @@ import GHCup.Utils.Dirs
|
|||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
|
|
||||||
|
import Codec.Archive
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
#endif
|
#endif
|
||||||
@@ -35,7 +35,7 @@ import System.Environment
|
|||||||
import GHCup.Utils
|
import GHCup.Utils
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
import Data.Versions
|
import Data.Versions hiding (str)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +42,7 @@ import Data.Aeson.Encode.Pretty ( encodePretty )
|
|||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
|
import Data.Versions
|
||||||
import GHC.IO.Encoding
|
import GHC.IO.Encoding
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Language.Haskell.TH
|
import Language.Haskell.TH
|
||||||
@@ -84,7 +85,7 @@ toSettings options = do
|
|||||||
keepDirs = fromMaybe (fromMaybe (Types.keepDirs defaultSettings) uKeepDirs) optKeepDirs
|
keepDirs = fromMaybe (fromMaybe (Types.keepDirs defaultSettings) uKeepDirs) optKeepDirs
|
||||||
downloader = fromMaybe (fromMaybe defaultDownloader uDownloader) optsDownloader
|
downloader = fromMaybe (fromMaybe defaultDownloader uDownloader) optsDownloader
|
||||||
keyBindings = maybe defaultKeyBindings mergeKeys uKeyBindings
|
keyBindings = maybe defaultKeyBindings mergeKeys uKeyBindings
|
||||||
urlSource = fromMaybe (fromMaybe (Types.urlSource defaultSettings) uUrlSource) optUrlSource
|
urlSource = maybe (fromMaybe (Types.urlSource defaultSettings) uUrlSource) (OwnSource . (:[]) . Right) optUrlSource
|
||||||
noNetwork = fromMaybe (fromMaybe (Types.noNetwork defaultSettings) uNoNetwork) optNoNetwork
|
noNetwork = fromMaybe (fromMaybe (Types.noNetwork defaultSettings) uNoNetwork) optNoNetwork
|
||||||
gpgSetting = fromMaybe (fromMaybe (Types.gpgSetting defaultSettings) uGPGSetting) optGpg
|
gpgSetting = fromMaybe (fromMaybe (Types.gpgSetting defaultSettings) uGPGSetting) optGpg
|
||||||
platformOverride = optPlatform <|> (uPlatformOverride <|> Types.platformOverride defaultSettings)
|
platformOverride = optPlatform <|> (uPlatformOverride <|> Types.platformOverride defaultSettings)
|
||||||
@@ -107,6 +108,7 @@ toSettings options = do
|
|||||||
, bSet = fromMaybe bSet kSet
|
, bSet = fromMaybe bSet kSet
|
||||||
, bChangelog = fromMaybe bChangelog kChangelog
|
, bChangelog = fromMaybe bChangelog kChangelog
|
||||||
, bShowAllVersions = fromMaybe bShowAllVersions kShowAll
|
, bShowAllVersions = fromMaybe bShowAllVersions kShowAll
|
||||||
|
, bShowAllTools = fromMaybe bShowAllTools kShowAllTools
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -209,9 +211,10 @@ Report bugs at <https://github.com/haskell/ghcup-hs/issues>|]
|
|||||||
exitWith (ExitFailure 2)
|
exitWith (ExitFailure 2)
|
||||||
|
|
||||||
ghcupInfo <-
|
ghcupInfo <-
|
||||||
( flip runReaderT leanAppstate . runE @'[ContentLengthError, DigestError, DistroNotFound, DownloadFailed, FileDoesNotExistError, GPGError, JSONError, NoCompatibleArch, NoCompatiblePlatform, NoDownload, GHCup.Errors.ParseError, ProcessError, UnsupportedSetupCombo, StackPlatformDetectError] $ do
|
( flip runReaderT leanAppstate
|
||||||
liftE $ getDownloadsF pfreq
|
. runE @'[DigestError, ContentLengthError, GPGError, JSONError , DownloadFailed, FileDoesNotExistError]
|
||||||
)
|
$ liftE getDownloadsF
|
||||||
|
)
|
||||||
>>= \case
|
>>= \case
|
||||||
VRight r -> pure r
|
VRight r -> pure r
|
||||||
VLeft e -> do
|
VLeft e -> do
|
||||||
@@ -260,7 +263,7 @@ Report bugs at <https://github.com/haskell/ghcup-hs/issues>|]
|
|||||||
Just _ -> pure ()
|
Just _ -> pure ()
|
||||||
|
|
||||||
-- TODO: always run for windows
|
-- TODO: always run for windows
|
||||||
siletRunLogger (flip runReaderT s' $ runE ensureShimGen) >>= \case
|
siletRunLogger (flip runReaderT s' $ runE ensureGlobalTools) >>= \case
|
||||||
VRight _ -> pure ()
|
VRight _ -> pure ()
|
||||||
VLeft e -> do
|
VLeft e -> do
|
||||||
runLogger
|
runLogger
|
||||||
@@ -338,9 +341,9 @@ Report bugs at <https://github.com/haskell/ghcup-hs/issues>|]
|
|||||||
] m Bool
|
] m Bool
|
||||||
alreadyInstalling (Install (Right InstallOptions{..})) (GHC, ver) = cmp' GHC instVer ver
|
alreadyInstalling (Install (Right InstallOptions{..})) (GHC, ver) = cmp' GHC instVer ver
|
||||||
alreadyInstalling (Install (Left (InstallGHC InstallOptions{..}))) (GHC, ver) = cmp' GHC instVer ver
|
alreadyInstalling (Install (Left (InstallGHC InstallOptions{..}))) (GHC, ver) = cmp' GHC instVer ver
|
||||||
alreadyInstalling (Install (Left (InstallCabal InstallOptions{..}))) (Cabal, ver) = cmp' Cabal instVer ver
|
alreadyInstalling (Install (Left (InstallCabal InstallOptions{..}))) (Cabal, ver) = cmp' Cabal instVer ver
|
||||||
alreadyInstalling (Install (Left (InstallHLS InstallOptions{..}))) (HLS, ver) = cmp' HLS instVer ver
|
alreadyInstalling (Install (Left (InstallHLS InstallOptions{..}))) (HLS, ver) = cmp' HLS instVer ver
|
||||||
alreadyInstalling (Install (Left (InstallStack InstallOptions{..}))) (Stack, ver) = cmp' Stack instVer ver
|
alreadyInstalling (Install (Left (InstallStack InstallOptions{..}))) (Stack, ver) = cmp' Stack instVer ver
|
||||||
alreadyInstalling (Compile (CompileGHC GHCCompileOptions{ ovewrwiteVer = Just over }))
|
alreadyInstalling (Compile (CompileGHC GHCCompileOptions{ ovewrwiteVer = Just over }))
|
||||||
(GHC, ver) = cmp' GHC (Just $ GHCVersion (mkTVer over)) ver
|
(GHC, ver) = cmp' GHC (Just $ GHCVersion (mkTVer over)) ver
|
||||||
alreadyInstalling (Compile (CompileGHC GHCCompileOptions{ targetGhc = GHC.SourceDist tver }))
|
alreadyInstalling (Compile (CompileGHC GHCCompileOptions{ targetGhc = GHC.SourceDist tver }))
|
||||||
@@ -375,4 +378,3 @@ Report bugs at <https://github.com/haskell/ghcup-hs/issues>|]
|
|||||||
cmp' tool instVer ver = do
|
cmp' tool instVer ver = do
|
||||||
(v, _) <- liftE $ fromVersion instVer tool
|
(v, _) <- liftE $ fromVersion instVer tool
|
||||||
pure (v == ver)
|
pure (v == ver)
|
||||||
|
|
||||||
|
|||||||
@@ -2,35 +2,14 @@ packages: ./ghcup.cabal
|
|||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
optional-packages: ./vendored/*/*.cabal
|
||||||
|
|
||||||
if impl(ghc < 9.0)
|
optimization: 2
|
||||||
package ghcup
|
|
||||||
flags: +tui -tar
|
package ghcup
|
||||||
else
|
flags: +tui
|
||||||
package ghcup
|
|
||||||
flags: +tui +tar
|
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
constraints: http-io-streams -brotli,
|
||||||
any.aeson >= 2.0.1.0
|
any.aeson >= 2.0.1.0
|
||||||
|
|
||||||
if os(mingw32)
|
|
||||||
if impl(ghc >= 9.4)
|
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
package libarchive
|
package libarchive
|
||||||
flags: -system-libarchive
|
flags: -system-libarchive
|
||||||
|
|
||||||
@@ -46,10 +25,5 @@ package aeson
|
|||||||
package streamly
|
package streamly
|
||||||
flags: +use-unliftio
|
flags: +use-unliftio
|
||||||
|
|
||||||
package *
|
|
||||||
test-show-details: direct
|
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
|
|
||||||
with-compiler: ghc-8.10.7
|
with-compiler: ghc-8.10.7
|
||||||
|
|||||||
@@ -1,57 +1,55 @@
|
|||||||
active-repositories: hackage.haskell.org:merge
|
active-repositories: hackage.haskell.org:merge
|
||||||
constraints: any.Cabal ==3.6.3.0,
|
constraints: any.Cabal ==3.6.3.0,
|
||||||
Cabal -bundled-binary-generic,
|
Cabal -bundled-binary-generic,
|
||||||
any.Cabal-syntax ==3.10.2.0,
|
any.Cabal-syntax ==3.8.1.0,
|
||||||
any.HUnit ==1.6.2.0,
|
any.HUnit ==1.6.2.0,
|
||||||
any.HsOpenSSL ==0.11.7.6,
|
any.HsOpenSSL ==0.11.7.4,
|
||||||
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
||||||
any.OneTuple ==0.4.1.1,
|
any.OneTuple ==0.3.1,
|
||||||
any.QuickCheck ==2.14.3,
|
any.QuickCheck ==2.14.2,
|
||||||
QuickCheck -old-random +templatehaskell,
|
QuickCheck -old-random +templatehaskell,
|
||||||
any.StateVar ==1.2.2,
|
any.StateVar ==1.2.2,
|
||||||
any.abstract-deque ==0.3,
|
any.abstract-deque ==0.3,
|
||||||
abstract-deque -usecas,
|
abstract-deque -usecas,
|
||||||
any.aeson ==2.1.2.1,
|
any.aeson ==2.1.1.0,
|
||||||
aeson -cffi +ordered-keymap,
|
aeson -cffi +ordered-keymap,
|
||||||
any.aeson-pretty ==0.8.10,
|
any.aeson-pretty ==0.8.9,
|
||||||
aeson-pretty +lib-only,
|
aeson-pretty +lib-only,
|
||||||
any.alex ==3.5.0.0,
|
any.alex ==3.2.7.1,
|
||||||
any.ansi-terminal ==1.0.2,
|
any.ansi-terminal ==0.11.4,
|
||||||
ansi-terminal -example,
|
ansi-terminal -example +win32-2-13-1,
|
||||||
any.ansi-terminal-types ==0.11.5,
|
|
||||||
any.ansi-wl-pprint ==0.6.9,
|
any.ansi-wl-pprint ==0.6.9,
|
||||||
ansi-wl-pprint -example,
|
ansi-wl-pprint -example,
|
||||||
any.array ==0.5.4.0,
|
any.array ==0.5.4.0,
|
||||||
any.assoc ==1.1,
|
any.assoc ==1.0.2,
|
||||||
assoc +tagged,
|
any.async ==2.2.4,
|
||||||
any.async ==2.2.5,
|
|
||||||
async -bench,
|
async -bench,
|
||||||
any.atomic-primops ==0.8.4,
|
any.atomic-primops ==0.8.4,
|
||||||
atomic-primops -debug,
|
atomic-primops -debug,
|
||||||
any.attoparsec ==0.14.4,
|
any.attoparsec ==0.14.4,
|
||||||
attoparsec -developer,
|
attoparsec -developer,
|
||||||
any.base ==4.14.3.0,
|
any.base ==4.14.3.0,
|
||||||
any.base-compat ==0.13.1,
|
any.base-compat ==0.12.2,
|
||||||
any.base-compat-batteries ==0.13.1,
|
any.base-compat-batteries ==0.12.2,
|
||||||
any.base-orphans ==0.9.1,
|
any.base-orphans ==0.8.7,
|
||||||
any.base16-bytestring ==1.0.2.0,
|
any.base16-bytestring ==1.0.2.0,
|
||||||
any.base64-bytestring ==1.2.1.0,
|
any.base64-bytestring ==1.2.1.0,
|
||||||
any.bifunctors ==5.6.1,
|
any.bifunctors ==5.5.14,
|
||||||
bifunctors +tagged,
|
bifunctors +semigroups +tagged,
|
||||||
any.bimap ==0.5.0,
|
any.bimap ==0.5.0,
|
||||||
any.binary ==0.8.8.0,
|
any.binary ==0.8.8.0,
|
||||||
any.binary-instances ==1.0.4,
|
any.binary-instances ==1.0.3,
|
||||||
any.binary-orphans ==1.0.4.1,
|
any.binary-orphans ==1.0.3,
|
||||||
any.blaze-builder ==0.4.2.3,
|
any.blaze-builder ==0.4.2.2,
|
||||||
any.brick ==2.1.1,
|
any.brick ==1.5,
|
||||||
brick -demos,
|
brick -demos,
|
||||||
any.bytestring ==0.10.12.0,
|
any.bytestring ==0.10.12.0,
|
||||||
any.bz2 ==1.0.1.0,
|
any.bz2 ==1.0.1.0,
|
||||||
bz2 -cross +with-bzlib,
|
bz2 -cross +with-bzlib,
|
||||||
any.c2hs ==0.28.8,
|
any.c2hs ==0.28.8,
|
||||||
c2hs +base3 -regression,
|
c2hs +base3 -regression,
|
||||||
any.cabal-install-parsers ==0.6.1,
|
any.cabal-install-parsers ==0.5,
|
||||||
any.cabal-plan ==0.7.3.0,
|
any.cabal-plan ==0.7.2.3,
|
||||||
cabal-plan -_ -exe -license-report,
|
cabal-plan -_ -exe -license-report,
|
||||||
any.call-stack ==0.4.0,
|
any.call-stack ==0.4.0,
|
||||||
any.case-insensitive ==1.2.1.0,
|
any.case-insensitive ==1.2.1.0,
|
||||||
@@ -64,7 +62,7 @@ constraints: any.Cabal ==3.6.3.0,
|
|||||||
comonad +containers +distributive +indexed-traversable,
|
comonad +containers +distributive +indexed-traversable,
|
||||||
any.composition-prelude ==3.0.0.2,
|
any.composition-prelude ==3.0.0.2,
|
||||||
composition-prelude -development,
|
composition-prelude -development,
|
||||||
any.config-ini ==0.2.7.0,
|
any.config-ini ==0.2.5.0,
|
||||||
config-ini -enable-doctests,
|
config-ini -enable-doctests,
|
||||||
any.containers ==0.6.5.1,
|
any.containers ==0.6.5.1,
|
||||||
any.contravariant ==1.5.5,
|
any.contravariant ==1.5.5,
|
||||||
@@ -85,37 +83,34 @@ constraints: any.Cabal ==3.6.3.0,
|
|||||||
any.dlist ==1.0,
|
any.dlist ==1.0,
|
||||||
dlist -werror,
|
dlist -werror,
|
||||||
any.exceptions ==0.10.4,
|
any.exceptions ==0.10.4,
|
||||||
any.file-uri ==0.1.0.0,
|
|
||||||
any.filepath ==1.4.2.1,
|
any.filepath ==1.4.2.1,
|
||||||
any.foldable1-classes-compat ==0.1,
|
any.free ==5.1.10,
|
||||||
foldable1-classes-compat +tagged,
|
|
||||||
any.free ==5.2,
|
|
||||||
any.fusion-plugin-types ==0.1.0,
|
any.fusion-plugin-types ==0.1.0,
|
||||||
any.generic-arbitrary ==0.2.2,
|
any.generic-arbitrary ==0.2.2,
|
||||||
any.generically ==0.1.1,
|
any.generically ==0.1,
|
||||||
any.ghc-boot-th ==8.10.7,
|
any.ghc-boot-th ==8.10.7,
|
||||||
any.ghc-byteorder ==4.11.0.0.10,
|
any.ghc-byteorder ==4.11.0.0.10,
|
||||||
any.ghc-prim ==0.6.1,
|
any.ghc-prim ==0.6.1,
|
||||||
any.happy ==1.20.1.1,
|
any.happy ==1.20.0,
|
||||||
any.hashable ==1.4.3.0,
|
any.hashable ==1.4.2.0,
|
||||||
hashable +integer-gmp -random-initial-seed,
|
hashable +integer-gmp -random-initial-seed,
|
||||||
any.haskell-lexer ==1.1.1,
|
any.haskell-lexer ==1.1.1,
|
||||||
any.haskus-utils-data ==1.4,
|
any.haskus-utils-data ==1.4,
|
||||||
any.haskus-utils-types ==1.5.1,
|
any.haskus-utils-types ==1.5.1,
|
||||||
any.haskus-utils-variant ==3.3,
|
any.haskus-utils-variant ==3.2.1,
|
||||||
any.heaps ==0.4,
|
any.heaps ==0.4,
|
||||||
any.hsc2hs ==0.68.10,
|
any.hsc2hs ==0.68.8,
|
||||||
hsc2hs -in-ghc-tree,
|
hsc2hs -in-ghc-tree,
|
||||||
any.hspec ==2.10.10,
|
any.hspec ==2.10.8,
|
||||||
any.hspec-core ==2.10.10,
|
any.hspec-core ==2.10.8,
|
||||||
any.hspec-discover ==2.10.10,
|
any.hspec-discover ==2.10.8,
|
||||||
any.hspec-expectations ==0.8.2,
|
any.hspec-expectations ==0.8.2,
|
||||||
any.hspec-golden-aeson ==0.9.0.0,
|
any.hspec-golden-aeson ==0.9.0.0,
|
||||||
any.http-io-streams ==0.1.6.3,
|
any.http-io-streams ==0.1.6.1,
|
||||||
http-io-streams -brotli +fast-xor,
|
http-io-streams -brotli +fast-xor,
|
||||||
any.indexed-profunctors ==0.1.1.1,
|
any.indexed-profunctors ==0.1.1,
|
||||||
any.indexed-traversable ==0.1.3,
|
any.indexed-traversable ==0.1.2,
|
||||||
any.indexed-traversable-instances ==0.1.1.2,
|
any.indexed-traversable-instances ==0.1.1.1,
|
||||||
any.integer-gmp ==1.0.3.0,
|
any.integer-gmp ==1.0.3.0,
|
||||||
any.integer-logarithms ==1.0.3.1,
|
any.integer-logarithms ==1.0.3.1,
|
||||||
integer-logarithms -check-bounds +integer-gmp,
|
integer-logarithms -check-bounds +integer-gmp,
|
||||||
@@ -123,9 +118,9 @@ constraints: any.Cabal ==3.6.3.0,
|
|||||||
io-streams +network -nointeractivetests +zlib,
|
io-streams +network -nointeractivetests +zlib,
|
||||||
any.language-c ==0.9.2,
|
any.language-c ==0.9.2,
|
||||||
language-c -allwarnings +iecfpextension +usebytestrings,
|
language-c -allwarnings +iecfpextension +usebytestrings,
|
||||||
any.libarchive ==3.0.4.2,
|
any.libarchive ==3.0.3.2,
|
||||||
libarchive -cross -low-memory +no-exe -system-libarchive,
|
libarchive -cross -low-memory +no-exe -system-libarchive,
|
||||||
any.libyaml-streamly ==0.2.2,
|
any.libyaml-streamly ==0.2.1,
|
||||||
libyaml-streamly -no-unicode -system-libyaml,
|
libyaml-streamly -no-unicode -system-libyaml,
|
||||||
any.lockfree-queue ==0.2.4,
|
any.lockfree-queue ==0.2.4,
|
||||||
any.lukko ==0.1.1.3,
|
any.lukko ==0.1.1.3,
|
||||||
@@ -135,85 +130,84 @@ constraints: any.Cabal ==3.6.3.0,
|
|||||||
megaparsec -dev,
|
megaparsec -dev,
|
||||||
any.microlens ==0.4.13.1,
|
any.microlens ==0.4.13.1,
|
||||||
any.microlens-mtl ==0.2.0.3,
|
any.microlens-mtl ==0.2.0.3,
|
||||||
any.microlens-th ==0.4.3.14,
|
any.microlens-th ==0.4.3.11,
|
||||||
any.mtl ==2.2.2,
|
any.mtl ==2.2.2,
|
||||||
any.mtl-compat ==0.2.2,
|
any.network ==3.1.2.7,
|
||||||
mtl-compat -two-point-one -two-point-two,
|
|
||||||
any.network ==3.1.4.0,
|
|
||||||
network -devel,
|
network -devel,
|
||||||
any.network-uri ==2.6.4.2,
|
any.network-uri ==2.6.4.2,
|
||||||
any.openssl-streams ==1.2.3.0,
|
any.openssl-streams ==1.2.3.0,
|
||||||
any.optics ==0.4.2.1,
|
any.optics ==0.4.2,
|
||||||
any.optics-core ==0.4.1.1,
|
any.optics-core ==0.4.1,
|
||||||
optics-core -explicit-generic-labels,
|
optics-core -explicit-generic-labels,
|
||||||
any.optics-extra ==0.4.2.1,
|
any.optics-extra ==0.4.2.1,
|
||||||
any.optics-th ==0.4.1,
|
any.optics-th ==0.4.1,
|
||||||
any.optparse-applicative ==0.17.1.0,
|
any.optparse-applicative ==0.17.0.0,
|
||||||
optparse-applicative +process,
|
optparse-applicative +process,
|
||||||
any.os-release ==1.0.2.1,
|
any.os-release ==1.0.2.1,
|
||||||
os-release -devel,
|
os-release -devel,
|
||||||
any.parsec ==3.1.17.0,
|
any.parallel ==3.2.2.0,
|
||||||
|
any.parsec ==3.1.16.1,
|
||||||
any.parser-combinators ==1.3.0,
|
any.parser-combinators ==1.3.0,
|
||||||
parser-combinators -dev,
|
parser-combinators -dev,
|
||||||
any.polyparse ==1.13,
|
any.polyparse ==1.13,
|
||||||
any.pretty ==1.1.3.6,
|
any.pretty ==1.1.3.6,
|
||||||
any.pretty-terminal ==0.1.0.0,
|
any.pretty-terminal ==0.1.0.0,
|
||||||
any.primitive ==0.8.0.0,
|
any.primitive ==0.7.4.0,
|
||||||
any.process ==1.6.13.2,
|
any.process ==1.6.13.2,
|
||||||
any.profunctors ==5.6.2,
|
any.profunctors ==5.6.2,
|
||||||
any.quickcheck-arbitrary-adt ==0.3.1.0,
|
any.quickcheck-arbitrary-adt ==0.3.1.0,
|
||||||
any.quickcheck-io ==0.2.0,
|
any.quickcheck-io ==0.2.0,
|
||||||
any.random ==1.2.1.1,
|
any.random ==1.2.1.1,
|
||||||
any.recursion-schemes ==5.2.2.5,
|
any.recursion-schemes ==5.2.2.3,
|
||||||
recursion-schemes +template-haskell,
|
recursion-schemes +template-haskell,
|
||||||
any.regex-base ==0.94.0.2,
|
any.regex-base ==0.94.0.2,
|
||||||
any.regex-posix ==0.96.0.1,
|
any.regex-posix ==0.96.0.1,
|
||||||
regex-posix -_regex-posix-clib,
|
regex-posix -_regex-posix-clib,
|
||||||
any.resourcet ==1.2.6,
|
any.resourcet ==1.2.6,
|
||||||
any.retry ==0.9.3.1,
|
any.retry ==0.8.1.2,
|
||||||
retry -lib-werror,
|
retry -lib-werror,
|
||||||
any.rts ==1.0.1,
|
any.rts ==1.0.1,
|
||||||
any.safe ==0.3.21,
|
any.safe ==0.3.19,
|
||||||
any.safe-exceptions ==0.1.7.4,
|
any.safe-exceptions ==0.1.7.3,
|
||||||
any.scientific ==0.3.7.0,
|
any.scientific ==0.3.7.0,
|
||||||
scientific -bytestring-builder -integer-simple,
|
scientific -bytestring-builder -integer-simple,
|
||||||
any.semialign ==1.3,
|
any.semialign ==1.2.0.1,
|
||||||
semialign +semigroupoids,
|
semialign +semigroupoids,
|
||||||
any.semigroupoids ==6.0.0.1,
|
any.semigroupoids ==5.3.7,
|
||||||
semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers,
|
semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers,
|
||||||
any.setenv ==0.1.1.3,
|
any.setenv ==0.1.1.3,
|
||||||
any.split ==0.2.5,
|
any.split ==0.2.3.5,
|
||||||
any.splitmix ==0.1.0.5,
|
any.splitmix ==0.1.0.4,
|
||||||
splitmix -optimised-mixer,
|
splitmix -optimised-mixer,
|
||||||
any.stm ==2.5.0.1,
|
any.stm ==2.5.0.1,
|
||||||
any.streamly ==0.8.3,
|
any.streamly ==0.8.3,
|
||||||
streamly -debug -dev -fusion-plugin -has-llvm -inspection -limit-build-mem -no-fusion +opt -streamk -streamly-core -use-c-malloc +use-unliftio,
|
streamly -debug -dev -fusion-plugin -has-llvm -inspection -limit-build-mem -no-fusion +opt -streamk -streamly-core -use-c-malloc +use-unliftio,
|
||||||
any.strict ==0.5,
|
any.strict ==0.4.0.1,
|
||||||
|
strict +assoc,
|
||||||
any.strict-base ==0.4.0.0,
|
any.strict-base ==0.4.0.0,
|
||||||
any.tagged ==0.8.8,
|
any.tagged ==0.8.6.1,
|
||||||
tagged +deepseq +transformers,
|
tagged +deepseq +transformers,
|
||||||
any.tagsoup ==0.14.8,
|
any.tagsoup ==0.14.8,
|
||||||
any.tar ==0.6.0.0,
|
any.tar ==0.5.1.1,
|
||||||
any.tasty ==1.5,
|
tar -old-bytestring -old-time,
|
||||||
tasty +unix,
|
|
||||||
any.tasty-hunit ==0.10.1,
|
|
||||||
any.template-haskell ==2.16.0.0,
|
any.template-haskell ==2.16.0.0,
|
||||||
any.temporary ==1.3,
|
any.temporary ==1.3,
|
||||||
any.terminal-progress-bar ==0.4.2,
|
any.terminal-progress-bar ==0.4.1,
|
||||||
any.terminal-size ==0.3.4,
|
any.terminal-size ==0.3.3,
|
||||||
any.terminfo ==0.4.1.4,
|
any.terminfo ==0.4.1.4,
|
||||||
any.text ==2.0.2,
|
any.text ==2.0.1,
|
||||||
text -developer +simdutf,
|
text -developer +simdutf,
|
||||||
any.text-binary ==0.2.1.1,
|
any.text-binary ==0.2.1.1,
|
||||||
any.text-short ==0.1.5,
|
any.text-short ==0.1.5,
|
||||||
text-short -asserts,
|
text-short -asserts,
|
||||||
any.text-zipper ==0.13,
|
any.text-zipper ==0.12,
|
||||||
any.tf-random ==0.5,
|
any.tf-random ==0.5,
|
||||||
any.th-abstraction ==0.5.0.0,
|
any.th-abstraction ==0.4.5.0,
|
||||||
any.th-compat ==0.1.4,
|
any.th-compat ==0.1.4,
|
||||||
any.th-lift ==0.8.4,
|
any.th-lift ==0.8.2,
|
||||||
any.th-lift-instances ==0.1.20,
|
any.th-lift-instances ==0.1.20,
|
||||||
any.these ==1.2,
|
any.these ==1.1.1.1,
|
||||||
|
these +assoc,
|
||||||
any.time ==1.9.3,
|
any.time ==1.9.3,
|
||||||
any.time-compat ==1.9.6.1,
|
any.time-compat ==1.9.6.1,
|
||||||
time-compat -old-locale,
|
time-compat -old-locale,
|
||||||
@@ -226,31 +220,27 @@ constraints: any.Cabal ==3.6.3.0,
|
|||||||
unicode-data -ucd2haskell,
|
unicode-data -ucd2haskell,
|
||||||
any.unix ==2.7.2.2,
|
any.unix ==2.7.2.2,
|
||||||
any.unix-bytestring ==0.3.7.8,
|
any.unix-bytestring ==0.3.7.8,
|
||||||
any.unix-compat ==0.7.1,
|
any.unix-compat ==0.6,
|
||||||
unix-compat -old-time,
|
unix-compat -old-time,
|
||||||
any.unliftio-core ==0.2.1.0,
|
any.unliftio-core ==0.2.0.1,
|
||||||
any.unordered-containers ==0.2.20,
|
any.unordered-containers ==0.2.19.1,
|
||||||
unordered-containers -debug,
|
unordered-containers -debug,
|
||||||
any.uri-bytestring ==0.3.3.1,
|
any.uri-bytestring ==0.3.3.1,
|
||||||
uri-bytestring -lib-werror,
|
uri-bytestring -lib-werror,
|
||||||
any.utf8-string ==1.0.2,
|
any.utf8-string ==1.0.2,
|
||||||
any.uuid-types ==1.0.5.1,
|
any.uuid-types ==1.0.5,
|
||||||
any.vector ==0.13.1.0,
|
any.vector ==0.12.3.1,
|
||||||
vector +boundschecks -internalchecks -unsafechecks -wall,
|
vector +boundschecks -internalchecks -unsafechecks -wall,
|
||||||
any.vector-binary-instances ==0.2.5.2,
|
any.vector-binary-instances ==0.2.5.2,
|
||||||
any.vector-stream ==0.1.0.1,
|
any.versions ==5.0.4,
|
||||||
any.versions ==6.0.4,
|
any.vty ==5.37,
|
||||||
any.vty ==6.0,
|
|
||||||
any.vty-crossplatform ==0.2.0.0,
|
|
||||||
vty-crossplatform -demos,
|
|
||||||
any.vty-unix ==0.1.0.0,
|
|
||||||
any.witherable ==0.4.2,
|
any.witherable ==0.4.2,
|
||||||
any.word-wrap ==0.5,
|
any.word-wrap ==0.5,
|
||||||
any.word8 ==0.1.3,
|
any.word8 ==0.1.3,
|
||||||
any.xor ==0.0.1.2,
|
any.xor ==0.0.1.1,
|
||||||
any.yaml-streamly ==0.12.4,
|
any.yaml-streamly ==0.12.1,
|
||||||
yaml-streamly +no-examples +no-exe,
|
yaml-streamly +no-examples +no-exe,
|
||||||
any.zlib ==0.6.3.0,
|
any.zlib ==0.6.3.0,
|
||||||
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config,
|
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config,
|
||||||
any.zlib-bindings ==0.1.1.5
|
any.zlib-bindings ==0.1.1.5
|
||||||
index-state: hackage.haskell.org 2024-01-19T19:48:54Z
|
index-state: hackage.haskell.org 2023-01-12T04:22:48Z
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
packages: ./ghcup.cabal
|
|
||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
|
||||||
|
|
||||||
if impl(ghc < 9.0)
|
|
||||||
package ghcup
|
|
||||||
flags: +tui -tar
|
|
||||||
else
|
|
||||||
package ghcup
|
|
||||||
flags: +tui +tar
|
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
|
||||||
any.aeson >= 2.0.1.0
|
|
||||||
|
|
||||||
if os(mingw32)
|
|
||||||
if impl(ghc >= 9.4)
|
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
package libarchive
|
|
||||||
flags: -system-libarchive
|
|
||||||
|
|
||||||
package aeson-pretty
|
|
||||||
flags: +lib-only
|
|
||||||
|
|
||||||
package cabal-plan
|
|
||||||
flags: -exe
|
|
||||||
|
|
||||||
package aeson
|
|
||||||
flags: +ordered-keymap
|
|
||||||
|
|
||||||
package streamly
|
|
||||||
flags: +use-unliftio
|
|
||||||
|
|
||||||
package *
|
|
||||||
test-show-details: direct
|
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
|
|
||||||
with-compiler: ghc-9.0.2
|
|
||||||
@@ -1,269 +0,0 @@
|
|||||||
active-repositories: hackage.haskell.org:merge
|
|
||||||
constraints: any.Cabal ==3.6.3.0,
|
|
||||||
Cabal -bundled-binary-generic,
|
|
||||||
any.Cabal-syntax ==3.10.2.0,
|
|
||||||
any.HUnit ==1.6.2.0,
|
|
||||||
any.HsOpenSSL ==0.11.7.6,
|
|
||||||
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
|
||||||
any.OneTuple ==0.4.1.1,
|
|
||||||
any.QuickCheck ==2.14.3,
|
|
||||||
QuickCheck -old-random +templatehaskell,
|
|
||||||
any.StateVar ==1.2.2,
|
|
||||||
any.abstract-deque ==0.3,
|
|
||||||
abstract-deque -usecas,
|
|
||||||
any.aeson ==2.1.2.1,
|
|
||||||
aeson -cffi +ordered-keymap,
|
|
||||||
any.aeson-pretty ==0.8.10,
|
|
||||||
aeson-pretty +lib-only,
|
|
||||||
any.alex ==3.5.0.0,
|
|
||||||
any.ansi-terminal ==1.0.2,
|
|
||||||
ansi-terminal -example,
|
|
||||||
any.ansi-terminal-types ==0.11.5,
|
|
||||||
any.ansi-wl-pprint ==0.6.9,
|
|
||||||
ansi-wl-pprint -example,
|
|
||||||
any.array ==0.5.4.0,
|
|
||||||
any.assoc ==1.1,
|
|
||||||
assoc +tagged,
|
|
||||||
any.async ==2.2.5,
|
|
||||||
async -bench,
|
|
||||||
any.atomic-primops ==0.8.4,
|
|
||||||
atomic-primops -debug,
|
|
||||||
any.attoparsec ==0.14.4,
|
|
||||||
attoparsec -developer,
|
|
||||||
any.base ==4.15.1.0,
|
|
||||||
any.base-compat ==0.13.1,
|
|
||||||
any.base-compat-batteries ==0.13.1,
|
|
||||||
any.base-orphans ==0.9.1,
|
|
||||||
any.base16-bytestring ==1.0.2.0,
|
|
||||||
any.base64-bytestring ==1.2.1.0,
|
|
||||||
any.bifunctors ==5.6.1,
|
|
||||||
bifunctors +tagged,
|
|
||||||
any.bimap ==0.5.0,
|
|
||||||
any.binary ==0.8.8.0,
|
|
||||||
any.binary-instances ==1.0.4,
|
|
||||||
any.binary-orphans ==1.0.4.1,
|
|
||||||
any.bindings-DSL ==1.0.25,
|
|
||||||
any.bitvec ==1.1.5.0,
|
|
||||||
bitvec +simd,
|
|
||||||
any.blaze-builder ==0.4.2.3,
|
|
||||||
any.brick ==2.1.1,
|
|
||||||
brick -demos,
|
|
||||||
any.bytestring ==0.10.12.1,
|
|
||||||
any.bz2 ==1.0.1.0,
|
|
||||||
bz2 -cross +with-bzlib,
|
|
||||||
any.bzlib-conduit ==0.3.0.2,
|
|
||||||
any.c2hs ==0.28.8,
|
|
||||||
c2hs +base3 -regression,
|
|
||||||
any.cabal-install-parsers ==0.6.1,
|
|
||||||
any.cabal-plan ==0.7.3.0,
|
|
||||||
cabal-plan -_ -exe -license-report,
|
|
||||||
any.call-stack ==0.4.0,
|
|
||||||
any.case-insensitive ==1.2.1.0,
|
|
||||||
any.casing ==0.1.4.1,
|
|
||||||
any.cereal ==0.5.8.3,
|
|
||||||
cereal -bytestring-builder,
|
|
||||||
any.colour ==2.3.6,
|
|
||||||
any.comonad ==5.0.8,
|
|
||||||
comonad +containers +distributive +indexed-traversable,
|
|
||||||
any.conduit ==1.3.5,
|
|
||||||
any.conduit-extra ==1.3.6,
|
|
||||||
any.conduit-zstd ==0.0.2.0,
|
|
||||||
any.config-ini ==0.2.7.0,
|
|
||||||
config-ini -enable-doctests,
|
|
||||||
any.containers ==0.6.4.1,
|
|
||||||
any.contravariant ==1.5.5,
|
|
||||||
contravariant +semigroups +statevar +tagged,
|
|
||||||
any.cryptohash-sha1 ==0.11.101.0,
|
|
||||||
any.cryptohash-sha256 ==0.11.102.1,
|
|
||||||
cryptohash-sha256 -exe +use-cbits,
|
|
||||||
any.data-array-byte ==0.1.0.1,
|
|
||||||
any.data-clist ==0.2,
|
|
||||||
any.data-default-class ==0.1.2.0,
|
|
||||||
any.data-fix ==0.3.2,
|
|
||||||
any.deepseq ==1.4.5.0,
|
|
||||||
any.digest ==0.0.2.0,
|
|
||||||
digest -have_arm64_crc32c -have_builtin_prefetch -have_mm_prefetch -have_sse42 -have_strong_getauxval -have_weak_getauxval +pkg-config,
|
|
||||||
any.directory ==1.3.6.2,
|
|
||||||
any.disk-free-space ==0.1.0.1,
|
|
||||||
any.distributive ==0.6.2.1,
|
|
||||||
distributive +semigroups +tagged,
|
|
||||||
any.dlist ==1.0,
|
|
||||||
dlist -werror,
|
|
||||||
any.exceptions ==0.10.4,
|
|
||||||
any.file-uri ==0.1.0.0,
|
|
||||||
any.filepath ==1.4.2.1,
|
|
||||||
any.foldable1-classes-compat ==0.1,
|
|
||||||
foldable1-classes-compat +tagged,
|
|
||||||
any.free ==5.2,
|
|
||||||
any.fusion-plugin-types ==0.1.0,
|
|
||||||
any.generic-arbitrary ==0.2.2,
|
|
||||||
any.generically ==0.1.1,
|
|
||||||
any.ghc-bignum ==1.1,
|
|
||||||
any.ghc-boot-th ==9.0.2,
|
|
||||||
any.ghc-byteorder ==4.11.0.0.10,
|
|
||||||
any.ghc-prim ==0.7.0,
|
|
||||||
any.happy ==1.20.1.1,
|
|
||||||
any.hashable ==1.4.3.0,
|
|
||||||
hashable +integer-gmp -random-initial-seed,
|
|
||||||
any.haskell-lexer ==1.1.1,
|
|
||||||
any.haskus-utils-data ==1.4,
|
|
||||||
any.haskus-utils-types ==1.5.1,
|
|
||||||
any.haskus-utils-variant ==3.3,
|
|
||||||
any.heaps ==0.4,
|
|
||||||
any.hsc2hs ==0.68.10,
|
|
||||||
hsc2hs -in-ghc-tree,
|
|
||||||
any.hspec ==2.10.10,
|
|
||||||
any.hspec-core ==2.10.10,
|
|
||||||
any.hspec-discover ==2.10.10,
|
|
||||||
any.hspec-expectations ==0.8.2,
|
|
||||||
any.hspec-golden-aeson ==0.9.0.0,
|
|
||||||
any.http-io-streams ==0.1.6.3,
|
|
||||||
http-io-streams -brotli +fast-xor,
|
|
||||||
any.indexed-profunctors ==0.1.1.1,
|
|
||||||
any.indexed-traversable ==0.1.3,
|
|
||||||
any.indexed-traversable-instances ==0.1.1.2,
|
|
||||||
any.integer-logarithms ==1.0.3.1,
|
|
||||||
integer-logarithms -check-bounds +integer-gmp,
|
|
||||||
any.io-streams ==1.5.2.2,
|
|
||||||
io-streams +network -nointeractivetests +zlib,
|
|
||||||
any.language-c ==0.9.2,
|
|
||||||
language-c -allwarnings +iecfpextension +usebytestrings,
|
|
||||||
any.libyaml-streamly ==0.2.2,
|
|
||||||
libyaml-streamly -no-unicode -system-libyaml,
|
|
||||||
any.lockfree-queue ==0.2.4,
|
|
||||||
any.lukko ==0.1.1.3,
|
|
||||||
lukko +ofd-locking,
|
|
||||||
any.lzma-static ==5.2.5.5,
|
|
||||||
any.megaparsec ==9.2.2,
|
|
||||||
megaparsec -dev,
|
|
||||||
any.microlens ==0.4.13.1,
|
|
||||||
any.microlens-mtl ==0.2.0.3,
|
|
||||||
any.microlens-th ==0.4.3.14,
|
|
||||||
any.monad-control ==1.0.3.1,
|
|
||||||
any.mono-traversable ==1.0.15.3,
|
|
||||||
any.mtl ==2.2.2,
|
|
||||||
any.mtl-compat ==0.2.2,
|
|
||||||
mtl-compat -two-point-one -two-point-two,
|
|
||||||
any.network ==3.1.4.0,
|
|
||||||
network -devel,
|
|
||||||
any.network-uri ==2.6.4.2,
|
|
||||||
any.openssl-streams ==1.2.3.0,
|
|
||||||
any.optics ==0.4.2.1,
|
|
||||||
any.optics-core ==0.4.1.1,
|
|
||||||
optics-core -explicit-generic-labels,
|
|
||||||
any.optics-extra ==0.4.2.1,
|
|
||||||
any.optics-th ==0.4.1,
|
|
||||||
any.optparse-applicative ==0.17.1.0,
|
|
||||||
optparse-applicative +process,
|
|
||||||
any.os-release ==1.0.2.1,
|
|
||||||
os-release -devel,
|
|
||||||
any.parsec ==3.1.17.0,
|
|
||||||
any.parser-combinators ==1.3.0,
|
|
||||||
parser-combinators -dev,
|
|
||||||
any.pretty ==1.1.3.6,
|
|
||||||
any.pretty-terminal ==0.1.0.0,
|
|
||||||
any.primitive ==0.8.0.0,
|
|
||||||
any.process ==1.6.13.2,
|
|
||||||
any.profunctors ==5.6.2,
|
|
||||||
any.quickcheck-arbitrary-adt ==0.3.1.0,
|
|
||||||
any.quickcheck-io ==0.2.0,
|
|
||||||
any.random ==1.2.1.1,
|
|
||||||
any.recursion-schemes ==5.2.2.5,
|
|
||||||
recursion-schemes +template-haskell,
|
|
||||||
any.regex-base ==0.94.0.2,
|
|
||||||
any.regex-posix ==0.96.0.1,
|
|
||||||
regex-posix -_regex-posix-clib,
|
|
||||||
any.resourcet ==1.2.6,
|
|
||||||
any.retry ==0.9.3.1,
|
|
||||||
retry -lib-werror,
|
|
||||||
any.rts ==1.0.2,
|
|
||||||
any.safe ==0.3.21,
|
|
||||||
any.safe-exceptions ==0.1.7.4,
|
|
||||||
any.scientific ==0.3.7.0,
|
|
||||||
scientific -bytestring-builder -integer-simple,
|
|
||||||
any.semialign ==1.3,
|
|
||||||
semialign +semigroupoids,
|
|
||||||
any.semigroupoids ==6.0.0.1,
|
|
||||||
semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers,
|
|
||||||
any.setenv ==0.1.1.3,
|
|
||||||
any.split ==0.2.5,
|
|
||||||
any.splitmix ==0.1.0.5,
|
|
||||||
splitmix -optimised-mixer,
|
|
||||||
any.stm ==2.5.0.0,
|
|
||||||
any.streaming-commons ==0.2.2.6,
|
|
||||||
streaming-commons -use-bytestring-builder,
|
|
||||||
any.streamly ==0.8.3,
|
|
||||||
streamly -debug -dev -fusion-plugin -has-llvm -inspection -limit-build-mem -no-fusion +opt -streamk -streamly-core -use-c-malloc +use-unliftio,
|
|
||||||
any.strict ==0.5,
|
|
||||||
any.strict-base ==0.4.0.0,
|
|
||||||
any.tagged ==0.8.8,
|
|
||||||
tagged +deepseq +transformers,
|
|
||||||
any.tagsoup ==0.14.8,
|
|
||||||
any.tar ==0.6.0.0,
|
|
||||||
any.tasty ==1.5,
|
|
||||||
tasty +unix,
|
|
||||||
any.tasty-hunit ==0.10.1,
|
|
||||||
any.template-haskell ==2.17.0.0,
|
|
||||||
any.temporary ==1.3,
|
|
||||||
any.terminal-progress-bar ==0.4.2,
|
|
||||||
any.terminal-size ==0.3.4,
|
|
||||||
any.terminfo ==0.4.1.5,
|
|
||||||
any.text ==2.0.2,
|
|
||||||
text -developer +simdutf,
|
|
||||||
any.text-binary ==0.2.1.1,
|
|
||||||
any.text-short ==0.1.5,
|
|
||||||
text-short -asserts,
|
|
||||||
any.text-zipper ==0.13,
|
|
||||||
any.tf-random ==0.5,
|
|
||||||
any.th-abstraction ==0.5.0.0,
|
|
||||||
any.th-compat ==0.1.4,
|
|
||||||
any.th-lift ==0.8.4,
|
|
||||||
any.th-lift-instances ==0.1.20,
|
|
||||||
any.these ==1.2,
|
|
||||||
any.time ==1.9.3,
|
|
||||||
any.time-compat ==1.9.6.1,
|
|
||||||
time-compat -old-locale,
|
|
||||||
any.transformers ==0.5.6.2,
|
|
||||||
any.transformers-base ==0.4.6,
|
|
||||||
transformers-base +orphaninstances,
|
|
||||||
any.transformers-compat ==0.7.2,
|
|
||||||
transformers-compat -five +five-three -four +generic-deriving +mtl -three -two,
|
|
||||||
any.typed-process ==0.2.11.1,
|
|
||||||
any.unicode-data ==0.3.1,
|
|
||||||
unicode-data -ucd2haskell,
|
|
||||||
any.unix ==2.7.2.2,
|
|
||||||
any.unix-bytestring ==0.3.7.8,
|
|
||||||
any.unix-compat ==0.7.1,
|
|
||||||
unix-compat -old-time,
|
|
||||||
any.unliftio-core ==0.2.1.0,
|
|
||||||
any.unordered-containers ==0.2.20,
|
|
||||||
unordered-containers -debug,
|
|
||||||
any.uri-bytestring ==0.3.3.1,
|
|
||||||
uri-bytestring -lib-werror,
|
|
||||||
any.utf8-string ==1.0.2,
|
|
||||||
any.uuid-types ==1.0.5.1,
|
|
||||||
any.vector ==0.13.1.0,
|
|
||||||
vector +boundschecks -internalchecks -unsafechecks -wall,
|
|
||||||
any.vector-algorithms ==0.9.0.1,
|
|
||||||
vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks,
|
|
||||||
any.vector-binary-instances ==0.2.5.2,
|
|
||||||
any.vector-stream ==0.1.0.1,
|
|
||||||
any.versions ==6.0.4,
|
|
||||||
any.vty ==6.0,
|
|
||||||
any.vty-crossplatform ==0.2.0.0,
|
|
||||||
vty-crossplatform -demos,
|
|
||||||
any.vty-unix ==0.1.0.0,
|
|
||||||
any.witherable ==0.4.2,
|
|
||||||
any.word-wrap ==0.5,
|
|
||||||
any.word8 ==0.1.3,
|
|
||||||
any.xor ==0.0.1.2,
|
|
||||||
any.yaml-streamly ==0.12.4,
|
|
||||||
yaml-streamly +no-examples +no-exe,
|
|
||||||
any.zip ==2.0.0,
|
|
||||||
zip -dev -disable-bzip2 -disable-zstd,
|
|
||||||
any.zlib ==0.6.3.0,
|
|
||||||
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config,
|
|
||||||
any.zlib-bindings ==0.1.1.5,
|
|
||||||
any.zstd ==0.1.3.0,
|
|
||||||
zstd +standalone
|
|
||||||
index-state: hackage.haskell.org 2024-01-19T19:48:54Z
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
packages: ./ghcup.cabal
|
|
||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
|
||||||
|
|
||||||
if impl(ghc < 9.0)
|
|
||||||
package ghcup
|
|
||||||
flags: +tui -tar
|
|
||||||
else
|
|
||||||
package ghcup
|
|
||||||
flags: +tui +tar
|
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
|
||||||
any.aeson >= 2.0.1.0
|
|
||||||
|
|
||||||
if os(mingw32)
|
|
||||||
if impl(ghc >= 9.4)
|
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
package libarchive
|
|
||||||
flags: -system-libarchive
|
|
||||||
|
|
||||||
package aeson-pretty
|
|
||||||
flags: +lib-only
|
|
||||||
|
|
||||||
package cabal-plan
|
|
||||||
flags: -exe
|
|
||||||
|
|
||||||
package aeson
|
|
||||||
flags: +ordered-keymap
|
|
||||||
|
|
||||||
package streamly
|
|
||||||
flags: +use-unliftio
|
|
||||||
|
|
||||||
package *
|
|
||||||
test-show-details: direct
|
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
|
|
||||||
with-compiler: ghc-9.2.8
|
|
||||||
@@ -1,269 +0,0 @@
|
|||||||
active-repositories: hackage.haskell.org:merge
|
|
||||||
constraints: any.Cabal ==3.6.3.0,
|
|
||||||
Cabal -bundled-binary-generic,
|
|
||||||
any.Cabal-syntax ==3.10.2.0,
|
|
||||||
any.HUnit ==1.6.2.0,
|
|
||||||
any.HsOpenSSL ==0.11.7.6,
|
|
||||||
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
|
||||||
any.OneTuple ==0.4.1.1,
|
|
||||||
any.QuickCheck ==2.14.3,
|
|
||||||
QuickCheck -old-random +templatehaskell,
|
|
||||||
any.StateVar ==1.2.2,
|
|
||||||
any.abstract-deque ==0.3,
|
|
||||||
abstract-deque -usecas,
|
|
||||||
any.aeson ==2.1.2.1,
|
|
||||||
aeson -cffi +ordered-keymap,
|
|
||||||
any.aeson-pretty ==0.8.10,
|
|
||||||
aeson-pretty +lib-only,
|
|
||||||
any.alex ==3.5.0.0,
|
|
||||||
any.ansi-terminal ==1.0.2,
|
|
||||||
ansi-terminal -example,
|
|
||||||
any.ansi-terminal-types ==0.11.5,
|
|
||||||
any.ansi-wl-pprint ==0.6.9,
|
|
||||||
ansi-wl-pprint -example,
|
|
||||||
any.array ==0.5.4.0,
|
|
||||||
any.assoc ==1.1,
|
|
||||||
assoc +tagged,
|
|
||||||
any.async ==2.2.5,
|
|
||||||
async -bench,
|
|
||||||
any.atomic-primops ==0.8.4,
|
|
||||||
atomic-primops -debug,
|
|
||||||
any.attoparsec ==0.14.4,
|
|
||||||
attoparsec -developer,
|
|
||||||
any.base ==4.16.4.0,
|
|
||||||
any.base-compat ==0.13.1,
|
|
||||||
any.base-compat-batteries ==0.13.1,
|
|
||||||
any.base-orphans ==0.9.1,
|
|
||||||
any.base16-bytestring ==1.0.2.0,
|
|
||||||
any.base64-bytestring ==1.2.1.0,
|
|
||||||
any.bifunctors ==5.6.1,
|
|
||||||
bifunctors +tagged,
|
|
||||||
any.bimap ==0.5.0,
|
|
||||||
any.binary ==0.8.9.0,
|
|
||||||
any.binary-instances ==1.0.4,
|
|
||||||
any.binary-orphans ==1.0.4.1,
|
|
||||||
any.bindings-DSL ==1.0.25,
|
|
||||||
any.bitvec ==1.1.5.0,
|
|
||||||
bitvec +simd,
|
|
||||||
any.blaze-builder ==0.4.2.3,
|
|
||||||
any.brick ==2.1.1,
|
|
||||||
brick -demos,
|
|
||||||
any.bytestring ==0.11.4.0,
|
|
||||||
any.bz2 ==1.0.1.0,
|
|
||||||
bz2 -cross +with-bzlib,
|
|
||||||
any.bzlib-conduit ==0.3.0.2,
|
|
||||||
any.c2hs ==0.28.8,
|
|
||||||
c2hs +base3 -regression,
|
|
||||||
any.cabal-install-parsers ==0.6.1,
|
|
||||||
any.cabal-plan ==0.7.3.0,
|
|
||||||
cabal-plan -_ -exe -license-report,
|
|
||||||
any.call-stack ==0.4.0,
|
|
||||||
any.case-insensitive ==1.2.1.0,
|
|
||||||
any.casing ==0.1.4.1,
|
|
||||||
any.cereal ==0.5.8.3,
|
|
||||||
cereal -bytestring-builder,
|
|
||||||
any.colour ==2.3.6,
|
|
||||||
any.comonad ==5.0.8,
|
|
||||||
comonad +containers +distributive +indexed-traversable,
|
|
||||||
any.conduit ==1.3.5,
|
|
||||||
any.conduit-extra ==1.3.6,
|
|
||||||
any.conduit-zstd ==0.0.2.0,
|
|
||||||
any.config-ini ==0.2.7.0,
|
|
||||||
config-ini -enable-doctests,
|
|
||||||
any.containers ==0.6.5.1,
|
|
||||||
any.contravariant ==1.5.5,
|
|
||||||
contravariant +semigroups +statevar +tagged,
|
|
||||||
any.cryptohash-sha1 ==0.11.101.0,
|
|
||||||
any.cryptohash-sha256 ==0.11.102.1,
|
|
||||||
cryptohash-sha256 -exe +use-cbits,
|
|
||||||
any.data-array-byte ==0.1.0.1,
|
|
||||||
any.data-clist ==0.2,
|
|
||||||
any.data-default-class ==0.1.2.0,
|
|
||||||
any.data-fix ==0.3.2,
|
|
||||||
any.deepseq ==1.4.6.1,
|
|
||||||
any.digest ==0.0.2.0,
|
|
||||||
digest -have_arm64_crc32c -have_builtin_prefetch -have_mm_prefetch -have_sse42 -have_strong_getauxval -have_weak_getauxval +pkg-config,
|
|
||||||
any.directory ==1.3.6.2,
|
|
||||||
any.disk-free-space ==0.1.0.1,
|
|
||||||
any.distributive ==0.6.2.1,
|
|
||||||
distributive +semigroups +tagged,
|
|
||||||
any.dlist ==1.0,
|
|
||||||
dlist -werror,
|
|
||||||
any.exceptions ==0.10.4,
|
|
||||||
any.file-uri ==0.1.0.0,
|
|
||||||
any.filepath ==1.4.2.2,
|
|
||||||
any.foldable1-classes-compat ==0.1,
|
|
||||||
foldable1-classes-compat +tagged,
|
|
||||||
any.free ==5.2,
|
|
||||||
any.fusion-plugin-types ==0.1.0,
|
|
||||||
any.generic-arbitrary ==0.2.2,
|
|
||||||
any.generically ==0.1.1,
|
|
||||||
any.ghc-bignum ==1.2,
|
|
||||||
any.ghc-boot-th ==9.2.8,
|
|
||||||
any.ghc-byteorder ==4.11.0.0.10,
|
|
||||||
any.ghc-prim ==0.8.0,
|
|
||||||
any.happy ==1.20.1.1,
|
|
||||||
any.hashable ==1.4.3.0,
|
|
||||||
hashable +integer-gmp -random-initial-seed,
|
|
||||||
any.haskell-lexer ==1.1.1,
|
|
||||||
any.haskus-utils-data ==1.4,
|
|
||||||
any.haskus-utils-types ==1.5.1,
|
|
||||||
any.haskus-utils-variant ==3.3,
|
|
||||||
any.heaps ==0.4,
|
|
||||||
any.hsc2hs ==0.68.10,
|
|
||||||
hsc2hs -in-ghc-tree,
|
|
||||||
any.hspec ==2.10.10,
|
|
||||||
any.hspec-core ==2.10.10,
|
|
||||||
any.hspec-discover ==2.10.10,
|
|
||||||
any.hspec-expectations ==0.8.2,
|
|
||||||
any.hspec-golden-aeson ==0.9.0.0,
|
|
||||||
any.http-io-streams ==0.1.6.3,
|
|
||||||
http-io-streams -brotli +fast-xor,
|
|
||||||
any.indexed-profunctors ==0.1.1.1,
|
|
||||||
any.indexed-traversable ==0.1.3,
|
|
||||||
any.indexed-traversable-instances ==0.1.1.2,
|
|
||||||
any.integer-logarithms ==1.0.3.1,
|
|
||||||
integer-logarithms -check-bounds +integer-gmp,
|
|
||||||
any.io-streams ==1.5.2.2,
|
|
||||||
io-streams +network -nointeractivetests +zlib,
|
|
||||||
any.language-c ==0.9.2,
|
|
||||||
language-c -allwarnings +iecfpextension +usebytestrings,
|
|
||||||
any.libyaml-streamly ==0.2.2,
|
|
||||||
libyaml-streamly -no-unicode -system-libyaml,
|
|
||||||
any.lockfree-queue ==0.2.4,
|
|
||||||
any.lukko ==0.1.1.3,
|
|
||||||
lukko +ofd-locking,
|
|
||||||
any.lzma-static ==5.2.5.5,
|
|
||||||
any.megaparsec ==9.2.2,
|
|
||||||
megaparsec -dev,
|
|
||||||
any.microlens ==0.4.13.1,
|
|
||||||
any.microlens-mtl ==0.2.0.3,
|
|
||||||
any.microlens-th ==0.4.3.14,
|
|
||||||
any.monad-control ==1.0.3.1,
|
|
||||||
any.mono-traversable ==1.0.15.3,
|
|
||||||
any.mtl ==2.2.2,
|
|
||||||
any.mtl-compat ==0.2.2,
|
|
||||||
mtl-compat -two-point-one -two-point-two,
|
|
||||||
any.network ==3.1.4.0,
|
|
||||||
network -devel,
|
|
||||||
any.network-uri ==2.6.4.2,
|
|
||||||
any.openssl-streams ==1.2.3.0,
|
|
||||||
any.optics ==0.4.2.1,
|
|
||||||
any.optics-core ==0.4.1.1,
|
|
||||||
optics-core -explicit-generic-labels,
|
|
||||||
any.optics-extra ==0.4.2.1,
|
|
||||||
any.optics-th ==0.4.1,
|
|
||||||
any.optparse-applicative ==0.17.1.0,
|
|
||||||
optparse-applicative +process,
|
|
||||||
any.os-release ==1.0.2.1,
|
|
||||||
os-release -devel,
|
|
||||||
any.parsec ==3.1.17.0,
|
|
||||||
any.parser-combinators ==1.3.0,
|
|
||||||
parser-combinators -dev,
|
|
||||||
any.pretty ==1.1.3.6,
|
|
||||||
any.pretty-terminal ==0.1.0.0,
|
|
||||||
any.primitive ==0.8.0.0,
|
|
||||||
any.process ==1.6.16.0,
|
|
||||||
any.profunctors ==5.6.2,
|
|
||||||
any.quickcheck-arbitrary-adt ==0.3.1.0,
|
|
||||||
any.quickcheck-io ==0.2.0,
|
|
||||||
any.random ==1.2.1.1,
|
|
||||||
any.recursion-schemes ==5.2.2.5,
|
|
||||||
recursion-schemes +template-haskell,
|
|
||||||
any.regex-base ==0.94.0.2,
|
|
||||||
any.regex-posix ==0.96.0.1,
|
|
||||||
regex-posix -_regex-posix-clib,
|
|
||||||
any.resourcet ==1.2.6,
|
|
||||||
any.retry ==0.9.3.1,
|
|
||||||
retry -lib-werror,
|
|
||||||
any.rts ==1.0.2,
|
|
||||||
any.safe ==0.3.21,
|
|
||||||
any.safe-exceptions ==0.1.7.4,
|
|
||||||
any.scientific ==0.3.7.0,
|
|
||||||
scientific -bytestring-builder -integer-simple,
|
|
||||||
any.semialign ==1.3,
|
|
||||||
semialign +semigroupoids,
|
|
||||||
any.semigroupoids ==6.0.0.1,
|
|
||||||
semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers,
|
|
||||||
any.setenv ==0.1.1.3,
|
|
||||||
any.split ==0.2.5,
|
|
||||||
any.splitmix ==0.1.0.5,
|
|
||||||
splitmix -optimised-mixer,
|
|
||||||
any.stm ==2.5.0.2,
|
|
||||||
any.streaming-commons ==0.2.2.6,
|
|
||||||
streaming-commons -use-bytestring-builder,
|
|
||||||
any.streamly ==0.8.3,
|
|
||||||
streamly -debug -dev -fusion-plugin -has-llvm -inspection -limit-build-mem -no-fusion +opt -streamk -streamly-core -use-c-malloc +use-unliftio,
|
|
||||||
any.strict ==0.5,
|
|
||||||
any.strict-base ==0.4.0.0,
|
|
||||||
any.tagged ==0.8.8,
|
|
||||||
tagged +deepseq +transformers,
|
|
||||||
any.tagsoup ==0.14.8,
|
|
||||||
any.tar ==0.6.0.0,
|
|
||||||
any.tasty ==1.5,
|
|
||||||
tasty +unix,
|
|
||||||
any.tasty-hunit ==0.10.1,
|
|
||||||
any.template-haskell ==2.18.0.0,
|
|
||||||
any.temporary ==1.3,
|
|
||||||
any.terminal-progress-bar ==0.4.2,
|
|
||||||
any.terminal-size ==0.3.4,
|
|
||||||
any.terminfo ==0.4.1.5,
|
|
||||||
any.text ==2.0.2,
|
|
||||||
text -developer +simdutf,
|
|
||||||
any.text-binary ==0.2.1.1,
|
|
||||||
any.text-short ==0.1.5,
|
|
||||||
text-short -asserts,
|
|
||||||
any.text-zipper ==0.13,
|
|
||||||
any.tf-random ==0.5,
|
|
||||||
any.th-abstraction ==0.5.0.0,
|
|
||||||
any.th-compat ==0.1.4,
|
|
||||||
any.th-lift ==0.8.4,
|
|
||||||
any.th-lift-instances ==0.1.20,
|
|
||||||
any.these ==1.2,
|
|
||||||
any.time ==1.11.1.1,
|
|
||||||
any.time-compat ==1.9.6.1,
|
|
||||||
time-compat -old-locale,
|
|
||||||
any.transformers ==0.5.6.2,
|
|
||||||
any.transformers-base ==0.4.6,
|
|
||||||
transformers-base +orphaninstances,
|
|
||||||
any.transformers-compat ==0.7.2,
|
|
||||||
transformers-compat -five +five-three -four +generic-deriving +mtl -three -two,
|
|
||||||
any.typed-process ==0.2.11.1,
|
|
||||||
any.unicode-data ==0.3.1,
|
|
||||||
unicode-data -ucd2haskell,
|
|
||||||
any.unix ==2.7.2.2,
|
|
||||||
any.unix-bytestring ==0.3.7.8,
|
|
||||||
any.unix-compat ==0.7.1,
|
|
||||||
unix-compat -old-time,
|
|
||||||
any.unliftio-core ==0.2.1.0,
|
|
||||||
any.unordered-containers ==0.2.20,
|
|
||||||
unordered-containers -debug,
|
|
||||||
any.uri-bytestring ==0.3.3.1,
|
|
||||||
uri-bytestring -lib-werror,
|
|
||||||
any.utf8-string ==1.0.2,
|
|
||||||
any.uuid-types ==1.0.5.1,
|
|
||||||
any.vector ==0.13.1.0,
|
|
||||||
vector +boundschecks -internalchecks -unsafechecks -wall,
|
|
||||||
any.vector-algorithms ==0.9.0.1,
|
|
||||||
vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks,
|
|
||||||
any.vector-binary-instances ==0.2.5.2,
|
|
||||||
any.vector-stream ==0.1.0.1,
|
|
||||||
any.versions ==6.0.4,
|
|
||||||
any.vty ==6.0,
|
|
||||||
any.vty-crossplatform ==0.2.0.0,
|
|
||||||
vty-crossplatform -demos,
|
|
||||||
any.vty-unix ==0.1.0.0,
|
|
||||||
any.witherable ==0.4.2,
|
|
||||||
any.word-wrap ==0.5,
|
|
||||||
any.word8 ==0.1.3,
|
|
||||||
any.xor ==0.0.1.2,
|
|
||||||
any.yaml-streamly ==0.12.4,
|
|
||||||
yaml-streamly +no-examples +no-exe,
|
|
||||||
any.zip ==2.0.0,
|
|
||||||
zip -dev -disable-bzip2 -disable-zstd,
|
|
||||||
any.zlib ==0.6.3.0,
|
|
||||||
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config,
|
|
||||||
any.zlib-bindings ==0.1.1.5,
|
|
||||||
any.zstd ==0.1.3.0,
|
|
||||||
zstd +standalone
|
|
||||||
index-state: hackage.haskell.org 2024-01-19T19:48:54Z
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
packages: ./ghcup.cabal
|
|
||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
|
||||||
|
|
||||||
if impl(ghc < 9.0)
|
|
||||||
package ghcup
|
|
||||||
flags: +tui -tar
|
|
||||||
else
|
|
||||||
package ghcup
|
|
||||||
flags: +tui +tar
|
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
|
||||||
any.aeson >= 2.0.1.0
|
|
||||||
|
|
||||||
if os(mingw32)
|
|
||||||
if impl(ghc >= 9.4)
|
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
package libarchive
|
|
||||||
flags: -system-libarchive
|
|
||||||
|
|
||||||
package aeson-pretty
|
|
||||||
flags: +lib-only
|
|
||||||
|
|
||||||
package cabal-plan
|
|
||||||
flags: -exe
|
|
||||||
|
|
||||||
package aeson
|
|
||||||
flags: +ordered-keymap
|
|
||||||
|
|
||||||
package streamly
|
|
||||||
flags: +use-unliftio
|
|
||||||
|
|
||||||
package *
|
|
||||||
test-show-details: direct
|
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
|
|
||||||
with-compiler: ghc-9.4.8
|
|
||||||
@@ -1,267 +0,0 @@
|
|||||||
active-repositories: hackage.haskell.org:merge
|
|
||||||
constraints: any.Cabal ==3.6.3.0 || ==3.8.1.0,
|
|
||||||
Cabal -bundled-binary-generic,
|
|
||||||
any.Cabal-syntax ==3.8.1.0 || ==3.10.2.0,
|
|
||||||
any.HUnit ==1.6.2.0,
|
|
||||||
any.HsOpenSSL ==0.11.7.6,
|
|
||||||
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
|
||||||
any.OneTuple ==0.4.1.1,
|
|
||||||
any.QuickCheck ==2.14.3,
|
|
||||||
QuickCheck -old-random +templatehaskell,
|
|
||||||
any.StateVar ==1.2.2,
|
|
||||||
any.abstract-deque ==0.3,
|
|
||||||
abstract-deque -usecas,
|
|
||||||
any.aeson ==2.1.2.1,
|
|
||||||
aeson -cffi +ordered-keymap,
|
|
||||||
any.aeson-pretty ==0.8.10,
|
|
||||||
aeson-pretty +lib-only,
|
|
||||||
any.alex ==3.5.0.0,
|
|
||||||
any.ansi-terminal ==1.0.2,
|
|
||||||
ansi-terminal -example,
|
|
||||||
any.ansi-terminal-types ==0.11.5,
|
|
||||||
any.ansi-wl-pprint ==0.6.9,
|
|
||||||
ansi-wl-pprint -example,
|
|
||||||
any.array ==0.5.4.0,
|
|
||||||
any.assoc ==1.1,
|
|
||||||
assoc +tagged,
|
|
||||||
any.async ==2.2.5,
|
|
||||||
async -bench,
|
|
||||||
any.atomic-primops ==0.8.4,
|
|
||||||
atomic-primops -debug,
|
|
||||||
any.attoparsec ==0.14.4,
|
|
||||||
attoparsec -developer,
|
|
||||||
any.base ==4.17.2.1,
|
|
||||||
any.base-compat ==0.13.1,
|
|
||||||
any.base-compat-batteries ==0.13.1,
|
|
||||||
any.base-orphans ==0.9.1,
|
|
||||||
any.base16-bytestring ==1.0.2.0,
|
|
||||||
any.base64-bytestring ==1.2.1.0,
|
|
||||||
any.bifunctors ==5.6.1,
|
|
||||||
bifunctors +tagged,
|
|
||||||
any.bimap ==0.5.0,
|
|
||||||
any.binary ==0.8.9.1,
|
|
||||||
any.binary-instances ==1.0.4,
|
|
||||||
any.binary-orphans ==1.0.4.1,
|
|
||||||
any.bindings-DSL ==1.0.25,
|
|
||||||
any.bitvec ==1.1.5.0,
|
|
||||||
bitvec +simd,
|
|
||||||
any.blaze-builder ==0.4.2.3,
|
|
||||||
any.brick ==2.1.1,
|
|
||||||
brick -demos,
|
|
||||||
any.bytestring ==0.11.5.3,
|
|
||||||
any.bz2 ==1.0.1.0,
|
|
||||||
bz2 -cross +with-bzlib,
|
|
||||||
any.bzlib-conduit ==0.3.0.2,
|
|
||||||
any.c2hs ==0.28.8,
|
|
||||||
c2hs +base3 -regression,
|
|
||||||
any.cabal-install-parsers ==0.6.1,
|
|
||||||
any.cabal-plan ==0.7.3.0,
|
|
||||||
cabal-plan -_ -exe -license-report,
|
|
||||||
any.call-stack ==0.4.0,
|
|
||||||
any.case-insensitive ==1.2.1.0,
|
|
||||||
any.casing ==0.1.4.1,
|
|
||||||
any.cereal ==0.5.8.3,
|
|
||||||
cereal -bytestring-builder,
|
|
||||||
any.colour ==2.3.6,
|
|
||||||
any.comonad ==5.0.8,
|
|
||||||
comonad +containers +distributive +indexed-traversable,
|
|
||||||
any.conduit ==1.3.5,
|
|
||||||
any.conduit-extra ==1.3.6,
|
|
||||||
any.conduit-zstd ==0.0.2.0,
|
|
||||||
any.config-ini ==0.2.7.0,
|
|
||||||
config-ini -enable-doctests,
|
|
||||||
any.containers ==0.6.7,
|
|
||||||
any.contravariant ==1.5.5,
|
|
||||||
contravariant +semigroups +statevar +tagged,
|
|
||||||
any.cryptohash-sha1 ==0.11.101.0,
|
|
||||||
any.cryptohash-sha256 ==0.11.102.1,
|
|
||||||
cryptohash-sha256 -exe +use-cbits,
|
|
||||||
any.data-clist ==0.2,
|
|
||||||
any.data-default-class ==0.1.2.0,
|
|
||||||
any.data-fix ==0.3.2,
|
|
||||||
any.deepseq ==1.4.8.0,
|
|
||||||
any.digest ==0.0.2.0,
|
|
||||||
digest -have_arm64_crc32c -have_builtin_prefetch -have_mm_prefetch -have_sse42 -have_strong_getauxval -have_weak_getauxval +pkg-config,
|
|
||||||
any.directory ==1.3.7.1,
|
|
||||||
any.disk-free-space ==0.1.0.1,
|
|
||||||
any.distributive ==0.6.2.1,
|
|
||||||
distributive +semigroups +tagged,
|
|
||||||
any.dlist ==1.0,
|
|
||||||
dlist -werror,
|
|
||||||
any.exceptions ==0.10.5,
|
|
||||||
any.file-uri ==0.1.0.0,
|
|
||||||
any.filepath ==1.4.2.2,
|
|
||||||
any.foldable1-classes-compat ==0.1,
|
|
||||||
foldable1-classes-compat +tagged,
|
|
||||||
any.free ==5.2,
|
|
||||||
any.fusion-plugin-types ==0.1.0,
|
|
||||||
any.generic-arbitrary ==0.2.2,
|
|
||||||
any.generically ==0.1.1,
|
|
||||||
any.ghc-bignum ==1.3,
|
|
||||||
any.ghc-boot-th ==9.4.8,
|
|
||||||
any.ghc-byteorder ==4.11.0.0.10,
|
|
||||||
any.ghc-prim ==0.9.1,
|
|
||||||
any.happy ==1.20.1.1,
|
|
||||||
any.hashable ==1.4.3.0,
|
|
||||||
hashable +integer-gmp -random-initial-seed,
|
|
||||||
any.haskell-lexer ==1.1.1,
|
|
||||||
any.haskus-utils-data ==1.4,
|
|
||||||
any.haskus-utils-types ==1.5.1,
|
|
||||||
any.haskus-utils-variant ==3.3,
|
|
||||||
any.heaps ==0.4,
|
|
||||||
any.hsc2hs ==0.68.10,
|
|
||||||
hsc2hs -in-ghc-tree,
|
|
||||||
any.hspec ==2.10.10,
|
|
||||||
any.hspec-core ==2.10.10,
|
|
||||||
any.hspec-discover ==2.10.10,
|
|
||||||
any.hspec-expectations ==0.8.2,
|
|
||||||
any.hspec-golden-aeson ==0.9.0.0,
|
|
||||||
any.http-io-streams ==0.1.6.3,
|
|
||||||
http-io-streams -brotli +fast-xor,
|
|
||||||
any.indexed-profunctors ==0.1.1.1,
|
|
||||||
any.indexed-traversable ==0.1.3,
|
|
||||||
any.indexed-traversable-instances ==0.1.1.2,
|
|
||||||
any.integer-logarithms ==1.0.3.1,
|
|
||||||
integer-logarithms -check-bounds +integer-gmp,
|
|
||||||
any.io-streams ==1.5.2.2,
|
|
||||||
io-streams +network -nointeractivetests +zlib,
|
|
||||||
any.language-c ==0.9.2,
|
|
||||||
language-c -allwarnings +iecfpextension +usebytestrings,
|
|
||||||
any.libyaml-streamly ==0.2.2,
|
|
||||||
libyaml-streamly -no-unicode -system-libyaml,
|
|
||||||
any.lockfree-queue ==0.2.4,
|
|
||||||
any.lukko ==0.1.1.3,
|
|
||||||
lukko +ofd-locking,
|
|
||||||
any.lzma-static ==5.2.5.5,
|
|
||||||
any.megaparsec ==9.2.2,
|
|
||||||
megaparsec -dev,
|
|
||||||
any.microlens ==0.4.13.1,
|
|
||||||
any.microlens-mtl ==0.2.0.3,
|
|
||||||
any.microlens-th ==0.4.3.14,
|
|
||||||
any.monad-control ==1.0.3.1,
|
|
||||||
any.mono-traversable ==1.0.15.3,
|
|
||||||
any.mtl ==2.2.2,
|
|
||||||
any.mtl-compat ==0.2.2,
|
|
||||||
mtl-compat -two-point-one -two-point-two,
|
|
||||||
any.network ==3.1.4.0,
|
|
||||||
network -devel,
|
|
||||||
any.network-uri ==2.6.4.2,
|
|
||||||
any.openssl-streams ==1.2.3.0,
|
|
||||||
any.optics ==0.4.2.1,
|
|
||||||
any.optics-core ==0.4.1.1,
|
|
||||||
optics-core -explicit-generic-labels,
|
|
||||||
any.optics-extra ==0.4.2.1,
|
|
||||||
any.optics-th ==0.4.1,
|
|
||||||
any.optparse-applicative ==0.17.1.0,
|
|
||||||
optparse-applicative +process,
|
|
||||||
any.os-release ==1.0.2.1,
|
|
||||||
os-release -devel,
|
|
||||||
any.parsec ==3.1.16.1,
|
|
||||||
any.parser-combinators ==1.3.0,
|
|
||||||
parser-combinators -dev,
|
|
||||||
any.pretty ==1.1.3.6,
|
|
||||||
any.pretty-terminal ==0.1.0.0,
|
|
||||||
any.primitive ==0.8.0.0,
|
|
||||||
any.process ==1.6.18.0,
|
|
||||||
any.profunctors ==5.6.2,
|
|
||||||
any.quickcheck-arbitrary-adt ==0.3.1.0,
|
|
||||||
any.quickcheck-io ==0.2.0,
|
|
||||||
any.random ==1.2.1.1,
|
|
||||||
any.recursion-schemes ==5.2.2.5,
|
|
||||||
recursion-schemes +template-haskell,
|
|
||||||
any.regex-base ==0.94.0.2,
|
|
||||||
any.regex-posix ==0.96.0.1,
|
|
||||||
regex-posix -_regex-posix-clib,
|
|
||||||
any.resourcet ==1.2.6,
|
|
||||||
any.retry ==0.9.3.1,
|
|
||||||
retry -lib-werror,
|
|
||||||
any.rts ==1.0.2,
|
|
||||||
any.safe ==0.3.21,
|
|
||||||
any.safe-exceptions ==0.1.7.4,
|
|
||||||
any.scientific ==0.3.7.0,
|
|
||||||
scientific -bytestring-builder -integer-simple,
|
|
||||||
any.semialign ==1.3,
|
|
||||||
semialign +semigroupoids,
|
|
||||||
any.semigroupoids ==6.0.0.1,
|
|
||||||
semigroupoids +comonad +containers +contravariant +distributive +tagged +unordered-containers,
|
|
||||||
any.setenv ==0.1.1.3,
|
|
||||||
any.split ==0.2.5,
|
|
||||||
any.splitmix ==0.1.0.5,
|
|
||||||
splitmix -optimised-mixer,
|
|
||||||
any.stm ==2.5.1.0,
|
|
||||||
any.streaming-commons ==0.2.2.6,
|
|
||||||
streaming-commons -use-bytestring-builder,
|
|
||||||
any.streamly ==0.8.3,
|
|
||||||
streamly -debug -dev -fusion-plugin -has-llvm -inspection -limit-build-mem -no-fusion +opt -streamk -streamly-core -use-c-malloc +use-unliftio,
|
|
||||||
any.strict ==0.5,
|
|
||||||
any.strict-base ==0.4.0.0,
|
|
||||||
any.tagged ==0.8.8,
|
|
||||||
tagged +deepseq +transformers,
|
|
||||||
any.tagsoup ==0.14.8,
|
|
||||||
any.tar ==0.6.0.0,
|
|
||||||
any.tasty ==1.5,
|
|
||||||
tasty +unix,
|
|
||||||
any.tasty-hunit ==0.10.1,
|
|
||||||
any.template-haskell ==2.19.0.0,
|
|
||||||
any.temporary ==1.3,
|
|
||||||
any.terminal-progress-bar ==0.4.2,
|
|
||||||
any.terminal-size ==0.3.4,
|
|
||||||
any.terminfo ==0.4.1.5,
|
|
||||||
any.text ==2.0.2,
|
|
||||||
any.text-binary ==0.2.1.1,
|
|
||||||
any.text-short ==0.1.5,
|
|
||||||
text-short -asserts,
|
|
||||||
any.text-zipper ==0.13,
|
|
||||||
any.tf-random ==0.5,
|
|
||||||
any.th-abstraction ==0.5.0.0,
|
|
||||||
any.th-compat ==0.1.4,
|
|
||||||
any.th-lift ==0.8.4,
|
|
||||||
any.th-lift-instances ==0.1.20,
|
|
||||||
any.these ==1.2,
|
|
||||||
any.time ==1.11.1.2 || ==1.12.2,
|
|
||||||
any.time-compat ==1.9.6.1,
|
|
||||||
time-compat -old-locale,
|
|
||||||
any.transformers ==0.5.6.2,
|
|
||||||
any.transformers-base ==0.4.6,
|
|
||||||
transformers-base +orphaninstances,
|
|
||||||
any.transformers-compat ==0.7.2,
|
|
||||||
transformers-compat -five +five-three -four +generic-deriving +mtl -three -two,
|
|
||||||
any.typed-process ==0.2.11.1,
|
|
||||||
any.unicode-data ==0.3.1,
|
|
||||||
unicode-data -ucd2haskell,
|
|
||||||
any.unix ==2.7.3,
|
|
||||||
any.unix-bytestring ==0.3.7.8,
|
|
||||||
any.unix-compat ==0.7.1,
|
|
||||||
unix-compat -old-time,
|
|
||||||
any.unliftio-core ==0.2.1.0,
|
|
||||||
any.unordered-containers ==0.2.20,
|
|
||||||
unordered-containers -debug,
|
|
||||||
any.uri-bytestring ==0.3.3.1,
|
|
||||||
uri-bytestring -lib-werror,
|
|
||||||
any.utf8-string ==1.0.2,
|
|
||||||
any.uuid-types ==1.0.5.1,
|
|
||||||
any.vector ==0.13.1.0,
|
|
||||||
vector +boundschecks -internalchecks -unsafechecks -wall,
|
|
||||||
any.vector-algorithms ==0.9.0.1,
|
|
||||||
vector-algorithms +bench +boundschecks -internalchecks -llvm +properties -unsafechecks,
|
|
||||||
any.vector-binary-instances ==0.2.5.2,
|
|
||||||
any.vector-stream ==0.1.0.1,
|
|
||||||
any.versions ==6.0.4,
|
|
||||||
any.vty ==6.0,
|
|
||||||
any.vty-crossplatform ==0.2.0.0,
|
|
||||||
vty-crossplatform -demos,
|
|
||||||
any.vty-unix ==0.1.0.0,
|
|
||||||
any.witherable ==0.4.2,
|
|
||||||
any.word-wrap ==0.5,
|
|
||||||
any.word8 ==0.1.3,
|
|
||||||
any.xor ==0.0.1.2,
|
|
||||||
any.yaml-streamly ==0.12.4,
|
|
||||||
yaml-streamly +no-examples +no-exe,
|
|
||||||
any.zip ==2.0.0,
|
|
||||||
zip -dev -disable-bzip2 -disable-zstd,
|
|
||||||
any.zlib ==0.6.3.0,
|
|
||||||
zlib -bundled-c-zlib -non-blocking-ffi -pkg-config,
|
|
||||||
any.zlib-bindings ==0.1.1.5,
|
|
||||||
any.zstd ==0.1.3.0,
|
|
||||||
zstd +standalone
|
|
||||||
index-state: hackage.haskell.org 2024-01-19T19:48:54Z
|
|
||||||
@@ -2,35 +2,12 @@ packages: ./ghcup.cabal
|
|||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
optional-packages: ./vendored/*/*.cabal
|
||||||
|
|
||||||
if impl(ghc < 9.0)
|
package ghcup
|
||||||
package ghcup
|
flags: +tui
|
||||||
flags: +tui -tar
|
|
||||||
else
|
|
||||||
package ghcup
|
|
||||||
flags: +tui +tar
|
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
constraints: http-io-streams -brotli,
|
||||||
any.aeson >= 2.0.1.0
|
any.aeson >= 2.0.1.0
|
||||||
|
|
||||||
if os(mingw32)
|
|
||||||
if impl(ghc >= 9.4)
|
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
package libarchive
|
package libarchive
|
||||||
flags: -system-libarchive
|
flags: -system-libarchive
|
||||||
|
|
||||||
@@ -47,7 +24,4 @@ package streamly
|
|||||||
flags: +use-unliftio
|
flags: +use-unliftio
|
||||||
|
|
||||||
package *
|
package *
|
||||||
test-show-details: direct
|
test-show-details: direct
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
@@ -4,28 +4,30 @@ optional-packages: ./vendored/*/*.cabal
|
|||||||
|
|
||||||
optimization: 2
|
optimization: 2
|
||||||
|
|
||||||
package ghcup
|
|
||||||
flags: +tui -tar
|
|
||||||
|
|
||||||
if os(linux)
|
if os(linux)
|
||||||
|
package ghcup
|
||||||
|
flags: +tui
|
||||||
if arch(x86_64) || arch(i386)
|
if arch(x86_64) || arch(i386)
|
||||||
package *
|
package *
|
||||||
ghc-options: -split-sections -optl-static
|
ghc-options: -split-sections -optl-static
|
||||||
elif os(darwin)
|
elif os(darwin)
|
||||||
constraints: zlib +bundled-c-zlib,
|
constraints: zlib +bundled-c-zlib,
|
||||||
lzma +static
|
lzma +static
|
||||||
|
package ghcup
|
||||||
|
flags: +tui
|
||||||
elif os(mingw32)
|
elif os(mingw32)
|
||||||
constraints: zlib +bundled-c-zlib,
|
constraints: zlib +bundled-c-zlib,
|
||||||
lzma +static,
|
lzma +static,
|
||||||
text -simdutf,
|
text -simdutf
|
||||||
vty-windows >=0.1.0.3
|
package ghcup
|
||||||
if impl(ghc >= 9.4)
|
flags: -tui
|
||||||
constraints: language-c >= 0.9.3
|
|
||||||
elif os(freebsd)
|
elif os(freebsd)
|
||||||
constraints: zlib +bundled-c-zlib,
|
constraints: zlib +bundled-c-zlib,
|
||||||
zip +disable-zstd
|
zip +disable-zstd
|
||||||
package *
|
package *
|
||||||
ghc-options: -split-sections -pgmc clang++14
|
ghc-options: -split-sections -pgmc clang++14
|
||||||
|
package ghcup
|
||||||
|
flags: +tui
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
constraints: http-io-streams -brotli,
|
||||||
any.aeson >= 2.0.1.0,
|
any.aeson >= 2.0.1.0,
|
||||||
@@ -46,20 +48,3 @@ package aeson
|
|||||||
package streamly
|
package streamly
|
||||||
flags: +use-unliftio
|
flags: +use-unliftio
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/haskell/tar.git
|
|
||||||
tag: d94a988be4311b830149a9f8fc16739927e5fc1c
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/uri-bytestring.git
|
|
||||||
tag: 4fb5ed14b500c192e6e7a97f6b2b1eb478806001
|
|
||||||
|
|
||||||
source-repository-package
|
|
||||||
type: git
|
|
||||||
location: https://github.com/hasufell/versions.git
|
|
||||||
tag: 79e18fbc44fae3064d8957c550cc0229465db320
|
|
||||||
|
|
||||||
allow-newer: cabal-install-parsers:tar
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,6 @@ gpg-setting: GPGNone # GPGStrict | GPGLax | GPGNone
|
|||||||
# TUI key bindings,
|
# TUI key bindings,
|
||||||
# see https://hackage.haskell.org/package/vty-5.31/docs/Graphics-Vty-Input-Events.html#t:Key
|
# see https://hackage.haskell.org/package/vty-5.31/docs/Graphics-Vty-Input-Events.html#t:Key
|
||||||
# for possible values.
|
# for possible values.
|
||||||
# It's also possible to define key+modifier, e.g.:
|
|
||||||
# quit:
|
|
||||||
# Key:
|
|
||||||
# KChar: c
|
|
||||||
# Mods: [MCtrl]
|
|
||||||
key-bindings:
|
key-bindings:
|
||||||
up:
|
up:
|
||||||
KUp: []
|
KUp: []
|
||||||
@@ -51,48 +46,44 @@ meta-cache: 300 # in seconds
|
|||||||
# 2. Strict: fail hard
|
# 2. Strict: fail hard
|
||||||
meta-mode: Lax # Strict | Lax
|
meta-mode: Lax # Strict | Lax
|
||||||
|
|
||||||
# Where to get GHC/cabal/hls download info/versions from. This is a list that performs
|
# Where to get GHC/cabal/hls download info/versions from. For more detailed explanation
|
||||||
# union over tool versions, preferring the later entries.
|
# check the 'URLSource' type in the code.
|
||||||
url-source:
|
url-source:
|
||||||
## Use the internal download uri, this is the default
|
## Use the internal download uri, this is the default
|
||||||
- GHCupURL
|
GHCupURL: []
|
||||||
|
|
||||||
## Prefer stack supplied metadata (will still use GHCup metadata for versions not existing in stack metadata)
|
## Example 1: Read download info from this location instead
|
||||||
# - StackSetupURL
|
## Accepts file/http/https scheme
|
||||||
|
## Can also be an array of URLs or an array of 'Either GHCupInfo URL', in
|
||||||
|
## which case they are merged right-biased (overwriting duplicate versions).
|
||||||
|
# OwnSource: "file:///home/jule/git/ghcup-hs/ghcup-0.0.3.yaml"
|
||||||
|
|
||||||
## Add pre-release channel
|
## Example 2: Add custom tarballs to the default downloads, overwriting duplicate versions.
|
||||||
# - https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml
|
## Can also be an array of 'Either GHCupInfo URL', also see Example 3.
|
||||||
## Add nightly channel
|
# AddSource:
|
||||||
# - https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml
|
# Left:
|
||||||
## Add cross compiler channel
|
# globalTools: {}
|
||||||
# - https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-cross-0.0.8.yaml
|
# toolRequirements: {}
|
||||||
|
# ghcupDownloads:
|
||||||
|
# GHC:
|
||||||
|
# 9.10.2:
|
||||||
|
# viTags: []
|
||||||
|
# viArch:
|
||||||
|
# A_64:
|
||||||
|
# Linux_UnknownLinux:
|
||||||
|
# unknown_versioning:
|
||||||
|
# dlUri: https://downloads.haskell.org/~ghc/7.10.3/ghc-7.10.3-x86_64-deb8-linux.tar.bz2
|
||||||
|
# dlSubdir: ghc-7.10.3
|
||||||
|
# dlHash: 01cfbad8dff1e8b34a5fdca8caeaf843b56e36af919e29cd68870d2588563db5
|
||||||
|
|
||||||
## Use dwarf bindist for 9.4.7 for ghcup metadata
|
## Example 3: Add multiple custom download files to the default downloads via right-biased merge (overwriting duplicate
|
||||||
# - ghcup-info:
|
## versions).
|
||||||
# ghcupDownloads:
|
# AddSource:
|
||||||
# GHC:
|
# - Right: "file:///home/jule/git/ghcup-hs/ghcup-prereleases.yaml"
|
||||||
# 9.4.7:
|
# - Right: "file:///home/jule/git/ghcup-hs/ghcup-custom.yaml"
|
||||||
# viTags: []
|
|
||||||
# viArch:
|
|
||||||
# A_64:
|
|
||||||
# Linux_UnknownLinux:
|
|
||||||
# unknown_versioning:
|
|
||||||
# dlUri: https://downloads.haskell.org/ghc/9.4.7/ghc-9.4.7-x86_64-deb10-linux-dwarf.tar.xz
|
|
||||||
# dlSubdir:
|
|
||||||
# RegexDir: "ghc-.*"
|
|
||||||
# dlHash: b261b3438ba455e3cf757f9c8dc3a06fdc061ea8ec287a65b7809e25fe18bad4
|
|
||||||
|
|
||||||
## for stack metadata and the linux64-tinfo6 bindists, use static alpine for 9.8.1
|
|
||||||
# - setup-info:
|
|
||||||
# ghc:
|
|
||||||
# linux64-tinfo6:
|
|
||||||
# 9.8.1:
|
|
||||||
# url: "https://downloads.haskell.org/~ghc/9.8.1/ghc-9.8.1-x86_64-alpine3_12-linux-static.tar.xz"
|
|
||||||
# content-length: 229037440
|
|
||||||
# sha256: b48f3d3a508d0c140d1c801e04afc65e80c0d25e7e939a8a41edb387b26b81b3
|
|
||||||
|
|
||||||
# This is a way to override platform detection, e.g. when you're running
|
# This is a way to override platform detection, e.g. when you're running
|
||||||
# a Ubuntu derivative based on 18.04, you could do:
|
# a Ubuntu derivate based on 18.04, you could do:
|
||||||
#
|
#
|
||||||
# platform-override:
|
# platform-override:
|
||||||
# arch: A_64
|
# arch: A_64
|
||||||
|
|||||||
Submodule data/metadata updated: 7e1a50cfff...c88802ea8c
@@ -1,4 +1,4 @@
|
|||||||
FROM --platform=linux/i386 i386/alpine:3.16
|
FROM --platform=linux/i386 i386/alpine:3.12
|
||||||
|
|
||||||
ENV LANG C.UTF-8
|
ENV LANG C.UTF-8
|
||||||
|
|
||||||
@@ -37,8 +37,8 @@ RUN apk add --no-cache \
|
|||||||
xz-dev \
|
xz-dev \
|
||||||
ncurses-static
|
ncurses-static
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.20.0
|
ARG GHCUP_VERSION=0.1.19.4
|
||||||
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
|
|
||||||
# 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 && \
|
||||||
@@ -51,9 +51,9 @@ RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
|||||||
chmod +x /usr/bin/ghcup && \
|
chmod +x /usr/bin/ghcup && \
|
||||||
rm -rf SHA256SUMS SHA256SUMS.sig
|
rm -rf SHA256SUMS SHA256SUMS.sig
|
||||||
|
|
||||||
ARG GHC=9.4.8
|
ARG GHC=8.10.7
|
||||||
ARG CABAL_INSTALL=3.10.2.0
|
ARG CABAL_INSTALL=3.6.2.0
|
||||||
ARG STACK=2.13.1
|
ARG STACK=2.9.1
|
||||||
|
|
||||||
ENV GHCUP_CURL_OPTS="--silent"
|
ENV GHCUP_CURL_OPTS="--silent"
|
||||||
ENV NO_COLOR=1
|
ENV NO_COLOR=1
|
||||||
@@ -63,7 +63,7 @@ RUN ghcup config set gpg-setting GPGStrict && \
|
|||||||
ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \
|
ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \
|
||||||
ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \
|
ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \
|
||||||
find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \
|
find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \
|
||||||
rm -rf "/usr/share/doc/ghc-${GHC}" && \
|
rm -r "/usr/share/doc/ghc-${GHC}" && \
|
||||||
rm -rf /tmp/ghcup* && \
|
rm -rf /tmp/ghcup* && \
|
||||||
ghcup gc -p -s -c -t
|
ghcup gc -p -s -c -t
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ RUN apk add --no-cache \
|
|||||||
xz-dev \
|
xz-dev \
|
||||||
ncurses-static
|
ncurses-static
|
||||||
|
|
||||||
ARG GHCUP_VERSION=0.1.20.0
|
ARG GHCUP_VERSION=0.1.19.4
|
||||||
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
|
|
||||||
|
|
||||||
# install ghcup
|
# install ghcup
|
||||||
@@ -52,9 +52,9 @@ RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
|||||||
chmod +x /usr/bin/ghcup && \
|
chmod +x /usr/bin/ghcup && \
|
||||||
rm -rf SHA256SUMS SHA256SUMS.sig
|
rm -rf SHA256SUMS SHA256SUMS.sig
|
||||||
|
|
||||||
ARG GHC=9.4.8
|
ARG GHC=8.10.7
|
||||||
ARG CABAL_INSTALL=3.10.2.0
|
ARG CABAL_INSTALL=3.6.2.0
|
||||||
ARG STACK=2.13.1
|
ARG STACK=2.9.1
|
||||||
|
|
||||||
ENV GHCUP_CURL_OPTS="--silent"
|
ENV GHCUP_CURL_OPTS="--silent"
|
||||||
ENV NO_COLOR=1
|
ENV NO_COLOR=1
|
||||||
@@ -64,7 +64,7 @@ RUN ghcup config set gpg-setting GPGStrict && \
|
|||||||
ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \
|
ghcup --verbose install ghc --isolate=/usr --force ${GHC} && \
|
||||||
ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \
|
ghcup --verbose install cabal --isolate=/usr/bin --force ${CABAL_INSTALL} && \
|
||||||
find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \
|
find "/usr/lib/ghc-${GHC}/" \( -name "*_p.a" -o -name "*.p_hi" \) -type f -delete && \
|
||||||
rm -rf "/usr/share/doc/ghc-${GHC}" && \
|
rm -r "/usr/share/doc/ghc-${GHC}" && \
|
||||||
rm -rf /tmp/ghcup* && \
|
rm -rf /tmp/ghcup* && \
|
||||||
ghcup gc -p -s -c -t
|
ghcup gc -p -s -c -t
|
||||||
|
|
||||||
|
|||||||
@@ -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.20.0
|
ARG GHCUP_VERSION=0.1.19.4
|
||||||
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
|
|
||||||
# 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 && \
|
||||||
@@ -43,9 +43,9 @@ RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
|||||||
chmod +x /usr/bin/ghcup && \
|
chmod +x /usr/bin/ghcup && \
|
||||||
rm -rf SHA256SUMS SHA256SUMS.sig
|
rm -rf SHA256SUMS SHA256SUMS.sig
|
||||||
|
|
||||||
ARG GHC=9.2.8
|
ARG GHC=8.10.7
|
||||||
ARG CABAL_INSTALL=3.6.2.0
|
ARG CABAL_INSTALL=3.6.2.0
|
||||||
ARG STACK=2.13.1
|
ARG STACK=2.9.1
|
||||||
|
|
||||||
ENV GHCUP_CURL_OPTS="--silent"
|
ENV GHCUP_CURL_OPTS="--silent"
|
||||||
ENV NO_COLOR=1
|
ENV NO_COLOR=1
|
||||||
|
|||||||
@@ -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.20.0
|
ARG GHCUP_VERSION=0.1.19.4
|
||||||
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
|
|
||||||
# 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 && \
|
||||||
@@ -43,9 +43,9 @@ RUN gpg --batch --keyserver keys.openpgp.org --recv-keys $GPG_KEY && \
|
|||||||
chmod +x /usr/bin/ghcup && \
|
chmod +x /usr/bin/ghcup && \
|
||||||
rm -rf SHA256SUMS SHA256SUMS.sig
|
rm -rf SHA256SUMS SHA256SUMS.sig
|
||||||
|
|
||||||
ARG GHC=9.4.8
|
ARG GHC=8.10.7
|
||||||
ARG CABAL_INSTALL=3.10.2.0
|
ARG CABAL_INSTALL=3.6.2.0
|
||||||
ARG STACK=2.13.1
|
ARG STACK=2.9.1
|
||||||
|
|
||||||
ENV GHCUP_CURL_OPTS="--silent"
|
ENV GHCUP_CURL_OPTS="--silent"
|
||||||
ENV NO_COLOR=1
|
ENV NO_COLOR=1
|
||||||
|
|||||||
360
docs/guide.md
360
docs/guide.md
@@ -4,7 +4,7 @@ This is a more in-depth guide specific to GHCup. `ghcup --help` is your friend.
|
|||||||
|
|
||||||
## Basic usage
|
## Basic usage
|
||||||
|
|
||||||
For the simple, interactive, text-based user interface (TUI), run:
|
For the simple, interactive, text-based user interface (TUI) (not available on windows), run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ghcup tui
|
ghcup tui
|
||||||
@@ -43,12 +43,6 @@ All of the following are valid arguments to `ghcup install ghc`:
|
|||||||
|
|
||||||
If the argument is omitted, the default is `recommended`.
|
If the argument is omitted, the default is `recommended`.
|
||||||
|
|
||||||
Other tags include:
|
|
||||||
|
|
||||||
- `prerelease`: a prerelease version
|
|
||||||
- `latest-prerelease`: the latest prerelease version
|
|
||||||
|
|
||||||
|
|
||||||
## Manpages
|
## Manpages
|
||||||
|
|
||||||
For man pages to work you need [man-db](http://man-db.nongnu.org/) as your `man` provider, then issue `man ghc`. Manpages only work for the currently set ghc.
|
For man pages to work you need [man-db](http://man-db.nongnu.org/) as your `man` provider, then issue `man ghc`. Manpages only work for the currently set ghc.
|
||||||
@@ -67,7 +61,8 @@ and make sure your bashrc sources the startup script
|
|||||||
|
|
||||||
`ghcup` is very portable. There are a few exceptions though:
|
`ghcup` is very portable. There are a few exceptions though:
|
||||||
|
|
||||||
1. legacy subcommands `ghcup install` (without a tool identifier) and `ghcup install-cabal` may be removed in the future
|
1. `ghcup tui` is only available on non-windows platforms
|
||||||
|
2. legacy subcommands `ghcup install` (without a tool identifier) and `ghcup install-cabal` may be removed in the future
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
|
|
||||||
@@ -78,7 +73,7 @@ Partial configuration is fine. Command line options always override the config f
|
|||||||
|
|
||||||
## Overriding distro detection
|
## Overriding distro detection
|
||||||
|
|
||||||
If you're running e.g. an Ubuntu derivative based on 18.04 and ghcup is picking bindists that
|
If you're running e.g. an Ubuntu derivate based on 18.04 and ghcup is picking bindists that
|
||||||
don't work well, you could do this in `config.yaml`:
|
don't work well, you could do this in `config.yaml`:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
@@ -94,7 +89,7 @@ platform-override:
|
|||||||
|
|
||||||
This is the complete list of env variables that change GHCup behavior:
|
This is the complete list of env variables that change GHCup behavior:
|
||||||
|
|
||||||
* `GHCUP_USE_XDG_DIRS`: see [XDG support](#xdg-support) below
|
* `GHCUP_USE_XDG_DIRS`: see [XDG support](#xdg-support) above
|
||||||
* `GHCUP_INSTALL_BASE_PREFIX`: the base of ghcup (default: `$HOME`)
|
* `GHCUP_INSTALL_BASE_PREFIX`: the base of ghcup (default: `$HOME`)
|
||||||
* `GHCUP_CURL_OPTS`: additional options that can be passed to curl
|
* `GHCUP_CURL_OPTS`: additional options that can be passed to curl
|
||||||
* `GHCUP_WGET_OPTS`: additional options that can be passed to wget
|
* `GHCUP_WGET_OPTS`: additional options that can be passed to wget
|
||||||
@@ -141,29 +136,50 @@ If you experience problems, consider clearing the cache via `ghcup gc --cache`.
|
|||||||
|
|
||||||
## Metadata
|
## Metadata
|
||||||
|
|
||||||
Metadata files are also called release or distribution channels. They describe tool versions, where to download them etc. and
|
The metadata are the files that describe tool versions, where to download them etc. and
|
||||||
can be viewed here: [https://github.com/haskell/ghcup-metadata](https://github.com/haskell/ghcup-metadata).
|
can be viewed here: [https://github.com/haskell/ghcup-metadata](https://github.com/haskell/ghcup-metadata)
|
||||||
|
|
||||||
See the [description](https://github.com/haskell/ghcup-metadata#metadata-variants-distribution-channels)
|
### Mirrors
|
||||||
of metadata files to understand their purpose. These can be combined.
|
|
||||||
|
|
||||||
For example, if you want access to both prerelease and cross bindists, you'd do:
|
GHCup allows to use custom mirrors/download-info hosted by yourself or 3rd parties.
|
||||||
|
|
||||||
|
To use a mirror, set the following option in `~/.ghcup/config.yaml`:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
url-source:
|
||||||
|
# Accepts file/http/https scheme
|
||||||
|
OwnSource: "https://some-url/ghcup-0.0.6.yaml"
|
||||||
|
```
|
||||||
|
|
||||||
|
See [config.yaml](https://github.com/haskell/ghcup-hs/blob/master/data/config.yaml)
|
||||||
|
for more options.
|
||||||
|
|
||||||
|
Alternatively you can do it via a cli switch:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ghcup --url-source=https://some-url/ghcup-0.0.6.yaml list
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Known mirrors
|
||||||
|
|
||||||
|
1. [https://mirror.sjtu.edu.cn/docs/ghcup](https://mirror.sjtu.edu.cn/docs/ghcup)
|
||||||
|
2. [https://mirrors.ustc.edu.cn/help/ghcup.html](https://mirrors.ustc.edu.cn/help/ghcup.html)
|
||||||
|
|
||||||
|
### (Pre-)Release channels
|
||||||
|
|
||||||
|
A release channel is basically just a metadata file location. You can add additional release
|
||||||
|
channels that complement the default one, such as the **prerelease channel** like so:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ghcup config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml
|
ghcup config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml
|
||||||
ghcup config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-cross-0.0.8.yaml
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This results in the following configuration in `~/.ghcup/config.yaml`:
|
This will result in `~/.ghcup/config.yaml` to contain this record:
|
||||||
|
|
||||||
```yaml
|
```yml
|
||||||
url-source:
|
url-source:
|
||||||
# the base url that contains all the release bindists
|
AddSource:
|
||||||
- GHCupURL
|
- Right: https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml
|
||||||
# prereleases
|
|
||||||
- https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.8.yaml
|
|
||||||
# cross bindists
|
|
||||||
- https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-cross-0.0.8.yaml
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You can add as many channels as you like. They are combined under *Last*, so versions from the prerelease channel
|
You can add as many channels as you like. They are combined under *Last*, so versions from the prerelease channel
|
||||||
@@ -173,68 +189,46 @@ To remove the channel, delete the entire `url-source` section or set it back to
|
|||||||
|
|
||||||
```yml
|
```yml
|
||||||
url-source:
|
url-source:
|
||||||
- GHCupURL
|
GHCupURL: []
|
||||||
```
|
```
|
||||||
|
|
||||||
Also see [config.yaml](https://github.com/haskell/ghcup-hs/blob/master/data/config.yaml)
|
If you want to combine your release channel with a mirror, you'd do it like so:
|
||||||
for more options.
|
|
||||||
|
|
||||||
You can also use an alternative metadata via one-shot cli option:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ghcup --url-source=https://some-url/ghcup-0.0.8.yaml tui
|
|
||||||
```
|
|
||||||
|
|
||||||
One main caveat of using URLs is that you might need to check whether there are new versions
|
|
||||||
of the file (e.g. `ghcup-0.0.7.yaml` vs `ghcup-0.0.8.yaml`). Although old metadata files
|
|
||||||
are supported for some time, they are not so indefinitely.
|
|
||||||
|
|
||||||
### Mirrors
|
|
||||||
|
|
||||||
Metadata files can also be used to operate 3rd party mirrors, in which case you want to use
|
|
||||||
a URL instead of the `GHCupURL` alias. E.g. in `~/.ghcup/config.yaml`, you'd do:
|
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
url-source:
|
url-source:
|
||||||
- https://mirror.sjtu.edu.cn/ghcup/yaml/ghcup/data/ghcup-0.0.6.yaml
|
OwnSource:
|
||||||
|
# base metadata
|
||||||
|
- "https://mirror.sjtu.edu.cn/ghcup/yaml/ghcup/data/ghcup-0.0.6.yaml"
|
||||||
|
# prerelease channel
|
||||||
|
- "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that later versions of GHCup allow more sophisticated mirror support, see [here](./#mirrors-proper).
|
### Nightlies
|
||||||
|
|
||||||
#### Known mirrors
|
Nightlies are just another release channel. Currently, only GHC supports nightlies, which are binary releases
|
||||||
|
that are built every night from `master`.
|
||||||
|
|
||||||
1. [https://mirror.sjtu.edu.cn/docs/ghcup](https://mirror.sjtu.edu.cn/docs/ghcup)
|
To add the nightly channel, run:
|
||||||
2. [https://mirrors.ustc.edu.cn/help/ghcup.html](https://mirrors.ustc.edu.cn/help/ghcup.html)
|
|
||||||
|
|
||||||
### Git based metadata config
|
|
||||||
|
|
||||||
If you don't like the way ghcup updates its metadata with caching and fetching via curl, you can also do as follows:
|
|
||||||
|
|
||||||
Clone the metadata git repo:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
mkdir -p /home/user/git/
|
ghcup config add-release-channel https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml
|
||||||
cd /home/user/git/
|
|
||||||
git clone -b master https://github.com/haskell/ghcup-metadata.git
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Then tell ghcup to use file locations in `~/.ghcup/config.yaml`, e.g.:
|
To list all nightlies from 2023, run:
|
||||||
|
|
||||||
```yaml
|
|
||||||
url-source:
|
|
||||||
- file:///home/user/git/ghcup-metadata/ghcup-0.0.8.yaml
|
|
||||||
- file:///home/user/git/ghcup-metadata/ghcup-cross-0.0.8.yaml
|
|
||||||
- file:///home/user/git/ghcup-metadata/ghcup-prereleases-0.0.8.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, if you invoke `ghcup tui`, it will open instantly without any download, since it just
|
|
||||||
reads the metadata from local disk.
|
|
||||||
|
|
||||||
You'll have to update the metadata manually though, like so:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd /home/user/git/
|
ghcup list --show-nightly --tool=ghc --since=2023-01-01
|
||||||
git pull --ff-only origin master
|
```
|
||||||
|
|
||||||
|
Ways to install a nightly:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# by date
|
||||||
|
ghcup install ghc 2023-06-20
|
||||||
|
# by version
|
||||||
|
ghcup install ghc 9.7.20230619
|
||||||
|
# by tag
|
||||||
|
ghcup install ghc latest-nightly
|
||||||
```
|
```
|
||||||
|
|
||||||
## Stack integration
|
## Stack integration
|
||||||
@@ -242,7 +236,17 @@ git pull --ff-only origin master
|
|||||||
Stack manages GHC versions internally by default. In order to make it use ghcup installed
|
Stack manages GHC versions internally by default. In order to make it use ghcup installed
|
||||||
GHC versions there are two strategies.
|
GHC versions there are two strategies.
|
||||||
|
|
||||||
### Strategy 1: Stack hooks (new, recommended)
|
### Strategy 1: System GHC (works on all stack versions)
|
||||||
|
|
||||||
|
You can instruct stack to use "system" GHC versions (whatever is in PATH). To do so,
|
||||||
|
run the following commands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
stack config set install-ghc false --global
|
||||||
|
stack config set system-ghc true --global
|
||||||
|
```
|
||||||
|
|
||||||
|
### Strategy 2: Stack hooks (new, recommended)
|
||||||
|
|
||||||
Since stack 2.9.1 you can customize the installation logic of GHC completely, see [https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation](https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation).
|
Since stack 2.9.1 you can customize the installation logic of GHC completely, see [https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation](https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation).
|
||||||
|
|
||||||
@@ -264,61 +268,6 @@ stack config set system-ghc false --global
|
|||||||
By default, when the hook fails for whatever reason, stack will fall back to its own installation logic. To disable
|
By default, when the hook fails for whatever reason, stack will fall back to its own installation logic. To disable
|
||||||
this, run `stack config set install-ghc false --global`.
|
this, run `stack config set install-ghc false --global`.
|
||||||
|
|
||||||
### Strategy 2: System GHC (works on all stack versions)
|
|
||||||
|
|
||||||
You can instruct stack to use "system" GHC versions (whatever is in PATH). To do so,
|
|
||||||
run the following commands:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
stack config set install-ghc false --global
|
|
||||||
stack config set system-ghc true --global
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using stack's setup-info metadata to install GHC
|
|
||||||
|
|
||||||
You can now use stack's [setup-info metadata](https://github.com/commercialhaskell/stackage-content/blob/master/stack/stack-setup-2.yaml)
|
|
||||||
to install GHC. For that, you can invoke ghcup like so as a shorthand:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# ghcup will only see GHC now
|
|
||||||
ghcup -s StackSetupURL install ghc 9.4.7
|
|
||||||
# this combines both ghcup and stack metadata
|
|
||||||
ghcup -s '["GHCupURL", "StackSetupURL"]' install ghc 9.4.7
|
|
||||||
```
|
|
||||||
|
|
||||||
To make this permanent and combine it with the GHCup metadata, you can add the following to your `~/.ghcup/config.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
url-source:
|
|
||||||
- GHCupURL
|
|
||||||
# stack versions take precedence
|
|
||||||
# you'll still have access to GHCup provided versions and tools in case they don't exist in stack metadata
|
|
||||||
- StackSetupURL
|
|
||||||
```
|
|
||||||
|
|
||||||
You can customize or add sections to the setup-info similar to how the [stack documentation](https://docs.haskellstack.org/en/stable/yaml_configuration/#setup-info) explains it. E.g. to change the 9.4.7 bindist, you might do:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
url-source:
|
|
||||||
- GHCupURL
|
|
||||||
- StackSetupURL
|
|
||||||
- setup-info:
|
|
||||||
ghc:
|
|
||||||
linux64-tinfo6:
|
|
||||||
9.4.7:
|
|
||||||
url: "https://downloads.haskell.org/~ghc/9.4.7/ghc-9.4.7-x86_64-fedora27-linux.tar.xz"
|
|
||||||
content-length: 179117892
|
|
||||||
sha256: 216b76b7c6383e6ad9ba82533f323f8550e52893a8b9fa33c7b9dc4201ac766a
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Caveats
|
|
||||||
|
|
||||||
The main caveat with using this method is that there's no guarantee that GHCup will pick a compatible HLS bindist
|
|
||||||
when you try to install HLS.
|
|
||||||
|
|
||||||
Another potential usability issue is that the `latest` and `recommended` shorthands won't work anymore, since
|
|
||||||
Stack metadata doesn't have a concept of those and we don't try to be smart when combining the metadatas.
|
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
On windows, you may find the following config options useful too:
|
On windows, you may find the following config options useful too:
|
||||||
@@ -326,39 +275,6 @@ On windows, you may find the following config options useful too:
|
|||||||
|
|
||||||
Also check out: [https://docs.haskellstack.org/en/stable/yaml_configuration](https://docs.haskellstack.org/en/stable/yaml_configuration)
|
Also check out: [https://docs.haskellstack.org/en/stable/yaml_configuration](https://docs.haskellstack.org/en/stable/yaml_configuration)
|
||||||
|
|
||||||
## Mirrors (proper)
|
|
||||||
|
|
||||||
Mirrors are now supported via configuration, instead of specifying alternative metadata files.
|
|
||||||
|
|
||||||
As an example, this would be a complete mirror configuration in `~/.ghcup/config.yaml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
mirrors:
|
|
||||||
# yaml download location, would result in:
|
|
||||||
# https://raw.githubusercontent.com/haskell/ghcup-metadata/develop/ghcup-0.0.8.yaml
|
|
||||||
# -> https://mirror.sjtu.edu.cn/ghcup/yaml/haskell/ghcup-metadata/master/ghcup-0.0.8.yaml
|
|
||||||
"raw.githubusercontent.com":
|
|
||||||
authority:
|
|
||||||
host: "mirror.sjtu.edu.cn"
|
|
||||||
pathPrefix: "ghcup/yaml"
|
|
||||||
# for stack and some older HLS versions, would result in e.g.
|
|
||||||
# https://github.com/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-Windows-1.2.0.tar.gz
|
|
||||||
# -> https://mirror.sjtu.edu.cn/ghcup/github/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-Windows-1.2.0.tar.gz
|
|
||||||
"github.com":
|
|
||||||
authority:
|
|
||||||
host: "mirror.sjtu.edu.cn"
|
|
||||||
pathPrefix: "ghcup/github"
|
|
||||||
# for all haskell.org hosted bindists, would result in e.g.
|
|
||||||
# https://downloads.haskell.org/~ghc/9.8.1/ghc-9.8.1-x86_64-deb10-linux.tar.xz
|
|
||||||
# -> https://mirror.sjtu.edu.cn/ghcup/haskell-downloads/~ghc/9.8.1/ghc-9.8.1-x86_64-deb10-linux.tar.xz
|
|
||||||
"downloads.haskell.org":
|
|
||||||
authority:
|
|
||||||
host: "mirror.sjtu.edu.cn"
|
|
||||||
pathPrefix: "downloads.haskell.org"
|
|
||||||
```
|
|
||||||
|
|
||||||
The configuration depends on the host of the mirror and they have to provide the correct configuration.
|
|
||||||
|
|
||||||
# More on installation
|
# More on installation
|
||||||
|
|
||||||
## Customisation of the installation scripts
|
## Customisation of the installation scripts
|
||||||
@@ -495,9 +411,9 @@ ghcup compile hls --git-ref master --git-describe-version --ghc 8.10.7 --ghc 9.2
|
|||||||
|
|
||||||
This however will create a new HLS version in ghcup, e.g. `1.7.0.0-105-gdc682ba1`, for both 8.10.7 and 9.2.4. If you want to switch back to the official bindists, run `ghcup set hls 1.7.0.0`.
|
This however will create a new HLS version in ghcup, e.g. `1.7.0.0-105-gdc682ba1`, for both 8.10.7 and 9.2.4. If you want to switch back to the official bindists, run `ghcup set hls 1.7.0.0`.
|
||||||
|
|
||||||
## Cross support
|
### Cross support
|
||||||
|
|
||||||
ghcup can compile a cross GHC for any target. However, this
|
ghcup can compile and install a cross GHC for any target. However, this
|
||||||
requires that the build host has a complete cross toolchain and various
|
requires that the build host has a complete cross toolchain and various
|
||||||
libraries installed for the target platform.
|
libraries installed for the target platform.
|
||||||
|
|
||||||
@@ -506,76 +422,6 @@ For distributions with non-standard locations of cross toolchain and
|
|||||||
libraries, this may need some tweaking of `build.mk` or configure args.
|
libraries, this may need some tweaking of `build.mk` or configure args.
|
||||||
See `ghcup compile ghc --help` for further information.
|
See `ghcup compile ghc --help` for further information.
|
||||||
|
|
||||||
Since ghcup version 0.1.20.0, we provide cross bindists for GHC JS and WASM. These can be installed conveniently.
|
|
||||||
However, these are intended as a developer preview only. By using these GHC variants, you are implicitly signing up to participate in GHC development!
|
|
||||||
If you run into bugs or missing behavior, join the dev chat at https://matrix.to/#/#GHC:matrix.org.
|
|
||||||
|
|
||||||
First, add the cross release channel:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ghcup config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/develop/ghcup-cross-0.0.8.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
The next sections explain how to install each cross bindist.
|
|
||||||
|
|
||||||
### GHC JS cross bindists (experimental)
|
|
||||||
|
|
||||||
You need the required emscripten JS toolchain:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone https://github.com/emscripten-core/emsdk.git
|
|
||||||
cd emsdk
|
|
||||||
./emsdk install latest
|
|
||||||
./emsdk activate latest
|
|
||||||
source ./emsdk_env.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Instructions are also here: [Download and install — Emscripten 3.1.43-git (dev) documentation](https://emscripten.org/docs/getting_started/downloads.html).
|
|
||||||
|
|
||||||
To install we need to invoke ghcup like so:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
emconfigure ghcup install ghc --set javascript-unknown-ghcjs-9.6.2
|
|
||||||
```
|
|
||||||
|
|
||||||
You'll now have the compiler `javascript-unknown-ghcjs-ghc`. To build a hello world, do e.g.:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
echo 'main = putStrLn "hello world"' > hello.hs
|
|
||||||
javascript-unknown-ghcjs-ghc -fforce-recomp hello.hs
|
|
||||||
./hello
|
|
||||||
```
|
|
||||||
|
|
||||||
You can follow the instructions [here](https://gitlab.haskell.org/ghc/ghc/-/wikis/javascript-backend/building#compiling-hello-world).
|
|
||||||
|
|
||||||
### GHC WASM cross bindists (experimental)
|
|
||||||
|
|
||||||
You need the required wasm toolchain:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone https://gitlab.haskell.org/ghc/ghc-wasm-meta.git
|
|
||||||
cd ghc-wasm-meta/
|
|
||||||
export SKIP_GHC=yes
|
|
||||||
./setup.sh
|
|
||||||
source ~/.ghc-wasm/env
|
|
||||||
```
|
|
||||||
|
|
||||||
To install, we need to invoke ghcup like so also passing the `--host=<host>` flag (adjust as needed):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ghcup install ghc --set wasm32-wasi-9.6.3.20230927 -- --host=x86_64-linux --with-intree-gmp --with-system-libffi
|
|
||||||
```
|
|
||||||
|
|
||||||
Also check the documentation here: [Glasgow Haskell Compiler / ghc-wasm-meta](https://gitlab.haskell.org/ghc/ghc-wasm-meta).
|
|
||||||
|
|
||||||
You'll now have the compiler `wasm32-wasi-ghc`. To build a hello world, do e.g.:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
echo 'main = putStrLn "hello world"' > hello.hs
|
|
||||||
wasm32-wasi-ghc hello.hs -o hello.wasm
|
|
||||||
wasmtime ./hello.wasm
|
|
||||||
```
|
|
||||||
|
|
||||||
## Isolated installs
|
## Isolated installs
|
||||||
|
|
||||||
**Before using isolated installs, make sure to have at least GHCup version 0.1.17.8!**
|
**Before using isolated installs, make sure to have at least GHCup version 0.1.17.8!**
|
||||||
@@ -610,7 +456,7 @@ Examples:
|
|||||||
## Continuous integration
|
## Continuous integration
|
||||||
|
|
||||||
On Windows, GHCup can be installed automatically on a CI runner
|
On Windows, GHCup can be installed automatically on a CI runner
|
||||||
non-interactively, as below. The parameters to the PowerShell script are
|
non-interactively, as below. The paramaters to the PowerShell script are
|
||||||
specified positionally, after `-ArgumentList`:
|
specified positionally, after `-ArgumentList`:
|
||||||
|
|
||||||
```ps
|
```ps
|
||||||
@@ -632,48 +478,8 @@ variables and, in the case of Windows, parameters to tweak the script behavior.
|
|||||||
|
|
||||||
### github workflows
|
### github workflows
|
||||||
|
|
||||||
On github workflows GHCup itself is pre-installed on all platforms, but may use non-standard install locations.
|
On github workflows you can use [https://github.com/haskell/actions/](https://github.com/haskell/actions/).
|
||||||
Here's an example workflow with a GHC matrix:
|
GHCup itself is also pre-installed on all platforms, but may use non-standard install locations.
|
||||||
|
|
||||||
```yaml
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: true
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-22.04, macOS-latest]
|
|
||||||
ghc: ['9.6', '9.4', '9.2', '9.0', '8.10', '8.8', '8.6']
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Setup toolchain
|
|
||||||
run: |
|
|
||||||
ghcup install cabal --set recommended
|
|
||||||
ghcup install ghc --set ${{ matrix.ghc }}
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
cabal update
|
|
||||||
cabal test all --test-show-details=direct
|
|
||||||
|
|
||||||
i386:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: i386/ubuntu:bionic
|
|
||||||
steps:
|
|
||||||
- name: Install GHCup in container
|
|
||||||
run: |
|
|
||||||
apt-get update -y
|
|
||||||
apt-get install -y autoconf build-essential zlib1g-dev libgmp-dev curl
|
|
||||||
# we just go with recommended versions of cabal and GHC
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | BOOTSTRAP_HASKELL_NONINTERACTIVE=1 BOOTSTRAP_HASKELL_INSTALL_NO_STACK=1 sh
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- name: Test
|
|
||||||
run: |
|
|
||||||
# in containers we need to fix PATH
|
|
||||||
source ~/.ghcup/env
|
|
||||||
cabal update
|
|
||||||
cabal test all --test-show-details=direct
|
|
||||||
```
|
|
||||||
|
|
||||||
## GPG verification
|
## GPG verification
|
||||||
|
|
||||||
@@ -683,10 +489,10 @@ this is cryptographically secure.
|
|||||||
First, obtain the gpg keys:
|
First, obtain the gpg keys:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --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
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 33C3A599DB85EA9B8BAA1866B202264020068BFB
|
||||||
```
|
```
|
||||||
|
|
||||||
Then verify the gpg key in one of these ways:
|
Then verify the gpg key in one of these ways:
|
||||||
|
|||||||
@@ -42,14 +42,10 @@ Also see [tags and shortcuts](../guide/#tags-and-shortcuts) for more information
|
|||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
#### Version >= 11 && <= 12
|
#### Version >= 11
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
#### Version >= 12
|
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi8 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
|
||||||
|
|
||||||
### Linux Ubuntu
|
### Linux Ubuntu
|
||||||
|
|
||||||
#### Generic
|
#### Generic
|
||||||
@@ -60,13 +56,10 @@ The following distro packages are required: `build-essential curl libffi-dev lib
|
|||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
#### Version >= 20.10 && < 23
|
#### Version >= 20.10
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
#### Version >= 23
|
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev`
|
|
||||||
|
|
||||||
### Linux Fedora
|
### Linux Fedora
|
||||||
|
|
||||||
@@ -140,18 +133,16 @@ 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.8.1</td><td><span style="color:blue">latest</span>, base-4.19.0.0</td></tr>
|
<tr><td>9.6.2</td><td><span style="color:blue">latest</span>, base-4.18.0.0</td></tr>
|
||||||
<tr><td>9.6.3</td><td>base-4.18.1.0</td></tr>
|
|
||||||
<tr><td>9.6.2</td><td>base-4.18.0.0</td></tr>
|
|
||||||
<tr><td>9.6.1</td><td>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><span style="color:green">recommended</span>, base-4.17.2.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.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.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>base-4.16.4.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>base-4.16.4.0</td></tr>
|
||||||
@@ -192,8 +183,7 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>Cabal Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>Cabal Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>3.10.2.0</td><td><span style="color:blue">latest</span></td></tr>
|
<tr><td>3.10.1.0</td><td><span style="color:blue">latest</span></td></tr>
|
||||||
<tr><td>3.10.1.0</td><td></td></tr>
|
|
||||||
<tr><td>3.8.1.0</td><td></td></tr>
|
<tr><td>3.8.1.0</td><td></td></tr>
|
||||||
<tr><td>3.6.2.0</td><td><span style="color:green">recommended</span></td></tr>
|
<tr><td>3.6.2.0</td><td><span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>3.6.0.0</td><td></td></tr>
|
<tr><td>3.6.0.0</td><td></td></tr>
|
||||||
@@ -210,9 +200,7 @@ 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.4.0.0</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
<tr><td>2.2.0.0</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>2.3.0.0</td><td></td></tr>
|
|
||||||
<tr><td>2.2.0.0</td><td></td></tr>
|
|
||||||
<tr><td>2.1.0.0</td><td></td></tr>
|
<tr><td>2.1.0.0</td><td></td></tr>
|
||||||
<tr><td>2.0.0.1</td><td></td></tr>
|
<tr><td>2.0.0.1</td><td></td></tr>
|
||||||
<tr><td>2.0.0.0</td><td></td></tr>
|
<tr><td>2.0.0.0</td><td></td></tr>
|
||||||
@@ -237,9 +225,8 @@ 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.13.1</td><td><span style="color:blue">latest</span></td></tr>
|
<tr><td>2.11.1</td><td><span style="color:blue">latest</span></td></tr>
|
||||||
<tr><td>2.11.1</td><td><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.3</td><td></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>
|
||||||
@@ -255,7 +242,7 @@ 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 8.1 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 7 | amd64 | ❔ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| Windows Server 2016 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows Server 2016 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| Windows Server 2019 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows Server 2019 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
@@ -271,11 +258,12 @@ This list may not be exhaustive and specifies support for bindists only.
|
|||||||
| Linux generic | aarch64 | ✅ | ⚠️ | ✅ | ⚠️ | ❌ |
|
| Linux generic | aarch64 | ✅ | ⚠️ | ✅ | ⚠️ | ❌ |
|
||||||
| Linux generic | armv7 | ✅ | ⚠️ | ✅ | ⚠️ | ❌ |
|
| Linux generic | armv7 | ✅ | ⚠️ | ✅ | ⚠️ | ❌ |
|
||||||
|
|
||||||
### Windows <8.1
|
### Windows 7
|
||||||
|
|
||||||
No longer supported for recent GHCs, according to manual testing of GHC 9.8.1 on Windows 7.
|
May or may not work, several issues:
|
||||||
According to [msys2 documentation](https://www.msys2.org/docs/windows_support), the minimum Windows
|
|
||||||
version is now 8.1.
|
* [https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/140](https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/140)
|
||||||
|
* [https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/197](https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/197)
|
||||||
|
|
||||||
### WSL1
|
### WSL1
|
||||||
|
|
||||||
@@ -310,12 +298,10 @@ and place it into your `PATH` anywhere.
|
|||||||
|
|
||||||
If you want to GPG verify the binaries, import the following keys first:
|
If you want to GPG verify the binaries, import the following keys first:
|
||||||
|
|
||||||
```sh
|
* `7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C`
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
* `FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01`
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
* `88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4`
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4
|
* `33C3A599DB85EA9B8BAA1866B202264020068BFB`
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF
|
|
||||||
```
|
|
||||||
|
|
||||||
Then adjust your `PATH` in `~/.bashrc` (or similar, depending on your shell) like so:
|
Then adjust your `PATH` in `~/.bashrc` (or similar, depending on your shell) like so:
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 40 KiB |
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 40 KiB |
118
ghcup.cabal
118
ghcup.cabal
@@ -1,6 +1,6 @@
|
|||||||
cabal-version: 2.4
|
cabal-version: 2.4
|
||||||
name: ghcup
|
name: ghcup
|
||||||
version: 0.1.20.0
|
version: 0.1.19.5
|
||||||
license: LGPL-3.0-only
|
license: LGPL-3.0-only
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
copyright: Julian Ospald 2020
|
copyright: Julian Ospald 2020
|
||||||
@@ -25,15 +25,10 @@ extra-source-files:
|
|||||||
cbits/dirutils.h
|
cbits/dirutils.h
|
||||||
data/build_mk/cross
|
data/build_mk/cross
|
||||||
data/build_mk/default
|
data/build_mk/default
|
||||||
test/ghcup-test/data/dir/.keep
|
test/data/dir/.keep
|
||||||
test/ghcup-test/data/file
|
test/data/file
|
||||||
test/ghcup-test/golden/unix/GHCupInfo.json
|
test/golden/unix/GHCupInfo.json
|
||||||
test/ghcup-test/golden/windows/GHCupInfo.json
|
test/golden/windows/GHCupInfo.json
|
||||||
|
|
||||||
tested-with: GHC==9.4.8
|
|
||||||
, GHC==9.2.8
|
|
||||||
, GHC==9.0.2
|
|
||||||
, GHC==8.10.7
|
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
@@ -41,7 +36,7 @@ source-repository head
|
|||||||
|
|
||||||
flag tui
|
flag tui
|
||||||
description:
|
description:
|
||||||
Build the brick powered tui (ghcup tui).
|
Build the brick powered tui (ghcup tui). This is disabled on windows.
|
||||||
|
|
||||||
default: False
|
default: False
|
||||||
manual: True
|
manual: True
|
||||||
@@ -58,11 +53,6 @@ flag no-exe
|
|||||||
default: False
|
default: False
|
||||||
manual: True
|
manual: True
|
||||||
|
|
||||||
flag tar
|
|
||||||
description: Use haskell tar instead of libarchive.
|
|
||||||
default: False
|
|
||||||
manual: True
|
|
||||||
|
|
||||||
common app-common-depends
|
common app-common-depends
|
||||||
build-depends:
|
build-depends:
|
||||||
, aeson >=1.4
|
, aeson >=1.4
|
||||||
@@ -77,7 +67,8 @@ common app-common-depends
|
|||||||
, directory ^>=1.3.6.0
|
, directory ^>=1.3.6.0
|
||||||
, filepath ^>=1.4.2.1
|
, filepath ^>=1.4.2.1
|
||||||
, haskus-utils-types ^>=1.5
|
, haskus-utils-types ^>=1.5
|
||||||
, haskus-utils-variant ^>=3.3
|
, haskus-utils-variant ^>=3.2.1
|
||||||
|
, libarchive ^>=3.0.3.0
|
||||||
, megaparsec >=8.0.0 && <9.3
|
, megaparsec >=8.0.0 && <9.3
|
||||||
, mtl ^>=2.2
|
, mtl ^>=2.2
|
||||||
, optparse-applicative >=0.15.1.0 && <0.18
|
, optparse-applicative >=0.15.1.0 && <0.18
|
||||||
@@ -88,26 +79,17 @@ common app-common-depends
|
|||||||
, safe ^>=0.3.18
|
, safe ^>=0.3.18
|
||||||
, safe-exceptions ^>=0.1
|
, safe-exceptions ^>=0.1
|
||||||
, tagsoup ^>=0.14
|
, tagsoup ^>=0.14
|
||||||
, template-haskell >=2.7 && <2.22
|
, 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.12
|
||||||
, unordered-containers ^>=0.2
|
, unordered-containers ^>=0.2
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, utf8-string ^>=1.0
|
, utf8-string ^>=1.0
|
||||||
, vector >=0.12 && <0.14
|
, vector ^>=0.12
|
||||||
, versions >=6.0.3 && <6.1
|
, versions >=4.0.1 && <5.1
|
||||||
, yaml-streamly ^>=0.12.0
|
, yaml-streamly ^>=0.12.0
|
||||||
|
|
||||||
if flag(tar)
|
|
||||||
cpp-options: -DTAR
|
|
||||||
build-depends:
|
|
||||||
tar ^>=0.6.0.0
|
|
||||||
, zip ^>=2.0.0
|
|
||||||
|
|
||||||
else
|
|
||||||
build-depends: libarchive ^>=3.0.3.0
|
|
||||||
|
|
||||||
library
|
library
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
GHCup
|
GHCup
|
||||||
@@ -135,14 +117,9 @@ library
|
|||||||
GHCup.Types
|
GHCup.Types
|
||||||
GHCup.Types.JSON
|
GHCup.Types.JSON
|
||||||
GHCup.Types.JSON.Utils
|
GHCup.Types.JSON.Utils
|
||||||
GHCup.Types.JSON.Versions
|
|
||||||
GHCup.Types.Optics
|
GHCup.Types.Optics
|
||||||
GHCup.Types.Stack
|
|
||||||
GHCup.Utils
|
GHCup.Utils
|
||||||
GHCup.Utils.Dirs
|
GHCup.Utils.Dirs
|
||||||
GHCup.Utils.Tar
|
|
||||||
GHCup.Utils.Tar.Types
|
|
||||||
GHCup.Utils.URI
|
|
||||||
GHCup.Version
|
GHCup.Version
|
||||||
|
|
||||||
hs-source-dirs: lib
|
hs-source-dirs: lib
|
||||||
@@ -185,9 +162,9 @@ library
|
|||||||
, disk-free-space ^>=0.1.0.1
|
, disk-free-space ^>=0.1.0.1
|
||||||
, exceptions ^>=0.10
|
, exceptions ^>=0.10
|
||||||
, filepath ^>=1.4.2.1
|
, filepath ^>=1.4.2.1
|
||||||
, file-uri ^>=0.1.0.0
|
|
||||||
, haskus-utils-types ^>=1.5
|
, haskus-utils-types ^>=1.5
|
||||||
, haskus-utils-variant ^>=3.3
|
, haskus-utils-variant ^>=3.2.1
|
||||||
|
, libarchive ^>=3.0.3.0
|
||||||
, lzma-static ^>=5.2.5.3
|
, lzma-static ^>=5.2.5.3
|
||||||
, megaparsec >=8.0.0 && <9.3
|
, megaparsec >=8.0.0 && <9.3
|
||||||
, mtl ^>=2.2
|
, mtl ^>=2.2
|
||||||
@@ -203,7 +180,7 @@ library
|
|||||||
, split ^>=0.2.3.4
|
, split ^>=0.2.3.4
|
||||||
, streamly ^>=0.8.2
|
, streamly ^>=0.8.2
|
||||||
, strict-base ^>=0.4
|
, strict-base ^>=0.4
|
||||||
, template-haskell >=2.7 && <2.22
|
, 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.12
|
||||||
@@ -211,21 +188,12 @@ library
|
|||||||
, unliftio-core ^>=0.2.0.1
|
, unliftio-core ^>=0.2.0.1
|
||||||
, unordered-containers ^>=0.2.10.0
|
, unordered-containers ^>=0.2.10.0
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, vector >=0.12 && <0.14
|
, vector ^>=0.12
|
||||||
, versions >=6.0.3 && <6.1
|
, versions >=4.0.1 && <5.1
|
||||||
, word8 ^>=0.1.3
|
, word8 ^>=0.1.3
|
||||||
, yaml-streamly ^>=0.12.0
|
, yaml-streamly ^>=0.12.0
|
||||||
, zlib ^>=0.6.2.2
|
, zlib ^>=0.6.2.2
|
||||||
|
|
||||||
if flag(tar)
|
|
||||||
cpp-options: -DTAR
|
|
||||||
build-depends:
|
|
||||||
tar ^>=0.6.0.0
|
|
||||||
, zip ^>=2.0.0
|
|
||||||
|
|
||||||
else
|
|
||||||
build-depends: libarchive ^>=3.0.3.0
|
|
||||||
|
|
||||||
if (flag(internal-downloader) && !os(windows))
|
if (flag(internal-downloader) && !os(windows))
|
||||||
exposed-modules: GHCup.Download.IOStreams
|
exposed-modules: GHCup.Download.IOStreams
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
@@ -263,12 +231,12 @@ library
|
|||||||
build-depends:
|
build-depends:
|
||||||
, bz2 >=0.5.0.5 && <1.1
|
, bz2 >=0.5.0.5 && <1.1
|
||||||
, terminal-size ^>=0.3.3
|
, terminal-size ^>=0.3.3
|
||||||
, unix ^>=2.7 || ^>=2.8
|
, unix ^>=2.7
|
||||||
, unix-bytestring ^>=0.3.7.3
|
, unix-bytestring ^>=0.3.7.3
|
||||||
|
|
||||||
if flag(tui)
|
if (flag(tui) && !os(windows))
|
||||||
cpp-options: -DBRICK
|
cpp-options: -DBRICK
|
||||||
build-depends: vty ^>=6.0
|
build-depends: vty ^>=5.37
|
||||||
|
|
||||||
library ghcup-optparse
|
library ghcup-optparse
|
||||||
import: app-common-depends
|
import: app-common-depends
|
||||||
@@ -293,7 +261,7 @@ library ghcup-optparse
|
|||||||
GHCup.OptParse.Upgrade
|
GHCup.OptParse.Upgrade
|
||||||
GHCup.OptParse.Whereis
|
GHCup.OptParse.Whereis
|
||||||
|
|
||||||
hs-source-dirs: lib-opt
|
hs-source-dirs: app/ghcup
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
default-extensions:
|
default-extensions:
|
||||||
LambdaCase
|
LambdaCase
|
||||||
@@ -314,18 +282,44 @@ library ghcup-optparse
|
|||||||
if flag(internal-downloader)
|
if flag(internal-downloader)
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
|
|
||||||
if flag(tui)
|
if (flag(tui) && !os(windows))
|
||||||
cpp-options: -DBRICK
|
cpp-options: -DBRICK
|
||||||
|
other-modules: BrickMain
|
||||||
|
build-depends:
|
||||||
|
, brick ^>=1.5
|
||||||
|
, transformers ^>=0.5
|
||||||
|
, unix ^>=2.7
|
||||||
|
, vty ^>=5.37
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7 || ^>=2.8
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
executable ghcup
|
executable ghcup
|
||||||
import: app-common-depends
|
import: app-common-depends
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
|
other-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
|
hs-source-dirs: app/ghcup
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
@@ -350,19 +344,20 @@ executable ghcup
|
|||||||
if flag(internal-downloader)
|
if flag(internal-downloader)
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
|
|
||||||
if flag(tui)
|
if (flag(tui) && !os(windows))
|
||||||
cpp-options: -DBRICK
|
cpp-options: -DBRICK
|
||||||
other-modules: BrickMain
|
other-modules: BrickMain
|
||||||
build-depends:
|
build-depends:
|
||||||
, brick ^>=2.1
|
, brick ^>=1.5
|
||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, vty ^>=6.0
|
, unix ^>=2.7
|
||||||
, optics ^>=0.4
|
, vty ^>=5.37
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7 || ^>=2.8
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
if flag(no-exe)
|
if flag(no-exe)
|
||||||
buildable: False
|
buildable: False
|
||||||
@@ -408,13 +403,13 @@ test-suite ghcup-test
|
|||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time >=1.9.3 && <1.12
|
, time >=1.9.3 && <1.12
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, versions >=6.0.3 && <6.1
|
, versions >=4.0.1 && <5.1
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7 || ^>=2.8
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
test-suite ghcup-optparse-test
|
test-suite ghcup-optparse-test
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
@@ -448,7 +443,6 @@ test-suite ghcup-optparse-test
|
|||||||
, optparse-applicative
|
, optparse-applicative
|
||||||
, tasty
|
, tasty
|
||||||
, tasty-hunit
|
, tasty-hunit
|
||||||
, template-haskell
|
|
||||||
, text
|
, text
|
||||||
, uri-bytestring
|
, uri-bytestring
|
||||||
, versions
|
, versions
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ fetchToolBindist :: ( MonadFail m
|
|||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
)
|
)
|
||||||
=> GHCTargetVersion
|
=> Version
|
||||||
-> Tool
|
-> Tool
|
||||||
-> Maybe FilePath
|
-> Maybe FilePath
|
||||||
-> Excepts
|
-> Excepts
|
||||||
@@ -113,7 +113,7 @@ fetchToolBindist :: ( MonadFail m
|
|||||||
m
|
m
|
||||||
FilePath
|
FilePath
|
||||||
fetchToolBindist v t mfp = do
|
fetchToolBindist v t mfp = do
|
||||||
dlinfo <- liftE $ getDownloadInfo' t v
|
dlinfo <- liftE $ getDownloadInfo t v
|
||||||
liftE $ downloadCached' dlinfo Nothing mfp
|
liftE $ downloadCached' dlinfo Nothing mfp
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import GHCup.Prelude
|
|||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
|
|
||||||
|
import Codec.Archive ( ArchiveResult )
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
{-# LANGUAGE TypeApplications #-}
|
{-# LANGUAGE TypeApplications #-}
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
|
||||||
|
|
||||||
{-|
|
{-|
|
||||||
Module : GHCup.Download
|
Module : GHCup.Download
|
||||||
Description : Downloading
|
Description : Downloading
|
||||||
@@ -30,12 +31,9 @@ import GHCup.Download.Utils
|
|||||||
#endif
|
#endif
|
||||||
import GHCup.Errors
|
import GHCup.Errors
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import qualified GHCup.Types.Stack as Stack
|
|
||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
import GHCup.Types.JSON ( )
|
import GHCup.Types.JSON ( )
|
||||||
import GHCup.Utils.Dirs
|
import GHCup.Utils.Dirs
|
||||||
import GHCup.Utils.URI
|
|
||||||
import GHCup.Platform
|
|
||||||
import GHCup.Prelude
|
import GHCup.Prelude
|
||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
import GHCup.Prelude.Logger.Internal
|
import GHCup.Prelude.Logger.Internal
|
||||||
@@ -57,7 +55,6 @@ import Data.ByteString ( ByteString )
|
|||||||
import Data.CaseInsensitive ( mk )
|
import Data.CaseInsensitive ( mk )
|
||||||
#endif
|
#endif
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Either
|
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Time.Clock
|
import Data.Time.Clock
|
||||||
import Data.Time.Clock.POSIX
|
import Data.Time.Clock.POSIX
|
||||||
@@ -78,7 +75,7 @@ import System.Exit
|
|||||||
import System.FilePath
|
import System.FilePath
|
||||||
import System.IO.Error
|
import System.IO.Error
|
||||||
import System.IO.Temp
|
import System.IO.Temp
|
||||||
import URI.ByteString hiding (parseURI)
|
import URI.ByteString
|
||||||
|
|
||||||
import qualified Crypto.Hash.SHA256 as SHA256
|
import qualified Crypto.Hash.SHA256 as SHA256
|
||||||
import qualified Data.ByteString as B
|
import qualified Data.ByteString as B
|
||||||
@@ -115,84 +112,33 @@ getDownloadsF :: ( FromJSONKey Tool
|
|||||||
, MonadFail m
|
, MonadFail m
|
||||||
, MonadMask m
|
, MonadMask m
|
||||||
)
|
)
|
||||||
=> PlatformRequest
|
=> Excepts
|
||||||
-> Excepts
|
'[DigestError, ContentLengthError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError]
|
||||||
'[DigestError, ContentLengthError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError, StackPlatformDetectError]
|
|
||||||
m
|
m
|
||||||
GHCupInfo
|
GHCupInfo
|
||||||
getDownloadsF pfreq@(PlatformRequest arch plat _) = do
|
getDownloadsF = do
|
||||||
Settings { urlSource } <- lift getSettings
|
Settings { urlSource } <- lift getSettings
|
||||||
let newUrlSources = fromURLSource urlSource
|
case urlSource of
|
||||||
infos <- liftE $ mapM dl' newUrlSources
|
GHCupURL -> liftE $ getBase ghcupURL
|
||||||
keys <- if any isRight infos
|
(OwnSource exts) -> do
|
||||||
then liftE . reThrowAll @_ @_ @'[StackPlatformDetectError] StackPlatformDetectError $ getStackPlatformKey pfreq
|
ext <- liftE $ mapM (either pure getBase) exts
|
||||||
else pure []
|
mergeGhcupInfo ext
|
||||||
ghcupInfos <- fmap catMaybes $ forM infos $ \case
|
(OwnSpec av) -> pure av
|
||||||
Left gi -> pure (Just gi)
|
(AddSource exts) -> do
|
||||||
Right si -> pure $ fromStackSetupInfo si keys
|
base <- liftE $ getBase ghcupURL
|
||||||
mergeGhcupInfo ghcupInfos
|
ext <- liftE $ mapM (either pure getBase) exts
|
||||||
|
mergeGhcupInfo (base:ext)
|
||||||
|
|
||||||
where
|
where
|
||||||
|
|
||||||
dl' :: ( FromJSONKey Tool
|
|
||||||
, FromJSONKey Version
|
|
||||||
, FromJSON VersionInfo
|
|
||||||
, MonadReader env m
|
|
||||||
, HasSettings env
|
|
||||||
, HasDirs env
|
|
||||||
, MonadIO m
|
|
||||||
, MonadCatch m
|
|
||||||
, HasLog env
|
|
||||||
, MonadThrow m
|
|
||||||
, MonadFail m
|
|
||||||
, MonadMask m
|
|
||||||
)
|
|
||||||
=> NewURLSource
|
|
||||||
-> Excepts
|
|
||||||
'[DownloadFailed, GPGError, DigestError, ContentLengthError, JSONError, FileDoesNotExistError]
|
|
||||||
m (Either GHCupInfo Stack.SetupInfo)
|
|
||||||
dl' NewGHCupURL = fmap Left $ liftE (getBase ghcupURL) >>= liftE . decodeMetadata @GHCupInfo
|
|
||||||
dl' NewStackSetupURL = fmap Right $ liftE (getBase stackSetupURL) >>= liftE . decodeMetadata @Stack.SetupInfo
|
|
||||||
dl' (NewGHCupInfo gi) = pure (Left gi)
|
|
||||||
dl' (NewSetupInfo si) = pure (Right si)
|
|
||||||
dl' (NewURI uri) = do
|
|
||||||
base <- liftE $ getBase uri
|
|
||||||
catchE @JSONError (\(JSONDecodeError _) -> do
|
|
||||||
logDebug $ "Couldn't decode " <> T.pack base <> " as GHCupInfo, trying as SetupInfo: "
|
|
||||||
Right <$> decodeMetadata @Stack.SetupInfo base)
|
|
||||||
$ fmap Left (decodeMetadata @GHCupInfo base >>= \gI -> warnOnMetadataUpdate uri gI >> pure gI)
|
|
||||||
|
|
||||||
fromStackSetupInfo :: MonadThrow m
|
|
||||||
=> Stack.SetupInfo
|
|
||||||
-> [String]
|
|
||||||
-> m GHCupInfo
|
|
||||||
fromStackSetupInfo (Stack.siGHCs -> ghcDli) keys = do
|
|
||||||
let ghcVersionsPerKey = (`M.lookup` ghcDli) . T.pack <$> keys
|
|
||||||
ghcVersions = fromMaybe mempty . listToMaybe . catMaybes $ ghcVersionsPerKey
|
|
||||||
(ghcupInfo' :: M.Map GHCTargetVersion DownloadInfo) <-
|
|
||||||
M.mapKeys mkTVer <$> M.traverseMaybeWithKey (\_ a -> pure $ fromStackDownloadInfo a) ghcVersions
|
|
||||||
let ghcupDownloads' = M.singleton GHC (M.map fromDownloadInfo ghcupInfo')
|
|
||||||
pure (GHCupInfo mempty ghcupDownloads' Nothing)
|
|
||||||
where
|
|
||||||
fromDownloadInfo :: DownloadInfo -> VersionInfo
|
|
||||||
fromDownloadInfo dli = let aspec = M.singleton arch (M.singleton plat (M.singleton Nothing dli))
|
|
||||||
in VersionInfo [] Nothing Nothing Nothing Nothing aspec Nothing Nothing Nothing
|
|
||||||
|
|
||||||
fromStackDownloadInfo :: MonadThrow m => Stack.GHCDownloadInfo -> m DownloadInfo
|
|
||||||
fromStackDownloadInfo (Stack.GHCDownloadInfo { gdiDownloadInfo = Stack.DownloadInfo{..} }) = do
|
|
||||||
url <- either (\e -> throwM $ ParseError (show e)) pure $ parseURI . E.encodeUtf8 $ downloadInfoUrl
|
|
||||||
sha256 <- maybe (throwM $ DigestMissing url) (pure . E.decodeUtf8) downloadInfoSha256
|
|
||||||
pure $ DownloadInfo url (Just $ RegexDir "ghc-.*") sha256 Nothing Nothing
|
|
||||||
|
|
||||||
|
|
||||||
mergeGhcupInfo :: MonadFail m
|
mergeGhcupInfo :: MonadFail m
|
||||||
=> [GHCupInfo]
|
=> [GHCupInfo]
|
||||||
-> m GHCupInfo
|
-> m GHCupInfo
|
||||||
mergeGhcupInfo [] = fail "mergeGhcupInfo: internal error: need at least one GHCupInfo"
|
mergeGhcupInfo [] = fail "mergeGhcupInfo: internal error: need at least one GHCupInfo"
|
||||||
mergeGhcupInfo xs@(GHCupInfo{}: _) =
|
mergeGhcupInfo xs@(GHCupInfo{}: _) =
|
||||||
let newDownloads = M.unionsWith (M.unionWith (\_ b2 -> b2)) (_ghcupDownloads <$> xs)
|
let newDownloads = M.unionsWith (M.unionWith (\_ b2 -> b2)) (_ghcupDownloads <$> xs)
|
||||||
|
newGlobalTools = M.unionsWith (\_ a2 -> a2 ) (_globalTools <$> xs)
|
||||||
newToolReqs = M.unionsWith (M.unionWith (\_ b2 -> b2)) (_toolRequirements <$> xs)
|
newToolReqs = M.unionsWith (M.unionWith (\_ b2 -> b2)) (_toolRequirements <$> xs)
|
||||||
in pure $ GHCupInfo newToolReqs newDownloads Nothing
|
in pure $ GHCupInfo newToolReqs newDownloads newGlobalTools
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
yamlFromCache :: (MonadReader env m, HasDirs env) => URI -> m FilePath
|
yamlFromCache :: (MonadReader env m, HasDirs env) => URI -> m FilePath
|
||||||
@@ -205,7 +151,7 @@ etagsFile :: FilePath -> FilePath
|
|||||||
etagsFile = (<.> "etags")
|
etagsFile = (<.> "etags")
|
||||||
|
|
||||||
|
|
||||||
getBase :: forall m env . ( MonadReader env m
|
getBase :: ( MonadReader env m
|
||||||
, HasDirs env
|
, HasDirs env
|
||||||
, HasSettings env
|
, HasSettings env
|
||||||
, MonadFail m
|
, MonadFail m
|
||||||
@@ -215,7 +161,7 @@ getBase :: forall m env . ( MonadReader env m
|
|||||||
, MonadMask m
|
, MonadMask m
|
||||||
)
|
)
|
||||||
=> URI
|
=> URI
|
||||||
-> Excepts '[DownloadFailed, GPGError, DigestError, ContentLengthError] m FilePath
|
-> Excepts '[DownloadFailed, GPGError, DigestError, ContentLengthError, JSONError, FileDoesNotExistError] m GHCupInfo
|
||||||
getBase uri = do
|
getBase uri = do
|
||||||
Settings { noNetwork, downloader, metaMode } <- lift getSettings
|
Settings { noNetwork, downloader, metaMode } <- lift getSettings
|
||||||
|
|
||||||
@@ -235,8 +181,25 @@ getBase uri = do
|
|||||||
$ uri
|
$ uri
|
||||||
|
|
||||||
-- if we didn't get a filepath from the download, use the cached yaml
|
-- if we didn't get a filepath from the download, use the cached yaml
|
||||||
maybe (lift $ yamlFromCache uri) pure mYaml
|
actualYaml <- maybe (lift $ yamlFromCache uri) pure mYaml
|
||||||
|
lift $ logDebug $ "Decoding yaml at: " <> T.pack actualYaml
|
||||||
|
|
||||||
|
liftE
|
||||||
|
. onE_ (onError actualYaml)
|
||||||
|
. lEM' @_ @_ @'[JSONError] (\(displayException -> e) -> JSONDecodeError $ unlines [e, "Consider removing " <> actualYaml <> " manually."])
|
||||||
|
. liftIO
|
||||||
|
. Y.decodeFileEither
|
||||||
|
$ actualYaml
|
||||||
where
|
where
|
||||||
|
-- On error, remove the etags file and set access time to 0. This should ensure the next invocation
|
||||||
|
-- may re-download and succeed.
|
||||||
|
onError :: (MonadReader env m, HasLog env, MonadMask m, MonadCatch m, MonadIO m) => FilePath -> m ()
|
||||||
|
onError fp = do
|
||||||
|
let efp = etagsFile fp
|
||||||
|
handleIO (\e -> logWarn $ "Couldn't remove file " <> T.pack efp <> ", error was: " <> T.pack (displayException e))
|
||||||
|
(hideError doesNotExistErrorType $ rmFile efp)
|
||||||
|
liftIO $ hideError doesNotExistErrorType $ setAccessTime fp (posixSecondsToUTCTime (fromIntegral @Int 0))
|
||||||
|
|
||||||
warnCache :: (MonadReader env m, HasLog env, MonadMask m, MonadCatch m, MonadIO m) => FilePath -> Downloader -> m ()
|
warnCache :: (MonadReader env m, HasLog env, MonadMask m, MonadCatch m, MonadIO m) => FilePath -> Downloader -> m ()
|
||||||
warnCache s downloader' = do
|
warnCache s downloader' = do
|
||||||
let tryDownloder = case downloader' of
|
let tryDownloder = case downloader' of
|
||||||
@@ -308,69 +271,6 @@ getBase uri = do
|
|||||||
|
|
||||||
pure f
|
pure f
|
||||||
|
|
||||||
warnOnMetadataUpdate ::
|
|
||||||
( MonadReader env m
|
|
||||||
, MonadIO m
|
|
||||||
, HasLog env
|
|
||||||
, HasDirs env
|
|
||||||
)
|
|
||||||
=> URI
|
|
||||||
-> GHCupInfo
|
|
||||||
-> m ()
|
|
||||||
warnOnMetadataUpdate uri (GHCupInfo { _metadataUpdate = Just newUri })
|
|
||||||
| scheme' uri == "file"
|
|
||||||
, urlBase' uri /= urlBase' newUri = do
|
|
||||||
confFile <- getConfigFilePath'
|
|
||||||
logWarn $ "New metadata version detected"
|
|
||||||
<> "\n old URI: " <> (decUTF8Safe . serializeURIRef') uri
|
|
||||||
<> "\n new URI: " <> (decUTF8Safe . serializeURIRef') newUri
|
|
||||||
<> "\nYou might need to update your " <> T.pack confFile
|
|
||||||
| scheme' uri /= "file"
|
|
||||||
, uri /= newUri = do
|
|
||||||
confFile <- getConfigFilePath'
|
|
||||||
logWarn $ "New metadata version detected"
|
|
||||||
<> "\n old URI: " <> (decUTF8Safe . serializeURIRef') uri
|
|
||||||
<> "\n new URI: " <> (decUTF8Safe . serializeURIRef') newUri
|
|
||||||
<> "\nYou might need to update your " <> T.pack confFile
|
|
||||||
where
|
|
||||||
scheme' = view (uriSchemeL' % schemeBSL')
|
|
||||||
urlBase' = T.unpack . decUTF8Safe . urlBaseName . view pathL'
|
|
||||||
warnOnMetadataUpdate _ _ = pure ()
|
|
||||||
|
|
||||||
|
|
||||||
decodeMetadata :: forall j m env .
|
|
||||||
( MonadReader env m
|
|
||||||
, HasDirs env
|
|
||||||
, HasSettings env
|
|
||||||
, MonadFail m
|
|
||||||
, MonadIO m
|
|
||||||
, MonadCatch m
|
|
||||||
, HasLog env
|
|
||||||
, MonadMask m
|
|
||||||
, FromJSON j
|
|
||||||
)
|
|
||||||
=> FilePath
|
|
||||||
-> Excepts '[JSONError, FileDoesNotExistError] m j
|
|
||||||
decodeMetadata actualYaml = do
|
|
||||||
lift $ logDebug $ "Decoding yaml at: " <> T.pack actualYaml
|
|
||||||
|
|
||||||
liftE
|
|
||||||
. onE_ (onError actualYaml)
|
|
||||||
. lEM' @_ @_ @'[JSONError] (\(displayException -> e) -> JSONDecodeError $ unlines [e, "Consider removing " <> actualYaml <> " manually."])
|
|
||||||
. liftIO
|
|
||||||
. Y.decodeFileEither
|
|
||||||
$ actualYaml
|
|
||||||
where
|
|
||||||
-- On error, remove the etags file and set access time to 0. This should ensure the next invocation
|
|
||||||
-- may re-download and succeed.
|
|
||||||
onError :: (MonadReader env m, HasLog env, MonadMask m, MonadCatch m, MonadIO m) => FilePath -> m ()
|
|
||||||
onError fp = do
|
|
||||||
let efp = etagsFile fp
|
|
||||||
handleIO (\e -> logWarn $ "Couldn't remove file " <> T.pack efp <> ", error was: " <> T.pack (displayException e))
|
|
||||||
(hideError doesNotExistErrorType $ rmFile efp)
|
|
||||||
liftIO $ hideError doesNotExistErrorType $ setAccessTime fp (posixSecondsToUTCTime (fromIntegral @Int 0))
|
|
||||||
|
|
||||||
|
|
||||||
getDownloadInfo :: ( MonadReader env m
|
getDownloadInfo :: ( MonadReader env m
|
||||||
, HasPlatformReq env
|
, HasPlatformReq env
|
||||||
, HasGHCupInfo env
|
, HasGHCupInfo env
|
||||||
@@ -426,7 +326,6 @@ getDownloadInfo' t v = do
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- | Tries to download from the given http or https url
|
-- | Tries to download from the given http or https url
|
||||||
-- and saves the result in continuous memory into a file.
|
-- and saves the result in continuous memory into a file.
|
||||||
-- If the filename is not provided, then we:
|
-- If the filename is not provided, then we:
|
||||||
@@ -856,7 +755,7 @@ getGpgOpts =
|
|||||||
-- "baz"
|
-- "baz"
|
||||||
urlBaseName :: ByteString -- ^ the url path (without scheme and host)
|
urlBaseName :: ByteString -- ^ the url path (without scheme and host)
|
||||||
-> ByteString
|
-> ByteString
|
||||||
urlBaseName = snd . B.breakEnd (== _slash)
|
urlBaseName = snd . B.breakEnd (== _slash) . urlDecode False
|
||||||
|
|
||||||
|
|
||||||
-- | Curl saves all intermediate connect headers as well, not just the last one, so we make an effort to take the
|
-- | Curl saves all intermediate connect headers as well, not just the last one, so we make an effort to take the
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import GHCup.Download.Utils
|
|||||||
import GHCup.Errors
|
import GHCup.Errors
|
||||||
import GHCup.Types.JSON ( )
|
import GHCup.Types.JSON ( )
|
||||||
import GHCup.Prelude
|
import GHCup.Prelude
|
||||||
import GHCup.Utils.URI
|
|
||||||
|
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
@@ -29,7 +28,7 @@ import Prelude hiding ( abs
|
|||||||
, writeFile
|
, writeFile
|
||||||
)
|
)
|
||||||
import System.ProgressBar
|
import System.ProgressBar
|
||||||
import URI.ByteString hiding (parseURI)
|
import URI.ByteString
|
||||||
|
|
||||||
import qualified Data.ByteString as BS
|
import qualified Data.ByteString as BS
|
||||||
import qualified Data.Map.Strict as M
|
import qualified Data.Map.Strict as M
|
||||||
@@ -115,7 +114,7 @@ downloadInternal = go (5 :: Int)
|
|||||||
| otherwise -> throwE $ HTTPStatusError scode (getHeaderMap r)
|
| otherwise -> throwE $ HTTPStatusError scode (getHeaderMap r)
|
||||||
)
|
)
|
||||||
|
|
||||||
followRedirectURL bs = case parseURI bs of
|
followRedirectURL bs = case parseURI strictURIParserOptions bs of
|
||||||
Right uri' -> do
|
Right uri' -> do
|
||||||
(https', host', fullPath', port') <- liftE $ uriToQuadruple uri'
|
(https', host', fullPath', port') <- liftE $ uriToQuadruple uri'
|
||||||
go (redirs - 1) progressBar https' host' fullPath' port' consumer setup addHeaders eCSize
|
go (redirs - 1) progressBar https' host' fullPath' port' consumer setup addHeaders eCSize
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ module GHCup.Errors where
|
|||||||
|
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
|
|
||||||
|
import Codec.Archive
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Data.ByteString ( ByteString )
|
import Data.ByteString ( ByteString )
|
||||||
import Data.CaseInsensitive ( CI )
|
import Data.CaseInsensitive ( CI )
|
||||||
@@ -86,7 +87,6 @@ allHFError = unlines allErrors
|
|||||||
, let proxy = Proxy :: Proxy ToolShadowed in format proxy
|
, let proxy = Proxy :: Proxy ToolShadowed in format proxy
|
||||||
, let proxy = Proxy :: Proxy ContentLengthError in format proxy
|
, let proxy = Proxy :: Proxy ContentLengthError in format proxy
|
||||||
, let proxy = Proxy :: Proxy DuplicateReleaseChannel in format proxy
|
, let proxy = Proxy :: Proxy DuplicateReleaseChannel in format proxy
|
||||||
, let proxy = Proxy :: Proxy UnsupportedSetupCombo in format proxy
|
|
||||||
, ""
|
, ""
|
||||||
, "# high level errors (4000+)"
|
, "# high level errors (4000+)"
|
||||||
, let proxy = Proxy :: Proxy DownloadFailed in format proxy
|
, let proxy = Proxy :: Proxy DownloadFailed in format proxy
|
||||||
@@ -99,7 +99,6 @@ allHFError = unlines allErrors
|
|||||||
, let proxy = Proxy :: Proxy ParseError in format proxy
|
, let proxy = Proxy :: Proxy ParseError in format proxy
|
||||||
, let proxy = Proxy :: Proxy UnexpectedListLength in format proxy
|
, let proxy = Proxy :: Proxy UnexpectedListLength in format proxy
|
||||||
, let proxy = Proxy :: Proxy NoUrlBase in format proxy
|
, let proxy = Proxy :: Proxy NoUrlBase in format proxy
|
||||||
, let proxy = Proxy :: Proxy DigestMissing in format proxy
|
|
||||||
, ""
|
, ""
|
||||||
, "# orphans (800+)"
|
, "# orphans (800+)"
|
||||||
, let proxy = Proxy :: Proxy URIParseError in format proxy
|
, let proxy = Proxy :: Proxy URIParseError in format proxy
|
||||||
@@ -208,25 +207,25 @@ instance HFErrorProject NoCompatiblePlatform where
|
|||||||
|
|
||||||
-- | 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 GHCTargetVersion Tool (Maybe PlatformRequest)
|
||||||
|
| NoDownload' GlobalTool
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
instance Pretty NoDownload where
|
instance Pretty NoDownload where
|
||||||
pPrint (NoDownload tver@(GHCTargetVersion mtarget vv) tool mpfreq) =
|
pPrint (NoDownload tver@(GHCTargetVersion mtarget vv) tool mpfreq)
|
||||||
let helperMsg
|
| (Just target) <- mtarget
|
||||||
| (Just target) <- mtarget
|
, target `elem` (T.pack . prettyShow <$> enumFromTo (minBound :: Tool) (maxBound :: Tool))
|
||||||
, target `elem` (T.pack . prettyShow <$> enumFromTo (minBound :: Tool) (maxBound :: Tool)) =
|
= text $ "Unable to find a download for "
|
||||||
"\nPerhaps you meant: 'ghcup <command> "
|
|
||||||
<> T.unpack target
|
|
||||||
<> " "
|
|
||||||
<> T.unpack (prettyVer vv)
|
|
||||||
<> "'"
|
|
||||||
| otherwise = ""
|
|
||||||
in text $ "Unable to find a download for "
|
|
||||||
<> show tool
|
<> show tool
|
||||||
<> " version "
|
<> " version '"
|
||||||
<> "'" <> T.unpack (tVerToText tver) <> "'"
|
<> T.unpack (tVerToText tver)
|
||||||
<> maybe "" (\pfreq -> " on detected platform " <> pfReqToString pfreq) mpfreq
|
<> maybe "'\n" (\pfreq -> "' on detected platform " <> pfReqToString pfreq <> "\n") mpfreq
|
||||||
<> helperMsg
|
<> "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
|
||||||
@@ -388,7 +387,7 @@ data NotInstalled = NotInstalled Tool GHCTargetVersion
|
|||||||
|
|
||||||
instance Pretty NotInstalled where
|
instance Pretty NotInstalled where
|
||||||
pPrint (NotInstalled tool ver) =
|
pPrint (NotInstalled tool ver) =
|
||||||
text "The version" <+> (text "'" <> pPrint ver <> text "'") <+> text "of the tool" <+> pPrint tool <+> text "is not installed."
|
text "The version" <+> pPrint ver <+> text "of the tool" <+> pPrint tool <+> text "is not installed."
|
||||||
|
|
||||||
instance HFErrorProject NotInstalled where
|
instance HFErrorProject NotInstalled where
|
||||||
eBase _ = 130
|
eBase _ = 130
|
||||||
@@ -525,7 +524,7 @@ data HTTPNotModified = HTTPNotModified Text
|
|||||||
|
|
||||||
instance Pretty HTTPNotModified where
|
instance Pretty HTTPNotModified where
|
||||||
pPrint (HTTPNotModified etag) =
|
pPrint (HTTPNotModified etag) =
|
||||||
text "Remote resource not modified, etag was:" <+> pPrint etag
|
text "Remote resource not modifed, etag was:" <+> pPrint etag
|
||||||
|
|
||||||
instance HFErrorProject HTTPNotModified where
|
instance HFErrorProject HTTPNotModified where
|
||||||
eBase _ = 240
|
eBase _ = 240
|
||||||
@@ -675,29 +674,18 @@ instance HFErrorProject ContentLengthError where
|
|||||||
eBase _ = 340
|
eBase _ = 340
|
||||||
eDesc _ = "File content length verification failed"
|
eDesc _ = "File content length verification failed"
|
||||||
|
|
||||||
data DuplicateReleaseChannel = DuplicateReleaseChannel NewURLSource
|
data DuplicateReleaseChannel = DuplicateReleaseChannel URI
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
instance HFErrorProject DuplicateReleaseChannel where
|
instance HFErrorProject DuplicateReleaseChannel where
|
||||||
eBase _ = 350
|
eBase _ = 350
|
||||||
eDesc _ = "Duplicate release channel detected when adding new source.\nGiving up. You can use '--force' to remove and append the duplicate source (this may change order/semantics)."
|
eDesc _ = "Duplicate release channel detected when adding URI.\nGiving up. You can use '--force' to remove and append the duplicate URI (this may change order/semantics)."
|
||||||
|
|
||||||
instance Pretty DuplicateReleaseChannel where
|
instance Pretty DuplicateReleaseChannel where
|
||||||
pPrint (DuplicateReleaseChannel source) =
|
pPrint (DuplicateReleaseChannel uri) =
|
||||||
text $ "Duplicate release channel detected when adding: \n "
|
text $ "Duplicate release channel detected when adding: \n "
|
||||||
<> show source
|
<> (T.unpack . E.decodeUtf8With E.lenientDecode . serializeURIRef') uri
|
||||||
<> "\nGiving up. You can use '--force' to remove and append the duplicate source (this may change order/semantics)."
|
<> "\nGiving up. You can use '--force' to remove and append the duplicate URI (this may change order/semantics)."
|
||||||
|
|
||||||
data UnsupportedSetupCombo = UnsupportedSetupCombo Architecture Platform
|
|
||||||
deriving Show
|
|
||||||
|
|
||||||
instance Pretty UnsupportedSetupCombo where
|
|
||||||
pPrint (UnsupportedSetupCombo arch plat) =
|
|
||||||
text "Could not find a compatible setup combo for:" <+> pPrint arch <+> pPrint plat
|
|
||||||
|
|
||||||
instance HFErrorProject UnsupportedSetupCombo where
|
|
||||||
eBase _ = 360
|
|
||||||
eDesc _ = "Could not find a compatible setup combo"
|
|
||||||
|
|
||||||
-------------------------
|
-------------------------
|
||||||
--[ High-level errors ]--
|
--[ High-level errors ]--
|
||||||
@@ -723,7 +711,7 @@ data InstallSetError = forall xs1 xs2 . (Show (V xs1), Pretty (V xs1), HFErrorPr
|
|||||||
|
|
||||||
instance Pretty InstallSetError where
|
instance Pretty InstallSetError where
|
||||||
pPrint (InstallSetError reason1 reason2) =
|
pPrint (InstallSetError reason1 reason2) =
|
||||||
text "Both installation and setting the tool failed.\nInstall error was:"
|
text "Both installation and setting the tool failed. Install error was:"
|
||||||
<+> pPrint reason1
|
<+> pPrint reason1
|
||||||
<+> text "\nSet error was:"
|
<+> text "\nSet error was:"
|
||||||
<+> pPrint reason2
|
<+> pPrint reason2
|
||||||
@@ -786,22 +774,6 @@ instance HFErrorProject GHCupSetError where
|
|||||||
eNum (GHCupSetError xs) = 9000 + eNum xs
|
eNum (GHCupSetError xs) = 9000 + eNum xs
|
||||||
eDesc _ = "Setting the current version failed."
|
eDesc _ = "Setting the current version failed."
|
||||||
|
|
||||||
-- | Executing stacks platform detection failed.
|
|
||||||
data StackPlatformDetectError = forall es . (ToVariantMaybe StackPlatformDetectError es, PopVariant StackPlatformDetectError es, Show (V es), Pretty (V es), HFErrorProject (V es)) => StackPlatformDetectError (V es)
|
|
||||||
|
|
||||||
instance Pretty StackPlatformDetectError where
|
|
||||||
pPrint (StackPlatformDetectError reason) =
|
|
||||||
case reason of
|
|
||||||
VMaybe (_ :: StackPlatformDetectError) -> pPrint reason
|
|
||||||
_ -> text "Running stack platform detection logic failed:" <+> pPrint reason
|
|
||||||
|
|
||||||
deriving instance Show StackPlatformDetectError
|
|
||||||
|
|
||||||
instance HFErrorProject StackPlatformDetectError where
|
|
||||||
eBase _ = 6000
|
|
||||||
eNum (StackPlatformDetectError xs) = 6000 + eNum xs
|
|
||||||
eDesc _ = "Running stack platform detection logic failed."
|
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
--[ True Exceptions (e.g. for MonadThrow) ]--
|
--[ True Exceptions (e.g. for MonadThrow) ]--
|
||||||
@@ -820,7 +792,7 @@ instance Exception ParseError
|
|||||||
|
|
||||||
instance HFErrorProject ParseError where
|
instance HFErrorProject ParseError where
|
||||||
eBase _ = 500
|
eBase _ = 500
|
||||||
eDesc _ = "A parse error occurred."
|
eDesc _ = "A parse error occured."
|
||||||
|
|
||||||
|
|
||||||
data UnexpectedListLength = UnexpectedListLength String
|
data UnexpectedListLength = UnexpectedListLength String
|
||||||
@@ -849,18 +821,6 @@ instance HFErrorProject NoUrlBase where
|
|||||||
eBase _ = 520
|
eBase _ = 520
|
||||||
eDesc _ = "URL does not have a base filename."
|
eDesc _ = "URL does not have a base filename."
|
||||||
|
|
||||||
data DigestMissing = DigestMissing URI
|
|
||||||
deriving Show
|
|
||||||
|
|
||||||
instance Pretty DigestMissing where
|
|
||||||
pPrint (DigestMissing uri) =
|
|
||||||
text "Digest missing for:" <+> (text . T.unpack . E.decodeUtf8With E.lenientDecode . serializeURIRef') uri
|
|
||||||
|
|
||||||
instance Exception DigestMissing
|
|
||||||
|
|
||||||
instance HFErrorProject DigestMissing where
|
|
||||||
eBase _ = 530
|
|
||||||
eDesc _ = "An expected digest is missing."
|
|
||||||
|
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import GHCup.Prelude.String.QQ
|
|||||||
import GHCup.Prelude.Version.QQ
|
import GHCup.Prelude.Version.QQ
|
||||||
import GHCup.Prelude.MegaParsec
|
import GHCup.Prelude.MegaParsec
|
||||||
|
|
||||||
|
import Codec.Archive ( ArchiveResult )
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Concurrent ( threadDelay )
|
import Control.Concurrent ( threadDelay )
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
@@ -73,7 +74,6 @@ import qualified Crypto.Hash.SHA256 as SHA256
|
|||||||
import qualified Data.ByteString.Base16 as B16
|
import qualified Data.ByteString.Base16 as B16
|
||||||
import qualified Data.ByteString as B
|
import qualified Data.ByteString as B
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
import qualified Data.Map.Strict as Map
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.IO as T
|
import qualified Data.Text.IO as T
|
||||||
import qualified Data.Text.Encoding as E
|
import qualified Data.Text.Encoding as E
|
||||||
@@ -216,9 +216,7 @@ testUnpackedGHC path tver addMakeArgs = do
|
|||||||
lift $ logInfo $ "Testing GHC version " <> tVerToText tver <> "!"
|
lift $ logInfo $ "Testing GHC version " <> tVerToText tver <> "!"
|
||||||
ghcDir <- lift $ ghcupGHCDir tver
|
ghcDir <- lift $ ghcupGHCDir tver
|
||||||
let ghcBinDir = fromGHCupPath ghcDir </> "bin"
|
let ghcBinDir = fromGHCupPath ghcDir </> "bin"
|
||||||
env <- liftIO $ addToPath [ghcBinDir] False
|
env <- liftIO $ addToPath ghcBinDir False
|
||||||
let pathVar = if isWindows then "Path" else "PATH"
|
|
||||||
forM_ (Map.lookup pathVar . Map.fromList $ env) $ liftIO . setEnv pathVar
|
|
||||||
|
|
||||||
lEM $ make' (fmap T.unpack addMakeArgs)
|
lEM $ make' (fmap T.unpack addMakeArgs)
|
||||||
(Just $ fromGHCupPath path)
|
(Just $ fromGHCupPath path)
|
||||||
@@ -448,30 +446,13 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
= []
|
= []
|
||||||
|
|
||||||
lift $ logInfo "Installing GHC (this may take a while)"
|
lift $ logInfo "Installing GHC (this may take a while)"
|
||||||
env <- case _rPlatform of
|
|
||||||
-- https://github.com/haskell/ghcup-hs/issues/967
|
|
||||||
Linux Alpine
|
|
||||||
-- lets not touch LD for cross targets
|
|
||||||
| Nothing <- _tvTarget tver -> do
|
|
||||||
cEnv <- liftIO getEnvironment
|
|
||||||
spaths <- liftIO getSearchPath
|
|
||||||
has_ld_bfd <- isJust <$> liftIO (searchPath spaths "ld.bfd")
|
|
||||||
let ldSet = isJust $ lookup "LD" cEnv
|
|
||||||
-- only set LD if ld.bfd exists in PATH and LD is not set
|
|
||||||
-- already
|
|
||||||
if has_ld_bfd && not ldSet
|
|
||||||
then do
|
|
||||||
lift $ logInfo "Detected alpine linux... setting LD=ld.bfd"
|
|
||||||
pure $ Just (("LD", "ld.bfd") : cEnv)
|
|
||||||
else pure Nothing
|
|
||||||
_ -> pure Nothing
|
|
||||||
lEM $ execLogged "sh"
|
lEM $ execLogged "sh"
|
||||||
("./configure" : ("--prefix=" <> fromInstallDir inst)
|
("./configure" : ("--prefix=" <> fromInstallDir inst)
|
||||||
: (maybe mempty (\x -> ["--target=" <> T.unpack x]) (_tvTarget tver) <> ldOverride <> (T.unpack <$> addConfArgs))
|
: (maybe mempty (\x -> ["--target=" <> T.unpack x]) (_tvTarget tver) <> ldOverride <> (T.unpack <$> addConfArgs))
|
||||||
)
|
)
|
||||||
(Just $ fromGHCupPath path)
|
(Just $ fromGHCupPath path)
|
||||||
"ghc-configure"
|
"ghc-configure"
|
||||||
env
|
Nothing
|
||||||
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)
|
||||||
@@ -531,7 +512,6 @@ installGHCBin :: ( MonadFail m
|
|||||||
, MonadResource m
|
, MonadResource m
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
, Alternative m
|
|
||||||
)
|
)
|
||||||
=> GHCTargetVersion -- ^ the version to install
|
=> GHCTargetVersion -- ^ the version to install
|
||||||
-> InstallDir
|
-> InstallDir
|
||||||
@@ -553,11 +533,6 @@ installGHCBin :: ( MonadFail m
|
|||||||
, ProcessError
|
, ProcessError
|
||||||
, UninstallFailed
|
, UninstallFailed
|
||||||
, MergeFileTreeError
|
, MergeFileTreeError
|
||||||
, NoCompatiblePlatform
|
|
||||||
, ParseError
|
|
||||||
, UnsupportedSetupCombo
|
|
||||||
, DistroNotFound
|
|
||||||
, NoCompatibleArch
|
|
||||||
]
|
]
|
||||||
m
|
m
|
||||||
()
|
()
|
||||||
@@ -779,8 +754,7 @@ rmGHCVer ver = do
|
|||||||
|
|
||||||
Dirs {..} <- lift getDirs
|
Dirs {..} <- lift getDirs
|
||||||
|
|
||||||
when isSetGHC $ do
|
lift $ hideError doesNotExistErrorType $ rmDirectoryLink (fromGHCupPath baseDir </> "share")
|
||||||
lift $ hideError doesNotExistErrorType $ rmDirectoryLink (fromGHCupPath baseDir </> "share")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1118,8 +1092,8 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
let possible_files = if isWindows
|
let possible_files = if isWindows
|
||||||
then ((workdir </> "hadrian") </>) <$> ["build.bat"]
|
then ((workdir </> "hadrian") </>) <$> ["build.bat"]
|
||||||
else ((workdir </> "hadrian") </>) <$> ["build", "build.sh"]
|
else ((workdir </> "hadrian") </>) <$> ["build", "build.sh"]
|
||||||
exists <- forM possible_files (\f -> liftIO (doesFileExist f) <&> (,f))
|
exsists <- forM possible_files (\f -> liftIO (doesFileExist f) <&> (,f))
|
||||||
case filter fst exists of
|
case filter fst exsists of
|
||||||
[] -> throwE HadrianNotFound
|
[] -> throwE HadrianNotFound
|
||||||
((_, x):_) -> pure x
|
((_, x):_) -> pure x
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import GHCup.Prelude.Logger
|
|||||||
import GHCup.Prelude.Process
|
import GHCup.Prelude.Process
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
|
|
||||||
|
import Codec.Archive ( ArchiveResult )
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@@ -716,10 +717,8 @@ getCabalVersion fp = do
|
|||||||
gpd <- case parseGenericPackageDescriptionMaybe contents of
|
gpd <- case parseGenericPackageDescriptionMaybe contents of
|
||||||
Nothing -> fail $ "could not parse cabal file: " <> fp
|
Nothing -> fail $ "could not parse cabal file: " <> fp
|
||||||
Just r -> pure r
|
Just r -> pure r
|
||||||
let tver = (\c -> Version Nothing c Nothing Nothing)
|
let tver = (\c -> Version Nothing c [] Nothing)
|
||||||
. Chunks
|
. NE.fromList . fmap (NE.fromList . (:[]) . digits . fromIntegral)
|
||||||
. NE.fromList
|
|
||||||
. fmap (Numeric . fromIntegral)
|
|
||||||
. versionNumbers
|
. versionNumbers
|
||||||
. pkgVersion
|
. pkgVersion
|
||||||
. package
|
. package
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
{-|
|
{-|
|
||||||
Module : GHCup.Platform
|
Module : GHCup.Plaform
|
||||||
Description : Retrieving platform information
|
Description : Retrieving platform information
|
||||||
Copyright : (c) Julian Ospald, 2020
|
Copyright : (c) Julian Ospald, 2020
|
||||||
License : LGPL-3.0
|
License : LGPL-3.0
|
||||||
@@ -28,8 +28,6 @@ import GHCup.Prelude
|
|||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
import GHCup.Prelude.Process
|
import GHCup.Prelude.Process
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
import GHCup.Prelude.Version.QQ
|
|
||||||
import GHCup.Prelude.MegaParsec
|
|
||||||
|
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
import Control.Monad.Fail ( MonadFail )
|
import Control.Monad.Fail ( MonadFail )
|
||||||
@@ -50,18 +48,11 @@ import Prelude hiding ( abs
|
|||||||
)
|
)
|
||||||
import System.Info
|
import System.Info
|
||||||
import System.OsRelease
|
import System.OsRelease
|
||||||
import System.Exit
|
|
||||||
import System.FilePath
|
|
||||||
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
||||||
import Text.Regex.Posix
|
import Text.Regex.Posix
|
||||||
|
|
||||||
import qualified Text.Megaparsec as MP
|
|
||||||
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.IO as T
|
import qualified Data.Text.IO as T
|
||||||
import Data.Void
|
|
||||||
import qualified Data.List as L
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -152,9 +143,6 @@ getLinuxDistro = do
|
|||||||
| hasWord name ["exherbo"] -> Exherbo
|
| hasWord name ["exherbo"] -> Exherbo
|
||||||
| hasWord name ["gentoo"] -> Gentoo
|
| hasWord name ["gentoo"] -> Gentoo
|
||||||
| hasWord name ["amazonlinux", "Amazon Linux"] -> AmazonLinux
|
| hasWord name ["amazonlinux", "Amazon Linux"] -> AmazonLinux
|
||||||
| hasWord name ["rocky", "Rocky Linux"] -> Rocky
|
|
||||||
-- https://github.com/void-linux/void-packages/blob/master/srcpkgs/base-files/files/os-release
|
|
||||||
| hasWord name ["void", "Void Linux"] -> Void
|
|
||||||
| otherwise -> UnknownLinux
|
| otherwise -> UnknownLinux
|
||||||
pure (distro, parsedVer)
|
pure (distro, parsedVer)
|
||||||
where
|
where
|
||||||
@@ -209,155 +197,3 @@ getLinuxDistro = do
|
|||||||
try_debian_version = do
|
try_debian_version = do
|
||||||
ver <- T.readFile debian_version
|
ver <- T.readFile debian_version
|
||||||
pure (T.pack "debian", Just ver)
|
pure (T.pack "debian", Just ver)
|
||||||
|
|
||||||
|
|
||||||
getStackGhcBuilds :: (MonadReader env m, HasLog env, MonadIO m)
|
|
||||||
=> PlatformResult
|
|
||||||
-> Excepts '[ParseError, NoCompatiblePlatform, DistroNotFound, ProcessError] m [String]
|
|
||||||
getStackGhcBuilds PlatformResult{..} = do
|
|
||||||
case _platform of
|
|
||||||
Linux _ -> do
|
|
||||||
-- Some systems don't have ldconfig in the PATH, so make sure to look in
|
|
||||||
-- /sbin and /usr/sbin as well
|
|
||||||
sbinEnv <- liftIO $ addToPath sbinDirs False
|
|
||||||
ldConfig <- lift $ executeOut' "ldconfig" ["-p"] Nothing (Just sbinEnv)
|
|
||||||
firstWords <- case ldConfig of
|
|
||||||
CapturedProcess ExitSuccess so _ ->
|
|
||||||
pure . mapMaybe (listToMaybe . T.words) . T.lines . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ so
|
|
||||||
CapturedProcess (ExitFailure _) _ _ ->
|
|
||||||
-- throwE $ NonZeroExit c "ldconfig" ["-p" ]
|
|
||||||
pure []
|
|
||||||
let checkLib :: (MonadReader env m, HasLog env, MonadIO m) => String -> m Bool
|
|
||||||
checkLib lib
|
|
||||||
| libT `elem` firstWords = do
|
|
||||||
logDebug $ "Found shared library " <> libT <> " in 'ldconfig -p' output"
|
|
||||||
pure True
|
|
||||||
| isWindows =
|
|
||||||
-- Cannot parse /usr/lib on Windows
|
|
||||||
pure False
|
|
||||||
| otherwise = hasMatches lib usrLibDirs
|
|
||||||
-- This is a workaround for the fact that libtinfo.so.x doesn't
|
|
||||||
-- appear in the 'ldconfig -p' output on Arch or Slackware even
|
|
||||||
-- when it exists. There doesn't seem to be an easy way to get the
|
|
||||||
-- true list of directories to scan for shared libs, but this
|
|
||||||
-- works for our particular cases.
|
|
||||||
where
|
|
||||||
libT = T.pack lib
|
|
||||||
|
|
||||||
hasMatches :: (MonadReader env m, HasLog env, MonadIO m) => String -> [FilePath] -> m Bool
|
|
||||||
hasMatches lib dirs = do
|
|
||||||
matches <- filterM (liftIO . doesFileExist . (</> lib)) dirs
|
|
||||||
case matches of
|
|
||||||
[] -> logDebug ("Did not find shared library " <> libT) >> pure False
|
|
||||||
(path:_) -> logDebug ("Found shared library " <> libT <> " in " <> T.pack path) >> pure True
|
|
||||||
where
|
|
||||||
libT = T.pack lib
|
|
||||||
|
|
||||||
getLibc6Version :: MonadIO m
|
|
||||||
=> Excepts '[ParseError, ProcessError] m Version
|
|
||||||
getLibc6Version = do
|
|
||||||
CapturedProcess{..} <- lift $ executeOut "ldd" ["--version"] Nothing
|
|
||||||
case _exitCode of
|
|
||||||
ExitSuccess -> either (throwE . ParseError . show) pure
|
|
||||||
. MP.parse lddVersion "" . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ _stdOut
|
|
||||||
ExitFailure c -> throwE $ NonZeroExit c "ldd" ["--version" ]
|
|
||||||
|
|
||||||
-- Assumes the first line of ldd has the format:
|
|
||||||
--
|
|
||||||
-- ldd (...) nn.nn
|
|
||||||
--
|
|
||||||
-- where nn.nn corresponds to the version of libc6.
|
|
||||||
lddVersion :: MP.Parsec Void Text Version
|
|
||||||
lddVersion = do
|
|
||||||
skipWhile (/= ')')
|
|
||||||
skip (== ')')
|
|
||||||
skipSpace
|
|
||||||
version'
|
|
||||||
|
|
||||||
hasMusl <- hasMatches relFileLibcMuslx86_64So1 libDirs
|
|
||||||
mLibc6Version <- veitherToEither <$> runE getLibc6Version
|
|
||||||
case mLibc6Version of
|
|
||||||
Right libc6Version -> logDebug $ "Found shared library libc6 in version: " <> prettyVer libc6Version
|
|
||||||
Left _ -> logDebug "Did not find a version of shared library libc6."
|
|
||||||
let hasLibc6_2_32 = either (const False) (>= [vver|2.32|]) mLibc6Version
|
|
||||||
hastinfo5 <- checkLib relFileLibtinfoSo5
|
|
||||||
hastinfo6 <- checkLib relFileLibtinfoSo6
|
|
||||||
hasncurses6 <- checkLib relFileLibncurseswSo6
|
|
||||||
hasgmp5 <- checkLib relFileLibgmpSo10
|
|
||||||
hasgmp4 <- checkLib relFileLibgmpSo3
|
|
||||||
let libComponents = if hasMusl
|
|
||||||
then
|
|
||||||
[ ["musl"] ]
|
|
||||||
else
|
|
||||||
concat
|
|
||||||
[ if hastinfo6 && hasgmp5
|
|
||||||
then
|
|
||||||
if hasLibc6_2_32
|
|
||||||
then [["tinfo6"]]
|
|
||||||
else [["tinfo6-libc6-pre232"]]
|
|
||||||
else [[]]
|
|
||||||
, [ [] | hastinfo5 && hasgmp5 ]
|
|
||||||
, [ ["ncurses6"] | hasncurses6 && hasgmp5 ]
|
|
||||||
, [ ["gmp4"] | hasgmp4 ]
|
|
||||||
]
|
|
||||||
pure $ map
|
|
||||||
(\c -> case c of
|
|
||||||
[] -> []
|
|
||||||
_ -> L.intercalate "-" c)
|
|
||||||
libComponents
|
|
||||||
FreeBSD ->
|
|
||||||
case _distroVersion of
|
|
||||||
Just fVer
|
|
||||||
| fVer >= [vers|12|] -> pure []
|
|
||||||
_ -> pure ["ino64"]
|
|
||||||
Darwin -> pure []
|
|
||||||
Windows -> pure []
|
|
||||||
where
|
|
||||||
|
|
||||||
relFileLibcMuslx86_64So1 :: FilePath
|
|
||||||
relFileLibcMuslx86_64So1 = "libc.musl-x86_64.so.1"
|
|
||||||
libDirs :: [FilePath]
|
|
||||||
libDirs = ["/lib", "/lib64"]
|
|
||||||
usrLibDirs :: [FilePath]
|
|
||||||
usrLibDirs = ["/usr/lib", "/usr/lib64"]
|
|
||||||
sbinDirs :: [FilePath]
|
|
||||||
sbinDirs = ["/sbin", "/usr/sbin"]
|
|
||||||
relFileLibtinfoSo5 :: FilePath
|
|
||||||
relFileLibtinfoSo5 = "libtinfo.so.5"
|
|
||||||
relFileLibtinfoSo6 :: FilePath
|
|
||||||
relFileLibtinfoSo6 = "libtinfo.so.6"
|
|
||||||
relFileLibncurseswSo6 :: FilePath
|
|
||||||
relFileLibncurseswSo6 = "libncursesw.so.6"
|
|
||||||
relFileLibgmpSo10 :: FilePath
|
|
||||||
relFileLibgmpSo10 = "libgmp.so.10"
|
|
||||||
relFileLibgmpSo3 :: FilePath
|
|
||||||
relFileLibgmpSo3 = "libgmp.so.3"
|
|
||||||
|
|
||||||
getStackOSKey :: Monad m => PlatformRequest -> Excepts '[UnsupportedSetupCombo] m String
|
|
||||||
getStackOSKey PlatformRequest { .. } =
|
|
||||||
case (_rArch, _rPlatform) of
|
|
||||||
(A_32 , Linux _) -> pure "linux32"
|
|
||||||
(A_64 , Linux _) -> pure "linux64"
|
|
||||||
(A_32 , Darwin ) -> pure "macosx"
|
|
||||||
(A_64 , Darwin ) -> pure "macosx"
|
|
||||||
(A_32 , FreeBSD) -> pure "freebsd32"
|
|
||||||
(A_64 , FreeBSD) -> pure "freebsd64"
|
|
||||||
(A_32 , Windows) -> pure "windows32"
|
|
||||||
(A_64 , Windows) -> pure "windows64"
|
|
||||||
(A_ARM , Linux _) -> pure "linux-armv7"
|
|
||||||
(A_ARM64, Linux _) -> pure "linux-aarch64"
|
|
||||||
(A_Sparc, Linux _) -> pure "linux-sparc"
|
|
||||||
(A_ARM64, Darwin ) -> pure "macosx-aarch64"
|
|
||||||
(A_ARM64, FreeBSD) -> pure "freebsd-aarch64"
|
|
||||||
(arch', os') -> throwE $ UnsupportedSetupCombo arch' os'
|
|
||||||
|
|
||||||
getStackPlatformKey :: (MonadReader env m, MonadFail m, HasLog env, MonadCatch m, MonadIO m)
|
|
||||||
=> PlatformRequest
|
|
||||||
-> Excepts '[UnsupportedSetupCombo, ParseError, NoCompatiblePlatform, NoCompatibleArch, DistroNotFound, ProcessError] m [String]
|
|
||||||
getStackPlatformKey pfreq@PlatformRequest{..} = do
|
|
||||||
osKey <- liftE $ getStackOSKey pfreq
|
|
||||||
builds <- liftE $ getStackGhcBuilds (PlatformResult _rPlatform _rVersion)
|
|
||||||
let builds' = (\build -> if null build then osKey else osKey <> "-" <> build) <$> builds
|
|
||||||
logDebug $ "Potential GHC builds: " <> mconcat (L.intersperse ", " $ fmap T.pack builds')
|
|
||||||
pure builds'
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,6 @@ import Control.Monad.Reader
|
|||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Text.PrettyPrint.HughesPJClass ( Pretty )
|
import Text.PrettyPrint.HughesPJClass ( Pretty )
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import System.Environment (getEnvironment)
|
|
||||||
import qualified Data.Map.Strict as Map
|
|
||||||
import System.FilePath
|
|
||||||
import Data.List (intercalate)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -92,25 +88,3 @@ throwSomeE :: forall es' es a m. (Monad m, LiftVariant es' es) => V es' -> Excep
|
|||||||
{-# INLINABLE throwSomeE #-}
|
{-# INLINABLE throwSomeE #-}
|
||||||
throwSomeE = Excepts . pure . VLeft . liftVariant
|
throwSomeE = Excepts . pure . VLeft . liftVariant
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
addToPath :: [FilePath]
|
|
||||||
-> Bool -- ^ if False will prepend
|
|
||||||
-> IO [(String, String)]
|
|
||||||
addToPath paths append = do
|
|
||||||
cEnv <- getEnvironment
|
|
||||||
return $ addToPath' cEnv paths append
|
|
||||||
|
|
||||||
addToPath' :: [(String, String)]
|
|
||||||
-> [FilePath]
|
|
||||||
-> Bool -- ^ if False will prepend
|
|
||||||
-> [(String, String)]
|
|
||||||
addToPath' cEnv' newPaths append =
|
|
||||||
let cEnv = Map.fromList cEnv'
|
|
||||||
paths = ["PATH", "Path"]
|
|
||||||
curPaths = (\x -> maybe [] splitSearchPath (Map.lookup x cEnv)) =<< paths
|
|
||||||
{- HLINT ignore "Redundant bracket" -}
|
|
||||||
newPath = intercalate [searchPathSeparator] (if append then (curPaths ++ newPaths) else (newPaths ++ curPaths))
|
|
||||||
envWithoutPath = foldr (\x y -> Map.delete x y) cEnv paths
|
|
||||||
pathVar = if isWindows then "Path" else "PATH"
|
|
||||||
envWithNewPath = Map.toList $ Map.insert pathVar newPath envWithoutPath
|
|
||||||
in envWithNewPath
|
|
||||||
|
|||||||
@@ -387,7 +387,7 @@ rmLink fp
|
|||||||
--
|
--
|
||||||
-- This overwrites previously existing files.
|
-- This overwrites previously existing files.
|
||||||
--
|
--
|
||||||
-- On windows, this requires that 'ensureShimGen' was run beforehand.
|
-- On windows, this requires that 'ensureGlobalTools' was run beforehand.
|
||||||
createLink :: ( MonadMask m
|
createLink :: ( MonadMask m
|
||||||
, MonadThrow m
|
, MonadThrow m
|
||||||
, HasLog env
|
, HasLog env
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ recreateSymlink symsource newsym fail' = do
|
|||||||
createSymbolicLink sympoint newsym
|
createSymbolicLink sympoint newsym
|
||||||
|
|
||||||
|
|
||||||
-- copies files, recreates symlinks, fails on all other types
|
-- copys files, recreates symlinks, fails on all other types
|
||||||
install :: FilePath -> FilePath -> Bool -> IO ()
|
install :: FilePath -> FilePath -> Bool -> IO ()
|
||||||
install from to fail' = do
|
install from to fail' = do
|
||||||
fs <- PF.getSymbolicLinkStatus from
|
fs <- PF.getSymbolicLinkStatus from
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ logInternal logLevel msg = do
|
|||||||
Info -> style' "[ Info ]"
|
Info -> style' "[ Info ]"
|
||||||
Warn -> style' "[ Warn ]"
|
Warn -> style' "[ Warn ]"
|
||||||
Error -> style' "[ Error ]"
|
Error -> style' "[ Error ]"
|
||||||
let strs = T.split (== '\n') . T.dropWhileEnd (`elem` ("\n\r" :: String)) $ msg
|
let strs = T.split (== '\n') msg
|
||||||
let out = case strs of
|
let out = case strs of
|
||||||
[] -> T.empty
|
[] -> T.empty
|
||||||
(x:xs) ->
|
(x:xs) ->
|
||||||
|
|||||||
@@ -91,16 +91,18 @@ ghcTargetVerP =
|
|||||||
verP' :: MP.Parsec Void Text Text
|
verP' :: MP.Parsec Void Text Text
|
||||||
verP' = do
|
verP' = do
|
||||||
v <- version'
|
v <- version'
|
||||||
let startsWithDigits =
|
let startsWithDigists =
|
||||||
and
|
and
|
||||||
. take 3
|
. take 3
|
||||||
. map (\case
|
. concatMap
|
||||||
Numeric _ -> True
|
(map
|
||||||
Alphanum _ -> False)
|
(\case
|
||||||
|
(Digits _) -> True
|
||||||
|
(Str _) -> False
|
||||||
|
) . NE.toList)
|
||||||
. NE.toList
|
. NE.toList
|
||||||
. (\(Chunks nec) -> nec)
|
|
||||||
$ _vChunks v
|
$ _vChunks v
|
||||||
if startsWithDigits && isNothing (_vEpoch v)
|
if startsWithDigists && isNothing (_vEpoch v)
|
||||||
then pure $ prettyVer v
|
then pure $ prettyVer v
|
||||||
else fail "Oh"
|
else fail "Oh"
|
||||||
|
|
||||||
@@ -120,17 +122,3 @@ verP suffix = do
|
|||||||
|
|
||||||
pathSep :: MP.Parsec Void Text Char
|
pathSep :: MP.Parsec Void Text Char
|
||||||
pathSep = MP.oneOf pathSeparators
|
pathSep = MP.oneOf pathSeparators
|
||||||
|
|
||||||
skipWhile :: (Char -> Bool) -> MP.Parsec Void Text ()
|
|
||||||
skipWhile f = void $ MP.takeWhileP Nothing f
|
|
||||||
|
|
||||||
skip :: (Char -> Bool) -> MP.Parsec Void Text ()
|
|
||||||
skip f = void $ MP.satisfy f
|
|
||||||
|
|
||||||
skipSpace :: MP.Parsec Void Text ()
|
|
||||||
skipSpace = void $ MP.satisfy isSpace
|
|
||||||
|
|
||||||
isSpace :: Char -> Bool
|
|
||||||
isSpace c = (c == ' ') || ('\t' <= c && c <= '\r')
|
|
||||||
{-# INLINE isSpace #-}
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ Portability : portable
|
|||||||
-}
|
-}
|
||||||
module GHCup.Prelude.Process (
|
module GHCup.Prelude.Process (
|
||||||
executeOut,
|
executeOut,
|
||||||
executeOut',
|
|
||||||
execLogged,
|
execLogged,
|
||||||
exec,
|
exec,
|
||||||
toProcessError,
|
toProcessError,
|
||||||
|
|||||||
@@ -70,16 +70,6 @@ executeOut path args chdir = liftIO $ captureOutStreams $ do
|
|||||||
maybe (pure ()) changeWorkingDirectory chdir
|
maybe (pure ()) changeWorkingDirectory chdir
|
||||||
SPP.executeFile path True args Nothing
|
SPP.executeFile path True args Nothing
|
||||||
|
|
||||||
executeOut' :: MonadIO m
|
|
||||||
=> FilePath -- ^ command as filename, e.g. 'ls'
|
|
||||||
-> [String] -- ^ arguments to the command
|
|
||||||
-> Maybe FilePath -- ^ chdir to this path
|
|
||||||
-> Maybe [(String, String)]
|
|
||||||
-> m CapturedProcess
|
|
||||||
executeOut' path args chdir env = liftIO $ captureOutStreams $ do
|
|
||||||
maybe (pure ()) changeWorkingDirectory chdir
|
|
||||||
SPP.executeFile path True args env
|
|
||||||
|
|
||||||
|
|
||||||
execLogged :: ( MonadReader env m
|
execLogged :: ( MonadReader env m
|
||||||
, HasSettings env
|
, HasSettings env
|
||||||
@@ -148,7 +138,7 @@ execLogged exe args chdir lfile env = do
|
|||||||
void $ SPIB.fdWrite fileFd (bs' <> "\n")
|
void $ SPIB.fdWrite fileFd (bs' <> "\n")
|
||||||
void $ SPIB.fdWrite stdOutput (bs' <> "\n")
|
void $ SPIB.fdWrite stdOutput (bs' <> "\n")
|
||||||
|
|
||||||
-- Reads fdIn and logs the output in a continuous scrolling area
|
-- Reads fdIn and logs the output in a continous scrolling area
|
||||||
-- of 'size' terminal lines. Also writes to a log file.
|
-- of 'size' terminal lines. Also writes to a log file.
|
||||||
printToRegion :: Fd -> Fd -> Int -> MVar Bool -> Bool -> IO ()
|
printToRegion :: Fd -> Fd -> Int -> MVar Bool -> Bool -> IO ()
|
||||||
printToRegion fileFd fdIn size pState no_color = do
|
printToRegion fileFd fdIn size pState no_color = do
|
||||||
@@ -179,7 +169,7 @@ execLogged exe args chdir lfile env = do
|
|||||||
overwriteNthLine n str = pos1 <> moveLineUp n <> clearLine <> str <> moveLineDown n <> pos1
|
overwriteNthLine n str = pos1 <> moveLineUp n <> clearLine <> str <> moveLineDown n <> pos1
|
||||||
|
|
||||||
blue :: ByteString -> ByteString
|
blue :: ByteString -> ByteString
|
||||||
blue bs
|
blue bs
|
||||||
| no_color = bs
|
| no_color = bs
|
||||||
| otherwise = "\x1b[0;34m" <> bs <> "\x1b[0m"
|
| otherwise = "\x1b[0;34m" <> bs <> "\x1b[0m"
|
||||||
|
|
||||||
|
|||||||
@@ -140,16 +140,8 @@ executeOut :: MonadIO m
|
|||||||
-> [String] -- ^ arguments to the command
|
-> [String] -- ^ arguments to the command
|
||||||
-> Maybe FilePath -- ^ chdir to this path
|
-> Maybe FilePath -- ^ chdir to this path
|
||||||
-> m CapturedProcess
|
-> m CapturedProcess
|
||||||
executeOut path args chdir = executeOut' path args chdir Nothing
|
executeOut path args chdir = do
|
||||||
|
cp <- createProcessWithMingwPath ((proc path args){ cwd = chdir })
|
||||||
executeOut' :: MonadIO m
|
|
||||||
=> FilePath -- ^ command as filename, e.g. 'ls'
|
|
||||||
-> [String] -- ^ arguments to the command
|
|
||||||
-> Maybe FilePath -- ^ chdir to this path
|
|
||||||
-> Maybe [(String, String)]
|
|
||||||
-> m CapturedProcess
|
|
||||||
executeOut' path args chdir env' = do
|
|
||||||
cp <- createProcessWithMingwPath ((proc path args){ cwd = chdir, env = env' })
|
|
||||||
(exit, out, err) <- liftIO $ readCreateProcessWithExitCodeBS cp ""
|
(exit, out, err) <- liftIO $ readCreateProcessWithExitCodeBS cp ""
|
||||||
pure $ CapturedProcess exit out err
|
pure $ CapturedProcess exit out err
|
||||||
|
|
||||||
|
|||||||
@@ -26,14 +26,36 @@ import GHC.Base
|
|||||||
#endif
|
#endif
|
||||||
import Language.Haskell.TH
|
import Language.Haskell.TH
|
||||||
import Language.Haskell.TH.Quote ( QuasiQuoter(..) )
|
import Language.Haskell.TH.Quote ( QuasiQuoter(..) )
|
||||||
import Language.Haskell.TH.Syntax ( dataToExpQ )
|
import Language.Haskell.TH.Syntax ( Lift
|
||||||
|
, dataToExpQ
|
||||||
|
)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Language.Haskell.TH.Syntax as TH
|
import qualified Language.Haskell.TH.Syntax as TH
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
deriving instance Data Versioning
|
||||||
|
deriving instance Lift Versioning
|
||||||
|
deriving instance Data Version
|
||||||
|
deriving instance Lift Version
|
||||||
|
deriving instance Data SemVer
|
||||||
|
deriving instance Lift SemVer
|
||||||
|
deriving instance Data Mess
|
||||||
|
deriving instance Lift Mess
|
||||||
|
deriving instance Data MChunk
|
||||||
|
deriving instance Lift MChunk
|
||||||
|
deriving instance Data PVP
|
||||||
|
deriving instance Lift PVP
|
||||||
|
deriving instance Lift VSep
|
||||||
|
deriving instance Data VSep
|
||||||
|
deriving instance Lift VUnit
|
||||||
|
deriving instance Data VUnit
|
||||||
|
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
deriving instance Lift (NonEmpty Word)
|
deriving instance Lift (NonEmpty Word)
|
||||||
|
deriving instance Lift (NonEmpty VChunk)
|
||||||
deriving instance Lift (NonEmpty MChunk)
|
deriving instance Lift (NonEmpty MChunk)
|
||||||
|
deriving instance Lift (NonEmpty VUnit)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qq :: (Text -> Q Exp) -> QuasiQuoter
|
qq :: (Text -> Q Exp) -> QuasiQuoter
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import GHCup.Prelude
|
|||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
import GHCup.Prelude.Logger
|
import GHCup.Prelude.Logger
|
||||||
|
|
||||||
|
import Codec.Archive ( ArchiveResult )
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@@ -233,7 +234,7 @@ setStack ver = do
|
|||||||
|
|
||||||
liftIO (isShadowed stackbin) >>= \case
|
liftIO (isShadowed stackbin) >>= \case
|
||||||
Nothing -> pure ()
|
Nothing -> pure ()
|
||||||
Just pa -> lift $ logWarn $ T.pack $ prettyHFError (ToolShadowed Stack pa stackbin ver)
|
Just pa -> lift $ logWarn $ T.pack $ prettyHFError (ToolShadowed Cabal pa stackbin ver)
|
||||||
|
|
||||||
pure ()
|
pure ()
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,10 @@ module GHCup.Types
|
|||||||
( module GHCup.Types
|
( module GHCup.Types
|
||||||
#if defined(BRICK)
|
#if defined(BRICK)
|
||||||
, Key(..)
|
, Key(..)
|
||||||
, Modifier(..)
|
|
||||||
#endif
|
#endif
|
||||||
, ArchiveResult(..)
|
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import GHCup.Types.Stack ( SetupInfo )
|
|
||||||
import GHCup.Utils.Tar.Types ( ArchiveResult(..) )
|
|
||||||
import {-# SOURCE #-} GHCup.Utils.Dirs ( fromGHCupPath, GHCupPath )
|
import {-# SOURCE #-} GHCup.Utils.Dirs ( fromGHCupPath, GHCupPath )
|
||||||
|
|
||||||
import Control.DeepSeq ( NFData, rnf )
|
import Control.DeepSeq ( NFData, rnf )
|
||||||
@@ -43,13 +39,14 @@ import Optics ( makeLenses )
|
|||||||
import Text.PrettyPrint.HughesPJClass (Pretty, pPrint, text)
|
import Text.PrettyPrint.HughesPJClass (Pretty, pPrint, text)
|
||||||
import URI.ByteString
|
import URI.ByteString
|
||||||
#if defined(BRICK)
|
#if defined(BRICK)
|
||||||
import Graphics.Vty ( Key(..), Modifier(..) )
|
import Graphics.Vty ( Key(..) )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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 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
|
||||||
@@ -58,15 +55,8 @@ data Key = KEsc | KChar Char | KBS | KEnter
|
|||||||
| KFun Int | KBackTab | KPrtScr | KPause | KIns
|
| KFun Int | KBackTab | KPrtScr | KPause | KIns
|
||||||
| KHome | KPageUp | KDel | KEnd | KPageDown | KBegin | KMenu
|
| KHome | KPageUp | KDel | KEnd | KPageDown | KBegin | KMenu
|
||||||
deriving (Eq,Show,Read,Ord,GHC.Generic)
|
deriving (Eq,Show,Read,Ord,GHC.Generic)
|
||||||
|
|
||||||
data Modifier = MShift | MCtrl | MMeta | MAlt
|
|
||||||
deriving (Eq,Show,Read,Ord,GHC.Generic)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
data KeyCombination = KeyCombination { key :: Key, mods :: [Modifier] }
|
|
||||||
deriving (Eq,Show,Read,Ord,GHC.Generic)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
--------------------
|
||||||
--[ GHCInfo Tree ]--
|
--[ GHCInfo Tree ]--
|
||||||
@@ -76,7 +66,7 @@ data KeyCombination = KeyCombination { key :: Key, mods :: [Modifier] }
|
|||||||
data GHCupInfo = GHCupInfo
|
data GHCupInfo = GHCupInfo
|
||||||
{ _toolRequirements :: ToolRequirements
|
{ _toolRequirements :: ToolRequirements
|
||||||
, _ghcupDownloads :: GHCupDownloads
|
, _ghcupDownloads :: GHCupDownloads
|
||||||
, _metadataUpdate :: Maybe URI
|
, _globalTools :: Map GlobalTool DownloadInfo
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic, Eq)
|
deriving (Show, GHC.Generic, Eq)
|
||||||
|
|
||||||
@@ -138,6 +128,14 @@ instance Pretty Tool where
|
|||||||
|
|
||||||
instance NFData Tool
|
instance NFData Tool
|
||||||
|
|
||||||
|
data GlobalTool = ShimGen
|
||||||
|
deriving (Eq, GHC.Generic, Ord, Show, Enum, Bounded)
|
||||||
|
|
||||||
|
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.
|
||||||
@@ -159,17 +157,13 @@ instance NFData VersionInfo
|
|||||||
|
|
||||||
|
|
||||||
-- | A tag. These are currently attached to a version of a tool.
|
-- | A tag. These are currently attached to a version of a tool.
|
||||||
data Tag = Latest -- ^ the latest version of a tool (unique per tool)
|
data Tag = Latest
|
||||||
| Recommended -- ^ the recommended version of a tool (unique per tool)
|
| Recommended
|
||||||
| Prerelease -- ^ denotes a prerelease version
|
| Prerelease
|
||||||
-- (a version should either be 'Prerelease' or
|
| LatestPrerelease
|
||||||
-- 'LatestPrerelease', but not both)
|
| Nightly
|
||||||
| LatestPrerelease -- ^ the latest prerelease (unique per tool)
|
| LatestNightly
|
||||||
| Nightly -- ^ denotes a nightly version
|
| Base PVP
|
||||||
-- (a version should either be 'Nightly' or
|
|
||||||
-- 'LatestNightly', but not both)
|
|
||||||
| LatestNightly -- ^ the latest nightly (unique per tool)
|
|
||||||
| Base PVP -- ^ the base version shipped with GHC
|
|
||||||
| Old -- ^ old versions are hidden by default in TUI
|
| Old -- ^ old versions are hidden by default in TUI
|
||||||
| UnknownTag String -- ^ used for upwardscompat
|
| UnknownTag String -- ^ used for upwardscompat
|
||||||
deriving (Ord, Eq, GHC.Generic, Show) -- FIXME: manual JSON instance
|
deriving (Ord, Eq, GHC.Generic, Show) -- FIXME: manual JSON instance
|
||||||
@@ -195,7 +189,7 @@ instance Pretty Tag where
|
|||||||
pPrint (Base pvp'') = text ("base-" ++ T.unpack (prettyPVP pvp''))
|
pPrint (Base pvp'') = text ("base-" ++ T.unpack (prettyPVP pvp''))
|
||||||
pPrint (UnknownTag t ) = text t
|
pPrint (UnknownTag t ) = text t
|
||||||
pPrint LatestPrerelease = text "latest-prerelease"
|
pPrint LatestPrerelease = text "latest-prerelease"
|
||||||
pPrint LatestNightly = text "latest-prerelease"
|
pPrint LatestNightly = text "latest-prerelease"
|
||||||
pPrint Old = mempty
|
pPrint Old = mempty
|
||||||
|
|
||||||
data Architecture = A_64
|
data Architecture = A_64
|
||||||
@@ -251,18 +245,13 @@ data LinuxDistro = Debian
|
|||||||
| RedHat
|
| RedHat
|
||||||
| Alpine
|
| Alpine
|
||||||
| AmazonLinux
|
| AmazonLinux
|
||||||
| Rocky
|
|
||||||
| Void
|
|
||||||
-- rolling
|
-- rolling
|
||||||
| Gentoo
|
| Gentoo
|
||||||
| Exherbo
|
| Exherbo
|
||||||
-- not known
|
-- not known
|
||||||
| UnknownLinux
|
| UnknownLinux
|
||||||
-- ^ must exit
|
-- ^ must exit
|
||||||
deriving (Eq, GHC.Generic, Ord, Show, Enum, Bounded)
|
deriving (Eq, GHC.Generic, Ord, Show)
|
||||||
|
|
||||||
allDistros :: [LinuxDistro]
|
|
||||||
allDistros = enumFromTo minBound maxBound
|
|
||||||
|
|
||||||
instance NFData LinuxDistro
|
instance NFData LinuxDistro
|
||||||
|
|
||||||
@@ -275,8 +264,6 @@ distroToString CentOS = "centos"
|
|||||||
distroToString RedHat = "redhat"
|
distroToString RedHat = "redhat"
|
||||||
distroToString Alpine = "alpine"
|
distroToString Alpine = "alpine"
|
||||||
distroToString AmazonLinux = "amazon"
|
distroToString AmazonLinux = "amazon"
|
||||||
distroToString Rocky = "rocky"
|
|
||||||
distroToString Void = "void"
|
|
||||||
distroToString Gentoo = "gentoo"
|
distroToString Gentoo = "gentoo"
|
||||||
distroToString Exherbo = "exherbo"
|
distroToString Exherbo = "exherbo"
|
||||||
distroToString UnknownLinux = "unknown"
|
distroToString UnknownLinux = "unknown"
|
||||||
@@ -336,41 +323,15 @@ instance Pretty TarDir where
|
|||||||
|
|
||||||
-- | Where to fetch GHCupDownloads from.
|
-- | Where to fetch GHCupDownloads from.
|
||||||
data URLSource = GHCupURL
|
data URLSource = GHCupURL
|
||||||
| StackSetupURL
|
| OwnSource [Either GHCupInfo URI] -- ^ complete source list
|
||||||
| OwnSource [Either (Either GHCupInfo SetupInfo) URI] -- ^ complete source list
|
| OwnSpec GHCupInfo
|
||||||
| OwnSpec (Either GHCupInfo SetupInfo)
|
| AddSource [Either GHCupInfo URI] -- ^ merge with GHCupURL
|
||||||
| AddSource [Either (Either GHCupInfo SetupInfo) URI] -- ^ merge with GHCupURL
|
deriving (GHC.Generic, Show)
|
||||||
| SimpleList [NewURLSource]
|
|
||||||
deriving (Eq, GHC.Generic, Show)
|
|
||||||
|
|
||||||
data NewURLSource = NewGHCupURL
|
|
||||||
| NewStackSetupURL
|
|
||||||
| NewGHCupInfo GHCupInfo
|
|
||||||
| NewSetupInfo SetupInfo
|
|
||||||
| NewURI URI
|
|
||||||
deriving (Eq, GHC.Generic, Show)
|
|
||||||
|
|
||||||
instance NFData NewURLSource
|
|
||||||
|
|
||||||
fromURLSource :: URLSource -> [NewURLSource]
|
|
||||||
fromURLSource GHCupURL = [NewGHCupURL]
|
|
||||||
fromURLSource StackSetupURL = [NewStackSetupURL]
|
|
||||||
fromURLSource (OwnSource arr) = convert' <$> arr
|
|
||||||
fromURLSource (AddSource arr) = NewGHCupURL:(convert' <$> arr)
|
|
||||||
fromURLSource (SimpleList arr) = arr
|
|
||||||
fromURLSource (OwnSpec (Left gi)) = [NewGHCupInfo gi]
|
|
||||||
fromURLSource (OwnSpec (Right si)) = [NewSetupInfo si]
|
|
||||||
|
|
||||||
convert' :: Either (Either GHCupInfo SetupInfo) URI -> NewURLSource
|
|
||||||
convert' (Left (Left gi)) = NewGHCupInfo gi
|
|
||||||
convert' (Left (Right si)) = NewSetupInfo si
|
|
||||||
convert' (Right uri) = NewURI uri
|
|
||||||
|
|
||||||
instance NFData URLSource
|
instance NFData URLSource
|
||||||
instance NFData (URIRef Absolute) where
|
instance NFData (URIRef Absolute) where
|
||||||
rnf (URI !_ !_ !_ !_ !_) = ()
|
rnf (URI !_ !_ !_ !_ !_) = ()
|
||||||
|
|
||||||
|
|
||||||
data MetaMode = Strict
|
data MetaMode = Strict
|
||||||
| Lax
|
| Lax
|
||||||
deriving (Show, Read, Eq, GHC.Generic)
|
deriving (Show, Read, Eq, GHC.Generic)
|
||||||
@@ -392,7 +353,7 @@ data UserSettings = UserSettings
|
|||||||
, uPlatformOverride :: Maybe PlatformRequest
|
, uPlatformOverride :: Maybe PlatformRequest
|
||||||
, uMirrors :: Maybe DownloadMirrors
|
, uMirrors :: Maybe DownloadMirrors
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic, Eq)
|
deriving (Show, GHC.Generic)
|
||||||
|
|
||||||
defaultUserSettings :: UserSettings
|
defaultUserSettings :: UserSettings
|
||||||
defaultUserSettings = UserSettings Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
|
defaultUserSettings = UserSettings Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
|
||||||
@@ -424,6 +385,7 @@ fromSettings Settings{..} (Just KeyBindings{..}) =
|
|||||||
, kSet = Just bSet
|
, kSet = Just bSet
|
||||||
, kChangelog = Just bChangelog
|
, kChangelog = Just bChangelog
|
||||||
, kShowAll = Just bShowAllVersions
|
, kShowAll = Just bShowAllVersions
|
||||||
|
, kShowAllTools = Just bShowAllTools
|
||||||
}
|
}
|
||||||
in UserSettings {
|
in UserSettings {
|
||||||
uCache = Just cache
|
uCache = Just cache
|
||||||
@@ -442,48 +404,47 @@ fromSettings Settings{..} (Just KeyBindings{..}) =
|
|||||||
}
|
}
|
||||||
|
|
||||||
data UserKeyBindings = UserKeyBindings
|
data UserKeyBindings = UserKeyBindings
|
||||||
{ kUp :: Maybe KeyCombination
|
{ kUp :: Maybe Key
|
||||||
, kDown :: Maybe KeyCombination
|
, kDown :: Maybe Key
|
||||||
, kQuit :: Maybe KeyCombination
|
, kQuit :: Maybe Key
|
||||||
, kInstall :: Maybe KeyCombination
|
, kInstall :: Maybe Key
|
||||||
, kUninstall :: Maybe KeyCombination
|
, kUninstall :: Maybe Key
|
||||||
, kSet :: Maybe KeyCombination
|
, kSet :: Maybe Key
|
||||||
, kChangelog :: Maybe KeyCombination
|
, kChangelog :: Maybe Key
|
||||||
, kShowAll :: Maybe KeyCombination
|
, kShowAll :: Maybe Key
|
||||||
|
, kShowAllTools :: Maybe Key
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic, Eq)
|
deriving (Show, GHC.Generic)
|
||||||
|
|
||||||
data KeyBindings = KeyBindings
|
data KeyBindings = KeyBindings
|
||||||
{ bUp :: KeyCombination
|
{ bUp :: Key
|
||||||
, bDown :: KeyCombination
|
, bDown :: Key
|
||||||
, bQuit :: KeyCombination
|
, bQuit :: Key
|
||||||
, bInstall :: KeyCombination
|
, bInstall :: Key
|
||||||
, bUninstall :: KeyCombination
|
, bUninstall :: Key
|
||||||
, bSet :: KeyCombination
|
, bSet :: Key
|
||||||
, bChangelog :: KeyCombination
|
, bChangelog :: Key
|
||||||
, bShowAllVersions :: KeyCombination
|
, bShowAllVersions :: Key
|
||||||
|
, bShowAllTools :: Key
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic)
|
deriving (Show, GHC.Generic)
|
||||||
|
|
||||||
instance NFData KeyBindings
|
instance NFData KeyBindings
|
||||||
#if !defined(BRICK)
|
#if defined(IS_WINDOWS) || !defined(BRICK)
|
||||||
instance NFData Key
|
instance NFData Key
|
||||||
|
|
||||||
instance NFData Modifier
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
instance NFData KeyCombination
|
|
||||||
|
|
||||||
defaultKeyBindings :: KeyBindings
|
defaultKeyBindings :: KeyBindings
|
||||||
defaultKeyBindings = KeyBindings
|
defaultKeyBindings = KeyBindings
|
||||||
{ bUp = KeyCombination { key = KUp , mods = [] }
|
{ bUp = KUp
|
||||||
, bDown = KeyCombination { key = KDown , mods = [] }
|
, bDown = KDown
|
||||||
, bQuit = KeyCombination { key = KChar 'q', mods = [] }
|
, bQuit = KChar 'q'
|
||||||
, bInstall = KeyCombination { key = KChar 'i', mods = [] }
|
, bInstall = KChar 'i'
|
||||||
, bUninstall = KeyCombination { key = KChar 'u', mods = [] }
|
, bUninstall = KChar 'u'
|
||||||
, bSet = KeyCombination { key = KChar 's', mods = [] }
|
, bSet = KChar 's'
|
||||||
, bChangelog = KeyCombination { key = KChar 'c', mods = [] }
|
, bChangelog = KChar 'c'
|
||||||
, bShowAllVersions = KeyCombination { key = KChar 'a', mods = [] }
|
, bShowAllVersions = KChar 'a'
|
||||||
|
, bShowAllTools = KChar 't'
|
||||||
}
|
}
|
||||||
|
|
||||||
data AppState = AppState
|
data AppState = AppState
|
||||||
|
|||||||
@@ -22,11 +22,8 @@ Portability : portable
|
|||||||
module GHCup.Types.JSON where
|
module GHCup.Types.JSON where
|
||||||
|
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import GHCup.Types.Stack (SetupInfo)
|
|
||||||
import GHCup.Types.JSON.Utils
|
import GHCup.Types.JSON.Utils
|
||||||
import GHCup.Types.JSON.Versions ()
|
|
||||||
import GHCup.Prelude.MegaParsec
|
import GHCup.Prelude.MegaParsec
|
||||||
import GHCup.Utils.URI
|
|
||||||
|
|
||||||
import Control.Applicative ( (<|>) )
|
import Control.Applicative ( (<|>) )
|
||||||
import Data.Aeson hiding (Key)
|
import Data.Aeson hiding (Key)
|
||||||
@@ -34,12 +31,10 @@ import Data.Aeson.TH
|
|||||||
import Data.Aeson.Types hiding (Key)
|
import Data.Aeson.Types hiding (Key)
|
||||||
import Data.ByteString ( ByteString )
|
import Data.ByteString ( ByteString )
|
||||||
import Data.List.NonEmpty ( NonEmpty(..) )
|
import Data.List.NonEmpty ( NonEmpty(..) )
|
||||||
import Data.Maybe
|
|
||||||
import Data.Text.Encoding as E
|
import Data.Text.Encoding as E
|
||||||
import Data.Foldable
|
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import URI.ByteString hiding (parseURI)
|
import URI.ByteString
|
||||||
import Text.Casing
|
import Text.Casing
|
||||||
|
|
||||||
import qualified Data.List.NonEmpty as NE
|
import qualified Data.List.NonEmpty as NE
|
||||||
@@ -53,13 +48,13 @@ deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MetaMo
|
|||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''LinuxDistro
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''LinuxDistro
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VSep
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VSep
|
||||||
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VUnit
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MChunk
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MChunk
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Platform
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Platform
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Mess
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Mess
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Chunk
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Release
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''SemVer
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''SemVer
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Tool
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Tool
|
||||||
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GlobalTool
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''KeepDirs
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''KeepDirs
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Downloader
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Downloader
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GPGSetting
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GPGSetting
|
||||||
@@ -96,7 +91,7 @@ instance ToJSON URI where
|
|||||||
|
|
||||||
instance FromJSON URI where
|
instance FromJSON URI where
|
||||||
parseJSON = withText "URL" $ \t ->
|
parseJSON = withText "URL" $ \t ->
|
||||||
case parseURI (encodeUtf8 t) of
|
case parseURI strictURIParserOptions (encodeUtf8 t) of
|
||||||
Right x -> pure x
|
Right x -> pure x
|
||||||
Left e -> fail . show $ e
|
Left e -> fail . show $ e
|
||||||
|
|
||||||
@@ -116,6 +111,34 @@ instance FromJSONKey GHCTargetVersion where
|
|||||||
Right x -> pure x
|
Right x -> pure x
|
||||||
Left e -> fail $ "Failure in GHCTargetVersion (FromJSONKey)" <> show e
|
Left e -> fail $ "Failure in GHCTargetVersion (FromJSONKey)" <> show e
|
||||||
|
|
||||||
|
instance ToJSON Versioning where
|
||||||
|
toJSON = toJSON . prettyV
|
||||||
|
|
||||||
|
instance FromJSON Versioning where
|
||||||
|
parseJSON = withText "Versioning" $ \t -> case versioning t of
|
||||||
|
Right x -> pure x
|
||||||
|
Left e -> fail $ "Failure in GHCTargetVersion (FromJSON)" <> show e
|
||||||
|
|
||||||
|
instance ToJSONKey Versioning where
|
||||||
|
toJSONKey = toJSONKeyText $ \x -> prettyV x
|
||||||
|
|
||||||
|
instance FromJSONKey Versioning where
|
||||||
|
fromJSONKey = FromJSONKeyTextParser $ \t -> case versioning t of
|
||||||
|
Right x -> pure x
|
||||||
|
Left e -> fail $ "Failure in Versioning (FromJSONKey)" <> show e
|
||||||
|
|
||||||
|
instance ToJSONKey (Maybe Versioning) where
|
||||||
|
toJSONKey = toJSONKeyText $ \case
|
||||||
|
Just x -> prettyV x
|
||||||
|
Nothing -> T.pack "unknown_versioning"
|
||||||
|
|
||||||
|
instance FromJSONKey (Maybe Versioning) where
|
||||||
|
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
||||||
|
if t == T.pack "unknown_versioning" then pure Nothing else just t
|
||||||
|
where
|
||||||
|
just t = case versioning t of
|
||||||
|
Right x -> pure $ Just x
|
||||||
|
Left e -> fail $ "Failure in (Maybe Versioning) (FromJSONKey)" <> show e
|
||||||
|
|
||||||
instance ToJSONKey Platform where
|
instance ToJSONKey Platform where
|
||||||
toJSONKey = toJSONKeyText $ \case
|
toJSONKey = toJSONKeyText $ \case
|
||||||
@@ -152,12 +175,55 @@ instance ToJSONKey Architecture where
|
|||||||
instance FromJSONKey Architecture where
|
instance FromJSONKey Architecture where
|
||||||
fromJSONKey = genericFromJSONKey defaultJSONKeyOptions
|
fromJSONKey = genericFromJSONKey defaultJSONKeyOptions
|
||||||
|
|
||||||
|
instance ToJSONKey (Maybe Version) where
|
||||||
|
toJSONKey = toJSONKeyText $ \case
|
||||||
|
Just x -> prettyVer x
|
||||||
|
Nothing -> T.pack "unknown_version"
|
||||||
|
|
||||||
|
instance FromJSONKey (Maybe Version) where
|
||||||
|
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
||||||
|
if t == T.pack "unknown_version" then pure Nothing else just t
|
||||||
|
where
|
||||||
|
just t = case version t of
|
||||||
|
Right x -> pure $ Just x
|
||||||
|
Left e -> fail $ "Failure in (Maybe Version) (FromJSONKey)" <> show e
|
||||||
|
|
||||||
|
instance ToJSON Version where
|
||||||
|
toJSON = toJSON . prettyVer
|
||||||
|
|
||||||
|
instance FromJSON Version where
|
||||||
|
parseJSON = withText "Version" $ \t -> case version t of
|
||||||
|
Right x -> pure x
|
||||||
|
Left e -> fail $ "Failure in Version (FromJSON)" <> show e
|
||||||
|
|
||||||
|
instance ToJSONKey Version where
|
||||||
|
toJSONKey = toJSONKeyText $ \x -> prettyVer x
|
||||||
|
|
||||||
|
instance FromJSONKey Version where
|
||||||
|
fromJSONKey = FromJSONKeyTextParser $ \t -> case version t of
|
||||||
|
Right x -> pure x
|
||||||
|
Left e -> fail $ "Failure in Version (FromJSONKey)" <> show e
|
||||||
|
|
||||||
|
instance ToJSON PVP where
|
||||||
|
toJSON = toJSON . prettyPVP
|
||||||
|
|
||||||
|
instance FromJSON PVP where
|
||||||
|
parseJSON = withText "PVP" $ \t -> case pvp t of
|
||||||
|
Right x -> pure x
|
||||||
|
Left e -> fail $ "Failure in PVP (FromJSON)" <> show e
|
||||||
|
|
||||||
instance ToJSONKey Tool where
|
instance ToJSONKey Tool where
|
||||||
toJSONKey = genericToJSONKey defaultJSONKeyOptions
|
toJSONKey = genericToJSONKey defaultJSONKeyOptions
|
||||||
|
|
||||||
instance FromJSONKey Tool where
|
instance FromJSONKey Tool where
|
||||||
fromJSONKey = genericFromJSONKey defaultJSONKeyOptions
|
fromJSONKey = genericFromJSONKey defaultJSONKeyOptions
|
||||||
|
|
||||||
|
instance ToJSONKey GlobalTool where
|
||||||
|
toJSONKey = genericToJSONKey defaultJSONKeyOptions
|
||||||
|
|
||||||
|
instance FromJSONKey GlobalTool where
|
||||||
|
fromJSONKey = genericFromJSONKey defaultJSONKeyOptions
|
||||||
|
|
||||||
instance ToJSON TarDir where
|
instance ToJSON TarDir where
|
||||||
toJSON (RealDir p) = toJSON p
|
toJSON (RealDir p) = toJSON p
|
||||||
toJSON (RegexDir r) = object ["RegexDir" .= r]
|
toJSON (RegexDir r) = object ["RegexDir" .= r]
|
||||||
@@ -275,64 +341,33 @@ instance FromJSONKey (Maybe VersionRange) where
|
|||||||
Left e -> fail $ "Failure in (Maybe VersionRange) (FromJSONKey)" <> MP.errorBundlePretty e
|
Left e -> fail $ "Failure in (Maybe VersionRange) (FromJSONKey)" <> MP.errorBundlePretty e
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Requirements
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Requirements
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadInfo
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadInfo
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VersionInfo
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VersionInfo
|
||||||
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GHCupInfo
|
||||||
instance FromJSON GHCupInfo where
|
deriveToJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''URLSource
|
||||||
parseJSON = withObject "GHCupInfo" $ \o -> do
|
|
||||||
toolRequirements' <- o .:? "toolRequirements"
|
|
||||||
metadataUpdate <- o .:? "metadataUpdate"
|
|
||||||
ghcupDownloads' <- o .: "ghcupDownloads"
|
|
||||||
pure (GHCupInfo (fromMaybe mempty toolRequirements') ghcupDownloads' metadataUpdate)
|
|
||||||
|
|
||||||
deriveToJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GHCupInfo
|
|
||||||
|
|
||||||
instance ToJSON NewURLSource where
|
|
||||||
toJSON NewGHCupURL = String "GHCupURL"
|
|
||||||
toJSON NewStackSetupURL = String "StackSetupURL"
|
|
||||||
toJSON (NewGHCupInfo gi) = object [ "ghcup-info" .= gi ]
|
|
||||||
toJSON (NewSetupInfo si) = object [ "setup-info" .= si ]
|
|
||||||
toJSON (NewURI uri) = toJSON uri
|
|
||||||
|
|
||||||
instance ToJSON URLSource where
|
|
||||||
toJSON = toJSON . fromURLSource
|
|
||||||
|
|
||||||
deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Key
|
deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Key
|
||||||
deriveJSON defaultOptions { sumEncoding = ObjectWithSingleField } ''Modifier
|
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' T.unpack . T.stripPrefix (T.pack "k-") . T.pack . kebab $ str' } ''UserKeyBindings
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel, unwrapUnaryRecords = True } ''Port
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel, unwrapUnaryRecords = True } ''Port
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel, unwrapUnaryRecords = True } ''Host
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel, unwrapUnaryRecords = True } ''Host
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''UserInfo
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''UserInfo
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' (T.unpack . T.toLower) . T.stripPrefix (T.pack "authority") . T.pack $ str' } ''Authority
|
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' (T.unpack . T.toLower) . T.stripPrefix (T.pack "authority") . T.pack $ str' } ''Authority
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadMirror
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadMirror
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadMirrors
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''DownloadMirrors
|
||||||
|
deriveToJSON defaultOptions { fieldLabelModifier = kebab } ''Settings
|
||||||
|
deriveToJSON defaultOptions { fieldLabelModifier = drop 2 . kebab } ''KeyBindings -- move under key-bindings key
|
||||||
|
|
||||||
instance FromJSON URLSource where
|
instance FromJSON URLSource where
|
||||||
parseJSON v =
|
parseJSON v =
|
||||||
parseGHCupURL v
|
parseGHCupURL v
|
||||||
<|> parseStackURL v
|
|
||||||
<|> parseOwnSourceLegacy v
|
<|> parseOwnSourceLegacy v
|
||||||
<|> parseOwnSourceNew1 v
|
<|> parseOwnSourceNew1 v
|
||||||
<|> parseOwnSourceNew2 v
|
<|> parseOwnSourceNew2 v
|
||||||
<|> parseOwnSpec v
|
<|> parseOwnSpec v
|
||||||
<|> legacyParseAddSource v
|
<|> legacyParseAddSource v
|
||||||
<|> newParseAddSource v
|
<|> newParseAddSource v
|
||||||
-- new since Stack SetupInfo
|
|
||||||
<|> parseOwnSpecNew v
|
|
||||||
<|> parseOwnSourceNew3 v
|
|
||||||
<|> newParseAddSource2 v
|
|
||||||
-- more lenient versions
|
|
||||||
<|> parseOwnSpecLenient v
|
|
||||||
<|> parseOwnSourceLenient v
|
|
||||||
<|> parseAddSourceLenient v
|
|
||||||
-- simplified list
|
|
||||||
<|> parseNewUrlSource v
|
|
||||||
<|> parseNewUrlSource' v
|
|
||||||
where
|
where
|
||||||
convert'' :: Either GHCupInfo URI -> Either (Either GHCupInfo SetupInfo) URI
|
|
||||||
convert'' (Left gi) = Left (Left gi)
|
|
||||||
convert'' (Right uri) = Right uri
|
|
||||||
|
|
||||||
parseOwnSourceLegacy = withObject "URLSource" $ \o -> do
|
parseOwnSourceLegacy = withObject "URLSource" $ \o -> do
|
||||||
r :: URI <- o .: "OwnSource"
|
r :: URI <- o .: "OwnSource"
|
||||||
pure (OwnSource [Right r])
|
pure (OwnSource [Right r])
|
||||||
@@ -341,100 +376,18 @@ instance FromJSON URLSource where
|
|||||||
pure (OwnSource (fmap Right r))
|
pure (OwnSource (fmap Right r))
|
||||||
parseOwnSourceNew2 = withObject "URLSource" $ \o -> do
|
parseOwnSourceNew2 = withObject "URLSource" $ \o -> do
|
||||||
r :: [Either GHCupInfo URI] <- o .: "OwnSource"
|
r :: [Either GHCupInfo URI] <- o .: "OwnSource"
|
||||||
pure (OwnSource (convert'' <$> r))
|
pure (OwnSource r)
|
||||||
parseOwnSpec = withObject "URLSource" $ \o -> do
|
parseOwnSpec = withObject "URLSource" $ \o -> do
|
||||||
r :: GHCupInfo <- o .: "OwnSpec"
|
r :: GHCupInfo <- o .: "OwnSpec"
|
||||||
pure (OwnSpec $ Left r)
|
pure (OwnSpec r)
|
||||||
parseGHCupURL = withObject "URLSource" $ \o -> do
|
parseGHCupURL = withObject "URLSource" $ \o -> do
|
||||||
_ :: [Value] <- o .: "GHCupURL"
|
_ :: [Value] <- o .: "GHCupURL"
|
||||||
pure GHCupURL
|
pure GHCupURL
|
||||||
parseStackURL = withObject "URLSource" $ \o -> do
|
|
||||||
_ :: [Value] <- o .: "StackSetupURL"
|
|
||||||
pure StackSetupURL
|
|
||||||
legacyParseAddSource = withObject "URLSource" $ \o -> do
|
legacyParseAddSource = withObject "URLSource" $ \o -> do
|
||||||
r :: Either GHCupInfo URI <- o .: "AddSource"
|
r :: Either GHCupInfo URI <- o .: "AddSource"
|
||||||
pure (AddSource [convert'' r])
|
pure (AddSource [r])
|
||||||
newParseAddSource = withObject "URLSource" $ \o -> do
|
newParseAddSource = withObject "URLSource" $ \o -> do
|
||||||
r :: [Either GHCupInfo URI] <- o .: "AddSource"
|
r :: [Either GHCupInfo URI] <- o .: "AddSource"
|
||||||
pure (AddSource (convert'' <$> r))
|
|
||||||
|
|
||||||
-- new since Stack SetupInfo
|
|
||||||
parseOwnSpecNew = withObject "URLSource" $ \o -> do
|
|
||||||
r :: Either GHCupInfo SetupInfo <- o .: "OwnSpec"
|
|
||||||
pure (OwnSpec r)
|
|
||||||
parseOwnSourceNew3 = withObject "URLSource" $ \o -> do
|
|
||||||
r :: [Either (Either GHCupInfo SetupInfo) URI] <- o .: "OwnSource"
|
|
||||||
pure (OwnSource r)
|
|
||||||
newParseAddSource2 = withObject "URLSource" $ \o -> do
|
|
||||||
r :: [Either (Either GHCupInfo SetupInfo) URI] <- o .: "AddSource"
|
|
||||||
pure (AddSource r)
|
pure (AddSource r)
|
||||||
|
|
||||||
-- more lenient versions
|
|
||||||
parseOwnSpecLenient = withObject "URLSource" $ \o -> do
|
|
||||||
spec :: Object <- o .: "OwnSpec"
|
|
||||||
OwnSpec <$> lenientInfoParser spec
|
|
||||||
parseOwnSourceLenient = withObject "URLSource" $ \o -> do
|
|
||||||
mown :: Array <- o .: "OwnSource"
|
|
||||||
OwnSource . toList <$> mapM lenientInfoUriParser mown
|
|
||||||
parseAddSourceLenient = withObject "URLSource" $ \o -> do
|
|
||||||
madd :: Array <- o .: "AddSource"
|
|
||||||
AddSource . toList <$> mapM lenientInfoUriParser madd
|
|
||||||
|
|
||||||
-- simplified
|
|
||||||
parseNewUrlSource = withArray "URLSource" $ \a -> do
|
|
||||||
SimpleList . toList <$> mapM parseJSON a
|
|
||||||
parseNewUrlSource' v' = SimpleList .(:[]) <$> parseJSON v'
|
|
||||||
|
|
||||||
|
|
||||||
lenientInfoUriParser :: Value -> Parser (Either (Either GHCupInfo SetupInfo) URI)
|
|
||||||
lenientInfoUriParser (Object o) = Left <$> lenientInfoParser o
|
|
||||||
lenientInfoUriParser v@(String _) = Right <$> parseJSON v
|
|
||||||
lenientInfoUriParser _ = fail "Unexpected json in lenientInfoUriParser"
|
|
||||||
|
|
||||||
|
|
||||||
lenientInfoParser :: Object -> Parser (Either GHCupInfo SetupInfo)
|
|
||||||
lenientInfoParser o = do
|
|
||||||
setup_info :: Maybe Object <- o .:? "setup-info"
|
|
||||||
case setup_info of
|
|
||||||
Nothing -> do
|
|
||||||
r <- parseJSON (Object o)
|
|
||||||
pure $ Left r
|
|
||||||
Just setup_info' -> do
|
|
||||||
r <- parseJSON (Object setup_info')
|
|
||||||
pure $ Right r
|
|
||||||
|
|
||||||
instance FromJSON NewURLSource where
|
|
||||||
parseJSON v = uri v <|> url v <|> gi v <|> si v
|
|
||||||
where
|
|
||||||
uri = withText "NewURLSource" $ \t -> NewURI <$> parseJSON (String t)
|
|
||||||
url = withText "NewURLSource" $ \t -> case T.unpack t of
|
|
||||||
"GHCupURL" -> pure NewGHCupURL
|
|
||||||
"StackSetupURL" -> pure NewStackSetupURL
|
|
||||||
t' -> fail $ "Unexpected text value in NewURLSource: " <> t'
|
|
||||||
gi = withObject "NewURLSource" $ \o -> do
|
|
||||||
ginfo :: GHCupInfo <- o .: "ghcup-info"
|
|
||||||
pure $ NewGHCupInfo ginfo
|
|
||||||
|
|
||||||
si = withObject "NewURLSource" $ \o -> do
|
|
||||||
sinfo :: SetupInfo <- o .: "setup-info"
|
|
||||||
pure $ NewSetupInfo sinfo
|
|
||||||
|
|
||||||
|
|
||||||
instance FromJSON KeyCombination where
|
|
||||||
parseJSON v = proper v <|> simple v
|
|
||||||
where
|
|
||||||
simple = withObject "KeyCombination" $ \o -> do
|
|
||||||
k <- parseJSON (Object o)
|
|
||||||
pure (KeyCombination k [])
|
|
||||||
proper = withObject "KeyCombination" $ \o -> do
|
|
||||||
k <- o .: "Key"
|
|
||||||
m <- o .: "Mods"
|
|
||||||
pure $ KeyCombination k m
|
|
||||||
|
|
||||||
instance ToJSON KeyCombination where
|
|
||||||
toJSON (KeyCombination k m) = object ["Key" .= k, "Mods" .= m]
|
|
||||||
|
|
||||||
deriveToJSON defaultOptions { fieldLabelModifier = drop 2 . kebab } ''KeyBindings -- move under key-bindings key
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' T.unpack . T.stripPrefix (T.pack "k-") . T.pack . kebab $ str' } ''UserKeyBindings
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' T.unpack . T.stripPrefix (T.pack "u-") . T.pack . kebab $ str' } ''UserSettings
|
deriveJSON defaultOptions { fieldLabelModifier = \str' -> maybe str' T.unpack . T.stripPrefix (T.pack "u-") . T.pack . kebab $ str' } ''UserSettings
|
||||||
deriveToJSON defaultOptions { fieldLabelModifier = kebab } ''Settings
|
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
{-# OPTIONS_GHC -Wno-orphans #-}
|
|
||||||
|
|
||||||
{-# LANGUAGE DataKinds #-}
|
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
|
||||||
{-# LANGUAGE FlexibleInstances #-}
|
|
||||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
|
||||||
|
|
||||||
{-|
|
|
||||||
Module : GHCup.Types.JSON.Versions
|
|
||||||
Description : GHCup Version JSON types/instances
|
|
||||||
Copyright : (c) Julian Ospald, 2020
|
|
||||||
License : LGPL-3.0
|
|
||||||
Maintainer : hasufell@hasufell.de
|
|
||||||
Stability : experimental
|
|
||||||
Portability : portable
|
|
||||||
-}
|
|
||||||
module GHCup.Types.JSON.Versions where
|
|
||||||
|
|
||||||
import Data.Aeson hiding (Key)
|
|
||||||
import Data.Aeson.Types hiding (Key)
|
|
||||||
import Data.Versions
|
|
||||||
|
|
||||||
import qualified Data.Text as T
|
|
||||||
|
|
||||||
instance ToJSON Versioning where
|
|
||||||
toJSON = toJSON . prettyV
|
|
||||||
|
|
||||||
instance FromJSON Versioning where
|
|
||||||
parseJSON = withText "Versioning" $ \t -> case versioning t of
|
|
||||||
Right x -> pure x
|
|
||||||
Left e -> fail $ "Failure in GHCTargetVersion (FromJSON)" <> show e
|
|
||||||
|
|
||||||
instance ToJSONKey Versioning where
|
|
||||||
toJSONKey = toJSONKeyText $ \x -> prettyV x
|
|
||||||
|
|
||||||
instance FromJSONKey Versioning where
|
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t -> case versioning t of
|
|
||||||
Right x -> pure x
|
|
||||||
Left e -> fail $ "Failure in Versioning (FromJSONKey)" <> show e
|
|
||||||
|
|
||||||
instance ToJSONKey (Maybe Versioning) where
|
|
||||||
toJSONKey = toJSONKeyText $ \case
|
|
||||||
Just x -> prettyV x
|
|
||||||
Nothing -> T.pack "unknown_versioning"
|
|
||||||
|
|
||||||
instance FromJSONKey (Maybe Versioning) where
|
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
|
||||||
if t == T.pack "unknown_versioning" then pure Nothing else just t
|
|
||||||
where
|
|
||||||
just t = case versioning t of
|
|
||||||
Right x -> pure $ Just x
|
|
||||||
Left e -> fail $ "Failure in (Maybe Versioning) (FromJSONKey)" <> show e
|
|
||||||
|
|
||||||
instance ToJSONKey (Maybe Version) where
|
|
||||||
toJSONKey = toJSONKeyText $ \case
|
|
||||||
Just x -> prettyVer x
|
|
||||||
Nothing -> T.pack "unknown_version"
|
|
||||||
|
|
||||||
instance FromJSONKey (Maybe Version) where
|
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t ->
|
|
||||||
if t == T.pack "unknown_version" then pure Nothing else just t
|
|
||||||
where
|
|
||||||
just t = case version t of
|
|
||||||
Right x -> pure $ Just x
|
|
||||||
Left e -> fail $ "Failure in (Maybe Version) (FromJSONKey)" <> show e
|
|
||||||
|
|
||||||
instance ToJSON Version where
|
|
||||||
toJSON = toJSON . prettyVer
|
|
||||||
|
|
||||||
instance FromJSON Version where
|
|
||||||
parseJSON = withText "Version" $ \t -> case version t of
|
|
||||||
Right x -> pure x
|
|
||||||
Left e -> fail $ "Failure in Version (FromJSON)" <> show e
|
|
||||||
|
|
||||||
instance ToJSONKey Version where
|
|
||||||
toJSONKey = toJSONKeyText $ \x -> prettyVer x
|
|
||||||
|
|
||||||
instance FromJSONKey Version where
|
|
||||||
fromJSONKey = FromJSONKeyTextParser $ \t -> case version t of
|
|
||||||
Right x -> pure x
|
|
||||||
Left e -> fail $ "Failure in Version (FromJSONKey)" <> show e
|
|
||||||
|
|
||||||
instance ToJSON PVP where
|
|
||||||
toJSON = toJSON . prettyPVP
|
|
||||||
|
|
||||||
instance FromJSON PVP where
|
|
||||||
parseJSON = withText "PVP" $ \t -> case pvp t of
|
|
||||||
Right x -> pure x
|
|
||||||
Left e -> fail $ "Failure in PVP (FromJSON)" <> show e
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
{-# OPTIONS_GHC -Wno-orphans #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
{-# LANGUAGE RecordWildCards #-}
|
|
||||||
{-# LANGUAGE FlexibleInstances #-}
|
|
||||||
|
|
||||||
{-|
|
|
||||||
Module : GHCup.Types.Stack
|
|
||||||
Description : GHCup types.Stack
|
|
||||||
Copyright : (c) Julian Ospald, 2023
|
|
||||||
License : LGPL-3.0
|
|
||||||
Maintainer : hasufell@hasufell.de
|
|
||||||
Stability : experimental
|
|
||||||
Portability : portable
|
|
||||||
-}
|
|
||||||
module GHCup.Types.Stack where
|
|
||||||
|
|
||||||
import GHCup.Types.JSON.Versions ()
|
|
||||||
|
|
||||||
import Control.Applicative
|
|
||||||
import Control.DeepSeq ( NFData )
|
|
||||||
import Data.ByteString
|
|
||||||
import Data.Aeson
|
|
||||||
import Data.Aeson.Types
|
|
||||||
import Data.Map.Strict ( Map )
|
|
||||||
import Data.Text ( Text )
|
|
||||||
import Data.Text.Encoding
|
|
||||||
import Data.Versions
|
|
||||||
|
|
||||||
import qualified Data.Map as Map
|
|
||||||
import qualified GHC.Generics as GHC
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------
|
|
||||||
--[ Stack download info copy pasta ]--
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
data SetupInfo = SetupInfo
|
|
||||||
{ siSevenzExe :: Maybe DownloadInfo
|
|
||||||
, siSevenzDll :: Maybe DownloadInfo
|
|
||||||
, siMsys2 :: Map Text VersionedDownloadInfo
|
|
||||||
, siGHCs :: Map Text (Map Version GHCDownloadInfo)
|
|
||||||
, siStack :: Map Text (Map Version DownloadInfo)
|
|
||||||
}
|
|
||||||
deriving (Show, Eq, GHC.Generic)
|
|
||||||
|
|
||||||
instance NFData SetupInfo
|
|
||||||
|
|
||||||
instance FromJSON SetupInfo where
|
|
||||||
parseJSON = withObject "SetupInfo" $ \o -> do
|
|
||||||
siSevenzExe <- o .:? "sevenzexe-info"
|
|
||||||
siSevenzDll <- o .:? "sevenzdll-info"
|
|
||||||
siMsys2 <- o .:? "msys2" .!= mempty
|
|
||||||
siGHCs <- o .: "ghc"
|
|
||||||
siStack <- o .:? "stack" .!= mempty
|
|
||||||
pure SetupInfo {..}
|
|
||||||
|
|
||||||
instance ToJSON SetupInfo where
|
|
||||||
toJSON (SetupInfo {..}) = object [ "sevenzexe-info" .= siSevenzExe
|
|
||||||
, "sevenzdll-info" .= siSevenzDll
|
|
||||||
, "msys2" .= siMsys2
|
|
||||||
, "ghc" .= siGHCs
|
|
||||||
, "stack" .= siStack
|
|
||||||
]
|
|
||||||
|
|
||||||
-- | For the @siGHCs@ field maps are deeply merged. For all fields the values
|
|
||||||
-- from the first @SetupInfo@ win.
|
|
||||||
instance Semigroup SetupInfo where
|
|
||||||
l <> r =
|
|
||||||
SetupInfo
|
|
||||||
{ siSevenzExe = siSevenzExe l <|> siSevenzExe r
|
|
||||||
, siSevenzDll = siSevenzDll l <|> siSevenzDll r
|
|
||||||
, siMsys2 = siMsys2 l <> siMsys2 r
|
|
||||||
, siGHCs = Map.unionWith (<>) (siGHCs l) (siGHCs r)
|
|
||||||
, siStack = Map.unionWith (<>) (siStack l) (siStack r) }
|
|
||||||
|
|
||||||
instance Monoid SetupInfo where
|
|
||||||
mempty =
|
|
||||||
SetupInfo
|
|
||||||
{ siSevenzExe = Nothing
|
|
||||||
, siSevenzDll = Nothing
|
|
||||||
, siMsys2 = Map.empty
|
|
||||||
, siGHCs = Map.empty
|
|
||||||
, siStack = Map.empty
|
|
||||||
}
|
|
||||||
mappend = (<>)
|
|
||||||
|
|
||||||
-- | Build of the compiler distribution (e.g. standard, gmp4, tinfo6)
|
|
||||||
-- | Information for a file to download.
|
|
||||||
data DownloadInfo = DownloadInfo
|
|
||||||
{ downloadInfoUrl :: Text
|
|
||||||
-- ^ URL or absolute file path
|
|
||||||
, downloadInfoContentLength :: Maybe Int
|
|
||||||
, downloadInfoSha1 :: Maybe ByteString
|
|
||||||
, downloadInfoSha256 :: Maybe ByteString
|
|
||||||
}
|
|
||||||
deriving (Show, Eq, GHC.Generic)
|
|
||||||
|
|
||||||
instance ToJSON DownloadInfo where
|
|
||||||
toJSON (DownloadInfo {..}) = object [ "url" .= downloadInfoUrl
|
|
||||||
, "content-length" .= downloadInfoContentLength
|
|
||||||
, "sha1" .= (decodeUtf8 <$> downloadInfoSha1)
|
|
||||||
, "sha256" .= (decodeUtf8 <$> downloadInfoSha256)
|
|
||||||
]
|
|
||||||
|
|
||||||
instance NFData DownloadInfo
|
|
||||||
|
|
||||||
instance FromJSON DownloadInfo where
|
|
||||||
parseJSON = withObject "DownloadInfo" parseDownloadInfoFromObject
|
|
||||||
|
|
||||||
-- | Parse JSON in existing object for 'DownloadInfo'
|
|
||||||
parseDownloadInfoFromObject :: Object -> Parser DownloadInfo
|
|
||||||
parseDownloadInfoFromObject o = do
|
|
||||||
url <- o .: "url"
|
|
||||||
contentLength <- o .:? "content-length"
|
|
||||||
sha1TextMay <- o .:? "sha1"
|
|
||||||
sha256TextMay <- o .:? "sha256"
|
|
||||||
pure
|
|
||||||
DownloadInfo
|
|
||||||
{ downloadInfoUrl = url
|
|
||||||
, downloadInfoContentLength = contentLength
|
|
||||||
, downloadInfoSha1 = fmap encodeUtf8 sha1TextMay
|
|
||||||
, downloadInfoSha256 = fmap encodeUtf8 sha256TextMay
|
|
||||||
}
|
|
||||||
|
|
||||||
data VersionedDownloadInfo = VersionedDownloadInfo
|
|
||||||
{ vdiVersion :: Version
|
|
||||||
, vdiDownloadInfo :: DownloadInfo
|
|
||||||
}
|
|
||||||
deriving (Show, Eq, GHC.Generic)
|
|
||||||
|
|
||||||
instance ToJSON VersionedDownloadInfo where
|
|
||||||
toJSON (VersionedDownloadInfo {vdiDownloadInfo = DownloadInfo{..}, ..})
|
|
||||||
= object [ "version" .= vdiVersion
|
|
||||||
, "url" .= downloadInfoUrl
|
|
||||||
, "content-length" .= downloadInfoContentLength
|
|
||||||
, "sha1" .= (decodeUtf8 <$> downloadInfoSha1)
|
|
||||||
, "sha256" .= (decodeUtf8 <$> downloadInfoSha256)
|
|
||||||
]
|
|
||||||
|
|
||||||
instance NFData VersionedDownloadInfo
|
|
||||||
|
|
||||||
instance FromJSON VersionedDownloadInfo where
|
|
||||||
parseJSON = withObject "VersionedDownloadInfo" $ \o -> do
|
|
||||||
ver' <- o .: "version"
|
|
||||||
downloadInfo <- parseDownloadInfoFromObject o
|
|
||||||
pure VersionedDownloadInfo
|
|
||||||
{ vdiVersion = ver'
|
|
||||||
, vdiDownloadInfo = downloadInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
data GHCDownloadInfo = GHCDownloadInfo
|
|
||||||
{ gdiConfigureOpts :: [Text]
|
|
||||||
, gdiConfigureEnv :: Map Text Text
|
|
||||||
, gdiDownloadInfo :: DownloadInfo
|
|
||||||
}
|
|
||||||
deriving (Show, Eq, GHC.Generic)
|
|
||||||
|
|
||||||
instance NFData GHCDownloadInfo
|
|
||||||
|
|
||||||
instance ToJSON GHCDownloadInfo where
|
|
||||||
toJSON (GHCDownloadInfo {gdiDownloadInfo = DownloadInfo {..}, ..})
|
|
||||||
= object [ "configure-opts" .= gdiConfigureOpts
|
|
||||||
, "configure-env" .= gdiConfigureEnv
|
|
||||||
, "url" .= downloadInfoUrl
|
|
||||||
, "content-length" .= downloadInfoContentLength
|
|
||||||
, "sha1" .= (decodeUtf8 <$> downloadInfoSha1)
|
|
||||||
, "sha256" .= (decodeUtf8 <$> downloadInfoSha256)
|
|
||||||
]
|
|
||||||
|
|
||||||
instance FromJSON GHCDownloadInfo where
|
|
||||||
parseJSON = withObject "GHCDownloadInfo" $ \o -> do
|
|
||||||
configureOpts <- o .:? "configure-opts" .!= mempty
|
|
||||||
configureEnv <- o .:? "configure-env" .!= mempty
|
|
||||||
downloadInfo <- parseDownloadInfoFromObject o
|
|
||||||
pure GHCDownloadInfo
|
|
||||||
{ gdiConfigureOpts = configureOpts
|
|
||||||
, gdiConfigureEnv = configureEnv
|
|
||||||
, gdiDownloadInfo = downloadInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -21,9 +21,7 @@ installation and introspection of files/versions etc.
|
|||||||
-}
|
-}
|
||||||
module GHCup.Utils
|
module GHCup.Utils
|
||||||
( module GHCup.Utils.Dirs
|
( module GHCup.Utils.Dirs
|
||||||
, module GHCup.Utils.Tar
|
|
||||||
, module GHCup.Utils
|
, module GHCup.Utils
|
||||||
, module GHCup.Utils.URI
|
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
, module GHCup.Prelude.Windows
|
, module GHCup.Prelude.Windows
|
||||||
#else
|
#else
|
||||||
@@ -44,8 +42,6 @@ import GHCup.Types
|
|||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
import GHCup.Types.JSON ( )
|
import GHCup.Types.JSON ( )
|
||||||
import GHCup.Utils.Dirs
|
import GHCup.Utils.Dirs
|
||||||
import GHCup.Utils.Tar
|
|
||||||
import GHCup.Utils.URI
|
|
||||||
import GHCup.Version
|
import GHCup.Version
|
||||||
import GHCup.Prelude
|
import GHCup.Prelude
|
||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
@@ -53,6 +49,8 @@ import GHCup.Prelude.Logger.Internal
|
|||||||
import GHCup.Prelude.MegaParsec
|
import GHCup.Prelude.MegaParsec
|
||||||
import GHCup.Prelude.Process
|
import GHCup.Prelude.Process
|
||||||
import GHCup.Prelude.String.QQ
|
import GHCup.Prelude.String.QQ
|
||||||
|
|
||||||
|
import Codec.Archive hiding ( Directory )
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
@@ -80,17 +78,21 @@ import System.FilePath
|
|||||||
import System.IO.Error
|
import System.IO.Error
|
||||||
import Text.Regex.Posix
|
import Text.Regex.Posix
|
||||||
import Text.PrettyPrint.HughesPJClass (prettyShow)
|
import Text.PrettyPrint.HughesPJClass (prettyShow)
|
||||||
import URI.ByteString hiding (parseURI)
|
import URI.ByteString
|
||||||
|
|
||||||
|
import qualified Codec.Compression.BZip as BZip
|
||||||
|
import qualified Codec.Compression.GZip as GZip
|
||||||
|
import qualified Codec.Compression.Lzma as Lzma
|
||||||
|
import qualified Data.ByteString.Lazy as BL
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Encoding as E
|
import qualified Data.Text.Encoding as E
|
||||||
import qualified Text.Megaparsec as MP
|
import qualified Text.Megaparsec as MP
|
||||||
import qualified Data.List.NonEmpty as NE
|
import qualified Data.List.NonEmpty as NE
|
||||||
import qualified Streamly.Prelude as S
|
import qualified Streamly.Prelude as S
|
||||||
|
|
||||||
import Control.DeepSeq (force)
|
import Control.DeepSeq (force)
|
||||||
import GHC.IO (evaluate)
|
import GHC.IO (evaluate)
|
||||||
|
import System.Environment (getEnvironment, setEnv)
|
||||||
import Data.Time (Day(..), diffDays, addDays)
|
import Data.Time (Day(..), diffDays, addDays)
|
||||||
|
|
||||||
|
|
||||||
@@ -117,11 +119,11 @@ import Data.Time (Day(..), diffDays, addDays)
|
|||||||
-- >>> let lc = LoggerConfig { lcPrintDebug = False, consoleOutter = mempty, fileOutter = mempty, fancyColors = False }
|
-- >>> let lc = LoggerConfig { lcPrintDebug = False, consoleOutter = mempty, fileOutter = mempty, fancyColors = False }
|
||||||
-- >>> dirs' <- getAllDirs
|
-- >>> dirs' <- getAllDirs
|
||||||
-- >>> let installedVersions = [ ([pver|8.10.7|], "-debug+lol", Nothing), ([pver|8.10.4|], "", Nothing), ([pver|8.8.4|], "", Nothing), ([pver|8.8.3|], "", Nothing) ]
|
-- >>> let installedVersions = [ ([pver|8.10.7|], "-debug+lol", Nothing), ([pver|8.10.4|], "", Nothing), ([pver|8.8.4|], "", Nothing), ([pver|8.8.3|], "", Nothing) ]
|
||||||
-- >>> let settings = defaultSettings { cache = True, metaCache = 0, noNetwork = True }
|
-- >>> let settings = Settings True 0 False Never Curl False GHCupURL True GPGNone False
|
||||||
-- >>> let leanAppState = LeanAppState settings dirs' defaultKeyBindings lc
|
-- >>> let leanAppState = LeanAppState settings dirs' defaultKeyBindings lc
|
||||||
-- >>> cwd <- getCurrentDirectory
|
-- >>> cwd <- getCurrentDirectory
|
||||||
-- >>> (Right ref) <- pure $ parseURI strictURIParserOptions $ "file://" <> E.encodeUtf8 (T.pack cwd) <> "/data/metadata/" <> (urlBaseName . view pathL' $ ghcupURL)
|
-- >>> (Right ref) <- pure $ parseURI strictURIParserOptions $ "file://" <> E.encodeUtf8 (T.pack cwd) <> "/data/metadata/" <> (urlBaseName . view pathL' $ ghcupURL)
|
||||||
-- >>> (VRight r) <- (fmap . fmap) _ghcupDownloads $ flip runReaderT leanAppState . runE @'[DigestError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError, ContentLengthError] $ liftE $ getBase ref
|
-- >>> (VRight r) <- (fmap . fmap) _ghcupDownloads $ flip runReaderT leanAppState . runE @'[DigestError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError] $ liftE $ getBase ref
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -279,7 +281,7 @@ rmPlainHLS = do
|
|||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|
|
||||||
-- | Whether the given GHC version is installed.
|
-- | Whether the given GHC versin is installed.
|
||||||
ghcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
|
ghcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
|
||||||
ghcInstalled ver = do
|
ghcInstalled ver = do
|
||||||
ghcdir <- ghcupGHCDir ver
|
ghcdir <- ghcupGHCDir ver
|
||||||
@@ -367,9 +369,7 @@ cabalSet = do
|
|||||||
handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
||||||
broken <- liftIO $ isBrokenSymlink cabalbin
|
broken <- liftIO $ isBrokenSymlink cabalbin
|
||||||
if broken
|
if broken
|
||||||
then do
|
then pure Nothing
|
||||||
logWarn $ "Broken symlink at " <> T.pack cabalbin
|
|
||||||
pure Nothing
|
|
||||||
else do
|
else do
|
||||||
link <- liftIO
|
link <- liftIO
|
||||||
$ handleIO' InvalidArgument
|
$ handleIO' InvalidArgument
|
||||||
@@ -466,9 +466,7 @@ stackSet = do
|
|||||||
handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
||||||
broken <- liftIO $ isBrokenSymlink stackBin
|
broken <- liftIO $ isBrokenSymlink stackBin
|
||||||
if broken
|
if broken
|
||||||
then do
|
then pure Nothing
|
||||||
logWarn $ "Broken symlink at " <> T.pack stackBin
|
|
||||||
pure Nothing
|
|
||||||
else do
|
else do
|
||||||
link <- liftIO
|
link <- liftIO
|
||||||
$ handleIO' InvalidArgument
|
$ handleIO' InvalidArgument
|
||||||
@@ -522,17 +520,15 @@ isLegacyHLS ver = do
|
|||||||
|
|
||||||
|
|
||||||
-- Return the currently set hls version, if any.
|
-- Return the currently set hls version, if any.
|
||||||
hlsSet :: (HasLog env, MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version)
|
hlsSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version)
|
||||||
hlsSet = do
|
hlsSet = do
|
||||||
Dirs {..} <- getDirs
|
Dirs {..} <- getDirs
|
||||||
let hlsBin = binDir </> "haskell-language-server-wrapper" <> exeExt
|
let hlsBin = binDir </> "haskell-language-server-wrapper" <> exeExt
|
||||||
|
|
||||||
handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
liftIO $ handleIO' NoSuchThing (\_ -> pure Nothing) $ do
|
||||||
broken <- liftIO $ isBrokenSymlink hlsBin
|
broken <- isBrokenSymlink hlsBin
|
||||||
if broken
|
if broken
|
||||||
then do
|
then pure Nothing
|
||||||
logWarn $ "Broken symlink at " <> T.pack hlsBin
|
|
||||||
pure Nothing
|
|
||||||
else do
|
else do
|
||||||
link <- liftIO $ getLinkTarget hlsBin
|
link <- liftIO $ getLinkTarget hlsBin
|
||||||
Just <$> linkVersion link
|
Just <$> linkVersion link
|
||||||
@@ -560,7 +556,6 @@ hlsSet = do
|
|||||||
-- | Return the GHC versions the currently selected HLS supports.
|
-- | Return the GHC versions the currently selected HLS supports.
|
||||||
hlsGHCVersions :: ( MonadReader env m
|
hlsGHCVersions :: ( MonadReader env m
|
||||||
, HasDirs env
|
, HasDirs env
|
||||||
, HasLog env
|
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadThrow m
|
, MonadThrow m
|
||||||
, MonadCatch m
|
, MonadCatch m
|
||||||
@@ -692,8 +687,10 @@ hlsAllBinaries ver = do
|
|||||||
|
|
||||||
-- | Extract (major, minor) from any version.
|
-- | Extract (major, minor) from any version.
|
||||||
getMajorMinorV :: MonadThrow m => Version -> m (Int, Int)
|
getMajorMinorV :: MonadThrow m => Version -> m (Int, Int)
|
||||||
getMajorMinorV (Version _ (Chunks (Numeric x :| Numeric y : _)) _ _) = pure (fromIntegral x, fromIntegral y)
|
getMajorMinorV Version {..} = case _vChunks of
|
||||||
getMajorMinorV _ = throwM $ ParseError "Could not parse X.Y from version"
|
((Digits x :| []) :| ((Digits y :| []):_)) -> pure (fromIntegral x, fromIntegral y)
|
||||||
|
_ -> throwM $ ParseError "Could not parse X.Y from version"
|
||||||
|
|
||||||
|
|
||||||
matchMajor :: Version -> Int -> Int -> Bool
|
matchMajor :: Version -> Int -> Int -> Bool
|
||||||
matchMajor v' major' minor' = case getMajorMinorV v' of
|
matchMajor v' major' minor' = case getMajorMinorV v' of
|
||||||
@@ -735,7 +732,7 @@ getGHCForPVP pvpIn mt = do
|
|||||||
-- | Like 'getGHCForPVP', except with explicit input parameter.
|
-- | Like 'getGHCForPVP', except with explicit input parameter.
|
||||||
--
|
--
|
||||||
-- >>> getGHCForPVP' [pver|8|] installedVersions Nothing
|
-- >>> getGHCForPVP' [pver|8|] installedVersions Nothing
|
||||||
-- Just (GHCTargetVersion {_tvTarget = Nothing, _tvVersion = Version {_vEpoch = Nothing, _vChunks = Chunks (Numeric 8 :| [Numeric 10,Numeric 7]), _vRel = Just (Release (Alphanum "debug" :| [])), _vMeta = Just "lol"}})
|
-- Just (GHCTargetVersion {_tvTarget = Nothing, _tvVersion = Version {_vEpoch = Nothing, _vChunks = (Digits 8 :| []) :| [Digits 10 :| [],Digits 7 :| []], _vRel = [Str "debug" :| []], _vMeta = Just "lol"}})
|
||||||
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.8|] installedVersions Nothing
|
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.8|] installedVersions Nothing
|
||||||
-- "Just 8.8.4"
|
-- "Just 8.8.4"
|
||||||
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.10.4|] installedVersions Nothing
|
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.10.4|] installedVersions Nothing
|
||||||
@@ -761,11 +758,11 @@ getGHCForPVP' pvpIn ghcs' mt = do
|
|||||||
-- | Get the latest available ghc for the given PVP version, which
|
-- | Get the latest available ghc for the given PVP version, which
|
||||||
-- may only contain parts.
|
-- may only contain parts.
|
||||||
--
|
--
|
||||||
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8|] r
|
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [10,7]})
|
-- Just (PVP {_pComponents = 8 :| [10,7]})
|
||||||
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8.8|] r
|
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
||||||
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8.8.4|] r
|
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8.4|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
||||||
getLatestToolFor :: MonadThrow m
|
getLatestToolFor :: MonadThrow m
|
||||||
=> Tool
|
=> Tool
|
||||||
@@ -782,6 +779,99 @@ getLatestToolFor tool target pvpIn dls = do
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
--[ Unpacking ]--
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- | Unpack an archive to a temporary directory and return that path.
|
||||||
|
unpackToDir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m)
|
||||||
|
=> FilePath -- ^ destination dir
|
||||||
|
-> FilePath -- ^ archive path
|
||||||
|
-> Excepts '[UnknownArchive
|
||||||
|
, ArchiveResult
|
||||||
|
] m ()
|
||||||
|
unpackToDir dfp av = do
|
||||||
|
let fn = takeFileName av
|
||||||
|
lift $ logInfo $ "Unpacking: " <> T.pack fn <> " to " <> T.pack dfp
|
||||||
|
|
||||||
|
let untar :: MonadIO m => BL.ByteString -> Excepts '[ArchiveResult] m ()
|
||||||
|
untar = lEM . liftIO . runArchiveM . unpackToDirLazy dfp
|
||||||
|
|
||||||
|
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
||||||
|
rf = liftIO . BL.readFile
|
||||||
|
|
||||||
|
-- extract, depending on file extension
|
||||||
|
if
|
||||||
|
| ".tar.gz" `isSuffixOf` fn -> liftE
|
||||||
|
(untar . GZip.decompress =<< rf av)
|
||||||
|
| ".tar.xz" `isSuffixOf` fn -> do
|
||||||
|
filecontents <- liftE $ rf av
|
||||||
|
let decompressed = Lzma.decompressWith (Lzma.defaultDecompressParams { Lzma.decompressAutoDecoder= True }) filecontents
|
||||||
|
liftE $ untar decompressed
|
||||||
|
| ".tar.bz2" `isSuffixOf` fn ->
|
||||||
|
liftE (untar . BZip.decompress =<< rf av)
|
||||||
|
| ".tar" `isSuffixOf` fn -> liftE (untar =<< rf av)
|
||||||
|
| ".zip" `isSuffixOf` fn -> liftE (untar =<< rf av)
|
||||||
|
| otherwise -> throwE $ UnknownArchive fn
|
||||||
|
|
||||||
|
|
||||||
|
getArchiveFiles :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m)
|
||||||
|
=> FilePath -- ^ archive path
|
||||||
|
-> Excepts '[UnknownArchive
|
||||||
|
, ArchiveResult
|
||||||
|
] m [FilePath]
|
||||||
|
getArchiveFiles av = do
|
||||||
|
let fn = takeFileName av
|
||||||
|
|
||||||
|
let entries :: Monad m => BL.ByteString -> Excepts '[ArchiveResult] m [FilePath]
|
||||||
|
entries = (fmap . fmap) filepath . lE . readArchiveBSL
|
||||||
|
|
||||||
|
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
||||||
|
rf = liftIO . BL.readFile
|
||||||
|
|
||||||
|
-- extract, depending on file extension
|
||||||
|
if
|
||||||
|
| ".tar.gz" `isSuffixOf` fn -> liftE
|
||||||
|
(entries . GZip.decompress =<< rf av)
|
||||||
|
| ".tar.xz" `isSuffixOf` fn -> do
|
||||||
|
filecontents <- liftE $ rf av
|
||||||
|
let decompressed = Lzma.decompressWith (Lzma.defaultDecompressParams { Lzma.decompressAutoDecoder= True }) filecontents
|
||||||
|
liftE $ entries decompressed
|
||||||
|
| ".tar.bz2" `isSuffixOf` fn ->
|
||||||
|
liftE (entries . BZip.decompress =<< rf av)
|
||||||
|
| ".tar" `isSuffixOf` fn -> liftE (entries =<< rf av)
|
||||||
|
| ".zip" `isSuffixOf` fn -> liftE (entries =<< rf av)
|
||||||
|
| otherwise -> throwE $ UnknownArchive fn
|
||||||
|
|
||||||
|
|
||||||
|
intoSubdir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m, MonadCatch m)
|
||||||
|
=> GHCupPath -- ^ unpacked tar dir
|
||||||
|
-> TarDir -- ^ how to descend
|
||||||
|
-> Excepts '[TarDirDoesNotExist] m GHCupPath
|
||||||
|
intoSubdir bdir tardir = case tardir of
|
||||||
|
RealDir pr -> do
|
||||||
|
whenM (fmap not . liftIO . doesDirectoryExist $ fromGHCupPath (bdir `appendGHCupPath` pr))
|
||||||
|
(throwE $ TarDirDoesNotExist tardir)
|
||||||
|
pure (bdir `appendGHCupPath` pr)
|
||||||
|
RegexDir r -> do
|
||||||
|
let rs = split (`elem` pathSeparators) r
|
||||||
|
foldlM
|
||||||
|
(\y x ->
|
||||||
|
(handleIO (\_ -> pure []) . liftIO . findFiles (fromGHCupPath y) . regex $ x) >>= (\case
|
||||||
|
[] -> throwE $ TarDirDoesNotExist tardir
|
||||||
|
(p : _) -> pure (y `appendGHCupPath` p)) . sort
|
||||||
|
)
|
||||||
|
bdir
|
||||||
|
rs
|
||||||
|
where regex = makeRegexOpts compIgnoreCase execBlank
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------------
|
------------
|
||||||
--[ Tags ]--
|
--[ Tags ]--
|
||||||
------------
|
------------
|
||||||
@@ -835,28 +925,6 @@ getLatestBaseVersion av pvpVer =
|
|||||||
--[ Other ]--
|
--[ Other ]--
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
||||||
intoSubdir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m, MonadCatch m)
|
|
||||||
=> GHCupPath -- ^ unpacked tar dir
|
|
||||||
-> TarDir -- ^ how to descend
|
|
||||||
-> Excepts '[TarDirDoesNotExist] m GHCupPath
|
|
||||||
intoSubdir bdir tardir = case tardir of
|
|
||||||
RealDir pr -> do
|
|
||||||
whenM (fmap not . liftIO . doesDirectoryExist $ fromGHCupPath (bdir `appendGHCupPath` pr))
|
|
||||||
(throwE $ TarDirDoesNotExist tardir)
|
|
||||||
pure (bdir `appendGHCupPath` pr)
|
|
||||||
RegexDir r -> do
|
|
||||||
let rs = split (`elem` pathSeparators) r
|
|
||||||
foldlM
|
|
||||||
(\y x ->
|
|
||||||
(handleIO (\_ -> pure []) . liftIO . findFiles (fromGHCupPath y) . regex $ x) >>= (\case
|
|
||||||
[] -> throwE $ TarDirDoesNotExist tardir
|
|
||||||
(p : _) -> pure (y `appendGHCupPath` p)) . sort
|
|
||||||
)
|
|
||||||
bdir
|
|
||||||
rs
|
|
||||||
where regex = makeRegexOpts compIgnoreCase execBlank
|
|
||||||
|
|
||||||
-- | Usually @~\/.ghcup\/ghc\/\<ver\>\/bin\/@
|
-- | Usually @~\/.ghcup\/ghc\/\<ver\>\/bin\/@
|
||||||
ghcInternalBinDir :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m)
|
ghcInternalBinDir :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m)
|
||||||
=> GHCTargetVersion
|
=> GHCTargetVersion
|
||||||
@@ -891,7 +959,7 @@ ghcToolFiles ver = do
|
|||||||
groupToolFiles = groupBy (\(a, _) (b, _) -> a == b) . fmap (splitOnPVP "-")
|
groupToolFiles = groupBy (\(a, _) (b, _) -> a == b) . fmap (splitOnPVP "-")
|
||||||
|
|
||||||
getUniqueTools :: [[(FilePath, String)]] -> [String]
|
getUniqueTools :: [[(FilePath, String)]] -> [String]
|
||||||
getUniqueTools = filter (isNotAnyInfix blackListedTools) . nub . fmap fst . concatMap (filter ((== "") . snd))
|
getUniqueTools = filter (isNotAnyInfix blackListedTools) . nub . fmap fst . filter ((== "") . snd) . concat
|
||||||
|
|
||||||
blackListedTools :: [String]
|
blackListedTools :: [String]
|
||||||
blackListedTools = ["haddock-ghc"]
|
blackListedTools = ["haddock-ghc"]
|
||||||
@@ -965,7 +1033,7 @@ applyPatches pdir ddir = do
|
|||||||
|
|
||||||
patches <- liftIO $ quilt `catchIO` (\e ->
|
patches <- liftIO $ quilt `catchIO` (\e ->
|
||||||
if isDoesNotExistError e || isPermissionError e then
|
if isDoesNotExistError e || isPermissionError e then
|
||||||
lexicographical
|
lexicographical
|
||||||
else throwIO e)
|
else throwIO e)
|
||||||
forM_ patches $ \patch' -> applyPatch patch' ddir
|
forM_ patches $ \patch' -> applyPatch patch' ddir
|
||||||
|
|
||||||
@@ -1013,7 +1081,7 @@ darwinNotarization :: (MonadReader env m, HasDirs env, MonadIO m)
|
|||||||
-> FilePath
|
-> FilePath
|
||||||
-> m (Either ProcessError ())
|
-> m (Either ProcessError ())
|
||||||
darwinNotarization Darwin path = exec
|
darwinNotarization Darwin path = exec
|
||||||
"/usr/bin/xattr"
|
"xattr"
|
||||||
["-r", "-d", "com.apple.quarantine", path]
|
["-r", "-d", "com.apple.quarantine", path]
|
||||||
Nothing
|
Nothing
|
||||||
Nothing
|
Nothing
|
||||||
@@ -1127,22 +1195,24 @@ getVersionInfo v' tool =
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
ensureShimGen :: ( MonadMask m
|
ensureGlobalTools :: ( MonadMask m
|
||||||
, MonadThrow m
|
, MonadThrow m
|
||||||
, HasLog env
|
, HasLog env
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadReader env m
|
, MonadReader env m
|
||||||
, HasDirs env
|
, HasDirs env
|
||||||
, HasSettings env
|
, HasSettings env
|
||||||
, HasGHCupInfo env
|
, HasGHCupInfo env
|
||||||
, MonadUnliftIO m
|
, MonadUnliftIO m
|
||||||
, MonadFail m
|
, MonadFail m
|
||||||
)
|
)
|
||||||
=> Excepts '[GPGError, DigestError, ContentLengthError, DownloadFailed, NoDownload] m ()
|
=> Excepts '[GPGError, DigestError, ContentLengthError, DownloadFailed, NoDownload] m ()
|
||||||
ensureShimGen
|
ensureGlobalTools
|
||||||
| isWindows = do
|
| isWindows = do
|
||||||
|
(GHCupInfo _ _ gTools) <- lift getGHCupInfo
|
||||||
dirs <- lift getDirs
|
dirs <- lift getDirs
|
||||||
let shimDownload = DownloadInfo shimGenURL Nothing shimGenSHA Nothing Nothing
|
shimDownload <- liftE $ lE @_ @'[NoDownload]
|
||||||
|
$ maybe (Left (NoDownload' ShimGen)) 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..."
|
||||||
@@ -1246,6 +1316,22 @@ warnAboutHlsCompatibility = do
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
addToPath :: FilePath
|
||||||
|
-> Bool -- ^ if False will prepend
|
||||||
|
-> IO [(String, String)]
|
||||||
|
addToPath path append = do
|
||||||
|
cEnv <- Map.fromList <$> getEnvironment
|
||||||
|
let paths = ["PATH", "Path"]
|
||||||
|
curPaths = (\x -> maybe [] splitSearchPath (Map.lookup x cEnv)) =<< paths
|
||||||
|
{- HLINT ignore "Redundant bracket" -}
|
||||||
|
newPath = intercalate [searchPathSeparator] (if append then (curPaths ++ [path]) else (path : curPaths))
|
||||||
|
envWithoutPath = foldr (\x y -> Map.delete x y) cEnv paths
|
||||||
|
pathVar = if isWindows then "Path" else "PATH"
|
||||||
|
envWithNewPath = Map.toList $ Map.insert pathVar newPath envWithoutPath
|
||||||
|
liftIO $ setEnv pathVar newPath
|
||||||
|
return envWithNewPath
|
||||||
|
|
||||||
|
|
||||||
-----------
|
-----------
|
||||||
--[ Git ]--
|
--[ Git ]--
|
||||||
-----------
|
-----------
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ module GHCup.Utils.Dirs
|
|||||||
, relativeSymlink
|
, relativeSymlink
|
||||||
, withGHCupTmpDir
|
, withGHCupTmpDir
|
||||||
, getConfigFilePath
|
, getConfigFilePath
|
||||||
, getConfigFilePath'
|
|
||||||
, useXDG
|
, useXDG
|
||||||
, cleanupTrash
|
, cleanupTrash
|
||||||
|
|
||||||
@@ -361,12 +360,6 @@ getConfigFilePath = do
|
|||||||
confDir <- liftIO ghcupConfigDir
|
confDir <- liftIO ghcupConfigDir
|
||||||
pure $ fromGHCupPath confDir </> "config.yaml"
|
pure $ fromGHCupPath confDir </> "config.yaml"
|
||||||
|
|
||||||
getConfigFilePath' :: (MonadReader env m, HasDirs env) => m FilePath
|
|
||||||
getConfigFilePath' = do
|
|
||||||
Dirs {..} <- getDirs
|
|
||||||
pure $ fromGHCupPath confDir </> "config.yaml"
|
|
||||||
|
|
||||||
|
|
||||||
ghcupConfigFile :: (MonadIO m)
|
ghcupConfigFile :: (MonadIO m)
|
||||||
=> Excepts '[JSONError] m UserSettings
|
=> Excepts '[JSONError] m UserSettings
|
||||||
ghcupConfigFile = do
|
ghcupConfigFile = do
|
||||||
|
|||||||
@@ -1,141 +0,0 @@
|
|||||||
{-# LANGUAGE CPP #-}
|
|
||||||
{-# LANGUAGE DataKinds #-}
|
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
{-|
|
|
||||||
Module : GHCup.Utils.Tar
|
|
||||||
Description : GHCup tar abstractions
|
|
||||||
Copyright : (c) Julian Ospald, 2024
|
|
||||||
License : LGPL-3.0
|
|
||||||
Maintainer : hasufell@hasufell.de
|
|
||||||
Stability : experimental
|
|
||||||
Portability : portable
|
|
||||||
-}
|
|
||||||
module GHCup.Utils.Tar where
|
|
||||||
|
|
||||||
import GHCup.Utils.Tar.Types ( ArchiveResult(..) )
|
|
||||||
import GHCup.Errors
|
|
||||||
import GHCup.Prelude
|
|
||||||
import GHCup.Prelude.Logger.Internal
|
|
||||||
import GHCup.Types.Optics
|
|
||||||
|
|
||||||
import Control.Monad.Catch (MonadThrow)
|
|
||||||
import Control.Monad.Reader
|
|
||||||
import Data.List
|
|
||||||
import Haskus.Utils.Variant.Excepts
|
|
||||||
import System.FilePath
|
|
||||||
|
|
||||||
#if defined(TAR)
|
|
||||||
import Codec.Archive.Zip
|
|
||||||
import qualified Codec.Archive.Tar as Tar
|
|
||||||
import qualified Codec.Archive.Tar.Entry as Tar
|
|
||||||
import qualified Data.Map.Strict as Map
|
|
||||||
#else
|
|
||||||
import Codec.Archive hiding ( Directory
|
|
||||||
, ArchiveResult -- imported from "GHCup.Utils.Tar.Types"
|
|
||||||
)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
import qualified Codec.Compression.BZip as BZip
|
|
||||||
import qualified Codec.Compression.GZip as GZip
|
|
||||||
import qualified Codec.Compression.Lzma as Lzma
|
|
||||||
import qualified Data.ByteString.Lazy as BL
|
|
||||||
import qualified Data.Text as T
|
|
||||||
|
|
||||||
|
|
||||||
-- | Unpack an archive to a given directory.
|
|
||||||
unpackToDir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m)
|
|
||||||
=> FilePath -- ^ destination dir
|
|
||||||
-> FilePath -- ^ archive path
|
|
||||||
-> Excepts '[UnknownArchive
|
|
||||||
, ArchiveResult
|
|
||||||
] m ()
|
|
||||||
unpackToDir dfp av = do
|
|
||||||
let fn = takeFileName av
|
|
||||||
lift $ logInfo $ "Unpacking: " <> T.pack fn <> " to " <> T.pack dfp
|
|
||||||
|
|
||||||
#if defined(TAR)
|
|
||||||
let untar :: MonadIO m => BL.ByteString -> Excepts '[ArchiveResult] m ()
|
|
||||||
untar = liftIO . Tar.unpack dfp . Tar.read
|
|
||||||
|
|
||||||
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
|
||||||
rf = liftIO . BL.readFile
|
|
||||||
#else
|
|
||||||
let untar :: MonadIO m => BL.ByteString -> Excepts '[ArchiveResult] m ()
|
|
||||||
untar = lEM . liftIO . runArchiveM . unpackToDirLazy dfp
|
|
||||||
|
|
||||||
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
|
||||||
rf = liftIO . BL.readFile
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-- extract, depending on file extension
|
|
||||||
if
|
|
||||||
| ".tar.gz" `isSuffixOf` fn -> liftE
|
|
||||||
(untar . GZip.decompress =<< rf av)
|
|
||||||
| ".tar.xz" `isSuffixOf` fn -> do
|
|
||||||
filecontents <- liftE $ rf av
|
|
||||||
let decompressed = Lzma.decompressWith (Lzma.defaultDecompressParams { Lzma.decompressAutoDecoder= True }) filecontents
|
|
||||||
liftE $ untar decompressed
|
|
||||||
| ".tar.bz2" `isSuffixOf` fn ->
|
|
||||||
liftE (untar . BZip.decompress =<< rf av)
|
|
||||||
| ".tar" `isSuffixOf` fn -> liftE (untar =<< rf av)
|
|
||||||
#if defined(TAR)
|
|
||||||
| ".zip" `isSuffixOf` fn -> withArchive av (unpackInto dfp)
|
|
||||||
#else
|
|
||||||
-- libarchive supports zip
|
|
||||||
| ".zip" `isSuffixOf` fn -> liftE (untar =<< rf av)
|
|
||||||
#endif
|
|
||||||
| otherwise -> throwE $ UnknownArchive fn
|
|
||||||
|
|
||||||
|
|
||||||
-- | Get all files from an archive.
|
|
||||||
getArchiveFiles :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m)
|
|
||||||
=> FilePath -- ^ archive path
|
|
||||||
-> Excepts '[ UnknownArchive
|
|
||||||
, ArchiveResult
|
|
||||||
] m [FilePath]
|
|
||||||
getArchiveFiles av = do
|
|
||||||
let fn = takeFileName av
|
|
||||||
#if defined(TAR)
|
|
||||||
let entries :: Monad m => BL.ByteString -> Excepts '[ArchiveResult] m [FilePath]
|
|
||||||
entries =
|
|
||||||
lE @ArchiveResult
|
|
||||||
. Tar.foldEntries
|
|
||||||
(\e x -> fmap (Tar.entryTarPath e :) x)
|
|
||||||
(Right [])
|
|
||||||
(\_ -> Left ArchiveFailed)
|
|
||||||
. Tar.decodeLongNames
|
|
||||||
. Tar.read
|
|
||||||
|
|
||||||
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
|
||||||
rf = liftIO . BL.readFile
|
|
||||||
#else
|
|
||||||
let entries :: Monad m => BL.ByteString -> Excepts '[ArchiveResult] m [FilePath]
|
|
||||||
entries = (fmap . fmap) filepath . lE . readArchiveBSL
|
|
||||||
|
|
||||||
rf :: MonadIO m => FilePath -> Excepts '[ArchiveResult] m BL.ByteString
|
|
||||||
rf = liftIO . BL.readFile
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-- extract, depending on file extension
|
|
||||||
if
|
|
||||||
| ".tar.gz" `isSuffixOf` fn -> liftE
|
|
||||||
(entries . GZip.decompress =<< rf av)
|
|
||||||
| ".tar.xz" `isSuffixOf` fn -> do
|
|
||||||
filecontents <- liftE $ rf av
|
|
||||||
let decompressed = Lzma.decompressWith (Lzma.defaultDecompressParams { Lzma.decompressAutoDecoder= True }) filecontents
|
|
||||||
liftE $ entries decompressed
|
|
||||||
| ".tar.bz2" `isSuffixOf` fn ->
|
|
||||||
liftE (entries . BZip.decompress =<< rf av)
|
|
||||||
| ".tar" `isSuffixOf` fn -> liftE (entries =<< rf av)
|
|
||||||
| ".zip" `isSuffixOf` fn ->
|
|
||||||
#if defined(TAR)
|
|
||||||
withArchive av $ do
|
|
||||||
entries' <- getEntries
|
|
||||||
pure $ fmap unEntrySelector $ Map.keys entries'
|
|
||||||
#else
|
|
||||||
liftE (entries =<< rf av)
|
|
||||||
#endif
|
|
||||||
| otherwise -> throwE $ UnknownArchive fn
|
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
{-# LANGUAGE CPP #-}
|
|
||||||
#if defined(TAR)
|
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
module GHCup.Utils.Tar.Types
|
|
||||||
( ArchiveResult(..)
|
|
||||||
)
|
|
||||||
where
|
|
||||||
|
|
||||||
#if defined(TAR)
|
|
||||||
|
|
||||||
import Control.Exception ( Exception )
|
|
||||||
import Control.DeepSeq ( NFData )
|
|
||||||
import qualified GHC.Generics as GHC
|
|
||||||
|
|
||||||
data ArchiveResult = ArchiveFatal
|
|
||||||
| ArchiveFailed
|
|
||||||
| ArchiveWarn
|
|
||||||
| ArchiveRetry
|
|
||||||
| ArchiveOk
|
|
||||||
| ArchiveEOF
|
|
||||||
deriving (Eq, Show, GHC.Generic)
|
|
||||||
|
|
||||||
instance NFData ArchiveResult
|
|
||||||
|
|
||||||
instance Exception ArchiveResult
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
import Codec.Archive ( ArchiveResult(..) )
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{-# LANGUAGE CPP #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
{-|
|
|
||||||
Module : GHCup.Utils.URI
|
|
||||||
Description : GHCup domain specific URI utilities
|
|
||||||
Copyright : (c) Julian Ospald, 2024
|
|
||||||
License : LGPL-3.0
|
|
||||||
Maintainer : hasufell@hasufell.de
|
|
||||||
Stability : experimental
|
|
||||||
Portability : portable
|
|
||||||
|
|
||||||
This module contains GHCup helpers specific to
|
|
||||||
URI handling.
|
|
||||||
-}
|
|
||||||
module GHCup.Utils.URI where
|
|
||||||
|
|
||||||
import Data.ByteString
|
|
||||||
import URI.ByteString hiding (parseURI)
|
|
||||||
import System.URI.File
|
|
||||||
|
|
||||||
import qualified URI.ByteString as URI
|
|
||||||
|
|
||||||
|
|
||||||
-----------
|
|
||||||
--[ URI ]--
|
|
||||||
-----------
|
|
||||||
|
|
||||||
|
|
||||||
parseURI :: ByteString -> Either URIParseError (URIRef Absolute)
|
|
||||||
parseURI bs = case parseFile bs of
|
|
||||||
Left _ -> case URI.parseURI strictURIParserOptions bs of
|
|
||||||
Right (URI { uriScheme = (Scheme "file") }) ->
|
|
||||||
#if defined(IS_WINDOWS)
|
|
||||||
Left (OtherError "Invalid file URI. File URIs must be absolute (start with a drive letter or UNC path) and not contain backslashes.")
|
|
||||||
#else
|
|
||||||
Left (OtherError "Invalid file URI. File URIs must be absolute.")
|
|
||||||
#endif
|
|
||||||
o -> o
|
|
||||||
Right (FileURI (Just _) _) -> Left $ OtherError "File URIs with auth part are not supported!"
|
|
||||||
Right (FileURI _ fp) -> Right $ URI (Scheme "file") Nothing fp (Query []) Nothing
|
|
||||||
where
|
|
||||||
parseFile
|
|
||||||
#if defined(IS_WINDOWS)
|
|
||||||
= parseFileURI ExtendedWindows
|
|
||||||
#else
|
|
||||||
= parseFileURI ExtendedPosix
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -24,26 +24,17 @@ import qualified Data.Text as T
|
|||||||
import qualified Data.Versions as V
|
import qualified Data.Versions as V
|
||||||
import Control.Exception.Safe (MonadThrow)
|
import Control.Exception.Safe (MonadThrow)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
|
import Data.List.NonEmpty (NonEmpty((:|)))
|
||||||
|
import Data.List (intersperse)
|
||||||
import Control.Monad.Catch (throwM)
|
import Control.Monad.Catch (throwM)
|
||||||
import GHCup.Errors (ParseError(..))
|
import GHCup.Errors (ParseError(..))
|
||||||
import Text.Megaparsec
|
|
||||||
import Data.Void (Void)
|
|
||||||
|
|
||||||
-- | This reflects the API version of the YAML.
|
-- | This reflects the API version of the YAML.
|
||||||
--
|
--
|
||||||
-- Note that when updating this, CI requires that the file exists AND the same file exists at
|
-- Note that when updating this, CI requires that the file exsists AND the same file exists at
|
||||||
-- 'https://www.haskell.org/ghcup/exp/ghcup-<ver>.yaml' with some newlines added.
|
-- 'https://www.haskell.org/ghcup/exp/ghcup-<ver>.yaml' with some newlines added.
|
||||||
ghcupURL :: URI
|
ghcupURL :: URI
|
||||||
ghcupURL = [uri|https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-0.0.8.yaml|]
|
ghcupURL = [uri|https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-0.0.7.yaml|]
|
||||||
|
|
||||||
stackSetupURL :: URI
|
|
||||||
stackSetupURL = [uri|https://raw.githubusercontent.com/commercialhaskell/stackage-content/master/stack/stack-setup-2.yaml|]
|
|
||||||
|
|
||||||
shimGenURL :: URI
|
|
||||||
shimGenURL = [uri|https://downloads.haskell.org/~ghcup/shimgen/shim-2.exe|]
|
|
||||||
|
|
||||||
shimGenSHA :: T.Text
|
|
||||||
shimGenSHA = T.pack "7c55e201f71860c5babea886007c8fa44b861abf50d1c07e5677eb0bda387a70"
|
|
||||||
|
|
||||||
-- | The current ghcup version.
|
-- | The current ghcup version.
|
||||||
ghcUpVer :: V.PVP
|
ghcUpVer :: V.PVP
|
||||||
@@ -62,7 +53,7 @@ versionCmp ver1 (VR_eq ver2) = ver1 == ver2
|
|||||||
|
|
||||||
versionRange :: V.Versioning -> VersionRange -> Bool
|
versionRange :: V.Versioning -> VersionRange -> Bool
|
||||||
versionRange ver' (SimpleRange cmps) = all (versionCmp ver') cmps
|
versionRange ver' (SimpleRange cmps) = all (versionCmp ver') cmps
|
||||||
versionRange ver' (OrRange cmps range) =
|
versionRange ver' (OrRange cmps range) =
|
||||||
versionRange ver' (SimpleRange cmps) || versionRange ver' range
|
versionRange ver' (SimpleRange cmps) || versionRange ver' range
|
||||||
|
|
||||||
pvpToVersion :: MonadThrow m => V.PVP -> Text -> m V.Version
|
pvpToVersion :: MonadThrow m => V.PVP -> Text -> m V.Version
|
||||||
@@ -74,15 +65,44 @@ pvpToVersion pvp_ rest =
|
|||||||
-- -- prop> \v -> let (Just (pvp', r)) = versionToPVP v in pvpToVersion pvp' r === Just v
|
-- -- prop> \v -> let (Just (pvp', r)) = versionToPVP v in pvpToVersion pvp' r === Just v
|
||||||
versionToPVP :: MonadThrow m => V.Version -> m (V.PVP, Text)
|
versionToPVP :: MonadThrow m => V.Version -> m (V.PVP, Text)
|
||||||
versionToPVP (V.Version (Just _) _ _ _) = throwM $ ParseError "Unexpected epoch"
|
versionToPVP (V.Version (Just _) _ _ _) = throwM $ ParseError "Unexpected epoch"
|
||||||
versionToPVP v = case parse pvp'' "Version->PVP" $ V.prettyVer v of
|
versionToPVP v = either (\_ -> (, rest v) <$> alternative v) (pure . (, mempty)) . V.pvp . V.prettyVer $ v
|
||||||
Left _ -> throwM $ ParseError "Couldn't convert Version to PVP"
|
|
||||||
Right r -> pure r
|
|
||||||
where
|
where
|
||||||
pvp'' :: Parsec Void T.Text (V.PVP, T.Text)
|
alternative :: MonadThrow m => V.Version -> m V.PVP
|
||||||
pvp'' = do
|
alternative v' = case NE.takeWhile isDigit (V._vChunks v') of
|
||||||
p <- V.pvp'
|
[] -> throwM $ ParseError "Couldn't convert Version to PVP"
|
||||||
s <- getParserState
|
xs -> pure $ pvpFromList (unsafeDigit <$> xs)
|
||||||
pure (p, stateInput s)
|
|
||||||
|
rest :: V.Version -> Text
|
||||||
|
rest (V.Version _ cs pr me) =
|
||||||
|
let chunks = NE.dropWhile isDigit cs
|
||||||
|
ver = intersperse (T.pack ".") . chunksAsT $ chunks
|
||||||
|
me' = maybe [] (\m -> [T.pack "+",m]) me
|
||||||
|
pr' = foldable [] (T.pack "-" :) $ intersperse (T.pack ".") (chunksAsT pr)
|
||||||
|
prefix = case (ver, pr', me') of
|
||||||
|
(_:_, _, _) -> T.pack "."
|
||||||
|
_ -> T.pack ""
|
||||||
|
in prefix <> mconcat (ver <> pr' <> me')
|
||||||
|
where
|
||||||
|
chunksAsT :: Functor t => t V.VChunk -> t Text
|
||||||
|
chunksAsT = fmap (foldMap f)
|
||||||
|
where
|
||||||
|
f :: V.VUnit -> Text
|
||||||
|
f (V.Digits i) = T.pack $ show i
|
||||||
|
f (V.Str s) = s
|
||||||
|
|
||||||
|
foldable :: Foldable f => f b -> (f a -> f b) -> f a -> f b
|
||||||
|
foldable d g f | null f = d
|
||||||
|
| otherwise = g f
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
isDigit :: V.VChunk -> Bool
|
||||||
|
isDigit (V.Digits _ :| []) = True
|
||||||
|
isDigit _ = False
|
||||||
|
|
||||||
|
unsafeDigit :: V.VChunk -> Int
|
||||||
|
unsafeDigit (V.Digits x :| []) = fromIntegral x
|
||||||
|
unsafeDigit _ = error "unsafeDigit: wrong input"
|
||||||
|
|
||||||
pvpFromList :: [Int] -> V.PVP
|
pvpFromList :: [Int] -> V.PVP
|
||||||
pvpFromList = V.PVP . NE.fromList . fmap fromIntegral
|
pvpFromList = V.PVP . NE.fromList . fmap fromIntegral
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ int main()
|
|||||||
// CreateProcess, and therefore we fallback to ShellExecuteEx,
|
// CreateProcess, and therefore we fallback to ShellExecuteEx,
|
||||||
// which CAN create elevated processes, at the cost of opening a new separate
|
// which CAN create elevated processes, at the cost of opening a new separate
|
||||||
// window.
|
// window.
|
||||||
// Theoretically, this could be fixed (or rather, worked around) using pipes
|
// Theorically, this could be fixed (or rather, worked around) using pipes
|
||||||
// and IPC, but... this is a question for another day.
|
// and IPC, but... this is a question for another day.
|
||||||
SHELLEXECUTEINFOW sei = {0};
|
SHELLEXECUTEINFOW sei = {0};
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
# * BOOTSTRAP_HASKELL_VERBOSE - any nonzero value for more verbose installation
|
# * BOOTSTRAP_HASKELL_VERBOSE - any nonzero value for more verbose installation
|
||||||
# * BOOTSTRAP_HASKELL_GHC_VERSION - the ghc version to install
|
# * BOOTSTRAP_HASKELL_GHC_VERSION - the ghc version to install
|
||||||
# * BOOTSTRAP_HASKELL_CABAL_VERSION - the cabal version to install
|
# * BOOTSTRAP_HASKELL_CABAL_VERSION - the cabal version to install
|
||||||
# * BOOTSTRAP_HASKELL_CABAL_XDG - don't disable the XDG logic (this doesn't force XDG though, because cabal is confusing)
|
|
||||||
# * BOOTSTRAP_HASKELL_INSTALL_NO_STACK - disable installation of stack
|
# * BOOTSTRAP_HASKELL_INSTALL_NO_STACK - disable installation of stack
|
||||||
# * BOOTSTRAP_HASKELL_INSTALL_NO_STACK_HOOK - disable installation stack ghcup hook
|
# * BOOTSTRAP_HASKELL_INSTALL_NO_STACK_HOOK - disable installation stack ghcup hook
|
||||||
# * BOOTSTRAP_HASKELL_INSTALL_HLS - whether to install latest hls
|
# * BOOTSTRAP_HASKELL_INSTALL_HLS - whether to install latest hls
|
||||||
@@ -29,14 +28,14 @@
|
|||||||
|
|
||||||
plat="$(uname -s)"
|
plat="$(uname -s)"
|
||||||
arch=$(uname -m)
|
arch=$(uname -m)
|
||||||
ghver="0.1.20.0"
|
ghver="0.1.19.4"
|
||||||
: "${GHCUP_BASE_URL:=https://downloads.haskell.org/~ghcup}"
|
: "${GHCUP_BASE_URL:=https://downloads.haskell.org/~ghcup}"
|
||||||
|
|
||||||
export GHCUP_SKIP_UPDATE_CHECK=yes
|
export GHCUP_SKIP_UPDATE_CHECK=yes
|
||||||
: "${BOOTSTRAP_HASKELL_DOWNLOADER:=curl}"
|
: "${BOOTSTRAP_HASKELL_DOWNLOADER:=curl}"
|
||||||
|
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
: "${GHCUP_INSTALL_BASE_PREFIX:=/c}"
|
: "${GHCUP_INSTALL_BASE_PREFIX:=/c}"
|
||||||
GHCUP_DIR=$(cygpath -u "${GHCUP_INSTALL_BASE_PREFIX}/ghcup")
|
GHCUP_DIR=$(cygpath -u "${GHCUP_INSTALL_BASE_PREFIX}/ghcup")
|
||||||
GHCUP_BIN=$(cygpath -u "${GHCUP_INSTALL_BASE_PREFIX}/ghcup/bin")
|
GHCUP_BIN=$(cygpath -u "${GHCUP_INSTALL_BASE_PREFIX}/ghcup/bin")
|
||||||
@@ -73,7 +72,7 @@ warn() {
|
|||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;35m$1\\033[0m"
|
echo -e "\\033[0;35m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -89,7 +88,7 @@ yellow() {
|
|||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;33m$1\\033[0m"
|
echo -e "\\033[0;33m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -105,7 +104,7 @@ green() {
|
|||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;32m$1\\033[0m"
|
echo -e "\\033[0;32m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -161,7 +160,7 @@ _done() {
|
|||||||
echo
|
echo
|
||||||
echo "==============================================================================="
|
echo "==============================================================================="
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
green
|
green
|
||||||
green "All done!"
|
green "All done!"
|
||||||
green
|
green
|
||||||
@@ -173,8 +172,9 @@ _done() {
|
|||||||
green "Start a new haskell project in the current directory via:"
|
green "Start a new haskell project in the current directory via:"
|
||||||
green " cabal init --interactive"
|
green " cabal init --interactive"
|
||||||
green
|
green
|
||||||
green "To install other GHC versions and tools, run:"
|
green "Install other GHC versions and tools via:"
|
||||||
green " ghcup tui"
|
green " ghcup list"
|
||||||
|
green " ghcup install <tool> <version>"
|
||||||
green
|
green
|
||||||
green "To install system libraries and update msys2/mingw64,"
|
green "To install system libraries and update msys2/mingw64,"
|
||||||
green "open the \"Mingw haskell shell\""
|
green "open the \"Mingw haskell shell\""
|
||||||
@@ -314,7 +314,7 @@ download_ghcup() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
case "${arch}" in
|
case "${arch}" in
|
||||||
x86_64|amd64)
|
x86_64|amd64)
|
||||||
_url=${GHCUP_BASE_URL}/${ghver}/x86_64-mingw64-ghcup-${ghver}.exe
|
_url=${GHCUP_BASE_URL}/${ghver}/x86_64-mingw64-ghcup-${ghver}.exe
|
||||||
@@ -327,7 +327,7 @@ download_ghcup() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
case "${BOOTSTRAP_HASKELL_DOWNLOADER}" in
|
case "${BOOTSTRAP_HASKELL_DOWNLOADER}" in
|
||||||
"curl")
|
"curl")
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
@@ -546,7 +546,7 @@ adjust_bashrc() {
|
|||||||
printf "\n%s" "[[ -f ~/.bashrc ]] && source ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
|
printf "\n%s" "[[ -f ~/.bashrc ]] && source ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
if [ ! -e "${HOME}/.bash_profile" ] ; then
|
if [ ! -e "${HOME}/.bash_profile" ] ; then
|
||||||
echo '# generated by ghcup' > "${HOME}/.bash_profile"
|
echo '# generated by ghcup' > "${HOME}/.bash_profile"
|
||||||
echo 'test -f ~/.profile && . ~/.profile' >> "${HOME}/.bash_profile"
|
echo 'test -f ~/.profile && . ~/.profile' >> "${HOME}/.bash_profile"
|
||||||
@@ -596,7 +596,7 @@ adjust_cabal_config() {
|
|||||||
|
|
||||||
ask_cabal_config_init() {
|
ask_cabal_config_init() {
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG}" ] ; then
|
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG}" ] ; then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
@@ -637,7 +637,7 @@ ask_cabal_config_init() {
|
|||||||
|
|
||||||
do_cabal_config_init() {
|
do_cabal_config_init() {
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
case $1 in
|
case $1 in
|
||||||
1)
|
1)
|
||||||
adjust_cabal_config
|
adjust_cabal_config
|
||||||
@@ -681,7 +681,7 @@ ask_hls() {
|
|||||||
*)
|
*)
|
||||||
echo "Possible choices are:"
|
echo "Possible choices are:"
|
||||||
echo
|
echo
|
||||||
echo "Y - Yes, install the haskell-language-server"
|
echo "Y - Yes, install the haskell-langauge-server"
|
||||||
echo "N - No, don't install anything more (default)"
|
echo "N - No, don't install anything more (default)"
|
||||||
echo
|
echo
|
||||||
echo "Please make your choice and press ENTER."
|
echo "Please make your choice and press ENTER."
|
||||||
@@ -739,15 +739,6 @@ ask_stack() {
|
|||||||
unset stack_answer
|
unset stack_answer
|
||||||
}
|
}
|
||||||
|
|
||||||
find_stack_root() {
|
|
||||||
if [ -n "${STACK_ROOT}" ] ; then
|
|
||||||
echo "${STACK_ROOT}"
|
|
||||||
elif [ -n "${STACK_XDG}" ] ; then
|
|
||||||
echo "${XDG_DATA_HOME:-$HOME/.local/share}/stack"
|
|
||||||
else
|
|
||||||
echo "${HOME}/.stack"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
find_shell
|
find_shell
|
||||||
|
|
||||||
@@ -766,7 +757,7 @@ if [ -z "${GHCUP_USE_XDG_DIRS}" ] ; then
|
|||||||
echo "ghcup installs only into the following directory,"
|
echo "ghcup installs only into the following directory,"
|
||||||
echo "which can be removed anytime:"
|
echo "which can be removed anytime:"
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
echo " $(cygpath -w "$GHCUP_DIR")"
|
echo " $(cygpath -w "$GHCUP_DIR")"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -830,19 +821,10 @@ if [ -z "${BOOTSTRAP_HASKELL_MINIMAL}" ] ; then
|
|||||||
|
|
||||||
do_cabal_config_init $ask_cabal_config_init_answer
|
do_cabal_config_init $ask_cabal_config_init_answer
|
||||||
|
|
||||||
if [ -z "${BOOTSTRAP_HASKELL_CABAL_XDG}" ] ; then
|
|
||||||
# disable XDG if we can
|
|
||||||
if [ -e "${XDG_CONFIG_HOME:-"$HOME/.config"}/cabal" ] || [ -n "${CABAL_DIR}" ] || [ -n "${CABAL_CONFIG}" ] ; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
edo mkdir -p "${HOME}/.cabal"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
edo cabal update --ignore-project
|
edo cabal update --ignore-project
|
||||||
else # don't install ghc and cabal
|
else # don't install ghc and cabal
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*|CYGWIN*)
|
MSYS*|MINGW*)
|
||||||
# need to bootstrap cabal to initialize config on windows
|
# need to bootstrap cabal to initialize config on windows
|
||||||
# we'll remove it afterwards
|
# we'll remove it afterwards
|
||||||
tmp_dir="$(mktemp -d)"
|
tmp_dir="$(mktemp -d)"
|
||||||
@@ -869,9 +851,8 @@ case $ask_stack_answer in
|
|||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
(_eghcup --cache install stack) || die "Stack installation failed"
|
(_eghcup --cache install stack) || die "Stack installation failed"
|
||||||
stack_root="$(find_stack_root)"
|
edo mkdir -p "${STACK_ROOT:-$HOME/.stack}"/hooks
|
||||||
edo mkdir -p "${stack_root}"/hooks
|
hook_exe="${STACK_ROOT:-$HOME/.stack}"/hooks/ghc-install.sh
|
||||||
hook_exe="${stack_root}"/hooks/ghc-install.sh
|
|
||||||
hook_url="https://www.haskell.org/ghcup/sh/hooks/stack/ghc-install.sh"
|
hook_url="https://www.haskell.org/ghcup/sh/hooks/stack/ghc-install.sh"
|
||||||
|
|
||||||
if [ -e "${hook_exe}" ] ; then
|
if [ -e "${hook_exe}" ] ; then
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
* cabal - The Cabal build tool for managing Haskell software"
|
* cabal - The Cabal build tool for managing Haskell software"
|
||||||
* stack - (optional) A cross-platform program for developing Haskell projects"
|
* stack - (optional) A cross-platform program for developing Haskell projects"
|
||||||
* hls - (optional) A language server for developers to integrate with their editor/IDE"
|
* hls - (optional) A language server for developers to integrate with their editor/IDE"
|
||||||
|
|
||||||
By default, the installation is non-interactive, unless you run it with 'Interactive $true'.
|
By default, the installation is non-interactive, unless you run it with 'Interactive $true'.
|
||||||
#>
|
#>
|
||||||
param (
|
param (
|
||||||
@@ -42,11 +42,7 @@ param (
|
|||||||
# The Msys2 version to download (e.g. 20221216)
|
# The Msys2 version to download (e.g. 20221216)
|
||||||
[string]$Msys2Version,
|
[string]$Msys2Version,
|
||||||
# The Msys2 sha256sum hash
|
# The Msys2 sha256sum hash
|
||||||
[string]$Msys2Hash,
|
[string]$Msys2Hash
|
||||||
# Whether to disable creation of several desktop shortcuts
|
|
||||||
[switch]$DontWriteDesktopShortcuts,
|
|
||||||
# Whether to disable adjusting bashrc (in msys2 env) with PATH
|
|
||||||
[switch]$DontAdjustBashRc
|
|
||||||
)
|
)
|
||||||
|
|
||||||
$DefaultMsys2Version = "20221216"
|
$DefaultMsys2Version = "20221216"
|
||||||
@@ -143,7 +139,7 @@ filter Get-FileSize {
|
|||||||
function Get-FileWCSynchronous{
|
function Get-FileWCSynchronous{
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
[string]$url,
|
[string]$url,
|
||||||
[string]$destinationFolder="$env:USERPROFILE\Downloads",
|
[string]$destinationFolder="$env:USERPROFILE\Downloads",
|
||||||
[switch]$includeStats
|
[switch]$includeStats
|
||||||
)
|
)
|
||||||
@@ -233,7 +229,7 @@ if ($GhcupBasePrefixEnv) {
|
|||||||
Print-Msg -color Green -msg ("Picked {0} as default Install prefix!" -f $defaultGhcupBasePrefix)
|
Print-Msg -color Green -msg ("Picked {0} as default Install prefix!" -f $defaultGhcupBasePrefix)
|
||||||
} else {
|
} else {
|
||||||
Print-Msg -color Red -msg "Couldn't find a writable partition with at least 5GB free disk space!"
|
Print-Msg -color Red -msg "Couldn't find a writable partition with at least 5GB free disk space!"
|
||||||
Exit 1
|
Exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,7 +274,7 @@ Press enter to accept the default [{0}]:
|
|||||||
if (!($GhcupBasePrefix.EndsWith('\'))) {
|
if (!($GhcupBasePrefix.EndsWith('\'))) {
|
||||||
$GhcupBasePrefix = ('{0}\' -f $GhcupBasePrefix)
|
$GhcupBasePrefix = ('{0}\' -f $GhcupBasePrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
$GhcupBasePrefix = $GhcupBasePrefix.TrimEnd().TrimStart()
|
$GhcupBasePrefix = $GhcupBasePrefix.TrimEnd().TrimStart()
|
||||||
if (!($GhcupBasePrefix)) {
|
if (!($GhcupBasePrefix)) {
|
||||||
Print-Msg -color Red -msg "No directory specified!"
|
Print-Msg -color Red -msg "No directory specified!"
|
||||||
@@ -354,7 +350,7 @@ if ($CabalDir) {
|
|||||||
$CabDirEnv = $CabalDir
|
$CabDirEnv = $CabalDir
|
||||||
if (!($CabDirEnv)) {
|
if (!($CabDirEnv)) {
|
||||||
Print-Msg -color Red -msg "No directory specified!"
|
Print-Msg -color Red -msg "No directory specified!"
|
||||||
Exit 1
|
Exit 1
|
||||||
} elseif (!(Split-Path -IsAbsolute -Path "$CabDirEnv")) {
|
} elseif (!(Split-Path -IsAbsolute -Path "$CabDirEnv")) {
|
||||||
Print-Msg -color Red -msg "Invalid/Non-absolute Path specified"
|
Print-Msg -color Red -msg "Invalid/Non-absolute Path specified"
|
||||||
Exit 1
|
Exit 1
|
||||||
@@ -369,7 +365,7 @@ if ($CabalDir) {
|
|||||||
|
|
||||||
$CabDirEnv = $CabDirEnv.TrimEnd().TrimStart()
|
$CabDirEnv = $CabDirEnv.TrimEnd().TrimStart()
|
||||||
if (!($CabDirEnv)) {
|
if (!($CabDirEnv)) {
|
||||||
Print-Msg -color Red -msg "No directory specified!"
|
Print-Msg -color Red -msg "No directory specified!"
|
||||||
} elseif (!(Split-Path -IsAbsolute -Path "$CabDirEnv")) {
|
} elseif (!(Split-Path -IsAbsolute -Path "$CabDirEnv")) {
|
||||||
Print-Msg -color Red -msg "Invalid/Non-absolute Path specified"
|
Print-Msg -color Red -msg "Invalid/Non-absolute Path specified"
|
||||||
} else {
|
} else {
|
||||||
@@ -414,26 +410,6 @@ if (!($InstallStack)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Interactive) {
|
|
||||||
$DesktopDecision = $Host.UI.PromptForChoice('Create Desktop shortcuts'
|
|
||||||
, 'Do you want to create convenience desktop shortcuts (e.g. for uninstallation and msys2 shell)?'
|
|
||||||
, [System.Management.Automation.Host.ChoiceDescription[]] @('&Yes'
|
|
||||||
'&No'
|
|
||||||
'&Abort'), 0)
|
|
||||||
if ($DesktopDecision -eq 0) {
|
|
||||||
$InstallDesktopShortcuts = $true
|
|
||||||
} elseif ($DesktopDecision -eq 2) {
|
|
||||||
Exit 0
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($Minimal) {
|
|
||||||
$InstallDesktopShortcuts = $false
|
|
||||||
} elseif ($DontWriteDesktopShortcuts) {
|
|
||||||
$InstallDesktopShortcuts = $false
|
|
||||||
} else {
|
|
||||||
$InstallDesktopShortcuts = $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# mingw foo
|
# mingw foo
|
||||||
Print-Msg -msg 'First checking for Msys2...'
|
Print-Msg -msg 'First checking for Msys2...'
|
||||||
@@ -478,9 +454,7 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
|
|
||||||
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
|
||||||
# We ignore errors because we don't want the installation script to fail just because a temporary file can't be removed.
|
Remove-Item -Path "$archivePath"
|
||||||
# Relevant issue: https://github.com/haskell/ghcup-hs/issues/952
|
|
||||||
Remove-Item -Path "$archivePath" -ErrorAction Continue
|
|
||||||
|
|
||||||
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'
|
||||||
@@ -511,12 +485,12 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
$MsysDirPrompt = Read-Host
|
$MsysDirPrompt = Read-Host
|
||||||
$MsysDir = ($defaultMsys2Dir,$MsysDirPrompt)[[bool]$MsysDirPrompt]
|
$MsysDir = ($defaultMsys2Dir,$MsysDirPrompt)[[bool]$MsysDirPrompt]
|
||||||
} else {
|
} else {
|
||||||
Print-Msg -color Magenta -msg 'Input existing MSys2 toolchain directory:'
|
Print-Msg -color Magenta -msg 'Input existing MSys2 toolchain directory:'
|
||||||
$MsysDir = Read-Host
|
$MsysDir = Read-Host
|
||||||
}
|
}
|
||||||
$MsysDir = $MsysDir.TrimEnd().TrimStart()
|
$MsysDir = $MsysDir.TrimEnd().TrimStart()
|
||||||
if (!($MsysDir)) {
|
if (!($MsysDir)) {
|
||||||
Print-Msg -color Red -msg "No directory specified!"
|
Print-Msg -color Red -msg "No directory specified!"
|
||||||
} elseif (!(Test-Path -LiteralPath ('{0}' -f $MsysDir))) {
|
} elseif (!(Test-Path -LiteralPath ('{0}' -f $MsysDir))) {
|
||||||
Print-Msg -color Red -msg ('MSys2 installation at ''{0}'' could not be found!' -f $MsysDir)
|
Print-Msg -color Red -msg ('MSys2 installation at ''{0}'' could not be found!' -f $MsysDir)
|
||||||
} elseif (!(Split-Path -IsAbsolute -Path "$MsysDir")) {
|
} elseif (!(Split-Path -IsAbsolute -Path "$MsysDir")) {
|
||||||
@@ -536,11 +510,8 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
Start-Sleep -s 5
|
Start-Sleep -s 5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Print-Msg -msg 'Creating shortcuts...'
|
||||||
if ($InstallDesktopShortcuts) {
|
$uninstallShortCut = @'
|
||||||
|
|
||||||
Print-Msg -msg 'Creating shortcuts...'
|
|
||||||
$uninstallShortCut = @'
|
|
||||||
$decision = $Host.UI.PromptForChoice('Uninstall Haskell'
|
$decision = $Host.UI.PromptForChoice('Uninstall Haskell'
|
||||||
, 'Do you want to uninstall all of the haskell toolchain, including GHC, Cabal, Stack and GHCup itself?'
|
, 'Do you want to uninstall all of the haskell toolchain, including GHC, Cabal, Stack and GHCup itself?'
|
||||||
, [System.Management.Automation.Host.ChoiceDescription[]] @('&Uninstall'
|
, [System.Management.Automation.Host.ChoiceDescription[]] @('&Uninstall'
|
||||||
@@ -602,13 +573,12 @@ if ($Host.Name -eq "ConsoleHost")
|
|||||||
}
|
}
|
||||||
'@
|
'@
|
||||||
|
|
||||||
$GhcInstArgs = '-mingw64 -mintty -c "pacman --noconfirm -S --needed base-devel gettext autoconf make libtool automake python p7zip patch unzip"'
|
$GhcInstArgs = '-mingw64 -mintty -c "pacman --noconfirm -S --needed base-devel gettext autoconf make libtool automake python p7zip patch unzip"'
|
||||||
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe $GhcInstArgs -DestinationPath 'Install GHC dev dependencies.lnk' -TempPath $GhcupDir
|
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe $GhcInstArgs -DestinationPath 'Install GHC dev dependencies.lnk' -TempPath $GhcupDir
|
||||||
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe '-mingw64' -DestinationPath 'Mingw haskell shell.lnk' -TempPath $GhcupDir
|
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe '-mingw64' -DestinationPath 'Mingw haskell shell.lnk' -TempPath $GhcupDir
|
||||||
Create-Shortcut -SourceExe 'https://www.msys2.org/docs/package-management' -ArgumentsToSourceExe '' -DestinationPath 'Mingw package management docs.url' -TempPath $GhcupDir
|
Create-Shortcut -SourceExe 'https://www.msys2.org/docs/package-management' -ArgumentsToSourceExe '' -DestinationPath 'Mingw package management docs.url' -TempPath $GhcupDir
|
||||||
$DesktopDir = [Environment]::GetFolderPath("Desktop")
|
$DesktopDir = [Environment]::GetFolderPath("Desktop")
|
||||||
$null = New-Item -Path $DesktopDir -Name "Uninstall Haskell.ps1" -ItemType "file" -Force -Value $uninstallShortCut
|
$null = New-Item -Path $DesktopDir -Name "Uninstall Haskell.ps1" -ItemType "file" -Force -Value $uninstallShortCut
|
||||||
}
|
|
||||||
|
|
||||||
Print-Msg -msg ('Adding {0}\bin to Users Path...' -f $GhcupDir)
|
Print-Msg -msg ('Adding {0}\bin to Users Path...' -f $GhcupDir)
|
||||||
Add-EnvPath -Path ('{0}\bin' -f ([System.IO.Path]::GetFullPath("$GhcupDir"))) -Container 'User'
|
Add-EnvPath -Path ('{0}\bin' -f ([System.IO.Path]::GetFullPath("$GhcupDir"))) -Container 'User'
|
||||||
@@ -649,14 +619,10 @@ if ($DisableCurl) {
|
|||||||
$DownloadScript = 'curl --proto ''=https'' --tlsv1.2 -sSf'
|
$DownloadScript = 'curl --proto ''=https'' --tlsv1.2 -sSf'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!($DontAdjustBashRc)) {
|
|
||||||
$AdjustBashRcExport = 'export BOOTSTRAP_HASKELL_ADJUST_BASHRC=1 ;'
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Get-Process -ID $PID).ProcessName.StartsWith("bootstrap-haskell") -Or $InBash) {
|
if ((Get-Process -ID $PID).ProcessName.StartsWith("bootstrap-haskell") -Or $InBash) {
|
||||||
Exec "$Bash" '-lc' ('{4} {6} {7} {8} {9} {10} {12} [ -n ''{1}'' ] && export GHCUP_MSYS2=$(cygpath -m ''{1}'') ; [ -n ''{2}'' ] && export GHCUP_INSTALL_BASE_PREFIX=$(cygpath -m ''{2}/'') ; export PATH=$(cygpath -u ''{3}/bin''):$PATH ; export CABAL_DIR=''{5}'' ; [[ ''{0}'' = https* ]] && {11} {0} | bash || cat $(cygpath -m ''{0}'') | bash' -f $BootstrapUrl, $MsysDir, $GhcupBasePrefix, $GhcupDir, $SilentExport, $CabalDirFull, $StackInstallExport, $HLSInstallExport, $AdjustCabalConfigExport, $MinimalExport, $BootstrapDownloader, $DownloadScript, $AdjustBashRcExport)
|
Exec "$Bash" '-lc' ('{4} {6} {7} {8} {9} {10} [ -n ''{1}'' ] && export GHCUP_MSYS2=$(cygpath -m ''{1}'') ; [ -n ''{2}'' ] && export GHCUP_INSTALL_BASE_PREFIX=$(cygpath -m ''{2}/'') ; export PATH=$(cygpath -u ''{3}/bin''):$PATH ; export CABAL_DIR=''{5}'' ; [[ ''{0}'' = https* ]] && {11} {0} | bash || cat $(cygpath -m ''{0}'') | bash' -f $BootstrapUrl, $MsysDir, $GhcupBasePrefix, $GhcupDir, $SilentExport, $CabalDirFull, $StackInstallExport, $HLSInstallExport, $AdjustCabalConfigExport, $MinimalExport, $BootstrapDownloader, $DownloadScript)
|
||||||
} else {
|
} else {
|
||||||
Exec "$Msys2Shell" '-mingw64' '-mintty' '-shell' 'bash' '-c' ('{4} {6} {7} {8} {9} {10} {12} [ -n ''{1}'' ] && export GHCUP_MSYS2=$(cygpath -m ''{1}'') ; [ -n ''{2}'' ] && export GHCUP_INSTALL_BASE_PREFIX=$(cygpath -m ''{2}/'') ; export PATH=$(cygpath -u ''{3}/bin''):$PATH ; export CABAL_DIR=''{5}'' ; trap ''echo Press any key to exit && read -n 1 && exit'' 2 ; [[ ''{0}'' = https* ]] && {11} {0} | bash || cat $(cygpath -m ''{0}'') | bash ; echo ''Press any key to exit'' && read -n 1' -f $BootstrapUrl, $MsysDir, $GhcupBasePrefix, $GhcupDir, $SilentExport, $CabalDirFull, $StackInstallExport, $HLSInstallExport, $AdjustCabalConfigExport, $MinimalExport, $BootstrapDownloader, $DownloadScript, $AdjustBashRcExport)
|
Exec "$Msys2Shell" '-mingw64' '-mintty' '-shell' 'bash' '-c' ('{4} {6} {7} {8} {9} {10} [ -n ''{1}'' ] && export GHCUP_MSYS2=$(cygpath -m ''{1}'') ; [ -n ''{2}'' ] && export GHCUP_INSTALL_BASE_PREFIX=$(cygpath -m ''{2}/'') ; export PATH=$(cygpath -u ''{3}/bin''):$PATH ; export CABAL_DIR=''{5}'' ; trap ''echo Press any key to exit && read -n 1 && exit'' 2 ; [[ ''{0}'' = https* ]] && {11} {0} | bash || cat $(cygpath -m ''{0}'') | bash ; echo ''Press any key to exit'' && read -n 1' -f $BootstrapUrl, $MsysDir, $GhcupBasePrefix, $GhcupDir, $SilentExport, $CabalDirFull, $StackInstallExport, $HLSInstallExport, $AdjustCabalConfigExport, $MinimalExport, $BootstrapDownloader, $DownloadScript)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -xue
|
|
||||||
|
|
||||||
cabal --verbose=0 run ghcup:exe:ghcup -- --bash-completion-script ghcup > scripts/shell-completions/bash
|
|
||||||
cabal --verbose=0 run ghcup:exe:ghcup -- --zsh-completion-script ghcup > scripts/shell-completions/zsh
|
|
||||||
cabal --verbose=0 run ghcup:exe:ghcup -- --fish-completion-script ghcup > scripts/shell-completions/fish
|
|
||||||
|
|
||||||
@@ -9,8 +9,8 @@ set -eu
|
|||||||
|
|
||||||
case $HOOK_GHC_TYPE in
|
case $HOOK_GHC_TYPE in
|
||||||
bindist)
|
bindist)
|
||||||
ghc_path=$(ghcup whereis ghc "$HOOK_GHC_VERSION" || { ghcup install ghc "$HOOK_GHC_VERSION" >/dev/null && ghcup whereis ghc "$HOOK_GHC_VERSION" ; }) || { >&2 echo "Installing $HOOK_GHC_VERSION via ghcup failed" exit 3 ;}
|
ghcdir=$(ghcup whereis --directory ghc "$HOOK_GHC_VERSION" || ghcup run --ghc "$HOOK_GHC_VERSION" --install) || exit 3
|
||||||
printf "%s" "${ghc_path}"
|
printf "%s/ghc" "${ghcdir}"
|
||||||
;;
|
;;
|
||||||
git)
|
git)
|
||||||
# TODO: should be somewhat possible
|
# TODO: should be somewhat possible
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
resolver: lts-20.26
|
resolver: lts-20.20
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- .
|
- .
|
||||||
@@ -24,8 +24,6 @@ extra-deps:
|
|||||||
- strict-base-0.4.0.0
|
- strict-base-0.4.0.0
|
||||||
- text-2.0.2
|
- text-2.0.2
|
||||||
- yaml-streamly-0.12.2
|
- yaml-streamly-0.12.2
|
||||||
- github: fosskers/versions
|
|
||||||
commit: 7bc3355348aac3510771d4622aff09ac38c9924d
|
|
||||||
|
|
||||||
flags:
|
flags:
|
||||||
http-io-streams:
|
http-io-streams:
|
||||||
|
|||||||
@@ -175,6 +175,10 @@ instance Arbitrary Tool where
|
|||||||
arbitrary = genericArbitrary
|
arbitrary = genericArbitrary
|
||||||
shrink = genericShrink
|
shrink = genericShrink
|
||||||
|
|
||||||
|
instance Arbitrary GlobalTool where
|
||||||
|
arbitrary = genericArbitrary
|
||||||
|
shrink = genericShrink
|
||||||
|
|
||||||
instance Arbitrary GHCupInfo where
|
instance Arbitrary GHCupInfo where
|
||||||
arbitrary = genericArbitrary
|
arbitrary = genericArbitrary
|
||||||
shrink = genericShrink
|
shrink = genericShrink
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,3 @@
|
|||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
|
|
||||||
module ChangeLogTest where
|
module ChangeLogTest where
|
||||||
|
|
||||||
import Test.Tasty
|
import Test.Tasty
|
||||||
@@ -9,7 +6,8 @@ import Utils
|
|||||||
import Test.Tasty.HUnit
|
import Test.Tasty.HUnit
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import Data.Versions (versionQ)
|
import Data.Versions
|
||||||
|
import Data.List.NonEmpty (NonEmpty ((:|)))
|
||||||
|
|
||||||
changeLogTests :: TestTree
|
changeLogTests :: TestTree
|
||||||
changeLogTests = testGroup "changelog" $ map (uncurry check) checkList
|
changeLogTests = testGroup "changelog" $ map (uncurry check) checkList
|
||||||
@@ -32,7 +30,7 @@ checkList =
|
|||||||
(Just $ GHCVersion
|
(Just $ GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "9.2"))
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []]))
|
||||||
)
|
)
|
||||||
, ("changelog recommended", ChangeLogOptions False Nothing (Just $ ToolTag Recommended))
|
, ("changelog recommended", ChangeLogOptions False Nothing (Just $ ToolTag Recommended))
|
||||||
, ("changelog -t cabal recommended", ChangeLogOptions False (Just Cabal) (Just $ ToolTag Recommended))
|
, ("changelog -t cabal recommended", ChangeLogOptions False (Just Cabal) (Just $ ToolTag Recommended))
|
||||||
@@ -40,7 +38,7 @@ checkList =
|
|||||||
(Just $ GHCVersion
|
(Just $ GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "3.10.1.0"))
|
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| [],Digits 1 :| [],Digits 0 :| []]))
|
||||||
)
|
)
|
||||||
, ("changelog 2023-07-22", ChangeLogOptions False Nothing (Just (ToolDay (read "2023-07-22"))))
|
, ("changelog 2023-07-22", ChangeLogOptions False Nothing (Just (ToolDay (read "2023-07-22"))))
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
{-# LANGUAGE CPP #-}
|
{-# LANGUAGE CPP #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module CompileTest where
|
module CompileTest where
|
||||||
|
|
||||||
@@ -60,12 +59,12 @@ compileGhcCheckList = mapSecond CompileGHC
|
|||||||
[ ("compile ghc -v 9.4.5 -b 9.2.8", baseOptions)
|
[ ("compile ghc -v 9.4.5 -b 9.2.8", baseOptions)
|
||||||
, ("compile ghc -g a32db0b -b 9.2.8", mkDefaultGHCCompileOptions
|
, ("compile ghc -g a32db0b -b 9.2.8", mkDefaultGHCCompileOptions
|
||||||
(GHC.GitDist $ GitBranch "a32db0b" Nothing)
|
(GHC.GitDist $ GitBranch "a32db0b" Nothing)
|
||||||
(Left $(versionQ "9.2.8"))
|
(Left $ mkVersion' "9.2.8")
|
||||||
)
|
)
|
||||||
, ("compile ghc -g a32db0b -b 9.2.8 -r https://gitlab.haskell.org/ghc/ghc.git",
|
, ("compile ghc -g a32db0b -b 9.2.8 -r https://gitlab.haskell.org/ghc/ghc.git",
|
||||||
mkDefaultGHCCompileOptions
|
mkDefaultGHCCompileOptions
|
||||||
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
||||||
(Left $(versionQ "9.2.8"))
|
(Left $ mkVersion' "9.2.8")
|
||||||
)
|
)
|
||||||
, ("compile ghc -g a32db0b -r https://gitlab.haskell.org/ghc/ghc.git -b /usr/bin/ghc-9.2.2",
|
, ("compile ghc -g a32db0b -r https://gitlab.haskell.org/ghc/ghc.git -b /usr/bin/ghc-9.2.2",
|
||||||
mkDefaultGHCCompileOptions
|
mkDefaultGHCCompileOptions
|
||||||
@@ -74,25 +73,21 @@ compileGhcCheckList = mapSecond CompileGHC
|
|||||||
)
|
)
|
||||||
, ("compile ghc --remote-source-dist https://gitlab.haskell.org/ghc/ghc.git -b 9.2.8", mkDefaultGHCCompileOptions
|
, ("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|])
|
(GHC.RemoteDist [uri|https://gitlab.haskell.org/ghc/ghc.git|])
|
||||||
(Left $(versionQ "9.2.8"))
|
(Left $ mkVersion' "9.2.8")
|
||||||
)
|
)
|
||||||
, (baseCmd <> "-j20", baseOptions{GHC.jobs = Just 20})
|
, (baseCmd <> "-j20", baseOptions{GHC.jobs = Just 20})
|
||||||
, (baseCmd <> "--jobs 10", baseOptions{GHC.jobs = Just 10})
|
, (baseCmd <> "--jobs 10", baseOptions{GHC.jobs = Just 10})
|
||||||
, (baseCmd <> "-c build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
, (baseCmd <> "-c build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
||||||
, (baseCmd <> "--config build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
, (baseCmd <> "--config build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "--patch file:c:/example.patch", baseOptions{GHC.patches = Just $ Right [[uri|file:c:/example.patch|]]})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "--patch file:///example.patch", baseOptions{GHC.patches = Just $ Right [[uri|file:///example.patch|]]})
|
, (baseCmd <> "--patch file:///example.patch", baseOptions{GHC.patches = Just $ Right [[uri|file:///example.patch|]]})
|
||||||
#endif
|
|
||||||
, (baseCmd <> "-p patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
, (baseCmd <> "-p patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
||||||
, (baseCmd <> "--patchdir 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 <> "-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 <> "--cross-target armv7-unknown-linux-gnueabihf", baseOptions{GHC.crossTarget = Just "armv7-unknown-linux-gnueabihf"})
|
||||||
, (baseCmd <> "-- --enable-unregisterised", baseOptions{GHC.addConfArgs = ["--enable-unregisterised"]})
|
, (baseCmd <> "-- --enable-unregisterised", baseOptions{GHC.addConfArgs = ["--enable-unregisterised"]})
|
||||||
, (baseCmd <> "--set", baseOptions{GHC.setCompile = True})
|
, (baseCmd <> "--set", baseOptions{GHC.setCompile = True})
|
||||||
, (baseCmd <> "-o 9.4.5-p1", baseOptions{GHC.ovewrwiteVer = Just $(versionQ "9.4.5-p1")})
|
, (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 $(versionQ "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 <> "-f make", baseOptions{GHC.buildFlavour = Just "make"})
|
||||||
, (baseCmd <> "--flavour make", baseOptions{GHC.buildFlavour = Just "make"})
|
, (baseCmd <> "--flavour make", baseOptions{GHC.buildFlavour = Just "make"})
|
||||||
, (baseCmd <> "--hadrian", baseOptions{GHC.buildSystem = Just Hadrian})
|
, (baseCmd <> "--hadrian", baseOptions{GHC.buildSystem = Just Hadrian})
|
||||||
@@ -112,8 +107,8 @@ compileGhcCheckList = mapSecond CompileGHC
|
|||||||
baseOptions :: GHCCompileOptions
|
baseOptions :: GHCCompileOptions
|
||||||
baseOptions =
|
baseOptions =
|
||||||
mkDefaultGHCCompileOptions
|
mkDefaultGHCCompileOptions
|
||||||
(GHC.SourceDist $(versionQ "9.4.5"))
|
(GHC.SourceDist $ mkVersion' "9.4.5")
|
||||||
(Left $(versionQ "9.2.8"))
|
(Left $ mkVersion' "9.2.8")
|
||||||
|
|
||||||
compileHlsCheckList :: [(String, CompileCommand)]
|
compileHlsCheckList :: [(String, CompileCommand)]
|
||||||
compileHlsCheckList = mapSecond CompileHLS
|
compileHlsCheckList = mapSecond CompileHLS
|
||||||
@@ -141,7 +136,7 @@ compileHlsCheckList = mapSecond CompileHLS
|
|||||||
)
|
)
|
||||||
, ("compile hls --source-dist 2.0.0.0 --ghc 9.2.8",
|
, ("compile hls --source-dist 2.0.0.0 --ghc 9.2.8",
|
||||||
mkDefaultHLSCompileOptions
|
mkDefaultHLSCompileOptions
|
||||||
(HLS.SourceDist $(versionQ "2.0.0.0"))
|
(HLS.SourceDist $ mkVersion' "2.0.0.0")
|
||||||
[ghc928]
|
[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",
|
, ("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",
|
||||||
@@ -151,15 +146,15 @@ compileHlsCheckList = mapSecond CompileHLS
|
|||||||
)
|
)
|
||||||
, ("compile hls -v 2.0.0.0 --ghc latest",
|
, ("compile hls -v 2.0.0.0 --ghc latest",
|
||||||
mkDefaultHLSCompileOptions
|
mkDefaultHLSCompileOptions
|
||||||
(HLS.HackageDist $(versionQ "2.0.0.0"))
|
(HLS.HackageDist $ mkVersion' "2.0.0.0")
|
||||||
[ToolTag Latest]
|
[ToolTag Latest]
|
||||||
)
|
)
|
||||||
, (baseCmd <> "-j20", baseOptions{HLS.jobs = Just 20})
|
, (baseCmd <> "-j20", baseOptions{HLS.jobs = Just 20})
|
||||||
, (baseCmd <> "--jobs 10", baseOptions{HLS.jobs = Just 10})
|
, (baseCmd <> "--jobs 10", baseOptions{HLS.jobs = Just 10})
|
||||||
, (baseCmd <> "--no-set", baseOptions{HLS.setCompile = False})
|
, (baseCmd <> "--no-set", baseOptions{HLS.setCompile = False})
|
||||||
, (baseCmd <> "--cabal-update", baseOptions{HLS.updateCabal = True})
|
, (baseCmd <> "--cabal-update", baseOptions{HLS.updateCabal = True})
|
||||||
, (baseCmd <> "-o 2.0.0.0-p1", baseOptions{HLS.ovewrwiteVer = Right $(versionQ "2.0.0.0-p1")})
|
, (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 $(versionQ "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})
|
, (baseCmd <> "--git-describe-version", baseOptions{HLS.ovewrwiteVer = Left True})
|
||||||
#ifdef IS_WINDOWS
|
#ifdef IS_WINDOWS
|
||||||
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
||||||
@@ -168,22 +163,10 @@ compileHlsCheckList = mapSecond CompileHLS
|
|||||||
, (baseCmd <> "-i /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
, (baseCmd <> "-i /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
||||||
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
||||||
#endif
|
#endif
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "--cabal-project file:c:/tmp/cabal.project", baseOptions{HLS.cabalProject = Just $ Right [uri|file:c:/tmp/cabal.project|]})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "--cabal-project file:///tmp/cabal.project", baseOptions{HLS.cabalProject = Just $ Right [uri|file:///tmp/cabal.project|]})
|
, (baseCmd <> "--cabal-project file:///tmp/cabal.project", baseOptions{HLS.cabalProject = Just $ Right [uri|file:///tmp/cabal.project|]})
|
||||||
#endif
|
|
||||||
, (baseCmd <> "--cabal-project cabal.ghc8107.project", baseOptions{HLS.cabalProject = Just $ Left "cabal.ghc8107.project"})
|
, (baseCmd <> "--cabal-project cabal.ghc8107.project", baseOptions{HLS.cabalProject = Just $ Left "cabal.ghc8107.project"})
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "--cabal-project-local file:c:/tmp/cabal.project.local", baseOptions{HLS.cabalProjectLocal = Just [uri|file:c:/tmp/cabal.project.local|]})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "--cabal-project-local file:///tmp/cabal.project.local", baseOptions{HLS.cabalProjectLocal = Just [uri|file:///tmp/cabal.project.local|]})
|
, (baseCmd <> "--cabal-project-local file:///tmp/cabal.project.local", baseOptions{HLS.cabalProjectLocal = Just [uri|file:///tmp/cabal.project.local|]})
|
||||||
#endif
|
|
||||||
#ifdef IS_WINDOWS
|
|
||||||
, (baseCmd <> "--patch file:c:/example.patch", baseOptions{HLS.patches = Just $ Right [[uri|file:c:/example.patch|]]})
|
|
||||||
#else
|
|
||||||
, (baseCmd <> "--patch file:///example.patch", baseOptions{HLS.patches = Just $ Right [[uri|file:///example.patch|]]})
|
, (baseCmd <> "--patch file:///example.patch", baseOptions{HLS.patches = Just $ Right [[uri|file:///example.patch|]]})
|
||||||
#endif
|
|
||||||
, (baseCmd <> "-p patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
, (baseCmd <> "-p patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
||||||
, (baseCmd <> "--patchdir 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"]})
|
, (baseCmd <> "-- --enable-tests", baseOptions{HLS.cabalArgs = ["--enable-tests"]})
|
||||||
@@ -195,11 +178,11 @@ compileHlsCheckList = mapSecond CompileHLS
|
|||||||
baseOptions :: HLSCompileOptions
|
baseOptions :: HLSCompileOptions
|
||||||
baseOptions =
|
baseOptions =
|
||||||
mkDefaultHLSCompileOptions
|
mkDefaultHLSCompileOptions
|
||||||
(HLS.HackageDist $(versionQ "2.0.0.0"))
|
(HLS.HackageDist $ mkVersion' "2.0.0.0")
|
||||||
[ghc928]
|
[ghc928]
|
||||||
|
|
||||||
ghc928 :: ToolVersion
|
ghc928 :: ToolVersion
|
||||||
ghc928 = GHCVersion $ GHCTargetVersion Nothing $(versionQ "9.2.8")
|
ghc928 = GHCVersion $ GHCTargetVersion Nothing (mkVersion' "9.2.8")
|
||||||
|
|
||||||
compileParseWith :: [String] -> IO CompileCommand
|
compileParseWith :: [String] -> IO CompileCommand
|
||||||
compileParseWith args = do
|
compileParseWith args = do
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ module ConfigTest where
|
|||||||
import Test.Tasty
|
import Test.Tasty
|
||||||
import Test.Tasty.HUnit
|
import Test.Tasty.HUnit
|
||||||
import GHCup.OptParse
|
import GHCup.OptParse
|
||||||
import GHCup.Types (NewURLSource(..))
|
|
||||||
import Utils
|
import Utils
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import URI.ByteString.QQ
|
import URI.ByteString.QQ
|
||||||
@@ -24,13 +23,7 @@ checkList =
|
|||||||
, ("config init", InitConfig)
|
, ("config init", InitConfig)
|
||||||
, ("config show", ShowConfig)
|
, ("config show", ShowConfig)
|
||||||
, ("config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
, ("config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
||||||
, AddReleaseChannel False (NewURI [uri|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 add-release-channel GHCupURL"
|
|
||||||
, AddReleaseChannel False NewGHCupURL
|
|
||||||
)
|
|
||||||
, ("config add-release-channel StackSetupURL"
|
|
||||||
, AddReleaseChannel False NewStackSetupURL
|
|
||||||
)
|
)
|
||||||
, ("config set cache true", SetConfig "cache" (Just "true"))
|
, ("config set cache true", SetConfig "cache" (Just "true"))
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{-# LANGUAGE CPP #-}
|
{-# LANGUAGE CPP #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module InstallTest where
|
module InstallTest where
|
||||||
|
|
||||||
@@ -55,7 +54,7 @@ oldStyleCheckList =
|
|||||||
: ("install -u https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz head"
|
: ("install -u https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz head"
|
||||||
, Right defaultOptions
|
, Right defaultOptions
|
||||||
{ instBindist = Just [uri|https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz|]
|
{ 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 $(versionQ "head")
|
, instVer = Just $ GHCVersion $ GHCTargetVersion Nothing (mkVersion $ (Str "head" :| []) :| [])
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
: mapSecond
|
: mapSecond
|
||||||
@@ -63,48 +62,48 @@ oldStyleCheckList =
|
|||||||
[ ("install ghc-9.2", GHCVersion
|
[ ("install ghc-9.2", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc")
|
(Just "ghc")
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
-- invalid
|
-- invalid
|
||||||
, ("install next", GHCVersion
|
, ("install next", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "next")
|
(mkVersion $ (Str "next" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install latest", ToolTag Latest)
|
, ("install latest", ToolTag Latest)
|
||||||
, ("install nightly", GHCVersion
|
, ("install nightly", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "nightly")
|
(mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install recommended", ToolTag Recommended)
|
, ("install recommended", ToolTag Recommended)
|
||||||
, ("install prerelease", GHCVersion
|
, ("install prerelease", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "prerelease")
|
(mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install latest-prerelease", ToolTag LatestPrerelease)
|
, ("install latest-prerelease", ToolTag LatestPrerelease)
|
||||||
, ("install latest-nightly", ToolTag LatestNightly)
|
, ("install latest-nightly", ToolTag LatestNightly)
|
||||||
, ("install ghc-javascript-unknown-ghcjs-9.6", GHCVersion
|
, ("install ghc-javascript-unknown-ghcjs-9.6", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc-javascript-unknown-ghcjs")
|
(Just "ghc-javascript-unknown-ghcjs")
|
||||||
$(versionQ "9.6")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
||||||
)
|
)
|
||||||
, ("install base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("install base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("install cabal-3.10", GHCVersion
|
, ("install cabal-3.10", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "cabal")
|
(Just "cabal")
|
||||||
$(versionQ "3.10")
|
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
)
|
)
|
||||||
, ("install hls-2.0.0.0", GHCVersion
|
, ("install hls-2.0.0.0", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "hls")
|
(Just "hls")
|
||||||
$(versionQ "2.0.0.0")
|
(mkVersion $ (Digits 2 :| []) :| [Digits 0 :| [], Digits 0 :| [], Digits 0 :| []])
|
||||||
)
|
)
|
||||||
, ("install stack-2.9.3", GHCVersion
|
, ("install stack-2.9.3", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "stack")
|
(Just "stack")
|
||||||
$(versionQ "2.9.3")
|
(mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 3 :| []])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -115,37 +114,37 @@ installGhcCheckList =
|
|||||||
[ ("install ghc 9.2", GHCVersion
|
[ ("install ghc 9.2", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
, ("install ghc next", GHCVersion
|
, ("install ghc next", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "next")
|
(mkVersion $ (Str "next" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install ghc latest", ToolTag Latest)
|
, ("install ghc latest", ToolTag Latest)
|
||||||
, ("install ghc nightly", GHCVersion
|
, ("install ghc nightly", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "nightly")
|
(mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install ghc recommended", ToolTag Recommended)
|
, ("install ghc recommended", ToolTag Recommended)
|
||||||
, ("install ghc prerelease", GHCVersion
|
, ("install ghc prerelease", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "prerelease")
|
(mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("install ghc latest-prerelease", ToolTag LatestPrerelease)
|
, ("install ghc latest-prerelease", ToolTag LatestPrerelease)
|
||||||
, ("install ghc latest-nightly", ToolTag LatestNightly)
|
, ("install ghc latest-nightly", ToolTag LatestNightly)
|
||||||
, ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion
|
, ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "javascript-unknown-ghcjs")
|
(Just "javascript-unknown-ghcjs")
|
||||||
$(versionQ "9.6")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
||||||
)
|
)
|
||||||
, ("install ghc base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("install ghc base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("install ghc ghc-9.2", GHCVersion
|
, ("install ghc ghc-9.2", GHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc")
|
(Just "ghc")
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -153,48 +152,69 @@ installCabalCheckList :: [(String, Either InstallCommand InstallOptions)]
|
|||||||
installCabalCheckList =
|
installCabalCheckList =
|
||||||
("install cabal", Left $ InstallCabal defaultOptions{instSet = True})
|
("install cabal", Left $ InstallCabal defaultOptions{instSet = True})
|
||||||
: mapSecond (Left . InstallCabal . mkInstallOptions')
|
: mapSecond (Left . InstallCabal . mkInstallOptions')
|
||||||
[ ("install cabal 3.10", ToolVersion $(versionQ "3.10"))
|
[ ("install cabal 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
, ("install cabal next", ToolVersion $(versionQ "next"))
|
, ("install cabal next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
||||||
, ("install cabal latest", ToolTag Latest)
|
, ("install cabal latest", ToolTag Latest)
|
||||||
, ("install cabal nightly", ToolVersion $(versionQ "nightly"))
|
, ("install cabal nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("install cabal recommended", ToolTag Recommended)
|
, ("install cabal recommended", ToolTag Recommended)
|
||||||
, ("install cabal prerelease", ToolVersion $(versionQ "prerelease"))
|
, ("install cabal prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("install cabal latest-prerelease", ToolTag LatestPrerelease)
|
, ("install cabal latest-prerelease", ToolTag LatestPrerelease)
|
||||||
, ("install cabal latest-nightly", ToolTag LatestNightly)
|
, ("install cabal latest-nightly", ToolTag LatestNightly)
|
||||||
, ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("install cabal cabal-3.10", ToolVersion $(versionQ "cabal-3.10"))
|
, ("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 :: [(String, Either InstallCommand InstallOptions)]
|
||||||
installHlsCheckList =
|
installHlsCheckList =
|
||||||
("install hls", Left $ InstallHLS defaultOptions{instSet = True})
|
("install hls", Left $ InstallHLS defaultOptions{instSet = True})
|
||||||
: mapSecond (Left . InstallHLS . mkInstallOptions')
|
: mapSecond (Left . InstallHLS . mkInstallOptions')
|
||||||
[ ("install hls 3.10", ToolVersion $(versionQ "3.10"))
|
[ ("install hls 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
, ("install hls next", ToolVersion $(versionQ "next"))
|
, ("install hls next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
||||||
, ("install hls latest", ToolTag Latest)
|
, ("install hls latest", ToolTag Latest)
|
||||||
, ("install hls nightly", ToolVersion $(versionQ "nightly"))
|
, ("install hls nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("install hls recommended", ToolTag Recommended)
|
, ("install hls recommended", ToolTag Recommended)
|
||||||
, ("install hls prerelease", ToolVersion $(versionQ "prerelease"))
|
, ("install hls prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("install hls latest-prerelease", ToolTag LatestPrerelease)
|
, ("install hls latest-prerelease", ToolTag LatestPrerelease)
|
||||||
, ("install hls latest-nightly", ToolTag LatestNightly)
|
, ("install hls latest-nightly", ToolTag LatestNightly)
|
||||||
, ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("install hls hls-2.0", ToolVersion $(versionQ "hls-2.0"))
|
, ("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 :: [(String, Either InstallCommand InstallOptions)]
|
||||||
installStackCheckList =
|
installStackCheckList =
|
||||||
("install stack", Left $ InstallStack defaultOptions{instSet = True})
|
("install stack", Left $ InstallStack defaultOptions{instSet = True})
|
||||||
: mapSecond (Left . InstallStack . mkInstallOptions')
|
: mapSecond (Left . InstallStack . mkInstallOptions')
|
||||||
[ ("install stack 3.10", ToolVersion $(versionQ "3.10"))
|
[ ("install stack 3.10", ToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
, ("install stack next", ToolVersion $(versionQ "next"))
|
, ("install stack next", ToolVersion $ mkVersion $ (Str "next" :| []) :| [])
|
||||||
, ("install stack latest", ToolTag Latest)
|
, ("install stack latest", ToolTag Latest)
|
||||||
, ("install stack nightly", ToolVersion $(versionQ "nightly"))
|
, ("install stack nightly", ToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("install stack recommended", ToolTag Recommended)
|
, ("install stack recommended", ToolTag Recommended)
|
||||||
, ("install stack prerelease", ToolVersion $(versionQ "prerelease"))
|
, ("install stack prerelease", ToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("install stack latest-prerelease", ToolTag LatestPrerelease)
|
, ("install stack latest-prerelease", ToolTag LatestPrerelease)
|
||||||
, ("install stack latest-nightly", ToolTag LatestNightly)
|
, ("install stack latest-nightly", ToolTag LatestNightly)
|
||||||
, ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("install stack stack-2.9", ToolVersion $(versionQ "stack-2.9"))
|
, ("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 :: [String] -> IO (Either InstallCommand InstallOptions)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module RmTest where
|
module RmTest where
|
||||||
|
|
||||||
@@ -7,6 +6,7 @@ import Test.Tasty
|
|||||||
import GHCup.OptParse
|
import GHCup.OptParse
|
||||||
import Utils
|
import Utils
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
|
import Data.List.NonEmpty (NonEmpty ((:|)))
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
|
|
||||||
|
|
||||||
@@ -24,36 +24,54 @@ rmTests =
|
|||||||
oldStyleCheckList :: [(String, Either RmCommand RmOptions)]
|
oldStyleCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
oldStyleCheckList = mapSecond (Right . RmOptions)
|
oldStyleCheckList = mapSecond (Right . RmOptions)
|
||||||
[ -- failed with ("rm", xxx)
|
[ -- failed with ("rm", xxx)
|
||||||
("rm 9.2.8", mkTVer $(versionQ "9.2.8"))
|
("rm 9.2.8", mkTVer (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
||||||
, ("rm ghc-9.2.8", GHCTargetVersion (Just "ghc") $(versionQ "9.2.8"))
|
, ("rm ghc-9.2.8", GHCTargetVersion (Just "ghc") (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
||||||
]
|
]
|
||||||
|
|
||||||
rmGhcCheckList :: [(String, Either RmCommand RmOptions)]
|
rmGhcCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
rmGhcCheckList = mapSecond (Left . RmGHC . RmOptions)
|
rmGhcCheckList = mapSecond (Left . RmGHC . RmOptions)
|
||||||
[ -- failed with ("rm ghc", xxx)
|
[ -- failed with ("rm ghc", xxx)
|
||||||
("rm ghc 9.2.8", mkTVer $(versionQ "9.2.8"))
|
("rm ghc 9.2.8", mkTVer (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
||||||
, ("rm ghc ghc-9.2.8", GHCTargetVersion (Just "ghc") $(versionQ "9.2.8"))
|
, ("rm ghc ghc-9.2.8", GHCTargetVersion (Just "ghc") (mkVersion $ (Digits 9 :| []) :| [Digits 2 :| [], Digits 8 :| []]))
|
||||||
]
|
]
|
||||||
|
|
||||||
rmCabalCheckList :: [(String, Either RmCommand RmOptions)]
|
rmCabalCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
rmCabalCheckList = mapSecond (Left . RmCabal)
|
rmCabalCheckList = mapSecond (Left . RmCabal)
|
||||||
[ -- failed with ("rm cabal", xxx)
|
[ -- failed with ("rm cabal", xxx)
|
||||||
("rm cabal 3.10", $(versionQ "3.10"))
|
("rm cabal 3.10", mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
, ("rm cabal cabal-3.10", $(versionQ "cabal-3.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 :: [(String, Either RmCommand RmOptions)]
|
||||||
rmHlsCheckList = mapSecond (Left . RmHLS)
|
rmHlsCheckList = mapSecond (Left . RmHLS)
|
||||||
[ -- failed with ("rm hls", xxx)
|
[ -- failed with ("rm hls", xxx)
|
||||||
("rm hls 2.0", $(versionQ "2.0"))
|
("rm hls 2.0", mkVersion $ (Digits 2 :| []) :| [Digits 0 :| []])
|
||||||
, ("rm hls hls-2.0", $(versionQ "hls-2.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 :: [(String, Either RmCommand RmOptions)]
|
||||||
rmStackCheckList = mapSecond (Left . RmStack)
|
rmStackCheckList = mapSecond (Left . RmStack)
|
||||||
[ -- failed with ("rm stack", xxx)
|
[ -- failed with ("rm stack", xxx)
|
||||||
("rm stack 2.9.1", $(versionQ "2.9.1"))
|
("rm stack 2.9.1", mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 1 :| []])
|
||||||
, ("rm stack stack-2.9.1", $(versionQ "stack-2.9.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 :: [String] -> IO (Either RmCommand RmOptions)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE CPP #-}
|
{-# LANGUAGE CPP #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module RunTest where
|
module RunTest where
|
||||||
|
|
||||||
@@ -8,7 +7,6 @@ import Test.Tasty
|
|||||||
import GHCup.OptParse
|
import GHCup.OptParse
|
||||||
import Utils
|
import Utils
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import Data.Versions (versionQ)
|
|
||||||
|
|
||||||
|
|
||||||
runTests :: TestTree
|
runTests :: TestTree
|
||||||
@@ -37,11 +35,11 @@ runCheckList =
|
|||||||
, ("run --install", defaultOptions{runInstTool' = True})
|
, ("run --install", defaultOptions{runInstTool' = True})
|
||||||
, ("run -m", defaultOptions{runMinGWPath = True})
|
, ("run -m", defaultOptions{runMinGWPath = True})
|
||||||
, ("run --mingw-path", defaultOptions{runMinGWPath = True})
|
, ("run --mingw-path", defaultOptions{runMinGWPath = True})
|
||||||
, ("run --ghc 9.2.8", defaultOptions{runGHCVer = Just $ GHCVersion $ mkTVer $(versionQ "9.2.8")})
|
, ("run --ghc 9.2.8", defaultOptions{runGHCVer = Just $ GHCVersion $ mkTVer $ mkVersion' "9.2.8"})
|
||||||
, ("run --ghc latest", defaultOptions{runGHCVer = Just $ ToolTag Latest})
|
, ("run --ghc latest", defaultOptions{runGHCVer = Just $ ToolTag Latest})
|
||||||
, ("run --cabal 3.10", defaultOptions{runCabalVer = Just $ ToolVersion $(versionQ "3.10")})
|
, ("run --cabal 3.10", defaultOptions{runCabalVer = Just $ ToolVersion $ mkVersion' "3.10"})
|
||||||
, ("run --hls 2.0", defaultOptions{runHLSVer = Just $ ToolVersion $(versionQ "2.0")})
|
, ("run --hls 2.0", defaultOptions{runHLSVer = Just $ ToolVersion $ mkVersion' "2.0"})
|
||||||
, ("run --stack 2.9", defaultOptions{runStackVer = Just $ ToolVersion $(versionQ "2.9") })
|
, ("run --stack 2.9", defaultOptions{runStackVer = Just $ ToolVersion $ mkVersion' "2.9"})
|
||||||
#ifdef IS_WINDOWS
|
#ifdef IS_WINDOWS
|
||||||
, ("run -b C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
, ("run -b C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
||||||
, ("run --bindir C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
, ("run --bindir C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
||||||
@@ -54,9 +52,9 @@ runCheckList =
|
|||||||
, ("run --ghc latest --cabal 3.10 --stack 2.9 --hls 2.0 --install",
|
, ("run --ghc latest --cabal 3.10 --stack 2.9 --hls 2.0 --install",
|
||||||
defaultOptions
|
defaultOptions
|
||||||
{ runGHCVer = Just $ ToolTag Latest
|
{ runGHCVer = Just $ ToolTag Latest
|
||||||
, runCabalVer = Just $ ToolVersion $(versionQ "3.10")
|
, runCabalVer = Just $ ToolVersion $ mkVersion' "3.10"
|
||||||
, runHLSVer = Just $ ToolVersion $(versionQ "2.0")
|
, runHLSVer = Just $ ToolVersion $ mkVersion' "2.0"
|
||||||
, runStackVer = Just $ ToolVersion $(versionQ "2.9")
|
, runStackVer = Just $ ToolVersion $ mkVersion' "2.9"
|
||||||
, runInstTool' = True
|
, runInstTool' = True
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module SetTest where
|
module SetTest where
|
||||||
|
|
||||||
@@ -28,44 +27,44 @@ oldStyleCheckList = mapSecond (Right . SetOptions)
|
|||||||
, ("set ghc-9.2", SetGHCVersion
|
, ("set ghc-9.2", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc")
|
(Just "ghc")
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
, ("set next", SetNext)
|
, ("set next", SetNext)
|
||||||
, ("set latest", SetToolTag Latest)
|
, ("set latest", SetToolTag Latest)
|
||||||
, ("set nightly", SetGHCVersion
|
, ("set nightly", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "nightly")
|
(mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
)
|
)
|
||||||
-- different from `set`
|
-- different from `set`
|
||||||
, ("set recommended", SetToolTag Recommended)
|
, ("set recommended", SetToolTag Recommended)
|
||||||
, ("set prerelease", SetGHCVersion
|
, ("set prerelease", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "prerelease")
|
(mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("set latest-prerelease", SetToolTag LatestPrerelease)
|
, ("set latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
, ("set latest-nightly", SetToolTag LatestNightly)
|
, ("set latest-nightly", SetToolTag LatestNightly)
|
||||||
, ("set ghc-javascript-unknown-ghcjs-9.6", SetGHCVersion
|
, ("set ghc-javascript-unknown-ghcjs-9.6", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc-javascript-unknown-ghcjs")
|
(Just "ghc-javascript-unknown-ghcjs")
|
||||||
$(versionQ "9.6")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
||||||
)
|
)
|
||||||
, ("set base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("set base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("set cabal-3.10", SetGHCVersion
|
, ("set cabal-3.10", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "cabal")
|
(Just "cabal")
|
||||||
$(versionQ "3.10")
|
(mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
)
|
)
|
||||||
, ("set hls-2.0.0.0", SetGHCVersion
|
, ("set hls-2.0.0.0", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "hls")
|
(Just "hls")
|
||||||
$(versionQ "2.0.0.0")
|
(mkVersion $ (Digits 2 :| []) :| [Digits 0 :| [], Digits 0 :| [], Digits 0 :| []])
|
||||||
)
|
)
|
||||||
, ("set stack-2.9.3", SetGHCVersion
|
, ("set stack-2.9.3", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "stack")
|
(Just "stack")
|
||||||
$(versionQ "2.9.3")
|
(mkVersion $ (Digits 2 :| []) :| [Digits 9 :| [], Digits 3 :| []])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -75,79 +74,100 @@ setGhcCheckList = mapSecond (Left . SetGHC . SetOptions)
|
|||||||
, ("set ghc 9.2", SetGHCVersion
|
, ("set ghc 9.2", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
, ("set ghc next", SetNext)
|
, ("set ghc next", SetNext)
|
||||||
, ("set ghc latest", SetToolTag Latest)
|
, ("set ghc latest", SetToolTag Latest)
|
||||||
, ("set ghc nightly", SetGHCVersion
|
, ("set ghc nightly", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "nightly")
|
(mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("set ghc recommended", SetToolTag Recommended)
|
, ("set ghc recommended", SetToolTag Recommended)
|
||||||
, ("set ghc prerelease", SetGHCVersion
|
, ("set ghc prerelease", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
Nothing
|
Nothing
|
||||||
$(versionQ "prerelease")
|
(mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
)
|
)
|
||||||
, ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
|
, ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
, ("set ghc latest-nightly", SetToolTag LatestNightly)
|
, ("set ghc latest-nightly", SetToolTag LatestNightly)
|
||||||
, ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
|
, ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "javascript-unknown-ghcjs")
|
(Just "javascript-unknown-ghcjs")
|
||||||
$(versionQ "9.6")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 6 :| []])
|
||||||
)
|
)
|
||||||
, ("set ghc base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("set ghc base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("set ghc ghc-9.2", SetGHCVersion
|
, ("set ghc ghc-9.2", SetGHCVersion
|
||||||
$ GHCTargetVersion
|
$ GHCTargetVersion
|
||||||
(Just "ghc")
|
(Just "ghc")
|
||||||
$(versionQ "9.2")
|
(mkVersion $ (Digits 9 :| []) :| [Digits 2 :| []])
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
setCabalCheckList :: [(String, Either SetCommand SetOptions)]
|
setCabalCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
setCabalCheckList = mapSecond (Left . SetCabal . SetOptions)
|
setCabalCheckList = mapSecond (Left . SetCabal . SetOptions)
|
||||||
[ ("set cabal", SetRecommended)
|
[ ("set cabal", SetRecommended)
|
||||||
, ("set cabal 3.10", SetToolVersion $(versionQ "3.10"))
|
, ("set cabal 3.10", SetToolVersion $ mkVersion $ (Digits 3 :| []) :| [Digits 10 :| []])
|
||||||
, ("set cabal next", SetNext)
|
, ("set cabal next", SetNext)
|
||||||
, ("set cabal latest", SetToolTag Latest)
|
, ("set cabal latest", SetToolTag Latest)
|
||||||
, ("set cabal nightly", SetToolVersion $(versionQ "nightly"))
|
, ("set cabal nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("set cabal recommended", SetToolTag Recommended)
|
, ("set cabal recommended", SetToolTag Recommended)
|
||||||
, ("set cabal prerelease", SetToolVersion $(versionQ "prerelease"))
|
, ("set cabal prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
|
, ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
, ("set cabal latest-nightly", SetToolTag LatestNightly)
|
, ("set cabal latest-nightly", SetToolTag LatestNightly)
|
||||||
, ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("set cabal cabal-3.10", SetToolVersion $(versionQ "cabal-3.10"))
|
, ("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 :: [(String, Either SetCommand SetOptions)]
|
||||||
setHlsCheckList = mapSecond (Left . SetHLS . SetOptions)
|
setHlsCheckList = mapSecond (Left . SetHLS . SetOptions)
|
||||||
[ ("set hls", SetRecommended)
|
[ ("set hls", SetRecommended)
|
||||||
, ("set hls 2.0", SetToolVersion $(versionQ "2.0"))
|
, ("set hls 2.0", SetToolVersion $ mkVersion $ (Digits 2 :| []) :| [Digits 0 :| []])
|
||||||
, ("set hls next", SetNext)
|
, ("set hls next", SetNext)
|
||||||
, ("set hls latest", SetToolTag Latest)
|
, ("set hls latest", SetToolTag Latest)
|
||||||
, ("set hls nightly", SetToolVersion $(versionQ "nightly"))
|
, ("set hls nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("set hls recommended", SetToolTag Recommended)
|
, ("set hls recommended", SetToolTag Recommended)
|
||||||
, ("set hls prerelease", SetToolVersion $(versionQ "prerelease"))
|
, ("set hls prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("set hls latest-prerelease", SetToolTag LatestPrerelease)
|
, ("set hls latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
, ("set hls latest-nightly", SetToolTag LatestNightly)
|
, ("set hls latest-nightly", SetToolTag LatestNightly)
|
||||||
, ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("set hls hls-2.0", SetToolVersion $(versionQ "hls-2.0"))
|
, ("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 :: [(String, Either SetCommand SetOptions)]
|
||||||
setStackCheckList = mapSecond (Left . SetStack . SetOptions)
|
setStackCheckList = mapSecond (Left . SetStack . SetOptions)
|
||||||
[ ("set stack", SetRecommended)
|
[ ("set stack", SetRecommended)
|
||||||
, ("set stack 2.9", SetToolVersion $(versionQ "2.9"))
|
, ("set stack 2.9", SetToolVersion $ mkVersion $ (Digits 2 :| []) :| [Digits 9 :| []])
|
||||||
, ("set stack next", SetNext)
|
, ("set stack next", SetNext)
|
||||||
, ("set stack latest", SetToolTag Latest)
|
, ("set stack latest", SetToolTag Latest)
|
||||||
, ("set stack nightly", SetToolVersion $(versionQ "nightly"))
|
, ("set stack nightly", SetToolVersion $ mkVersion $ (Str "nightly" :| []) :| [])
|
||||||
, ("set stack recommended", SetToolTag Recommended)
|
, ("set stack recommended", SetToolTag Recommended)
|
||||||
, ("set stack prerelease", SetToolVersion $(versionQ "prerelease"))
|
, ("set stack prerelease", SetToolVersion $ mkVersion $ (Str "prerelease" :| []) :| [])
|
||||||
, ("set stack latest-prerelease", SetToolTag LatestPrerelease)
|
, ("set stack latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
, ("set stack latest-nightly", SetToolTag LatestNightly)
|
, ("set stack latest-nightly", SetToolTag LatestNightly)
|
||||||
, ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
, ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
, ("set stack stack-2.9", SetToolVersion $(versionQ "stack-2.9"))
|
, ("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 :: [String] -> IO (Either SetCommand SetOptions)
|
||||||
|
|||||||
@@ -4,9 +4,12 @@ module Utils where
|
|||||||
import GHCup.OptParse as GHCup
|
import GHCup.OptParse as GHCup
|
||||||
import Options.Applicative
|
import Options.Applicative
|
||||||
import Data.Bifunctor
|
import Data.Bifunctor
|
||||||
|
import Data.Versions
|
||||||
|
import Data.List.NonEmpty (NonEmpty)
|
||||||
import Test.Tasty
|
import Test.Tasty
|
||||||
import Test.Tasty.HUnit
|
import Test.Tasty.HUnit
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
|
import qualified Data.Text as T
|
||||||
|
|
||||||
parseWith :: [String] -> IO Command
|
parseWith :: [String] -> IO Command
|
||||||
parseWith args =
|
parseWith args =
|
||||||
@@ -20,6 +23,14 @@ padLeft desiredLength s = padding ++ s
|
|||||||
mapSecond :: (b -> c) -> [(a,b)] -> [(a,c)]
|
mapSecond :: (b -> c) -> [(a,b)] -> [(a,c)]
|
||||||
mapSecond = map . second
|
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
|
buildTestTree
|
||||||
:: (Eq a, Show a)
|
:: (Eq a, Show a)
|
||||||
=> ([String] -> IO a) -- ^ The parse function
|
=> ([String] -> IO a) -- ^ The parse function
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
|
||||||
|
|
||||||
module WhereisTest where
|
module WhereisTest where
|
||||||
|
|
||||||
@@ -7,7 +6,6 @@ import Test.Tasty
|
|||||||
import GHCup.OptParse
|
import GHCup.OptParse
|
||||||
import Utils
|
import Utils
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
import Data.Versions (versionQ)
|
|
||||||
|
|
||||||
whereisTests :: TestTree
|
whereisTests :: TestTree
|
||||||
whereisTests = buildTestTree whereisParseWith ("whereis", whereisCheckList)
|
whereisTests = buildTestTree whereisParseWith ("whereis", whereisCheckList)
|
||||||
@@ -15,8 +13,8 @@ whereisTests = buildTestTree whereisParseWith ("whereis", whereisCheckList)
|
|||||||
whereisCheckList :: [(String, (WhereisOptions, WhereisCommand))]
|
whereisCheckList :: [(String, (WhereisOptions, WhereisCommand))]
|
||||||
whereisCheckList = concatMap mk
|
whereisCheckList = concatMap mk
|
||||||
[ ("whereis ghc", WhereisTool GHC Nothing)
|
[ ("whereis ghc", WhereisTool GHC Nothing)
|
||||||
, ("whereis ghc 9.2.8", WhereisTool GHC (Just $ GHCVersion $ mkTVer $(versionQ "9.2.8")))
|
, ("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") $(versionQ "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 ghc latest", WhereisTool GHC (Just $ ToolTag Latest))
|
||||||
, ("whereis cabal", WhereisTool Cabal Nothing)
|
, ("whereis cabal", WhereisTool Cabal Nothing)
|
||||||
, ("whereis hls", WhereisTool HLS Nothing)
|
, ("whereis hls", WhereisTool HLS Nothing)
|
||||||
|
|||||||
Reference in New Issue
Block a user