Compare commits
88 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 96f7aa5c62 | |||
| c2186bb33c | |||
| 1a9d43ea1a | |||
| 9de324d3c3 | |||
| b53acfe61f | |||
|
|
c92f71471d | ||
| 2a79c669a5 | |||
| 9b2d326c38 | |||
| 2bfca3760c | |||
| 0f7f5347d8 | |||
| 80703d7b29 | |||
| 942685f396 | |||
| 02744ff4a0 | |||
| c74409b9a5 | |||
| 1c32dbc88a | |||
| ab17270761 | |||
| d0538a50e0 | |||
| 318ac21e41 | |||
| 3e9bb7c369 | |||
| 2c64cd0f02 | |||
| 59e6b65249 | |||
| 91ef2c7666 | |||
| 935cb5541b | |||
| 9a7eb11c73 | |||
| 4b338ccfd8 | |||
| ca92b29ffe | |||
| ec4e69e89d | |||
| c225f2cfee | |||
| e325728f38 | |||
| c9a44d211e | |||
| 4b3ffd8570 | |||
| 3e9746cf0c | |||
| 950155cbe3 | |||
| dd978ff2fd | |||
| 4bbaffaa6f | |||
| 2a12362e75 | |||
| 411ac8dc31 | |||
| b837a93176 | |||
| 1c56e782d2 | |||
| c6c61ca486 | |||
| 6ae312c1f9 | |||
| f6cf4cb90c | |||
| 3ff65219e8 | |||
| e33f554838 | |||
| 2850f343b9 | |||
|
|
8d6445c632 | ||
|
|
de611e0d4e | ||
|
|
6fec9d4737 | ||
|
|
856e48aa14 | ||
|
|
2cafd9d2bc | ||
|
|
87ec8c756f | ||
| 2ece023c0f | |||
| 16e20ed474 | |||
| afd7e7dc4f | |||
| d46bdbf959 | |||
| cac3cec135 | |||
| 4e0efff4c4 | |||
| 71b7c96ddd | |||
| 5ff61cdf86 | |||
| 7d0ba7fc62 | |||
| bfe56aed1f | |||
| a1103c05a5 | |||
| 125125b9db | |||
| 4eec582f1b | |||
| e969489ca2 | |||
| ec4a657b42 | |||
| 55030d83da | |||
|
|
dfe213824f | ||
| c680a9f33b | |||
| df192ee18e | |||
|
|
008def2ff4 | ||
|
|
3976daddb7 | ||
| 524cdbbeb1 | |||
| a01c5acfe2 | |||
|
|
6689312ac5 | ||
| e214695a3e | |||
|
|
9d7f99bd00 | ||
| 3cea6ef97c | |||
| 3b0f131a65 | |||
|
|
e0a3020e34 | ||
|
|
0e46b9509a | ||
|
|
d3474d0cd9 | ||
|
|
5c3dad1bb9 | ||
|
|
987cdaf313 | ||
|
|
835352428a | ||
|
|
8f4246e716 | ||
|
|
1353a2fd20 | ||
|
|
aa9fbdbfc2 |
28
.cirrus.yml
28
.cirrus.yml
@@ -1,28 +0,0 @@
|
|||||||
freebsd_instance:
|
|
||||||
image_family: freebsd-13-2
|
|
||||||
|
|
||||||
build_task:
|
|
||||||
name: build
|
|
||||||
env:
|
|
||||||
GHC_VER: 9.2.4
|
|
||||||
CABAL_VER: 3.8.1.0
|
|
||||||
ARTIFACT: "x86_64-portbld-freebsd-ghcup"
|
|
||||||
ARCH: 64
|
|
||||||
RUNNER_OS: FreeBSD
|
|
||||||
DISTRO: na
|
|
||||||
GITHUB_WORKSPACE: ${CIRRUS_WORKING_DIR}
|
|
||||||
JSON_VERSION: "0.0.7"
|
|
||||||
CIRRUS_CLONE_SUBMODULES: true
|
|
||||||
AWS_ACCESS_KEY_ID: ENCRYPTED[6ed6287e2dd78ab5f84b22232c5245834ab042bd8ba443883aaf4b4d1ecc0481add1fdfad5ae6f6a8cfb418e6f19b2fc]
|
|
||||||
AWS_SECRET_ACCESS_KEY: ENCRYPTED[16f3cda2954c7cee99444e6788eb5997382aa4ce1477e7523fef2586077541f43b5c816156961fc6b4677259679875a7]
|
|
||||||
S3_HOST: ENCRYPTED[ce961780a33159f7d1d8046956b5ac6ebc3bfc8149428e5f538576cda51d9f3d0c35b79cdd1e325793639ff6e31f889d]
|
|
||||||
install_script:
|
|
||||||
- sed -i.bak -e 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
|
|
||||||
- pkg install -y ghc hs-cabal-install git bash misc/compat10x misc/compat11x misc/compat12x gmake llvm14
|
|
||||||
script:
|
|
||||||
- tzsetup Etc/GMT
|
|
||||||
- adjkerntz -a
|
|
||||||
- bash .github/scripts/build.sh
|
|
||||||
- bash .github/scripts/test.sh
|
|
||||||
binaries_artifacts:
|
|
||||||
path: "out/*"
|
|
||||||
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:/$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" "$@"
|
"$GHCUP_BIN/ghcup${ext}" -c -s "file:${GITHUB_WORKSPACE//\\//}/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
|
||||||
|
|||||||
4
.github/scripts/env.sh
vendored
4
.github/scripts/env.sh
vendored
@@ -9,6 +9,10 @@ fi
|
|||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
export TZ=Asia/Singapore
|
export TZ=Asia/Singapore
|
||||||
|
|
||||||
|
if [ "${RUNNER_OS}" = "freebsd" ] ; then
|
||||||
|
export RUNNER_OS=FreeBSD
|
||||||
|
fi
|
||||||
|
|
||||||
export OS="$RUNNER_OS"
|
export OS="$RUNNER_OS"
|
||||||
export PATH="$HOME/.local/bin:$PATH"
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
|
|
||||||
|
|||||||
11
.github/scripts/test.sh
vendored
11
.github/scripts/test.sh
vendored
@@ -11,6 +11,7 @@ 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}"
|
||||||
@@ -38,6 +39,12 @@ rm "ghcup-test${ext}" "ghcup-test-optparse${ext}"
|
|||||||
|
|
||||||
eghcup --numeric-version
|
eghcup --numeric-version
|
||||||
|
|
||||||
|
# test PATH on windows wrt msys2
|
||||||
|
# https://github.com/haskell/ghcup-hs/pull/992/checks
|
||||||
|
if [ "${OS}" = "Windows" ] ; then
|
||||||
|
eghcup run -m -- sh -c 'echo $PATH' | sed 's/:/\n/' | grep '^/mingw64/bin$'
|
||||||
|
fi
|
||||||
|
|
||||||
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}")"
|
||||||
@@ -193,7 +200,7 @@ 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-0.0.7.yaml list
|
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-${JSON_VERSION}.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")
|
||||||
@@ -203,7 +210,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-0.0.7.yaml list
|
raw_eghcup -s https://raw.githubusercontent.com/haskell/ghcup-metadata/exp/ghcup-${JSON_VERSION}.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}" ]
|
||||||
|
|||||||
4
.github/workflows/bootstrap.yaml
vendored
4
.github/workflows/bootstrap.yaml
vendored
@@ -52,7 +52,9 @@ jobs:
|
|||||||
- if: runner.os == 'Windows'
|
- if: runner.os == 'Windows'
|
||||||
name: Run bootstrap
|
name: Run bootstrap
|
||||||
run: |
|
run: |
|
||||||
|
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
|
||||||
$curDir = Get-Location
|
$curDir = Get-Location
|
||||||
Write-Host "Current Working Directory: $curDir"
|
Write-Host "Current Working Directory: $curDir"
|
||||||
./scripts/bootstrap/bootstrap-haskell.ps1 -InstallDir ${GITHUB_WORKSPACE} -BootstrapUrl ("{0}/scripts/bootstrap/bootstrap-haskell" -f $curDir) -InBash
|
./scripts/bootstrap/bootstrap-haskell.ps1 -InstallDir ${GITHUB_WORKSPACE} -BootstrapUrl ("{0}/scripts/bootstrap/bootstrap-haskell" -f $curDir) -InBash -Msys2Env "MINGW64"
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/cross.yaml
vendored
2
.github/workflows/cross.yaml
vendored
@@ -19,7 +19,7 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build linux binary
|
name: Build linux binary
|
||||||
runs-on: ubuntu-latest
|
runs-on: [self-hosted, Linux, X64, maerwald]
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.1.0
|
CABAL_VER: 3.10.1.0
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.7"
|
||||||
|
|||||||
2
.github/workflows/docker.yaml
vendored
2
.github/workflows/docker.yaml
vendored
@@ -57,6 +57,7 @@ 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 -- {} +"
|
||||||
|
|
||||||
@@ -93,6 +94,7 @@ 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 -- {} +"
|
||||||
|
|
||||||
|
|||||||
147
.github/workflows/release.yaml
vendored
147
.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.1.0
|
CABAL_VER: 3.10.2.0
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
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: 8.10.7
|
GHC_VER: 9.4.8
|
||||||
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.10.1.0
|
CABAL_VER: 3.6.2.0
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
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,18 +96,13 @@ 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.2
|
GHC_VER: 9.2.8
|
||||||
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.2.6
|
GHC_VER: 9.4.8
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/debian:10
|
|
||||||
name: Cleanup (aarch64 linux)
|
|
||||||
with:
|
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
|
||||||
|
|
||||||
- name: git config
|
- name: git config
|
||||||
run: |
|
run: |
|
||||||
git config --global --get-all safe.directory | grep '^\*$' || git config --global --add safe.directory "*"
|
git config --global --get-all safe.directory | grep '^\*$' || git config --global --add safe.directory "*"
|
||||||
@@ -158,9 +153,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.1.0
|
CABAL_VER: 3.10.2.0
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.13
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
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 }}
|
||||||
@@ -170,15 +165,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.2.6
|
GHC_VER: 9.4.8
|
||||||
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.2.6
|
GHC_VER: 9.4.8
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
ARTIFACT: "x86_64-mingw64-ghcup"
|
ARTIFACT: "x86_64-mingw64-ghcup"
|
||||||
GHC_VER: 8.10.7
|
GHC_VER: 9.4.8
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
@@ -189,13 +184,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@11 autoconf automake
|
bash .github/scripts/brew.sh git coreutils llvm@13 autoconf automake
|
||||||
export PATH="$HOME/.brew/bin:$HOME/.brew/sbin:$HOME/.brew/opt/llvm@11/bin:$PATH"
|
export PATH="$HOME/.brew/bin:$HOME/.brew/sbin:$HOME/.brew/opt/llvm@13/bin:$PATH"
|
||||||
export CC="$HOME/.brew/opt/llvm@11/bin/clang"
|
export CC="$HOME/.brew/opt/llvm@13/bin/clang"
|
||||||
export CXX="$HOME/.brew/opt/llvm@11/bin/clang++"
|
export CXX="$HOME/.brew/opt/llvm@13/bin/clang++"
|
||||||
export LD=ld
|
export LD=ld
|
||||||
export AR="$HOME/.brew/opt/llvm@11/bin/llvm-ar"
|
export AR="$HOME/.brew/opt/llvm@13/bin/llvm-ar"
|
||||||
export RANLIB="$HOME/.brew/opt/llvm@11/bin/llvm-ranlib"
|
export RANLIB="$HOME/.brew/opt/llvm@13/bin/llvm-ranlib"
|
||||||
bash .github/scripts/build.sh
|
bash .github/scripts/build.sh
|
||||||
env:
|
env:
|
||||||
ARTIFACT: ${{ matrix.ARTIFACT }}
|
ARTIFACT: ${{ matrix.ARTIFACT }}
|
||||||
@@ -246,13 +241,49 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
./out/*
|
./out/*
|
||||||
|
|
||||||
|
build-freebsd:
|
||||||
|
name: Build binary (FreeBSD)
|
||||||
|
runs-on: [self-hosted, FreeBSD, X64]
|
||||||
|
env:
|
||||||
|
CABAL_VER: 3.10.2.0
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
|
JSON_VERSION: "0.0.8"
|
||||||
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
S3_HOST: ${{ secrets.S3_HOST }}
|
||||||
|
ARTIFACT: "x86_64-portbld-freebsd-ghcup"
|
||||||
|
GHC_VER: 9.4.8
|
||||||
|
ARCH: 64
|
||||||
|
DISTRO: na
|
||||||
|
RUNNER_OS: FreeBSD
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
|
- name: Run build
|
||||||
|
run: |
|
||||||
|
sed -i.bak -e 's/quarterly/latest/' /etc/pkg/FreeBSD.conf
|
||||||
|
pkg install -y ghc hs-cabal-install git bash misc/compat10x misc/compat11x misc/compat12x gmake llvm14 libiconv
|
||||||
|
tzsetup Etc/GMT
|
||||||
|
adjkerntz -a
|
||||||
|
bash .github/scripts/build.sh
|
||||||
|
- if: always()
|
||||||
|
name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: |
|
||||||
|
./out/*
|
||||||
|
|
||||||
test-linux:
|
test-linux:
|
||||||
name: Test linux
|
name: Test linux
|
||||||
needs: "build-linux"
|
needs: "build-linux"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.1.0
|
CABAL_VER: 3.10.2.0
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
@@ -263,12 +294,12 @@ jobs:
|
|||||||
DISTRO: Alpine
|
DISTRO: Alpine
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
GHC_VER: 8.10.7
|
GHC_VER: 9.4.8
|
||||||
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: 8.10.7
|
GHC_VER: 9.4.8
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
|
|
||||||
@@ -329,28 +360,23 @@ jobs:
|
|||||||
needs: "build-arm"
|
needs: "build-arm"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.1.0
|
CABAL_VER: 3.6.2.0
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
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.2
|
GHC_VER: 9.2.8
|
||||||
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.2.6
|
GHC_VER: 9.4.8
|
||||||
ARCH: ARM64
|
ARCH: ARM64
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: docker://arm64v8/debian:10
|
|
||||||
name: Cleanup (aarch64 linux)
|
|
||||||
with:
|
|
||||||
args: "find . -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +"
|
|
||||||
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -396,25 +422,25 @@ jobs:
|
|||||||
needs: "build-macwin"
|
needs: "build-macwin"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CABAL_VER: 3.10.1.0
|
CABAL_VER: 3.10.2.0
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.13
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
JSON_VERSION: "0.0.7"
|
JSON_VERSION: "0.0.8"
|
||||||
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.2.6
|
GHC_VER: 9.4.8
|
||||||
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.2.6
|
GHC_VER: 9.4.8
|
||||||
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: 8.10.7
|
GHC_VER: 9.4.8
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
DISTRO: na
|
DISTRO: na
|
||||||
|
|
||||||
@@ -467,6 +493,41 @@ jobs:
|
|||||||
name: testfiles
|
name: testfiles
|
||||||
path: |
|
path: |
|
||||||
./test/ghcup-test/golden/unix/GHCupInfo*json
|
./test/ghcup-test/golden/unix/GHCupInfo*json
|
||||||
|
test-freebsd:
|
||||||
|
name: Test FreeBSD
|
||||||
|
needs: "build-freebsd"
|
||||||
|
runs-on: [self-hosted, FreeBSD, X64]
|
||||||
|
env:
|
||||||
|
CABAL_VER: 3.10.2.0
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
|
JSON_VERSION: "0.0.8"
|
||||||
|
ARTIFACT: "x86_64-portbld-freebsd-ghcup"
|
||||||
|
GHC_VER: 9.4.8
|
||||||
|
ARCH: 64
|
||||||
|
DISTRO: na
|
||||||
|
RUNNER_OS: FreeBSD
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: ./out
|
||||||
|
|
||||||
|
- name: Run test
|
||||||
|
run: |
|
||||||
|
bash .github/scripts/test.sh
|
||||||
|
|
||||||
|
- if: failure()
|
||||||
|
name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: testfiles
|
||||||
|
path: |
|
||||||
|
./test/ghcup-test/golden/unix/GHCupInfo*json
|
||||||
hls:
|
hls:
|
||||||
name: hls
|
name: hls
|
||||||
needs: build-linux
|
needs: build-linux
|
||||||
@@ -475,7 +536,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.7"
|
JSON_VERSION: "0.0.8"
|
||||||
ARTIFACT: "x86_64-linux-ghcup"
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
DISTRO: Ubuntu
|
DISTRO: Ubuntu
|
||||||
ARCH: 64
|
ARCH: 64
|
||||||
@@ -500,7 +561,7 @@ jobs:
|
|||||||
|
|
||||||
release:
|
release:
|
||||||
name: release
|
name: release
|
||||||
needs: ["test-linux", "test-arm", "test-macwin", "hls"]
|
needs: ["test-linux", "test-arm", "test-macwin", "test-freebsd", "hls"]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,6 +4,7 @@ codex.tags
|
|||||||
dist-newstyle/
|
dist-newstyle/
|
||||||
cabal.project.local
|
cabal.project.local
|
||||||
.stack-work/
|
.stack-work/
|
||||||
|
.hiefiles/
|
||||||
bin/
|
bin/
|
||||||
/*.prof
|
/*.prof
|
||||||
/*.ps
|
/*.ps
|
||||||
|
|||||||
@@ -7,6 +7,11 @@
|
|||||||
{-# LANGUAGE ViewPatterns #-}
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
{-# OPTIONS_GHC -Wno-unused-record-wildcards #-}
|
{-# OPTIONS_GHC -Wno-unused-record-wildcards #-}
|
||||||
{-# OPTIONS_GHC -Wno-unused-matches #-}
|
{-# OPTIONS_GHC -Wno-unused-matches #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
{-# LANGUAGE BangPatterns #-}
|
||||||
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
|
||||||
module BrickMain where
|
module BrickMain where
|
||||||
|
|
||||||
@@ -23,14 +28,23 @@ import GHCup.Prelude.Process
|
|||||||
import GHCup.Prompts
|
import GHCup.Prompts
|
||||||
|
|
||||||
import Brick
|
import Brick
|
||||||
import Brick.Widgets.Border
|
( BrickEvent(VtyEvent, MouseDown),
|
||||||
import Brick.Widgets.Border.Style
|
App(..),
|
||||||
import Brick.Widgets.Center
|
Padding(Max, Pad),
|
||||||
import Brick.Widgets.List ( listSelectedFocusedAttr
|
AttrMap,
|
||||||
, listSelectedAttr
|
EventM,
|
||||||
, listAttr
|
Size(..),
|
||||||
)
|
Widget(..),
|
||||||
import Codec.Archive
|
ViewportType (Vertical),
|
||||||
|
(<+>),
|
||||||
|
(<=>))
|
||||||
|
import qualified Brick
|
||||||
|
import Brick.Widgets.Border ( hBorder, borderWithLabel)
|
||||||
|
import Brick.Widgets.Border.Style ( unicode )
|
||||||
|
import Brick.Widgets.Center ( center, centerLayer )
|
||||||
|
import qualified Brick.Widgets.List as L
|
||||||
|
import Brick.Focus (FocusRing)
|
||||||
|
import qualified Brick.Focus as F
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
@@ -41,13 +55,14 @@ import Control.Monad.Trans.Except
|
|||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
import Data.Bool
|
import Data.Bool
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
|
import Data.Function ( (&), on)
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.IORef
|
import Data.IORef (IORef, readIORef, newIORef, writeIORef, modifyIORef)
|
||||||
import Data.Vector ( Vector
|
import Data.Vector ( Vector
|
||||||
, (!?)
|
|
||||||
)
|
)
|
||||||
import Data.Versions
|
import Data.Versions hiding (Lens')
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
import System.Exit
|
import System.Exit
|
||||||
@@ -68,6 +83,176 @@ import System.FilePath
|
|||||||
import qualified System.Posix.Process as SPP
|
import qualified System.Posix.Process as SPP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
import Optics.TH (makeLenses, makeLensesFor)
|
||||||
|
import Optics.State (use)
|
||||||
|
import Optics.State.Operators ( (.=), (%=), (<%=))
|
||||||
|
import Optics.Operators ((.~), (^.), (%~))
|
||||||
|
import Optics.Getter (view)
|
||||||
|
import Optics.Lens (Lens', lens, toLensVL)
|
||||||
|
|
||||||
|
{- Brick's widget:
|
||||||
|
It is a FocusRing over many list's. Each list contains the information for each tool. Each list has an internal name (for Brick's runtime)
|
||||||
|
and a label which we can use in rendering. This data-structure helps to reuse Brick.Widget.List and to navegate easily across
|
||||||
|
|
||||||
|
Consider this code as private. GenericSectionList should not be used directly as the FocusRing should be align with the Vector containing
|
||||||
|
the elements, otherwise you'd be focusing on a non-existent widget with unknown result (In theory the code is safe unless you have an empty section list).
|
||||||
|
|
||||||
|
- To build a SectionList use the safe constructor sectionList
|
||||||
|
- To access sections use the lens provider sectionL and the name of the section you'd like to access
|
||||||
|
- You can modify Brick.Widget.List.GenericList within GenericSectionList via sectionL but do not
|
||||||
|
modify the vector length
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
data GenericSectionList n t e
|
||||||
|
= GenericSectionList
|
||||||
|
{ sectionListFocusRing :: FocusRing n -- ^ The FocusRing for all sections
|
||||||
|
, sectionListElements :: !(Vector (L.GenericList n t e)) -- ^ A key-value vector
|
||||||
|
, sectionListName :: n -- ^ The section list name
|
||||||
|
}
|
||||||
|
|
||||||
|
makeLensesFor [("sectionListFocusRing", "sectionListFocusRingL"), ("sectionListElements", "sectionListElementsL"), ("sectionListName", "sectionListNameL")] ''GenericSectionList
|
||||||
|
|
||||||
|
type SectionList n e = GenericSectionList n V.Vector e
|
||||||
|
|
||||||
|
|
||||||
|
-- | Build a SectionList from nonempty list. If empty we could not defined sectionL lenses.
|
||||||
|
sectionList :: Foldable t
|
||||||
|
=> n -- The name of the section list
|
||||||
|
-> [(n, t e)] -- a list of tuples (section name, collection of elements)
|
||||||
|
-> Int
|
||||||
|
-> GenericSectionList n t e
|
||||||
|
sectionList name elements height
|
||||||
|
= GenericSectionList
|
||||||
|
{ sectionListFocusRing = F.focusRing [section_name | (section_name, _) <- elements]
|
||||||
|
, sectionListElements = V.fromList [L.list section_name els height | (section_name, els) <- elements]
|
||||||
|
, sectionListName = name
|
||||||
|
}
|
||||||
|
-- | This lens constructor, takes a name and looks if a section has such a name.
|
||||||
|
-- Used to dispatch events to sections. It is a partial function only meant to
|
||||||
|
-- be used with the FocusRing inside GenericSectionList
|
||||||
|
sectionL :: Eq n => n -> Lens' (GenericSectionList n t e) (L.GenericList n t e)
|
||||||
|
sectionL section_name = lens g s
|
||||||
|
where is_section_name = (== section_name) . L.listName
|
||||||
|
g section_list =
|
||||||
|
let elms = section_list ^. sectionListElementsL
|
||||||
|
zeroth = elms V.! 0 -- TODO: This crashes for empty vectors.
|
||||||
|
in fromMaybe zeroth (V.find is_section_name elms)
|
||||||
|
s gl@(GenericSectionList _ elms _) list =
|
||||||
|
case V.findIndex is_section_name elms of
|
||||||
|
Nothing -> gl
|
||||||
|
Just i -> let new_elms = V.update elms (V.fromList [(i, list)])
|
||||||
|
in gl & sectionListElementsL .~ new_elms
|
||||||
|
|
||||||
|
moveDown :: (L.Splittable t, Ord n, Foldable t) => EventM n (GenericSectionList n t e) ()
|
||||||
|
moveDown = do
|
||||||
|
ring <- use sectionListFocusRingL
|
||||||
|
case F.focusGetCurrent ring of
|
||||||
|
Nothing -> pure ()
|
||||||
|
Just l -> do -- If it is the last element, move to the first element of the next focus; else, just handle regular list event.
|
||||||
|
current_list <- use (sectionL l)
|
||||||
|
let current_idx = L.listSelected current_list
|
||||||
|
list_length = current_list & length
|
||||||
|
if current_idx == Just (list_length - 1)
|
||||||
|
then do
|
||||||
|
new_focus <- sectionListFocusRingL <%= F.focusNext
|
||||||
|
case F.focusGetCurrent new_focus of
|
||||||
|
Nothing -> pure () -- |- Optic.Zoom.zoom doesn't typecheck but Lens.Micro.Mtl.zoom does. It is re-exported by Brick
|
||||||
|
Just new_l -> Brick.zoom (toLensVL $ sectionL new_l) (Brick.modify L.listMoveToBeginning)
|
||||||
|
else Brick.zoom (toLensVL $ sectionL l) $ Brick.modify L.listMoveDown
|
||||||
|
|
||||||
|
moveUp :: (L.Splittable t, Ord n, Foldable t) => EventM n (GenericSectionList n t e) ()
|
||||||
|
moveUp = do
|
||||||
|
ring <- use sectionListFocusRingL
|
||||||
|
case F.focusGetCurrent ring of
|
||||||
|
Nothing -> pure ()
|
||||||
|
Just l -> do -- If it is the first element, move to the last element of the prev focus; else, just handle regular list event.
|
||||||
|
current_list <- use (sectionL l)
|
||||||
|
let current_idx = L.listSelected current_list
|
||||||
|
if current_idx == Just 0
|
||||||
|
then do
|
||||||
|
new_focus <- sectionListFocusRingL <%= F.focusPrev
|
||||||
|
case F.focusGetCurrent new_focus of
|
||||||
|
Nothing -> pure ()
|
||||||
|
Just new_l -> Brick.zoom (toLensVL $ sectionL new_l) (Brick.modify L.listMoveToEnd)
|
||||||
|
else Brick.zoom (toLensVL $ sectionL l) $ Brick.modify L.listMoveUp
|
||||||
|
|
||||||
|
-- | Handle events for list cursor movement. Events handled are:
|
||||||
|
--
|
||||||
|
-- * Up (up arrow key). If first element of section, then jump prev section
|
||||||
|
-- * Down (down arrow key). If last element of section, then jump next section
|
||||||
|
-- * Page Up (PgUp)
|
||||||
|
-- * Page Down (PgDown)
|
||||||
|
-- * Go to next section (Tab)
|
||||||
|
-- * Go to prev section (BackTab)
|
||||||
|
handleGenericListEvent :: (Foldable t, L.Splittable t, Ord n)
|
||||||
|
=> BrickEvent n a
|
||||||
|
-> EventM n (GenericSectionList n t e) ()
|
||||||
|
handleGenericListEvent (VtyEvent (Vty.EvResize _ _)) = pure ()
|
||||||
|
handleGenericListEvent (VtyEvent (Vty.EvKey (Vty.KChar '\t') [])) = sectionListFocusRingL %= F.focusNext
|
||||||
|
handleGenericListEvent (VtyEvent (Vty.EvKey Vty.KBackTab [])) = sectionListFocusRingL %= F.focusPrev
|
||||||
|
handleGenericListEvent (MouseDown _ Vty.BScrollDown _ _) = moveDown
|
||||||
|
handleGenericListEvent (MouseDown _ Vty.BScrollUp _ _) = moveUp
|
||||||
|
handleGenericListEvent (VtyEvent (Vty.EvKey Vty.KDown [])) = moveDown
|
||||||
|
handleGenericListEvent (VtyEvent (Vty.EvKey Vty.KUp [])) = moveUp
|
||||||
|
handleGenericListEvent (VtyEvent ev) = do
|
||||||
|
ring <- use sectionListFocusRingL
|
||||||
|
case F.focusGetCurrent ring of
|
||||||
|
Nothing -> pure ()
|
||||||
|
Just l -> Brick.zoom (toLensVL $ sectionL l) $ L.handleListEvent ev
|
||||||
|
handleGenericListEvent _ = pure ()
|
||||||
|
|
||||||
|
-- This re-uses Brick.Widget.List.renderList
|
||||||
|
renderSectionList :: forall n t e . (Traversable t, Ord n, Show n, Eq n, L.Splittable t, Semigroup (t e))
|
||||||
|
=> (Bool -> e -> Widget n) -- ^ Rendering function of the list element, True for the selected element
|
||||||
|
-> Bool -- ^ Whether the section list has focus
|
||||||
|
-> GenericSectionList n t e -- ^ The section list to render
|
||||||
|
-> Widget n
|
||||||
|
renderSectionList renderElem sectionFocus ge@(GenericSectionList focus elms slName) =
|
||||||
|
Brick.Widget Brick.Greedy Brick.Greedy $ Brick.render $ Brick.viewport slName Brick.Vertical $
|
||||||
|
V.ifoldl' (\(!accWidget) !i list ->
|
||||||
|
let hasFocusList = sectionIsFocused list
|
||||||
|
makeVisible = if hasFocusList then Brick.visibleRegion (Brick.Location (c, r)) (1, 1) else id
|
||||||
|
appendBorder = if i == 0 then id else (hBorder <=>)
|
||||||
|
newWidget = appendBorder (makeVisible $ renderInnerList hasFocusList list)
|
||||||
|
in accWidget <=> newWidget
|
||||||
|
)
|
||||||
|
Brick.emptyWidget
|
||||||
|
elms
|
||||||
|
where
|
||||||
|
-- A section is focused if the whole thing is focused, and the inner list has focus
|
||||||
|
sectionIsFocused :: L.GenericList n t e -> Bool
|
||||||
|
sectionIsFocused l = sectionFocus && (Just (L.listName l) == F.focusGetCurrent focus)
|
||||||
|
|
||||||
|
renderInnerList :: Bool -> L.GenericList n t e -> Widget n
|
||||||
|
renderInnerList hasFocus l = Brick.vLimit (length l) $ L.renderList (\b -> renderElem (b && hasFocus)) hasFocus l
|
||||||
|
|
||||||
|
-- compute the location to focus on within the active section
|
||||||
|
(c, r) :: (Int, Int) = case sectionListSelectedElement ge of
|
||||||
|
Nothing -> (0, 0)
|
||||||
|
Just (selElIx, _) -> (0, selElIx)
|
||||||
|
|
||||||
|
|
||||||
|
-- | Equivalent to listSelectedElement
|
||||||
|
sectionListSelectedElement :: (Eq n, L.Splittable t, Traversable t, Semigroup (t e)) => GenericSectionList n t e -> Maybe (Int, e)
|
||||||
|
sectionListSelectedElement generic_section_list = do
|
||||||
|
current_focus <- generic_section_list ^. sectionListFocusRingL & F.focusGetCurrent
|
||||||
|
let current_section = generic_section_list ^. sectionL current_focus
|
||||||
|
L.listSelectedElement current_section
|
||||||
|
|
||||||
|
{- Brick app data structures.
|
||||||
|
|
||||||
|
In this section we define the state, the widgets and the core data structures which we will be using for the brick app.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
data Name = AllTools -- The main list widget
|
||||||
|
| Singular Tool -- The particular list for each tool
|
||||||
|
| KeyInfoBox -- The text box widget with action informacion
|
||||||
|
| TutorialBox -- The tutorial widget
|
||||||
|
deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
|
data Mode = Navigation | KeyInfo | Tutorial deriving (Eq, Show, Ord)
|
||||||
|
|
||||||
installedSign :: String
|
installedSign :: String
|
||||||
#if IS_WINDOWS
|
#if IS_WINDOWS
|
||||||
@@ -92,56 +277,45 @@ notInstalledSign = "✗ "
|
|||||||
|
|
||||||
|
|
||||||
data BrickData = BrickData
|
data BrickData = BrickData
|
||||||
{ lr :: [ListResult]
|
{ _lr :: [ListResult]
|
||||||
}
|
}
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
data BrickSettings = BrickSettings
|
makeLenses ''BrickData
|
||||||
{ showAllVersions :: Bool
|
|
||||||
}
|
|
||||||
deriving Show
|
|
||||||
|
|
||||||
data BrickInternalState = BrickInternalState
|
data BrickSettings = BrickSettings { _showAllVersions :: Bool}
|
||||||
{ clr :: Vector ListResult
|
--deriving Show
|
||||||
, ix :: Int
|
|
||||||
}
|
makeLenses ''BrickSettings
|
||||||
deriving Show
|
|
||||||
|
type BrickInternalState = SectionList Name ListResult
|
||||||
|
|
||||||
data BrickState = BrickState
|
data BrickState = BrickState
|
||||||
{ appData :: BrickData
|
{ _appData :: BrickData
|
||||||
, appSettings :: BrickSettings
|
, _appSettings :: BrickSettings
|
||||||
, appState :: BrickInternalState
|
, _appState :: BrickInternalState
|
||||||
, appKeys :: KeyBindings
|
, _appKeys :: KeyBindings
|
||||||
|
, _mode :: Mode
|
||||||
|
}
|
||||||
|
--deriving Show
|
||||||
|
|
||||||
|
makeLenses ''BrickState
|
||||||
|
|
||||||
|
app :: AttrMap -> AttrMap -> App BrickState () Name
|
||||||
|
app attrs dimAttrs =
|
||||||
|
App { appDraw = drawUI dimAttrs
|
||||||
|
, appHandleEvent = eventHandler
|
||||||
|
, appStartEvent = return ()
|
||||||
|
, appAttrMap = const attrs
|
||||||
|
, appChooseCursor = Brick.showFirstCursor
|
||||||
}
|
}
|
||||||
deriving Show
|
|
||||||
|
|
||||||
|
|
||||||
keyHandlers :: KeyBindings
|
{- Drawing.
|
||||||
-> [ ( KeyCombination
|
|
||||||
, BrickSettings -> String
|
|
||||||
, BrickState -> EventM String BrickState ()
|
|
||||||
)
|
|
||||||
]
|
|
||||||
keyHandlers KeyBindings {..} =
|
|
||||||
[ (bQuit, const "Quit" , \_ -> halt)
|
|
||||||
, (bInstall, const "Install" , withIOAction install')
|
|
||||||
, (bUninstall, const "Uninstall", withIOAction del')
|
|
||||||
, (bSet, const "Set" , withIOAction set')
|
|
||||||
, (bChangelog, const "ChangeLog", withIOAction changelog')
|
|
||||||
, ( bShowAllVersions
|
|
||||||
, \BrickSettings {..} ->
|
|
||||||
if showAllVersions then "Don't show all versions" else "Show all versions"
|
|
||||||
, hideShowHandler (not . showAllVersions)
|
|
||||||
)
|
|
||||||
, (bUp, const "Up", \BrickState {..} -> put BrickState{ appState = moveCursor 1 appState Up, .. })
|
|
||||||
, (bDown, const "Down", \BrickState {..} -> put BrickState{ appState = moveCursor 1 appState Down, .. })
|
|
||||||
]
|
|
||||||
where
|
|
||||||
hideShowHandler f BrickState{..} =
|
|
||||||
let newAppSettings = appSettings { showAllVersions = f appSettings }
|
|
||||||
newInternalState = constructList appData newAppSettings (Just appState)
|
|
||||||
in put (BrickState appData newAppSettings newInternalState appKeys)
|
|
||||||
|
|
||||||
|
The section for creating our widgets.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
showKey :: Vty.Key -> String
|
showKey :: Vty.Key -> String
|
||||||
showKey (Vty.KChar c) = [c]
|
showKey (Vty.KChar c) = [c]
|
||||||
@@ -153,38 +327,38 @@ showMod :: Vty.Modifier -> String
|
|||||||
showMod = tail . show
|
showMod = tail . show
|
||||||
|
|
||||||
|
|
||||||
ui :: AttrMap -> BrickState -> Widget String
|
drawNavigation :: AttrMap -> BrickState -> Widget Name
|
||||||
ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
drawNavigation dimAttrs BrickState{ _appSettings = as@BrickSettings{}, ..}
|
||||||
= padBottom Max
|
= Brick.padBottom Max
|
||||||
( withBorderStyle unicode
|
( Brick.withBorderStyle unicode
|
||||||
$ borderWithLabel (str "GHCup")
|
$ borderWithLabel (Brick.str "GHCup")
|
||||||
(center (header <=> hBorder <=> renderList' appState))
|
(center (header <=> hBorder <=> renderList' _appState))
|
||||||
)
|
)
|
||||||
<=> footer
|
<=> footer
|
||||||
|
|
||||||
where
|
where
|
||||||
footer =
|
footer =
|
||||||
withAttr (attrName "help")
|
Brick.withAttr helpAttr
|
||||||
. txtWrap
|
. Brick.txtWrap
|
||||||
. T.pack
|
. T.pack
|
||||||
. foldr1 (\x y -> x <> " " <> y)
|
. foldr1 (\x y -> x <> " " <> y)
|
||||||
. fmap (\(KeyCombination key mods, s, _) -> intercalate "+" (showKey key : (showMod <$> mods)) <> ":" <> s as)
|
. fmap (\(KeyCombination key mods, s, _) -> intercalate "+" (showKey key : (showMod <$> mods)) <> ":" <> s as)
|
||||||
$ keyHandlers appKeys
|
$ keyHandlers _appKeys
|
||||||
header =
|
header =
|
||||||
minHSize 2 emptyWidget
|
minHSize 2 Brick.emptyWidget
|
||||||
<+> padLeft (Pad 2) (minHSize 6 $ str "Tool")
|
<+> Brick.padLeft (Pad 2) (minHSize 6 $ Brick.str "Tool")
|
||||||
<+> minHSize 15 (str "Version")
|
<+> minHSize 15 (Brick.str "Version")
|
||||||
<+> padLeft (Pad 1) (minHSize 25 $ str "Tags")
|
<+> Brick.padLeft (Pad 1) (minHSize 25 $ Brick.str "Tags")
|
||||||
<+> padLeft (Pad 5) (str "Notes")
|
<+> Brick.padLeft (Pad 5) (Brick.str "Notes")
|
||||||
renderList' bis@BrickInternalState{..} =
|
renderList' bis =
|
||||||
let minTagSize = V.maximum $ V.map (length . intercalate "," . fmap tagToString . lTag) clr
|
let allElements = V.concatMap L.listElements $ sectionListElements bis
|
||||||
minVerSize = V.maximum $ V.map (\ListResult{..} -> T.length $ tVerToText (GHCTargetVersion lCross lVer)) clr
|
minTagSize = V.maximum $ V.map (length . intercalate "," . fmap tagToString . lTag) allElements
|
||||||
in withDefAttr listAttr . drawListElements (renderItem minTagSize minVerSize) True $ bis
|
minVerSize = V.maximum $ V.map (\ListResult{..} -> T.length $ tVerToText (GHCTargetVersion lCross lVer)) allElements
|
||||||
renderItem minTagSize minVerSize _ b listResult@ListResult{lTag = lTag', ..} =
|
in Brick.withDefAttr L.listAttr $ renderSectionList (renderItem minTagSize minVerSize) True bis
|
||||||
|
renderItem minTagSize minVerSize b listResult@ListResult{lTag = lTag', ..} =
|
||||||
let marks = if
|
let marks = if
|
||||||
| lSet -> (withAttr (attrName "set") $ str setSign)
|
| lSet -> (Brick.withAttr setAttr $ Brick.str setSign)
|
||||||
| lInstalled -> (withAttr (attrName "installed") $ str installedSign)
|
| lInstalled -> (Brick.withAttr installedAttr $ Brick.str installedSign)
|
||||||
| otherwise -> (withAttr (attrName "not-installed") $ str notInstalledSign)
|
| otherwise -> (Brick.withAttr notInstalledAttr $ Brick.str notInstalledSign)
|
||||||
ver = case lCross of
|
ver = case lCross of
|
||||||
Nothing -> T.unpack . prettyVer $ lVer
|
Nothing -> T.unpack . prettyVer $ lVer
|
||||||
Just c -> T.unpack (c <> "-" <> prettyVer lVer)
|
Just c -> T.unpack (c <> "-" <> prettyVer lVer)
|
||||||
@@ -192,127 +366,192 @@ ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
|||||||
| lNoBindist && not lInstalled
|
| lNoBindist && not lInstalled
|
||||||
&& not b -- TODO: overloading dim and active ignores active
|
&& not b -- TODO: overloading dim and active ignores active
|
||||||
-- so we hack around it here
|
-- so we hack around it here
|
||||||
= updateAttrMap (const dimAttrs) . withAttr (attrName "no-bindist")
|
= Brick.updateAttrMap (const dimAttrs) . Brick.withAttr (Brick.attrName "no-bindist")
|
||||||
| otherwise = id
|
| otherwise = id
|
||||||
hooray
|
hooray
|
||||||
| elem Latest lTag' && not lInstalled =
|
| elem Latest lTag' && not lInstalled =
|
||||||
withAttr (attrName "hooray")
|
Brick.withAttr hoorayAttr
|
||||||
| otherwise = id
|
| otherwise = id
|
||||||
active = if b then putCursor "GHCup" (Location (0,0)) . forceAttr (attrName "active") else id
|
in hooray $ dim
|
||||||
in hooray $ active $ dim
|
|
||||||
( marks
|
( marks
|
||||||
<+> padLeft (Pad 2)
|
<+> Brick.padLeft (Pad 2)
|
||||||
( minHSize 6
|
( minHSize 6
|
||||||
(printTool lTool)
|
(printTool lTool)
|
||||||
)
|
)
|
||||||
<+> minHSize minVerSize (str ver)
|
<+> minHSize minVerSize (Brick.str ver)
|
||||||
<+> (let l = catMaybes . fmap printTag $ sort lTag'
|
<+> (let l = catMaybes . fmap printTag $ sort lTag'
|
||||||
in padLeft (Pad 1) $ minHSize minTagSize $ if null l
|
in Brick.padLeft (Pad 1) $ minHSize minTagSize $ if null l
|
||||||
then emptyWidget
|
then Brick.emptyWidget
|
||||||
else foldr1 (\x y -> x <+> str "," <+> y) l
|
else foldr1 (\x y -> x <+> Brick.str "," <+> y) l
|
||||||
)
|
)
|
||||||
<+> padLeft (Pad 5)
|
<+> Brick.padLeft (Pad 5)
|
||||||
( let notes = printNotes listResult
|
( let notes = printNotes listResult
|
||||||
in if null notes
|
in if null notes
|
||||||
then emptyWidget
|
then Brick.emptyWidget
|
||||||
else foldr1 (\x y -> x <+> str "," <+> y) notes
|
else foldr1 (\x y -> x <+> Brick.str "," <+> y) notes
|
||||||
)
|
)
|
||||||
<+> vLimit 1 (fill ' ')
|
<+> Brick.vLimit 1 (Brick.fill ' ')
|
||||||
)
|
)
|
||||||
|
|
||||||
printTag Recommended = Just $ withAttr (attrName "recommended") $ str "recommended"
|
printTag Recommended = Just $ Brick.withAttr recommendedAttr $ Brick.str "recommended"
|
||||||
printTag Latest = Just $ withAttr (attrName "latest") $ str "latest"
|
printTag Latest = Just $ Brick.withAttr latestAttr $ Brick.str "latest"
|
||||||
printTag Prerelease = Just $ withAttr (attrName "prerelease") $ str "prerelease"
|
printTag Prerelease = Just $ Brick.withAttr prereleaseAttr $ Brick.str "prerelease"
|
||||||
printTag Nightly = Just $ withAttr (attrName "nightly") $ str "nightly"
|
printTag Nightly = Just $ Brick.withAttr nightlyAttr $ Brick.str "nightly"
|
||||||
printTag (Base pvp'') = Just $ str ("base-" ++ T.unpack (prettyPVP pvp''))
|
printTag (Base pvp'') = Just $ Brick.str ("base-" ++ T.unpack (prettyPVP pvp''))
|
||||||
printTag Old = Nothing
|
printTag Old = Nothing
|
||||||
printTag LatestPrerelease = Just $ withAttr (attrName "latest-prerelease") $ str "latest-prerelease"
|
printTag LatestPrerelease = Just $ Brick.withAttr latestPrereleaseAttr $ Brick.str "latest-prerelease"
|
||||||
printTag LatestNightly = Just $ withAttr (attrName "latest-nightly") $ str "latest-nightly"
|
printTag LatestNightly = Just $ Brick.withAttr latestNightlyAttr $ Brick.str "latest-nightly"
|
||||||
printTag (UnknownTag t) = Just $ str t
|
printTag (UnknownTag t) = Just $ Brick.str t
|
||||||
|
|
||||||
printTool Cabal = str "cabal"
|
printTool Cabal = Brick.str "cabal"
|
||||||
printTool GHC = str "GHC"
|
printTool GHC = Brick.str "GHC"
|
||||||
printTool GHCup = str "GHCup"
|
printTool GHCup = Brick.str "GHCup"
|
||||||
printTool HLS = str "HLS"
|
printTool HLS = Brick.str "HLS"
|
||||||
printTool Stack = str "Stack"
|
printTool Stack = Brick.str "Stack"
|
||||||
|
|
||||||
printNotes ListResult {..} =
|
printNotes ListResult {..} =
|
||||||
(if hlsPowered then [withAttr (attrName "hls-powered") $ str "hls-powered"] else mempty
|
(if hlsPowered then [Brick.withAttr hlsPoweredAttr $ Brick.str "hls-powered"] else mempty
|
||||||
)
|
)
|
||||||
++ (if lStray then [withAttr (attrName "stray") $ str "stray"] else mempty)
|
++ (if lStray then [Brick.withAttr strayAttr $ Brick.str "stray"] else mempty)
|
||||||
++ (case lReleaseDay of
|
++ (case lReleaseDay of
|
||||||
Nothing -> mempty
|
Nothing -> mempty
|
||||||
Just d -> [withAttr (attrName "day") $ str (show d)])
|
Just d -> [Brick.withAttr dayAttr $ Brick.str (show d)])
|
||||||
|
|
||||||
-- | Draws the list elements.
|
minHSize s' = Brick.hLimit s' . Brick.vLimit 1 . (<+> Brick.fill ' ')
|
||||||
--
|
|
||||||
-- Evaluates the underlying container up to, and a bit beyond, the
|
drawTutorial :: Widget Name
|
||||||
-- selected element. The exact amount depends on available height
|
drawTutorial =
|
||||||
-- for drawing and 'listItemHeight'. At most, it will evaluate up to
|
|
||||||
-- element @(i + h + 1)@ where @i@ is the selected index and @h@ is the
|
|
||||||
-- available height.
|
|
||||||
drawListElements :: (Int -> Bool -> ListResult -> Widget String)
|
|
||||||
-> Bool
|
|
||||||
-> BrickInternalState
|
|
||||||
-> Widget String
|
|
||||||
drawListElements drawElem foc is@(BrickInternalState clr _) =
|
|
||||||
Widget Greedy Greedy $
|
|
||||||
let
|
let
|
||||||
es = clr
|
mkTextBox = Brick.hLimitPercent 70 . Brick.vBox . fmap (Brick.padRight Brick.Max)
|
||||||
listSelected = fmap fst $ listSelectedElement' is
|
txt_separator = hBorder <+> Brick.str " o " <+> hBorder
|
||||||
|
in centerLayer
|
||||||
|
$ Brick.hLimitPercent 75
|
||||||
|
$ Brick.vLimitPercent 50
|
||||||
|
$ Brick.withBorderStyle unicode
|
||||||
|
$ borderWithLabel (Brick.txt "Tutorial")
|
||||||
|
$ Brick.vBox
|
||||||
|
(fmap center
|
||||||
|
[ mkTextBox [Brick.txtWrap "GHCup is a distribution channel for Haskell's tools."]
|
||||||
|
, txt_separator
|
||||||
|
, mkTextBox [
|
||||||
|
Brick.hBox [
|
||||||
|
Brick.txt "This symbol "
|
||||||
|
, Brick.withAttr installedAttr (Brick.str installedSign)
|
||||||
|
, Brick.txtWrap " means that the tool is installed but not in used"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "This symbol "
|
||||||
|
, Brick.withAttr setAttr (Brick.str setSign)
|
||||||
|
, Brick.txtWrap " means that the tool is installed and in used"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "This symbol "
|
||||||
|
, Brick.withAttr notInstalledAttr (Brick.str notInstalledSign)
|
||||||
|
, Brick.txt " means that the tool isn't installed"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
, txt_separator
|
||||||
|
, mkTextBox [
|
||||||
|
Brick.hBox [
|
||||||
|
Brick.withAttr recommendedAttr $ Brick.str "recommended"
|
||||||
|
, Brick.txtWrap " tag is based on community adoption, known bugs, etc... So It makes this version the least experimental"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.withAttr latestAttr $ Brick.str "latest"
|
||||||
|
, Brick.txtWrap " tag is for the latest distributed version of the tool"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.withAttr latestAttr $ Brick.str "hls-powered"
|
||||||
|
, Brick.txt " denotes the compiler version supported by the currently set ("
|
||||||
|
, Brick.withAttr setAttr (Brick.str setSign)
|
||||||
|
, Brick.txt ") hls"
|
||||||
|
]
|
||||||
|
, Brick.txtWrap "base-X.Y.Z.W tag is the minimun version of the base package admited in such ghc version"
|
||||||
|
]
|
||||||
|
, Brick.txt " "
|
||||||
|
])
|
||||||
|
<=> Brick.padRight Brick.Max (Brick.txt "Press q to exit the tutorial")
|
||||||
|
|
||||||
drawnElements = flip V.imap es $ \i' e ->
|
drawKeyInfo :: KeyBindings -> Widget Name
|
||||||
let addSeparator w = case es !? (i' - 1) of
|
drawKeyInfo KeyBindings {..} =
|
||||||
Just e' | lTool e' /= lTool e ->
|
let
|
||||||
hBorder <=> w
|
mkTextBox = Brick.hLimitPercent 70 . Brick.vBox . fmap (Brick.padRight Brick.Max)
|
||||||
_ -> w
|
keyToWidget (KeyCombination key mods) = Brick.str $ intercalate "+" (showKey key : (showMod <$> mods))
|
||||||
|
in centerLayer
|
||||||
|
$ Brick.hLimitPercent 75
|
||||||
|
$ Brick.vLimitPercent 50
|
||||||
|
$ Brick.withBorderStyle unicode
|
||||||
|
$ borderWithLabel (Brick.txt "Key Actions")
|
||||||
|
$ Brick.vBox [
|
||||||
|
center $
|
||||||
|
mkTextBox [
|
||||||
|
Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bUp, Brick.txt " and ", keyToWidget bDown
|
||||||
|
, Brick.txtWrap " to navigate the list of tools"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bInstall
|
||||||
|
, Brick.txtWrap " to install the selected tool. Notice, you may need to set it as default afterwards"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bSet
|
||||||
|
, Brick.txtWrap " to set a tool as the one for use"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bUninstall
|
||||||
|
, Brick.txtWrap " to uninstall a tool"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bChangelog
|
||||||
|
, Brick.txtWrap " to open the tool's changelog. It will open a web browser"
|
||||||
|
]
|
||||||
|
, Brick.hBox [
|
||||||
|
Brick.txt "Press "
|
||||||
|
, keyToWidget bShowAllVersions
|
||||||
|
, Brick.txtWrap " to show older version of each tool"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
<=> Brick.hBox [Brick.txt "Press q to return to Navigation" <+> Brick.padRight Brick.Max (Brick.txt " ") <+> Brick.txt "Press Enter to go to the Tutorial"]
|
||||||
|
|
||||||
isSelected = Just i' == listSelected
|
drawUI :: AttrMap -> BrickState -> [Widget Name]
|
||||||
elemWidget = drawElem i' isSelected e
|
drawUI dimAttrs st =
|
||||||
selItemAttr = if foc
|
let navg = drawNavigation dimAttrs st
|
||||||
then withDefAttr listSelectedFocusedAttr
|
in case st ^. mode of
|
||||||
else withDefAttr listSelectedAttr
|
Navigation -> [navg]
|
||||||
makeVisible' = if isSelected then visible . selItemAttr else id
|
Tutorial -> [drawTutorial, navg]
|
||||||
in addSeparator $ makeVisible' elemWidget
|
KeyInfo -> [drawKeyInfo (st ^. appKeys), navg]
|
||||||
|
|
||||||
in render
|
{- Attributes
|
||||||
$ viewport "GHCup" Vertical
|
|
||||||
$ vBox
|
|
||||||
$ V.toList drawnElements
|
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
minHSize :: Int -> Widget n -> Widget n
|
|
||||||
minHSize s' = hLimit s' . vLimit 1 . (<+> fill ' ')
|
|
||||||
|
|
||||||
|
|
||||||
app :: AttrMap -> AttrMap -> App BrickState e String
|
|
||||||
app attrs dimAttrs =
|
|
||||||
App { appDraw = \st -> [ui dimAttrs st]
|
|
||||||
, appHandleEvent = \be -> get >>= \s -> eventHandler s be
|
|
||||||
, appStartEvent = return ()
|
|
||||||
, appAttrMap = const attrs
|
|
||||||
, appChooseCursor = showFirstCursor
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultAttributes :: Bool -> AttrMap
|
defaultAttributes :: Bool -> AttrMap
|
||||||
defaultAttributes no_color = attrMap
|
defaultAttributes no_color = Brick.attrMap
|
||||||
Vty.defAttr
|
Vty.defAttr
|
||||||
[ (attrName "active" , Vty.defAttr `withBackColor` Vty.blue)
|
[ (L.listSelectedFocusedAttr , Vty.defAttr `withBackColor` Vty.blue)
|
||||||
, (attrName "not-installed" , Vty.defAttr `withForeColor` Vty.red)
|
, (L.listSelectedAttr , Vty.defAttr)
|
||||||
, (attrName "set" , Vty.defAttr `withForeColor` Vty.green)
|
, (notInstalledAttr , Vty.defAttr `withForeColor` Vty.red)
|
||||||
, (attrName "installed" , Vty.defAttr `withForeColor` Vty.green)
|
, (setAttr , Vty.defAttr `withForeColor` Vty.green)
|
||||||
, (attrName "recommended" , Vty.defAttr `withForeColor` Vty.green)
|
, (installedAttr , Vty.defAttr `withForeColor` Vty.green)
|
||||||
, (attrName "hls-powered" , Vty.defAttr `withForeColor` Vty.green)
|
, (recommendedAttr , Vty.defAttr `withForeColor` Vty.green)
|
||||||
, (attrName "latest" , Vty.defAttr `withForeColor` Vty.yellow)
|
, (hlsPoweredAttr , Vty.defAttr `withForeColor` Vty.green)
|
||||||
, (attrName "latest-prerelease" , Vty.defAttr `withForeColor` Vty.red)
|
, (latestAttr , Vty.defAttr `withForeColor` Vty.yellow)
|
||||||
, (attrName "latest-nightly" , Vty.defAttr `withForeColor` Vty.red)
|
, (latestPrereleaseAttr , Vty.defAttr `withForeColor` Vty.red)
|
||||||
, (attrName "prerelease" , Vty.defAttr `withForeColor` Vty.red)
|
, (latestNightlyAttr , Vty.defAttr `withForeColor` Vty.red)
|
||||||
, (attrName "nightly" , Vty.defAttr `withForeColor` Vty.red)
|
, (prereleaseAttr , Vty.defAttr `withForeColor` Vty.red)
|
||||||
, (attrName "compiled" , Vty.defAttr `withForeColor` Vty.blue)
|
, (nightlyAttr , Vty.defAttr `withForeColor` Vty.red)
|
||||||
, (attrName "stray" , Vty.defAttr `withForeColor` Vty.blue)
|
, (compiledAttr , Vty.defAttr `withForeColor` Vty.blue)
|
||||||
, (attrName "day" , Vty.defAttr `withForeColor` Vty.blue)
|
, (strayAttr , Vty.defAttr `withForeColor` Vty.blue)
|
||||||
, (attrName "help" , Vty.defAttr `withStyle` Vty.italic)
|
, (dayAttr , Vty.defAttr `withForeColor` Vty.blue)
|
||||||
, (attrName "hooray" , Vty.defAttr `withForeColor` Vty.brightWhite)
|
, (helpAttr , Vty.defAttr `withStyle` Vty.italic)
|
||||||
|
, (hoorayAttr , Vty.defAttr `withForeColor` Vty.brightWhite)
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
withForeColor | no_color = const
|
withForeColor | no_color = const
|
||||||
@@ -323,58 +562,130 @@ defaultAttributes no_color = attrMap
|
|||||||
|
|
||||||
withStyle = Vty.withStyle
|
withStyle = Vty.withStyle
|
||||||
|
|
||||||
|
|
||||||
|
notInstalledAttr, setAttr, installedAttr, recommendedAttr, hlsPoweredAttr:: Brick.AttrName
|
||||||
|
latestAttr, latestPrereleaseAttr, latestNightlyAttr, prereleaseAttr, nightlyAttr:: Brick.AttrName
|
||||||
|
compiledAttr, strayAttr, dayAttr, helpAttr, hoorayAttr:: Brick.AttrName
|
||||||
|
|
||||||
|
notInstalledAttr = Brick.attrName "not-installed"
|
||||||
|
setAttr = Brick.attrName "set"
|
||||||
|
installedAttr = Brick.attrName "installed"
|
||||||
|
recommendedAttr = Brick.attrName "recommended"
|
||||||
|
hlsPoweredAttr = Brick.attrName "hls-powered"
|
||||||
|
latestAttr = Brick.attrName "latest"
|
||||||
|
latestPrereleaseAttr = Brick.attrName "latest-prerelease"
|
||||||
|
latestNightlyAttr = Brick.attrName "latest-nightly"
|
||||||
|
prereleaseAttr = Brick.attrName "prerelease"
|
||||||
|
nightlyAttr = Brick.attrName "nightly"
|
||||||
|
compiledAttr = Brick.attrName "compiled"
|
||||||
|
strayAttr = Brick.attrName "stray"
|
||||||
|
dayAttr = Brick.attrName "day"
|
||||||
|
helpAttr = Brick.attrName "help"
|
||||||
|
hoorayAttr = Brick.attrName "hooray"
|
||||||
|
|
||||||
dimAttributes :: Bool -> AttrMap
|
dimAttributes :: Bool -> AttrMap
|
||||||
dimAttributes no_color = attrMap
|
dimAttributes no_color = Brick.attrMap
|
||||||
(Vty.defAttr `Vty.withStyle` Vty.dim)
|
(Vty.defAttr `Vty.withStyle` Vty.dim)
|
||||||
[ (attrName "active" , Vty.defAttr `withBackColor` Vty.blue) -- has no effect ??
|
[ (Brick.attrName "active" , Vty.defAttr `withBackColor` Vty.blue) -- has no effect ??
|
||||||
, (attrName "no-bindist", Vty.defAttr `Vty.withStyle` Vty.dim)
|
, (Brick.attrName "no-bindist", Vty.defAttr `Vty.withStyle` Vty.dim)
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
withBackColor | no_color = \attr _ -> attr `Vty.withStyle` Vty.reverseVideo
|
withBackColor | no_color = \attr _ -> attr `Vty.withStyle` Vty.reverseVideo
|
||||||
| otherwise = Vty.withBackColor
|
| otherwise = Vty.withBackColor
|
||||||
|
|
||||||
eventHandler :: BrickState -> BrickEvent String e -> EventM String BrickState ()
|
{- Handlers
|
||||||
eventHandler st@BrickState{..} ev = do
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
keyHandlers :: KeyBindings
|
||||||
|
-> [ ( KeyCombination
|
||||||
|
, BrickSettings -> String
|
||||||
|
, EventM Name BrickState ()
|
||||||
|
)
|
||||||
|
]
|
||||||
|
keyHandlers KeyBindings {..} =
|
||||||
|
[ (bQuit, const "Quit" , Brick.halt)
|
||||||
|
, (bInstall, const "Install" , withIOAction install')
|
||||||
|
, (bUninstall, const "Uninstall", withIOAction del')
|
||||||
|
, (bSet, const "Set" , withIOAction set')
|
||||||
|
, (bChangelog, const "ChangeLog", withIOAction changelog')
|
||||||
|
, ( bShowAllVersions
|
||||||
|
, \BrickSettings {..} ->
|
||||||
|
if _showAllVersions then "Don't show all versions" else "Show all versions"
|
||||||
|
, hideShowHandler' (not . _showAllVersions)
|
||||||
|
)
|
||||||
|
, (bUp, const "Up", Brick.zoom (toLensVL appState) moveUp)
|
||||||
|
, (bDown, const "Down", Brick.zoom (toLensVL appState) moveDown)
|
||||||
|
, (KeyCombination (Vty.KChar 'h') [], const "help", mode .= KeyInfo)
|
||||||
|
]
|
||||||
|
where
|
||||||
|
--hideShowHandler' :: (BrickSettings -> Bool) -> (BrickSettings -> Bool) -> m ()
|
||||||
|
hideShowHandler' f = do
|
||||||
|
app_settings <- use appSettings
|
||||||
|
let
|
||||||
|
vers = f app_settings
|
||||||
|
newAppSettings = app_settings & showAllVersions .~ vers
|
||||||
|
ad <- use appData
|
||||||
|
current_app_state <- use appState
|
||||||
|
appSettings .= newAppSettings
|
||||||
|
appState .= constructList ad newAppSettings (Just current_app_state)
|
||||||
|
|
||||||
|
|
||||||
|
tutorialHandler :: BrickEvent Name e -> EventM Name BrickState ()
|
||||||
|
tutorialHandler ev =
|
||||||
|
case ev of
|
||||||
|
VtyEvent (Vty.EvKey (Vty.KChar 'q') _ ) -> mode .= Navigation
|
||||||
|
_ -> pure ()
|
||||||
|
|
||||||
|
keyInfoHandler :: BrickEvent Name e -> EventM Name BrickState ()
|
||||||
|
keyInfoHandler ev = do
|
||||||
|
case ev of
|
||||||
|
VtyEvent (Vty.EvKey (Vty.KChar 'q') _ ) -> mode .= Navigation
|
||||||
|
VtyEvent (Vty.EvKey Vty.KEnter _ ) -> mode .= Tutorial
|
||||||
|
_ -> pure ()
|
||||||
|
|
||||||
|
navigationHandler :: BrickEvent Name e -> EventM Name BrickState ()
|
||||||
|
navigationHandler ev = do
|
||||||
AppState { keyBindings = kb } <- liftIO $ readIORef settings'
|
AppState { keyBindings = kb } <- liftIO $ readIORef settings'
|
||||||
case ev of
|
case ev of
|
||||||
(MouseDown _ Vty.BScrollUp _ _) ->
|
inner_event@(VtyEvent (Vty.EvKey key _)) ->
|
||||||
put (BrickState { appState = moveCursor 1 appState Up, .. })
|
case find (\(key', _, _) -> key' == KeyCombination key []) (keyHandlers kb) of
|
||||||
(MouseDown _ Vty.BScrollDown _ _) ->
|
Nothing -> void $ Brick.zoom (toLensVL appState) $ handleGenericListEvent inner_event
|
||||||
put (BrickState { appState = moveCursor 1 appState Down, .. })
|
Just (_, _, handler) -> handler
|
||||||
(VtyEvent (Vty.EvResize _ _)) -> put st
|
inner_event -> Brick.zoom (toLensVL appState) $ handleGenericListEvent inner_event
|
||||||
(VtyEvent (Vty.EvKey Vty.KUp [])) ->
|
|
||||||
put BrickState{ appState = moveCursor 1 appState Up, .. }
|
eventHandler :: BrickEvent Name e -> EventM Name BrickState ()
|
||||||
(VtyEvent (Vty.EvKey Vty.KDown [])) ->
|
eventHandler ev = do
|
||||||
put BrickState{ appState = moveCursor 1 appState Down, .. }
|
m <- use mode
|
||||||
(VtyEvent (Vty.EvKey key mods)) ->
|
case m of
|
||||||
case find (\(keyCombo, _, _) -> keyCombo == KeyCombination key mods) (keyHandlers kb) of
|
KeyInfo -> keyInfoHandler ev
|
||||||
Nothing -> put st
|
Tutorial -> tutorialHandler ev
|
||||||
Just (_, _, handler) -> handler st
|
Navigation -> navigationHandler ev
|
||||||
_ -> put st
|
|
||||||
|
|
||||||
|
|
||||||
moveCursor :: Int -> BrickInternalState -> Direction -> BrickInternalState
|
{- Core Logic.
|
||||||
moveCursor steps ais@BrickInternalState{..} direction =
|
|
||||||
let newIx = if direction == Down then ix + steps else ix - steps
|
|
||||||
in case clr !? newIx of
|
|
||||||
Just _ -> BrickInternalState { ix = newIx, .. }
|
|
||||||
Nothing -> ais
|
|
||||||
|
|
||||||
|
This section defines the IO actions we can execute within the Brick App:
|
||||||
|
- Install
|
||||||
|
- Set
|
||||||
|
- UnInstall
|
||||||
|
- Launch the Changelog
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
-- | Suspend the current UI and run an IO action in terminal. If the
|
-- | Suspend the current UI and run an IO action in terminal. If the
|
||||||
-- IO action returns a Left value, then it's thrown as userError.
|
-- IO action returns a Left value, then it's thrown as userError.
|
||||||
withIOAction :: Ord n
|
withIOAction :: (Ord n, Eq n)
|
||||||
=> (BrickState
|
=> ( (Int, ListResult) -> ReaderT AppState IO (Either String a))
|
||||||
-> (Int, ListResult)
|
|
||||||
-> ReaderT AppState IO (Either String a))
|
|
||||||
-> BrickState
|
|
||||||
-> EventM n BrickState ()
|
-> EventM n BrickState ()
|
||||||
withIOAction action as = case listSelectedElement' (appState as) of
|
withIOAction action = do
|
||||||
Nothing -> put as
|
as <- Brick.get
|
||||||
Just (ix, e) -> do
|
case sectionListSelectedElement (view appState as) of
|
||||||
suspendAndResume $ do
|
Nothing -> pure ()
|
||||||
|
Just (curr_ix, e) -> do
|
||||||
|
Brick.suspendAndResume $ do
|
||||||
settings <- readIORef settings'
|
settings <- readIORef settings'
|
||||||
flip runReaderT settings $ action as (ix, e) >>= \case
|
flip runReaderT settings $ action (curr_ix, e) >>= \case
|
||||||
Left err -> liftIO $ putStrLn ("Error: " <> err)
|
Left err -> liftIO $ putStrLn ("Error: " <> err)
|
||||||
Right _ -> liftIO $ putStrLn "Success"
|
Right _ -> liftIO $ putStrLn "Success"
|
||||||
getAppData Nothing >>= \case
|
getAppData Nothing >>= \case
|
||||||
@@ -390,28 +701,35 @@ withIOAction action as = case listSelectedElement' (appState as) of
|
|||||||
-- and @BrickSettings@.
|
-- and @BrickSettings@.
|
||||||
updateList :: BrickData -> BrickState -> BrickState
|
updateList :: BrickData -> BrickState -> BrickState
|
||||||
updateList appD BrickState{..} =
|
updateList appD BrickState{..} =
|
||||||
let newInternalState = constructList appD appSettings (Just appState)
|
let newInternalState = constructList appD _appSettings (Just _appState)
|
||||||
in BrickState { appState = newInternalState
|
in BrickState { _appState = newInternalState
|
||||||
, appData = appD
|
, _appData = appD
|
||||||
, appSettings = appSettings
|
, _appSettings = _appSettings
|
||||||
, appKeys = appKeys
|
, _appKeys = _appKeys
|
||||||
|
, _mode = Navigation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
constructList :: BrickData
|
constructList :: BrickData
|
||||||
-> BrickSettings
|
-> BrickSettings
|
||||||
-> Maybe BrickInternalState
|
-> Maybe BrickInternalState
|
||||||
-> BrickInternalState
|
-> BrickInternalState
|
||||||
constructList appD appSettings =
|
constructList appD settings =
|
||||||
replaceLR (filterVisible (showAllVersions appSettings))
|
replaceLR (filterVisible (_showAllVersions settings))
|
||||||
(lr appD)
|
(_lr appD)
|
||||||
|
|
||||||
listSelectedElement' :: BrickInternalState -> Maybe (Int, ListResult)
|
-- | Focus on the tool section and the predicate which matches. If no result matches, focus on index 0
|
||||||
listSelectedElement' BrickInternalState{..} = fmap (ix, ) $ clr !? ix
|
selectBy :: Tool -> (ListResult -> Bool) -> BrickInternalState -> BrickInternalState
|
||||||
|
selectBy tool predicate internal_state =
|
||||||
|
let new_focus = F.focusSetCurrent (Singular tool) (view sectionListFocusRingL internal_state)
|
||||||
|
tool_lens = sectionL (Singular tool)
|
||||||
|
in internal_state
|
||||||
|
& sectionListFocusRingL .~ new_focus
|
||||||
|
& tool_lens %~ L.listMoveTo 0 -- We move to 0 first
|
||||||
|
& tool_lens %~ L.listFindBy predicate -- The lookup by the predicate.
|
||||||
|
|
||||||
|
-- | Select the latests GHC tool
|
||||||
selectLatest :: Vector ListResult -> Int
|
selectLatest :: BrickInternalState -> BrickInternalState
|
||||||
selectLatest = fromMaybe 0 . V.findIndex (\ListResult {..} -> lTool == GHC && Latest `elem` lTag)
|
selectLatest = selectBy GHC (elem Latest . lTag)
|
||||||
|
|
||||||
|
|
||||||
-- | Replace the @appState@ or construct it based on a filter function
|
-- | Replace the @appState@ or construct it based on a filter function
|
||||||
@@ -421,14 +739,13 @@ replaceLR :: (ListResult -> Bool)
|
|||||||
-> [ListResult]
|
-> [ListResult]
|
||||||
-> Maybe BrickInternalState
|
-> Maybe BrickInternalState
|
||||||
-> BrickInternalState
|
-> BrickInternalState
|
||||||
replaceLR filterF lr s =
|
replaceLR filterF list_result s =
|
||||||
let oldElem = s >>= listSelectedElement'
|
let oldElem = s >>= sectionListSelectedElement -- Maybe (Int, e)
|
||||||
newVec = V.fromList . filter filterF $ lr
|
newVec = [(Singular $ lTool (head g), V.fromList g) | g <- groupBy ((==) `on` lTool ) (filter filterF list_result)]
|
||||||
newSelected =
|
newSectionList = sectionList AllTools newVec 1
|
||||||
case oldElem >>= \(_, oldE) -> V.findIndex (toolEqual oldE) newVec of
|
in case oldElem of
|
||||||
Just ix -> ix
|
Just (_, el) -> selectBy (lTool el) (toolEqual el) newSectionList
|
||||||
Nothing -> selectLatest newVec
|
Nothing -> selectLatest newSectionList
|
||||||
in BrickInternalState newVec newSelected
|
|
||||||
where
|
where
|
||||||
toolEqual e1 e2 =
|
toolEqual e1 e2 =
|
||||||
lTool e1 == lTool e2 && lVer e1 == lVer e2 && lCross e1 == lCross e2
|
lTool e1 == lTool e2 && lVer e1 == lVer e2 && lCross e1 == lCross e2
|
||||||
@@ -446,10 +763,9 @@ filterVisible v e | lInstalled e = True
|
|||||||
|
|
||||||
|
|
||||||
install' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m, Alternative m)
|
install' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m, Alternative m)
|
||||||
=> BrickState
|
=> (Int, ListResult)
|
||||||
-> (Int, ListResult)
|
|
||||||
-> m (Either String ())
|
-> m (Either String ())
|
||||||
install' _ (_, ListResult {..}) = do
|
install' (_, ListResult {..}) = do
|
||||||
AppState { ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
AppState { ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
||||||
|
|
||||||
let run =
|
let run =
|
||||||
@@ -531,10 +847,9 @@ install' _ (_, ListResult {..}) = do
|
|||||||
|
|
||||||
|
|
||||||
set' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m, Alternative m)
|
set' :: (MonadReader AppState m, MonadIO m, MonadThrow m, MonadFail m, MonadMask m, MonadUnliftIO m, Alternative m)
|
||||||
=> BrickState
|
=> (Int, ListResult)
|
||||||
-> (Int, ListResult)
|
|
||||||
-> m (Either String ())
|
-> m (Either String ())
|
||||||
set' bs input@(_, ListResult {..}) = do
|
set' input@(_, ListResult {..}) = do
|
||||||
settings <- liftIO $ readIORef settings'
|
settings <- liftIO $ readIORef settings'
|
||||||
|
|
||||||
let run =
|
let run =
|
||||||
@@ -589,12 +904,12 @@ set' bs input@(_, ListResult {..}) = do
|
|||||||
promptAnswer <- getUserPromptResponse userPrompt
|
promptAnswer <- getUserPromptResponse userPrompt
|
||||||
case promptAnswer of
|
case promptAnswer of
|
||||||
PromptYes -> do
|
PromptYes -> do
|
||||||
res <- install' bs input
|
res <- install' input
|
||||||
case res of
|
case res of
|
||||||
(Left err) -> pure $ Left err
|
(Left err) -> pure $ Left err
|
||||||
(Right _) -> do
|
(Right _) -> do
|
||||||
logInfo "Setting now..."
|
logInfo "Setting now..."
|
||||||
set' bs input
|
set' input
|
||||||
|
|
||||||
PromptNo -> pure $ Left (prettyHFError e)
|
PromptNo -> pure $ Left (prettyHFError e)
|
||||||
where
|
where
|
||||||
@@ -609,10 +924,9 @@ set' bs input@(_, ListResult {..}) = do
|
|||||||
|
|
||||||
|
|
||||||
del' :: (MonadReader AppState m, MonadIO m, MonadFail m, MonadMask m, MonadUnliftIO m)
|
del' :: (MonadReader AppState m, MonadIO m, MonadFail m, MonadMask m, MonadUnliftIO m)
|
||||||
=> BrickState
|
=> (Int, ListResult)
|
||||||
-> (Int, ListResult)
|
|
||||||
-> m (Either String ())
|
-> m (Either String ())
|
||||||
del' _ (_, ListResult {..}) = do
|
del' (_, ListResult {..}) = do
|
||||||
AppState { ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
AppState { ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
||||||
|
|
||||||
let run = runE @'[NotInstalled, UninstallFailed]
|
let run = runE @'[NotInstalled, UninstallFailed]
|
||||||
@@ -636,10 +950,9 @@ del' _ (_, ListResult {..}) = do
|
|||||||
|
|
||||||
|
|
||||||
changelog' :: (MonadReader AppState m, MonadIO m)
|
changelog' :: (MonadReader AppState m, MonadIO m)
|
||||||
=> BrickState
|
=> (Int, ListResult)
|
||||||
-> (Int, ListResult)
|
|
||||||
-> m (Either String ())
|
-> m (Either String ())
|
||||||
changelog' _ (_, ListResult {..}) = do
|
changelog' (_, ListResult {..}) = do
|
||||||
AppState { pfreq, ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
AppState { pfreq, ghcupInfo = GHCupInfo { _ghcupDownloads = dls }} <- ask
|
||||||
case getChangeLog dls lTool (ToolVersion lVer) of
|
case getChangeLog dls lTool (ToolVersion lVer) of
|
||||||
Nothing -> pure $ Left $
|
Nothing -> pure $ Left $
|
||||||
@@ -678,7 +991,6 @@ settings' = unsafePerformIO $ do
|
|||||||
loggerConfig
|
loggerConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
brickMain :: AppState
|
brickMain :: AppState
|
||||||
-> IO ()
|
-> IO ()
|
||||||
brickMain s = do
|
brickMain s = do
|
||||||
@@ -687,12 +999,13 @@ brickMain s = do
|
|||||||
eAppData <- getAppData (Just $ ghcupInfo s)
|
eAppData <- getAppData (Just $ ghcupInfo s)
|
||||||
case eAppData of
|
case eAppData of
|
||||||
Right ad ->
|
Right ad ->
|
||||||
defaultMain
|
Brick.defaultMain
|
||||||
(app (defaultAttributes (noColor $ settings s)) (dimAttributes (noColor $ settings s)))
|
(app (defaultAttributes (noColor $ settings s)) (dimAttributes (noColor $ settings s)))
|
||||||
(BrickState ad
|
(BrickState ad
|
||||||
defaultAppSettings
|
defaultAppSettings
|
||||||
(constructList ad defaultAppSettings Nothing)
|
(constructList ad defaultAppSettings Nothing)
|
||||||
(keyBindings (s :: AppState))
|
(keyBindings (s :: AppState))
|
||||||
|
Navigation
|
||||||
|
|
||||||
)
|
)
|
||||||
$> ()
|
$> ()
|
||||||
@@ -702,7 +1015,7 @@ brickMain s = do
|
|||||||
|
|
||||||
|
|
||||||
defaultAppSettings :: BrickSettings
|
defaultAppSettings :: BrickSettings
|
||||||
defaultAppSettings = BrickSettings { showAllVersions = False }
|
defaultAppSettings = BrickSettings { _showAllVersions = False}
|
||||||
|
|
||||||
|
|
||||||
getGHCupInfo :: IO (Either String GHCupInfo)
|
getGHCupInfo :: IO (Either String GHCupInfo)
|
||||||
|
|||||||
@@ -2,14 +2,35 @@ packages: ./ghcup.cabal
|
|||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
optional-packages: ./vendored/*/*.cabal
|
||||||
|
|
||||||
optimization: 2
|
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
|
||||||
|
|
||||||
@@ -25,5 +46,10 @@ 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,55 +1,57 @@
|
|||||||
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.8.1.0,
|
any.Cabal-syntax ==3.10.2.0,
|
||||||
any.HUnit ==1.6.2.0,
|
any.HUnit ==1.6.2.0,
|
||||||
any.HsOpenSSL ==0.11.7.4,
|
any.HsOpenSSL ==0.11.7.6,
|
||||||
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
HsOpenSSL -fast-bignum -homebrew-openssl -macports-openssl -use-pkg-config,
|
||||||
any.OneTuple ==0.3.1,
|
any.OneTuple ==0.4.1.1,
|
||||||
any.QuickCheck ==2.14.2,
|
any.QuickCheck ==2.14.3,
|
||||||
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.1.0,
|
any.aeson ==2.1.2.1,
|
||||||
aeson -cffi +ordered-keymap,
|
aeson -cffi +ordered-keymap,
|
||||||
any.aeson-pretty ==0.8.9,
|
any.aeson-pretty ==0.8.10,
|
||||||
aeson-pretty +lib-only,
|
aeson-pretty +lib-only,
|
||||||
any.alex ==3.2.7.1,
|
any.alex ==3.5.0.0,
|
||||||
any.ansi-terminal ==0.11.4,
|
any.ansi-terminal ==1.0.2,
|
||||||
ansi-terminal -example +win32-2-13-1,
|
ansi-terminal -example,
|
||||||
|
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.0.2,
|
any.assoc ==1.1,
|
||||||
any.async ==2.2.4,
|
assoc +tagged,
|
||||||
|
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.12.2,
|
any.base-compat ==0.13.1,
|
||||||
any.base-compat-batteries ==0.12.2,
|
any.base-compat-batteries ==0.13.1,
|
||||||
any.base-orphans ==0.8.7,
|
any.base-orphans ==0.9.1,
|
||||||
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.5.14,
|
any.bifunctors ==5.6.1,
|
||||||
bifunctors +semigroups +tagged,
|
bifunctors +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.3,
|
any.binary-instances ==1.0.4,
|
||||||
any.binary-orphans ==1.0.3,
|
any.binary-orphans ==1.0.4.1,
|
||||||
any.blaze-builder ==0.4.2.2,
|
any.blaze-builder ==0.4.2.3,
|
||||||
any.brick ==1.5,
|
any.brick ==2.1.1,
|
||||||
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.5,
|
any.cabal-install-parsers ==0.6.1,
|
||||||
any.cabal-plan ==0.7.2.3,
|
any.cabal-plan ==0.7.3.0,
|
||||||
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,
|
||||||
@@ -62,7 +64,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.5.0,
|
any.config-ini ==0.2.7.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,
|
||||||
@@ -83,34 +85,37 @@ 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.free ==5.1.10,
|
any.foldable1-classes-compat ==0.1,
|
||||||
|
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,
|
any.generically ==0.1.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.0,
|
any.happy ==1.20.1.1,
|
||||||
any.hashable ==1.4.2.0,
|
any.hashable ==1.4.3.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.2.1,
|
any.haskus-utils-variant ==3.3,
|
||||||
any.heaps ==0.4,
|
any.heaps ==0.4,
|
||||||
any.hsc2hs ==0.68.8,
|
any.hsc2hs ==0.68.10,
|
||||||
hsc2hs -in-ghc-tree,
|
hsc2hs -in-ghc-tree,
|
||||||
any.hspec ==2.10.8,
|
any.hspec ==2.10.10,
|
||||||
any.hspec-core ==2.10.8,
|
any.hspec-core ==2.10.10,
|
||||||
any.hspec-discover ==2.10.8,
|
any.hspec-discover ==2.10.10,
|
||||||
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.1,
|
any.http-io-streams ==0.1.6.3,
|
||||||
http-io-streams -brotli +fast-xor,
|
http-io-streams -brotli +fast-xor,
|
||||||
any.indexed-profunctors ==0.1.1,
|
any.indexed-profunctors ==0.1.1.1,
|
||||||
any.indexed-traversable ==0.1.2,
|
any.indexed-traversable ==0.1.3,
|
||||||
any.indexed-traversable-instances ==0.1.1.1,
|
any.indexed-traversable-instances ==0.1.1.2,
|
||||||
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,
|
||||||
@@ -118,9 +123,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.3.2,
|
any.libarchive ==3.0.4.2,
|
||||||
libarchive -cross -low-memory +no-exe -system-libarchive,
|
libarchive -cross -low-memory +no-exe -system-libarchive,
|
||||||
any.libyaml-streamly ==0.2.1,
|
any.libyaml-streamly ==0.2.2,
|
||||||
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,
|
||||||
@@ -130,84 +135,85 @@ 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.11,
|
any.microlens-th ==0.4.3.14,
|
||||||
any.mtl ==2.2.2,
|
any.mtl ==2.2.2,
|
||||||
any.network ==3.1.2.7,
|
any.mtl-compat ==0.2.2,
|
||||||
|
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,
|
any.optics ==0.4.2.1,
|
||||||
any.optics-core ==0.4.1,
|
any.optics-core ==0.4.1.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.0.0,
|
any.optparse-applicative ==0.17.1.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.parallel ==3.2.2.0,
|
any.parsec ==3.1.17.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.7.4.0,
|
any.primitive ==0.8.0.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.3,
|
any.recursion-schemes ==5.2.2.5,
|
||||||
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.8.1.2,
|
any.retry ==0.9.3.1,
|
||||||
retry -lib-werror,
|
retry -lib-werror,
|
||||||
any.rts ==1.0.1,
|
any.rts ==1.0.1,
|
||||||
any.safe ==0.3.19,
|
any.safe ==0.3.21,
|
||||||
any.safe-exceptions ==0.1.7.3,
|
any.safe-exceptions ==0.1.7.4,
|
||||||
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.2.0.1,
|
any.semialign ==1.3,
|
||||||
semialign +semigroupoids,
|
semialign +semigroupoids,
|
||||||
any.semigroupoids ==5.3.7,
|
any.semigroupoids ==6.0.0.1,
|
||||||
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.3.5,
|
any.split ==0.2.5,
|
||||||
any.splitmix ==0.1.0.4,
|
any.splitmix ==0.1.0.5,
|
||||||
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.4.0.1,
|
any.strict ==0.5,
|
||||||
strict +assoc,
|
|
||||||
any.strict-base ==0.4.0.0,
|
any.strict-base ==0.4.0.0,
|
||||||
any.tagged ==0.8.6.1,
|
any.tagged ==0.8.8,
|
||||||
tagged +deepseq +transformers,
|
tagged +deepseq +transformers,
|
||||||
any.tagsoup ==0.14.8,
|
any.tagsoup ==0.14.8,
|
||||||
any.tar ==0.5.1.1,
|
any.tar ==0.6.0.0,
|
||||||
tar -old-bytestring -old-time,
|
any.tasty ==1.5,
|
||||||
|
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.1,
|
any.terminal-progress-bar ==0.4.2,
|
||||||
any.terminal-size ==0.3.3,
|
any.terminal-size ==0.3.4,
|
||||||
any.terminfo ==0.4.1.4,
|
any.terminfo ==0.4.1.4,
|
||||||
any.text ==2.0.1,
|
any.text ==2.0.2,
|
||||||
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.12,
|
any.text-zipper ==0.13,
|
||||||
any.tf-random ==0.5,
|
any.tf-random ==0.5,
|
||||||
any.th-abstraction ==0.4.5.0,
|
any.th-abstraction ==0.5.0.0,
|
||||||
any.th-compat ==0.1.4,
|
any.th-compat ==0.1.4,
|
||||||
any.th-lift ==0.8.2,
|
any.th-lift ==0.8.4,
|
||||||
any.th-lift-instances ==0.1.20,
|
any.th-lift-instances ==0.1.20,
|
||||||
any.these ==1.1.1.1,
|
any.these ==1.2,
|
||||||
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,
|
||||||
@@ -220,27 +226,31 @@ 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.6,
|
any.unix-compat ==0.7.1,
|
||||||
unix-compat -old-time,
|
unix-compat -old-time,
|
||||||
any.unliftio-core ==0.2.0.1,
|
any.unliftio-core ==0.2.1.0,
|
||||||
any.unordered-containers ==0.2.19.1,
|
any.unordered-containers ==0.2.20,
|
||||||
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,
|
any.uuid-types ==1.0.5.1,
|
||||||
any.vector ==0.12.3.1,
|
any.vector ==0.13.1.0,
|
||||||
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.versions ==5.0.4,
|
any.vector-stream ==0.1.0.1,
|
||||||
any.vty ==5.37,
|
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.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.1,
|
any.xor ==0.0.1.2,
|
||||||
any.yaml-streamly ==0.12.1,
|
any.yaml-streamly ==0.12.4,
|
||||||
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 2023-01-12T04:22:48Z
|
index-state: hackage.haskell.org 2024-01-19T19:48:54Z
|
||||||
|
|||||||
55
cabal.ghc902.project
Normal file
55
cabal.ghc902.project
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
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
|
||||||
269
cabal.ghc902.project.freeze
Normal file
269
cabal.ghc902.project.freeze
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
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
|
||||||
55
cabal.ghc928.project
Normal file
55
cabal.ghc928.project
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
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
|
||||||
269
cabal.ghc928.project.freeze
Normal file
269
cabal.ghc928.project.freeze
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
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
|
||||||
55
cabal.ghc948.project
Normal file
55
cabal.ghc948.project
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
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
|
||||||
267
cabal.ghc948.project.freeze
Normal file
267
cabal.ghc948.project.freeze
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
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,16 +2,34 @@ 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
|
source-repository-package
|
||||||
type: git
|
type: git
|
||||||
location: https://github.com/fosskers/versions.git
|
location: https://github.com/haskell/tar.git
|
||||||
tag: 7bc3355348aac3510771d4622aff09ac38c9924d
|
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
|
||||||
@@ -30,3 +48,6 @@ package streamly
|
|||||||
|
|
||||||
package *
|
package *
|
||||||
test-show-details: direct
|
test-show-details: direct
|
||||||
|
|
||||||
|
allow-newer: cabal-install-parsers:tar
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ optional-packages: ./vendored/*/*.cabal
|
|||||||
optimization: 2
|
optimization: 2
|
||||||
|
|
||||||
package ghcup
|
package ghcup
|
||||||
flags: +tui
|
flags: +tui -tar
|
||||||
|
|
||||||
if os(linux)
|
if os(linux)
|
||||||
if arch(x86_64) || arch(i386)
|
if arch(x86_64) || arch(i386)
|
||||||
@@ -19,11 +19,13 @@ elif os(mingw32)
|
|||||||
lzma +static,
|
lzma +static,
|
||||||
text -simdutf,
|
text -simdutf,
|
||||||
vty-windows >=0.1.0.3
|
vty-windows >=0.1.0.3
|
||||||
|
if impl(ghc >= 9.4)
|
||||||
|
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
|
||||||
|
|
||||||
constraints: http-io-streams -brotli,
|
constraints: http-io-streams -brotli,
|
||||||
any.aeson >= 2.0.1.0,
|
any.aeson >= 2.0.1.0,
|
||||||
@@ -44,3 +46,20 @@ 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
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ url-source:
|
|||||||
# sha256: b48f3d3a508d0c140d1c801e04afc65e80c0d25e7e939a8a41edb387b26b81b3
|
# 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 derivate based on 18.04, you could do:
|
# a Ubuntu derivative based on 18.04, you could do:
|
||||||
#
|
#
|
||||||
# platform-override:
|
# platform-override:
|
||||||
# arch: A_64
|
# arch: A_64
|
||||||
|
|||||||
Submodule data/metadata updated: 0239166c31...7e1a50cfff
@@ -1,4 +1,4 @@
|
|||||||
FROM --platform=linux/i386 i386/alpine:3.12
|
FROM --platform=linux/i386 i386/alpine:3.16
|
||||||
|
|
||||||
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.19.4
|
ARG GHCUP_VERSION=0.1.20.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
||||||
|
|
||||||
# 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=8.10.7
|
ARG GHC=9.4.8
|
||||||
ARG CABAL_INSTALL=3.6.2.0
|
ARG CABAL_INSTALL=3.10.2.0
|
||||||
ARG STACK=2.9.1
|
ARG STACK=2.13.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 -r "/usr/share/doc/ghc-${GHC}" && \
|
rm -rf "/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.19.4
|
ARG GHCUP_VERSION=0.1.20.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
||||||
|
|
||||||
|
|
||||||
# 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=8.10.7
|
ARG GHC=9.4.8
|
||||||
ARG CABAL_INSTALL=3.6.2.0
|
ARG CABAL_INSTALL=3.10.2.0
|
||||||
ARG STACK=2.9.1
|
ARG STACK=2.13.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 -r "/usr/share/doc/ghc-${GHC}" && \
|
rm -rf "/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.19.4
|
ARG GHCUP_VERSION=0.1.20.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
||||||
|
|
||||||
# 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=8.10.7
|
ARG GHC=9.2.8
|
||||||
ARG CABAL_INSTALL=3.6.2.0
|
ARG CABAL_INSTALL=3.6.2.0
|
||||||
ARG STACK=2.9.1
|
ARG STACK=2.13.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.19.4
|
ARG GHCUP_VERSION=0.1.20.0
|
||||||
ARG GPG_KEY=7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
ARG GPG_KEY="7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C FFEB7CE81E16A36B3E2DED6F2DE04D4E97DB64AD 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4 EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF"
|
||||||
|
|
||||||
# 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=8.10.7
|
ARG GHC=9.4.8
|
||||||
ARG CABAL_INSTALL=3.6.2.0
|
ARG CABAL_INSTALL=3.10.2.0
|
||||||
ARG STACK=2.9.1
|
ARG STACK=2.13.1
|
||||||
|
|
||||||
ENV GHCUP_CURL_OPTS="--silent"
|
ENV GHCUP_CURL_OPTS="--silent"
|
||||||
ENV NO_COLOR=1
|
ENV NO_COLOR=1
|
||||||
|
|||||||
@@ -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) (not available on windows), run:
|
For the simple, interactive, text-based user interface (TUI), run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
ghcup tui
|
ghcup tui
|
||||||
@@ -67,8 +67,7 @@ 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. `ghcup tui` is only available on non-windows platforms
|
1. legacy subcommands `ghcup install` (without a tool identifier) and `ghcup install-cabal` may be removed in the future
|
||||||
2. legacy subcommands `ghcup install` (without a tool identifier) and `ghcup install-cabal` may be removed in the future
|
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
|
|
||||||
@@ -79,7 +78,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 derivate based on 18.04 and ghcup is picking bindists that
|
If you're running e.g. an Ubuntu derivative 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
|
||||||
@@ -106,6 +105,7 @@ This is the complete list of env variables that change GHCup behavior:
|
|||||||
On windows, there's additionally:
|
On windows, there's additionally:
|
||||||
|
|
||||||
* `GHCUP_MSYS2`: Has to point to the root of an existing MSYS2 installation (when installed by GHCup, that's e.g. `C:\ghcup\msys64`). GHCup bootstrap takes care of this usually.
|
* `GHCUP_MSYS2`: Has to point to the root of an existing MSYS2 installation (when installed by GHCup, that's e.g. `C:\ghcup\msys64`). GHCup bootstrap takes care of this usually.
|
||||||
|
* `GHCUP_MSYS2_ENV`: The [MSYS2 environment](https://www.msys2.org/docs/environments/) to use when executing e.g. `ghcup run --mingw-path`. Possible values are `MSYS`, `UCRT64`, `CLANG64`, `CLANGARM64`, `CLANG32`, `MINGW64`, `MINGW32`. Defaults to `MINGW64`, `MINGW32` or `CLANGARM64`, depending on the architecture. `MSYS` is always added as the last component. If you change this value after running the bootstrap script, you may need to make sure that the cabal config reflects this change, more specifically `extra-prog-path`, `extra-include-dirs` and `extra-lib-dirs`. (**NOTE: specifying anything other than the default is considered experimental**)
|
||||||
|
|
||||||
### XDG support
|
### XDG support
|
||||||
|
|
||||||
@@ -557,7 +557,7 @@ You need the required wasm toolchain:
|
|||||||
git clone https://gitlab.haskell.org/ghc/ghc-wasm-meta.git
|
git clone https://gitlab.haskell.org/ghc/ghc-wasm-meta.git
|
||||||
cd ghc-wasm-meta/
|
cd ghc-wasm-meta/
|
||||||
export SKIP_GHC=yes
|
export SKIP_GHC=yes
|
||||||
sh setup.sh
|
./setup.sh
|
||||||
source ~/.ghc-wasm/env
|
source ~/.ghc-wasm/env
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -611,7 +611,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 paramaters to the PowerShell script are
|
non-interactively, as below. The parameters to the PowerShell script are
|
||||||
specified positionally, after `-ArgumentList`:
|
specified positionally, after `-ArgumentList`:
|
||||||
|
|
||||||
```ps
|
```ps
|
||||||
|
|||||||
52
ghcup.cabal
52
ghcup.cabal
@@ -30,6 +30,11 @@ extra-source-files:
|
|||||||
test/ghcup-test/golden/unix/GHCupInfo.json
|
test/ghcup-test/golden/unix/GHCupInfo.json
|
||||||
test/ghcup-test/golden/windows/GHCupInfo.json
|
test/ghcup-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
|
||||||
location: https://github.com/haskell/ghcup-hs.git
|
location: https://github.com/haskell/ghcup-hs.git
|
||||||
@@ -53,6 +58,11 @@ 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
|
||||||
@@ -67,8 +77,7 @@ 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.2.1
|
, haskus-utils-variant ^>=3.3
|
||||||
, 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
|
||||||
@@ -79,7 +88,7 @@ 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.20
|
, template-haskell >=2.7 && <2.22
|
||||||
, temporary ^>=1.3
|
, temporary ^>=1.3
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time >=1.9.3 && <1.12
|
, time >=1.9.3 && <1.12
|
||||||
@@ -90,6 +99,15 @@ common app-common-depends
|
|||||||
, versions >=6.0.3 && <6.1
|
, versions >=6.0.3 && <6.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
|
||||||
@@ -122,6 +140,9 @@ library
|
|||||||
GHCup.Types.Stack
|
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
|
||||||
@@ -164,9 +185,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.2.1
|
, haskus-utils-variant ^>=3.3
|
||||||
, 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
|
||||||
@@ -182,7 +203,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.20
|
, template-haskell >=2.7 && <2.22
|
||||||
, temporary ^>=1.3
|
, temporary ^>=1.3
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time >=1.9.3 && <1.12
|
, time >=1.9.3 && <1.12
|
||||||
@@ -196,6 +217,15 @@ library
|
|||||||
, 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
|
||||||
@@ -233,7 +263,7 @@ 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
|
, unix ^>=2.7 || ^>=2.8
|
||||||
, unix-bytestring ^>=0.3.7.3
|
, unix-bytestring ^>=0.3.7.3
|
||||||
|
|
||||||
if flag(tui)
|
if flag(tui)
|
||||||
@@ -291,7 +321,7 @@ library ghcup-optparse
|
|||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7
|
build-depends: unix ^>=2.7 || ^>=2.8
|
||||||
|
|
||||||
executable ghcup
|
executable ghcup
|
||||||
import: app-common-depends
|
import: app-common-depends
|
||||||
@@ -327,12 +357,12 @@ executable ghcup
|
|||||||
, brick ^>=2.1
|
, brick ^>=2.1
|
||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, vty ^>=6.0
|
, vty ^>=6.0
|
||||||
|
, optics ^>=0.4
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7
|
build-depends: unix ^>=2.7 || ^>=2.8
|
||||||
|
|
||||||
if flag(no-exe)
|
if flag(no-exe)
|
||||||
buildable: False
|
buildable: False
|
||||||
@@ -384,7 +414,7 @@ test-suite ghcup-test
|
|||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7
|
build-depends: unix ^>=2.7 || ^>=2.8
|
||||||
|
|
||||||
test-suite ghcup-optparse-test
|
test-suite ghcup-optparse-test
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ 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
|
||||||
@@ -59,7 +60,7 @@ 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
|
import URI.ByteString hiding (parseURI)
|
||||||
|
|
||||||
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
|
||||||
@@ -215,7 +216,7 @@ platformParser s' = case MP.parse (platformP <* MP.eof) "" (T.pack s') of
|
|||||||
|
|
||||||
|
|
||||||
uriParser :: String -> Either String URI
|
uriParser :: String -> Either String URI
|
||||||
uriParser = first show . parseURI strictURIParserOptions . UTF8.fromString
|
uriParser = first show . parseURI . UTF8.fromString
|
||||||
|
|
||||||
|
|
||||||
absolutePathParser :: FilePath -> Either String FilePath
|
absolutePathParser :: FilePath -> Either String FilePath
|
||||||
@@ -834,11 +835,11 @@ parseUrlSource :: String -> Either String URLSource
|
|||||||
parseUrlSource "GHCupURL" = pure GHCupURL
|
parseUrlSource "GHCupURL" = pure GHCupURL
|
||||||
parseUrlSource "StackSetupURL" = pure StackSetupURL
|
parseUrlSource "StackSetupURL" = pure StackSetupURL
|
||||||
parseUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
parseUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
||||||
<|> (fmap (OwnSource . (:[]) . Right) . first show . parseURI strictURIParserOptions .UTF8.fromString $ s')
|
<|> (fmap (OwnSource . (:[]) . Right) . first show . parseURI .UTF8.fromString $ s')
|
||||||
|
|
||||||
parseNewUrlSource :: String -> Either String NewURLSource
|
parseNewUrlSource :: String -> Either String NewURLSource
|
||||||
parseNewUrlSource "GHCupURL" = pure NewGHCupURL
|
parseNewUrlSource "GHCupURL" = pure NewGHCupURL
|
||||||
parseNewUrlSource "StackSetupURL" = pure NewStackSetupURL
|
parseNewUrlSource "StackSetupURL" = pure NewStackSetupURL
|
||||||
parseNewUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
parseNewUrlSource s' = (eitherDecode . LE.encodeUtf8 . LT.pack $ s')
|
||||||
<|> (fmap NewURI . first show . parseURI strictURIParserOptions .UTF8.fromString $ s')
|
<|> (fmap NewURI . first show . parseURI .UTF8.fromString $ s')
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ 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
|
||||||
@@ -158,7 +157,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 specifc version for the binary name
|
# compile a specific commit for ghc 9.2.3 and set a specific 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|]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ 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
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ 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
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ 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
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ 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
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ 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.Platform
|
||||||
import GHCup.Prelude
|
import GHCup.Prelude
|
||||||
import GHCup.Prelude.File
|
import GHCup.Prelude.File
|
||||||
@@ -77,7 +78,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
|
import URI.ByteString hiding (parseURI)
|
||||||
|
|
||||||
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
|
||||||
@@ -165,7 +166,7 @@ getDownloadsF pfreq@(PlatformRequest arch plat _) = do
|
|||||||
-> [String]
|
-> [String]
|
||||||
-> m GHCupInfo
|
-> m GHCupInfo
|
||||||
fromStackSetupInfo (Stack.siGHCs -> ghcDli) keys = do
|
fromStackSetupInfo (Stack.siGHCs -> ghcDli) keys = do
|
||||||
let ghcVersionsPerKey = (`M.lookup` ghcDli) <$> (T.pack <$> keys)
|
let ghcVersionsPerKey = (`M.lookup` ghcDli) . T.pack <$> keys
|
||||||
ghcVersions = fromMaybe mempty . listToMaybe . catMaybes $ ghcVersionsPerKey
|
ghcVersions = fromMaybe mempty . listToMaybe . catMaybes $ ghcVersionsPerKey
|
||||||
(ghcupInfo' :: M.Map GHCTargetVersion DownloadInfo) <-
|
(ghcupInfo' :: M.Map GHCTargetVersion DownloadInfo) <-
|
||||||
M.mapKeys mkTVer <$> M.traverseMaybeWithKey (\_ a -> pure $ fromStackDownloadInfo a) ghcVersions
|
M.mapKeys mkTVer <$> M.traverseMaybeWithKey (\_ a -> pure $ fromStackDownloadInfo a) ghcVersions
|
||||||
@@ -178,7 +179,7 @@ getDownloadsF pfreq@(PlatformRequest arch plat _) = do
|
|||||||
|
|
||||||
fromStackDownloadInfo :: MonadThrow m => Stack.GHCDownloadInfo -> m DownloadInfo
|
fromStackDownloadInfo :: MonadThrow m => Stack.GHCDownloadInfo -> m DownloadInfo
|
||||||
fromStackDownloadInfo (Stack.GHCDownloadInfo { gdiDownloadInfo = Stack.DownloadInfo{..} }) = do
|
fromStackDownloadInfo (Stack.GHCDownloadInfo { gdiDownloadInfo = Stack.DownloadInfo{..} }) = do
|
||||||
url <- either (\e -> throwM $ ParseError (show e)) pure $ parseURI strictURIParserOptions . E.encodeUtf8 $ downloadInfoUrl
|
url <- either (\e -> throwM $ ParseError (show e)) pure $ parseURI . E.encodeUtf8 $ downloadInfoUrl
|
||||||
sha256 <- maybe (throwM $ DigestMissing url) (pure . E.decodeUtf8) downloadInfoSha256
|
sha256 <- maybe (throwM $ DigestMissing url) (pure . E.decodeUtf8) downloadInfoSha256
|
||||||
pure $ DownloadInfo url (Just $ RegexDir "ghc-.*") sha256 Nothing Nothing
|
pure $ DownloadInfo url (Just $ RegexDir "ghc-.*") sha256 Nothing Nothing
|
||||||
|
|
||||||
@@ -855,7 +856,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) . urlDecode False
|
urlBaseName = snd . B.breakEnd (== _slash)
|
||||||
|
|
||||||
|
|
||||||
-- | 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,6 +11,7 @@ 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
|
||||||
@@ -28,7 +29,7 @@ import Prelude hiding ( abs
|
|||||||
, writeFile
|
, writeFile
|
||||||
)
|
)
|
||||||
import System.ProgressBar
|
import System.ProgressBar
|
||||||
import URI.ByteString
|
import URI.ByteString hiding (parseURI)
|
||||||
|
|
||||||
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
|
||||||
@@ -114,7 +115,7 @@ downloadInternal = go (5 :: Int)
|
|||||||
| otherwise -> throwE $ HTTPStatusError scode (getHeaderMap r)
|
| otherwise -> throwE $ HTTPStatusError scode (getHeaderMap r)
|
||||||
)
|
)
|
||||||
|
|
||||||
followRedirectURL bs = case parseURI strictURIParserOptions bs of
|
followRedirectURL bs = case parseURI 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,7 +21,6 @@ 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 )
|
||||||
@@ -212,20 +211,22 @@ data NoDownload = NoDownload GHCTargetVersion Tool (Maybe PlatformRequest)
|
|||||||
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> "
|
||||||
<> show tool
|
|
||||||
<> " version '"
|
|
||||||
<> T.unpack (tVerToText tver)
|
|
||||||
<> maybe "'\n" (\pfreq -> "' on detected platform " <> pfReqToString pfreq <> "\n") mpfreq
|
|
||||||
<> "Perhaps you meant: 'ghcup <command> "
|
|
||||||
<> T.unpack target
|
<> T.unpack target
|
||||||
<> " "
|
<> " "
|
||||||
<> T.unpack (prettyVer vv)
|
<> T.unpack (prettyVer vv)
|
||||||
<> "'"
|
<> "'"
|
||||||
| otherwise = text $ "Unable to find a download for " <> T.unpack (tVerToText tver)
|
| otherwise = ""
|
||||||
|
in text $ "Unable to find a download for "
|
||||||
|
<> show tool
|
||||||
|
<> " version "
|
||||||
|
<> "'" <> T.unpack (tVerToText tver) <> "'"
|
||||||
|
<> maybe "" (\pfreq -> " on detected platform " <> pfReqToString pfreq) mpfreq
|
||||||
|
<> helperMsg
|
||||||
|
|
||||||
instance HFErrorProject NoDownload where
|
instance HFErrorProject NoDownload where
|
||||||
eBase _ = 10
|
eBase _ = 10
|
||||||
@@ -387,7 +388,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" <+> pPrint ver <+> text "of the tool" <+> pPrint tool <+> text "is not installed."
|
text "The version" <+> (text "'" <> pPrint ver <> text "'") <+> text "of the tool" <+> pPrint tool <+> text "is not installed."
|
||||||
|
|
||||||
instance HFErrorProject NotInstalled where
|
instance HFErrorProject NotInstalled where
|
||||||
eBase _ = 130
|
eBase _ = 130
|
||||||
@@ -524,7 +525,7 @@ data HTTPNotModified = HTTPNotModified Text
|
|||||||
|
|
||||||
instance Pretty HTTPNotModified where
|
instance Pretty HTTPNotModified where
|
||||||
pPrint (HTTPNotModified etag) =
|
pPrint (HTTPNotModified etag) =
|
||||||
text "Remote resource not modifed, etag was:" <+> pPrint etag
|
text "Remote resource not modified, etag was:" <+> pPrint etag
|
||||||
|
|
||||||
instance HFErrorProject HTTPNotModified where
|
instance HFErrorProject HTTPNotModified where
|
||||||
eBase _ = 240
|
eBase _ = 240
|
||||||
@@ -819,7 +820,7 @@ instance Exception ParseError
|
|||||||
|
|
||||||
instance HFErrorProject ParseError where
|
instance HFErrorProject ParseError where
|
||||||
eBase _ = 500
|
eBase _ = 500
|
||||||
eDesc _ = "A parse error occured."
|
eDesc _ = "A parse error occurred."
|
||||||
|
|
||||||
|
|
||||||
data UnexpectedListLength = UnexpectedListLength String
|
data UnexpectedListLength = UnexpectedListLength String
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ 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
|
||||||
@@ -449,13 +448,30 @@ 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"
|
||||||
Nothing
|
env
|
||||||
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)
|
||||||
@@ -1102,8 +1118,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"]
|
||||||
exsists <- forM possible_files (\f -> liftIO (doesFileExist f) <&> (,f))
|
exists <- forM possible_files (\f -> liftIO (doesFileExist f) <&> (,f))
|
||||||
case filter fst exsists of
|
case filter fst exists of
|
||||||
[] -> throwE HadrianNotFound
|
[] -> throwE HadrianNotFound
|
||||||
((_, x):_) -> pure x
|
((_, x):_) -> pure x
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ 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
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
{-|
|
{-|
|
||||||
Module : GHCup.Plaform
|
Module : GHCup.Platform
|
||||||
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
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ recreateSymlink symsource newsym fail' = do
|
|||||||
createSymbolicLink sympoint newsym
|
createSymbolicLink sympoint newsym
|
||||||
|
|
||||||
|
|
||||||
-- copys files, recreates symlinks, fails on all other types
|
-- copies 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
|
||||||
|
|||||||
@@ -148,7 +148,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 continous scrolling area
|
-- Reads fdIn and logs the output in a continuous 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
|
||||||
|
|||||||
@@ -263,12 +263,9 @@ createProcessWithMingwPath :: MonadIO m
|
|||||||
=> CreateProcess
|
=> CreateProcess
|
||||||
-> m CreateProcess
|
-> m CreateProcess
|
||||||
createProcessWithMingwPath cp = do
|
createProcessWithMingwPath cp = do
|
||||||
msys2Dir <- liftIO ghcupMsys2Dir
|
|
||||||
cEnv <- Map.fromList <$> maybe (liftIO getEnvironment) pure (env cp)
|
cEnv <- Map.fromList <$> maybe (liftIO getEnvironment) pure (env cp)
|
||||||
let mingWPaths = [msys2Dir </> "mingw64" </> "bin"
|
mingWPaths <- liftIO ghcupMsys2BinDirs'
|
||||||
,msys2Dir </> "usr" </> "bin"
|
let paths = ["PATH", "Path"]
|
||||||
]
|
|
||||||
paths = ["PATH", "Path"]
|
|
||||||
curPaths = (\x -> maybe [] splitSearchPath (Map.lookup x cEnv)) =<< paths
|
curPaths = (\x -> maybe [] splitSearchPath (Map.lookup x cEnv)) =<< paths
|
||||||
newPath = intercalate [searchPathSeparator] (mingWPaths ++ curPaths)
|
newPath = intercalate [searchPathSeparator] (mingWPaths ++ curPaths)
|
||||||
envWithoutPath = foldr (\x y -> Map.delete x y) cEnv paths
|
envWithoutPath = foldr (\x y -> Map.delete x y) cEnv paths
|
||||||
@@ -276,11 +273,4 @@ createProcessWithMingwPath cp = do
|
|||||||
liftIO $ setEnv "Path" newPath
|
liftIO $ setEnv "Path" newPath
|
||||||
pure $ cp { env = Just $ Map.toList envWithNewPath }
|
pure $ cp { env = Just $ Map.toList envWithNewPath }
|
||||||
|
|
||||||
ghcupMsys2Dir :: IO FilePath
|
|
||||||
ghcupMsys2Dir =
|
|
||||||
lookupEnv "GHCUP_MSYS2" >>= \case
|
|
||||||
Just fp -> pure fp
|
|
||||||
Nothing -> do
|
|
||||||
baseDir <- liftIO ghcupBaseDir
|
|
||||||
pure (fromGHCupPath baseDir </> "msys64")
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ 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
|
||||||
|
|||||||
@@ -24,10 +24,12 @@ module GHCup.Types
|
|||||||
, Key(..)
|
, Key(..)
|
||||||
, Modifier(..)
|
, Modifier(..)
|
||||||
#endif
|
#endif
|
||||||
|
, ArchiveResult(..)
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import GHCup.Types.Stack ( SetupInfo )
|
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 )
|
||||||
@@ -542,11 +544,23 @@ data Dirs = Dirs
|
|||||||
, dbDir :: GHCupPath
|
, dbDir :: GHCupPath
|
||||||
, recycleDir :: GHCupPath -- mainly used on windows
|
, recycleDir :: GHCupPath -- mainly used on windows
|
||||||
, tmpDir :: GHCupPath
|
, tmpDir :: GHCupPath
|
||||||
|
, msys2Dir :: FilePath
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic)
|
deriving (Show, GHC.Generic)
|
||||||
|
|
||||||
instance NFData Dirs
|
instance NFData Dirs
|
||||||
|
|
||||||
|
data MSYS2Env = MSYS
|
||||||
|
| UCRT64
|
||||||
|
| CLANG64
|
||||||
|
| CLANGARM64
|
||||||
|
| CLANG32
|
||||||
|
| MINGW64
|
||||||
|
| MINGW32
|
||||||
|
deriving (Eq, Show, Ord, GHC.Generic, Read)
|
||||||
|
|
||||||
|
instance NFData MSYS2Env
|
||||||
|
|
||||||
data KeepDirs = Always
|
data KeepDirs = Always
|
||||||
| Errors
|
| Errors
|
||||||
| Never
|
| Never
|
||||||
@@ -775,4 +789,3 @@ instance Pretty ToolVersion where
|
|||||||
data BuildSystem = Hadrian
|
data BuildSystem = Hadrian
|
||||||
| Make
|
| Make
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import GHCup.Types.Stack (SetupInfo)
|
|||||||
import GHCup.Types.JSON.Utils
|
import GHCup.Types.JSON.Utils
|
||||||
import GHCup.Types.JSON.Versions ()
|
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)
|
||||||
@@ -38,7 +39,7 @@ import Data.Text.Encoding as E
|
|||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
import Data.Versions
|
import Data.Versions
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import URI.ByteString
|
import URI.ByteString hiding (parseURI)
|
||||||
import Text.Casing
|
import Text.Casing
|
||||||
|
|
||||||
import qualified Data.List.NonEmpty as NE
|
import qualified Data.List.NonEmpty as NE
|
||||||
@@ -95,7 +96,7 @@ instance ToJSON URI where
|
|||||||
|
|
||||||
instance FromJSON URI where
|
instance FromJSON URI where
|
||||||
parseJSON = withText "URL" $ \t ->
|
parseJSON = withText "URL" $ \t ->
|
||||||
case parseURI strictURIParserOptions (encodeUtf8 t) of
|
case parseURI (encodeUtf8 t) of
|
||||||
Right x -> pure x
|
Right x -> pure x
|
||||||
Left e -> fail . show $ e
|
Left e -> fail . show $ e
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ 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
|
||||||
@@ -42,6 +44,8 @@ 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
|
||||||
@@ -49,7 +53,6 @@ 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
|
||||||
@@ -77,12 +80,8 @@ 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
|
import URI.ByteString hiding (parseURI)
|
||||||
|
|
||||||
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
|
||||||
@@ -280,7 +279,7 @@ rmPlainHLS = do
|
|||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|
|
||||||
-- | Whether the given GHC versin is installed.
|
-- | Whether the given GHC version 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
|
||||||
@@ -783,99 +782,6 @@ 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 ]--
|
||||||
------------
|
------------
|
||||||
@@ -929,6 +835,28 @@ 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
|
||||||
@@ -963,7 +891,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 . filter ((== "") . snd) . concat
|
getUniqueTools = filter (isNotAnyInfix blackListedTools) . nub . fmap fst . concatMap (filter ((== "") . snd))
|
||||||
|
|
||||||
blackListedTools :: [String]
|
blackListedTools :: [String]
|
||||||
blackListedTools = ["haddock-ghc"]
|
blackListedTools = ["haddock-ghc"]
|
||||||
@@ -1227,7 +1155,7 @@ ensureShimGen
|
|||||||
|
|
||||||
-- | Ensure ghcup directory structure exists.
|
-- | Ensure ghcup directory structure exists.
|
||||||
ensureDirectories :: Dirs -> IO ()
|
ensureDirectories :: Dirs -> IO ()
|
||||||
ensureDirectories (Dirs baseDir binDir cacheDir logsDir confDir trashDir dbDir tmpDir) = do
|
ensureDirectories (Dirs baseDir binDir cacheDir logsDir confDir trashDir dbDir tmpDir _) = do
|
||||||
createDirRecursive' (fromGHCupPath baseDir)
|
createDirRecursive' (fromGHCupPath baseDir)
|
||||||
createDirRecursive' (fromGHCupPath baseDir </> "ghc")
|
createDirRecursive' (fromGHCupPath baseDir </> "ghc")
|
||||||
createDirRecursive' (fromGHCupPath baseDir </> "hls")
|
createDirRecursive' (fromGHCupPath baseDir </> "hls")
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ module GHCup.Utils.Dirs
|
|||||||
, getConfigFilePath'
|
, getConfigFilePath'
|
||||||
, useXDG
|
, useXDG
|
||||||
, cleanupTrash
|
, cleanupTrash
|
||||||
|
, ghcupMsys2BinDirs
|
||||||
|
, ghcupMsys2BinDirs'
|
||||||
|
|
||||||
, GHCupPath
|
, GHCupPath
|
||||||
, appendGHCupPath
|
, appendGHCupPath
|
||||||
@@ -136,6 +138,7 @@ import GHC.IO.Exception ( IOErrorType(NoSuchThing) )
|
|||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Optics hiding ( uncons )
|
import Optics hiding ( uncons )
|
||||||
import Safe
|
import Safe
|
||||||
|
import System.Info
|
||||||
import System.Directory hiding ( removeDirectory
|
import System.Directory hiding ( removeDirectory
|
||||||
, removeDirectoryRecursive
|
, removeDirectoryRecursive
|
||||||
, removePathForcibly
|
, removePathForcibly
|
||||||
@@ -338,6 +341,48 @@ ghcupTMPDir
|
|||||||
else ghcupBaseDir <&> (\(GHCupPath gp) -> GHCupPath (gp </> "tmp"))
|
else ghcupBaseDir <&> (\(GHCupPath gp) -> GHCupPath (gp </> "tmp"))
|
||||||
|
|
||||||
|
|
||||||
|
ghcupMsys2Dir :: IO FilePath
|
||||||
|
ghcupMsys2Dir =
|
||||||
|
lookupEnv "GHCUP_MSYS2" >>= \case
|
||||||
|
Just fp -> pure fp
|
||||||
|
Nothing -> do
|
||||||
|
baseDir <- liftIO ghcupBaseDir
|
||||||
|
pure (fromGHCupPath baseDir </> "msys64")
|
||||||
|
|
||||||
|
ghcupMsys2BinDirs :: (MonadFail m, MonadIO m, MonadReader env m, HasDirs env) => m [FilePath]
|
||||||
|
ghcupMsys2BinDirs = do
|
||||||
|
Dirs{..} <- getDirs
|
||||||
|
liftIO $ ghcupMsys2BinDirs_ msys2Dir
|
||||||
|
|
||||||
|
ghcupMsys2BinDirs' :: IO [FilePath]
|
||||||
|
ghcupMsys2BinDirs' = do
|
||||||
|
msys2Dir <- ghcupMsys2Dir
|
||||||
|
ghcupMsys2BinDirs_ msys2Dir
|
||||||
|
|
||||||
|
ghcupMsys2BinDirs_ :: FilePath -> IO [FilePath]
|
||||||
|
ghcupMsys2BinDirs_ msys2Dir' = do
|
||||||
|
env <- liftIO (lookupEnv "GHCUP_MSYS2_ENV") >>= \case
|
||||||
|
Just env -> maybe (fail parseFailMsg) pure $ readMay @MSYS2Env env
|
||||||
|
Nothing
|
||||||
|
| "x86_64" <- arch -> pure MINGW64
|
||||||
|
| "i386" <- arch -> pure MINGW32
|
||||||
|
| "aarch64" <- arch -> pure CLANGARM64
|
||||||
|
| otherwise -> fail "No compatible architecture for msys2"
|
||||||
|
pure [msys2Dir' </> toEnvDir env </> "bin", msys2Dir' </> toEnvDir MSYS </> "bin"]
|
||||||
|
where
|
||||||
|
-- https://www.msys2.org/docs/environments/
|
||||||
|
toEnvDir :: MSYS2Env -> FilePath
|
||||||
|
toEnvDir MSYS = "usr"
|
||||||
|
toEnvDir UCRT64 = "ucrt64"
|
||||||
|
toEnvDir CLANG64 = "clang64"
|
||||||
|
toEnvDir CLANGARM64 = "clangarm64"
|
||||||
|
toEnvDir CLANG32 = "clang32"
|
||||||
|
toEnvDir MINGW64 = "mingw64"
|
||||||
|
toEnvDir MINGW32 = "mingw32"
|
||||||
|
|
||||||
|
parseFailMsg = "Invalid value for GHCUP_MSYS2_ENV. Valid values are: MSYS, UCRT64, CLANG64, CLANGARM64, CLANG32, MINGW64, MINGW32"
|
||||||
|
|
||||||
|
|
||||||
getAllDirs :: IO Dirs
|
getAllDirs :: IO Dirs
|
||||||
getAllDirs = do
|
getAllDirs = do
|
||||||
baseDir <- ghcupBaseDir
|
baseDir <- ghcupBaseDir
|
||||||
@@ -348,6 +393,7 @@ getAllDirs = do
|
|||||||
recycleDir <- ghcupRecycleDir
|
recycleDir <- ghcupRecycleDir
|
||||||
tmpDir <- ghcupTMPDir
|
tmpDir <- ghcupTMPDir
|
||||||
dbDir <- ghcupDbDir
|
dbDir <- ghcupDbDir
|
||||||
|
msys2Dir <- ghcupMsys2Dir
|
||||||
pure Dirs { .. }
|
pure Dirs { .. }
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
141
lib/GHCup/Utils/Tar.hs
Normal file
141
lib/GHCup/Utils/Tar.hs
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
{-# 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
|
||||||
|
|
||||||
33
lib/GHCup/Utils/Tar/Types.hs
Normal file
33
lib/GHCup/Utils/Tar/Types.hs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{-# 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
|
||||||
49
lib/GHCup/Utils/URI.hs
Normal file
49
lib/GHCup/Utils/URI.hs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{-# 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
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ 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 exsists AND the same file exists at
|
-- Note that when updating this, CI requires that the file exists 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.8.yaml|]
|
||||||
|
|||||||
@@ -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.
|
||||||
// Theorically, this could be fixed (or rather, worked around) using pipes
|
// Theoretically, 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,6 +12,7 @@
|
|||||||
# * 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
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
# * BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG - whether to adjust mingw paths in cabal.config on windows
|
# * BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG - whether to adjust mingw paths in cabal.config on windows
|
||||||
# * BOOTSTRAP_HASKELL_DOWNLOADER - which downloader to use (default: curl)
|
# * BOOTSTRAP_HASKELL_DOWNLOADER - which downloader to use (default: curl)
|
||||||
# * GHCUP_BASE_URL - the base url for ghcup binary download (use this to overwrite https://downloads.haskell.org/~ghcup with a mirror)
|
# * GHCUP_BASE_URL - the base url for ghcup binary download (use this to overwrite https://downloads.haskell.org/~ghcup with a mirror)
|
||||||
|
# * GHCUP_MSYS2_ENV - the msys2 environment to use on windows, see https://www.msys2.org/docs/environments/ (defauts to MINGW64, MINGW32 or CLANGARM64, depending on the architecture)
|
||||||
|
|
||||||
# License: LGPL-3.0
|
# License: LGPL-3.0
|
||||||
|
|
||||||
@@ -26,6 +28,15 @@
|
|||||||
# safety subshell to avoid executing anything in case this script is not downloaded properly
|
# safety subshell to avoid executing anything in case this script is not downloaded properly
|
||||||
(
|
(
|
||||||
|
|
||||||
|
die() {
|
||||||
|
if [ -n "${NO_COLOR}" ] ; then
|
||||||
|
(>&2 printf "%s\\n" "$1")
|
||||||
|
else
|
||||||
|
(>&2 printf "\\033[0;31m%s\\033[0m\\n" "$1")
|
||||||
|
fi
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
plat="$(uname -s)"
|
plat="$(uname -s)"
|
||||||
arch=$(uname -m)
|
arch=$(uname -m)
|
||||||
ghver="0.1.20.0"
|
ghver="0.1.20.0"
|
||||||
@@ -35,7 +46,7 @@ export GHCUP_SKIP_UPDATE_CHECK=yes
|
|||||||
: "${BOOTSTRAP_HASKELL_DOWNLOADER:=curl}"
|
: "${BOOTSTRAP_HASKELL_DOWNLOADER:=curl}"
|
||||||
|
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
: "${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")
|
||||||
@@ -54,25 +65,47 @@ case "${plat}" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case "${GHCUP_MSYS2_ENV}" in
|
||||||
|
"")
|
||||||
|
case "${arch}" in
|
||||||
|
x86_64|amd64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="mingw64" ;;
|
||||||
|
i*86)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="mingw32" ;;
|
||||||
|
aarch64|arm64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="clangarm64" ;;
|
||||||
|
*) die "Unknown architecture: ${arch}" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
MSYS)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="usr" ;;
|
||||||
|
UCRT64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="ucrt64" ;;
|
||||||
|
CLANG64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="clang64" ;;
|
||||||
|
CLANGARM64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="clangarm64" ;;
|
||||||
|
CLANG32)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="clang32" ;;
|
||||||
|
MINGW64)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="mingw64" ;;
|
||||||
|
MINGW32)
|
||||||
|
GHCUP_MSYS2_ENV_DIR="mingw32" ;;
|
||||||
|
*)
|
||||||
|
die "Invalid value for GHCUP_MSYS2_ENV. Valid values are: MSYS, UCRT64, CLANG64, CLANGARM64, CLANG32, MINGW64, MINGW32" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
: "${BOOTSTRAP_HASKELL_GHC_VERSION:=recommended}"
|
: "${BOOTSTRAP_HASKELL_GHC_VERSION:=recommended}"
|
||||||
: "${BOOTSTRAP_HASKELL_CABAL_VERSION:=recommended}"
|
: "${BOOTSTRAP_HASKELL_CABAL_VERSION:=recommended}"
|
||||||
|
|
||||||
|
|
||||||
die() {
|
|
||||||
if [ -n "${NO_COLOR}" ] ; then
|
|
||||||
(>&2 printf "%s\\n" "$1")
|
|
||||||
else
|
|
||||||
(>&2 printf "\\033[0;31m%s\\033[0m\\n" "$1")
|
|
||||||
fi
|
|
||||||
exit 2
|
|
||||||
}
|
|
||||||
|
|
||||||
warn() {
|
warn() {
|
||||||
if [ -n "${NO_COLOR}" ] ; then
|
if [ -n "${NO_COLOR}" ] ; then
|
||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;35m$1\\033[0m"
|
echo -e "\\033[0;35m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -88,7 +121,7 @@ yellow() {
|
|||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;33m$1\\033[0m"
|
echo -e "\\033[0;33m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -104,7 +137,7 @@ green() {
|
|||||||
printf "%s\\n" "$1"
|
printf "%s\\n" "$1"
|
||||||
else
|
else
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
# shellcheck disable=SC3037
|
# shellcheck disable=SC3037
|
||||||
echo -e "\\033[0;32m$1\\033[0m"
|
echo -e "\\033[0;32m$1\\033[0m"
|
||||||
;;
|
;;
|
||||||
@@ -160,7 +193,7 @@ _done() {
|
|||||||
echo
|
echo
|
||||||
echo "==============================================================================="
|
echo "==============================================================================="
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
green
|
green
|
||||||
green "All done!"
|
green "All done!"
|
||||||
green
|
green
|
||||||
@@ -313,7 +346,7 @@ download_ghcup() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
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
|
||||||
@@ -326,7 +359,7 @@ download_ghcup() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
case "${BOOTSTRAP_HASKELL_DOWNLOADER}" in
|
case "${BOOTSTRAP_HASKELL_DOWNLOADER}" in
|
||||||
"curl")
|
"curl")
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
@@ -526,7 +559,7 @@ adjust_bashrc() {
|
|||||||
;;
|
;;
|
||||||
fish)
|
fish)
|
||||||
mkdir -p "${GHCUP_PROFILE_FILE%/*}"
|
mkdir -p "${GHCUP_PROFILE_FILE%/*}"
|
||||||
sed -i -e '/# ghcup-env$/ s/^#*/#/' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
sed -i -e '/# ghcup-env$/d' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
||||||
case $1 in
|
case $1 in
|
||||||
1)
|
1)
|
||||||
printf "\n%s" "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN \$PATH # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
printf "\n%s" "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME ; set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN \$PATH # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
||||||
@@ -537,15 +570,15 @@ adjust_bashrc() {
|
|||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
bash)
|
bash)
|
||||||
sed -i -e '/# ghcup-env$/ s/^#*/#/' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
sed -i -e '/# ghcup-env$/d' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
||||||
printf "\n%s" "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
printf "\n%s" "[ -f \"${GHCUP_DIR}/env\" ] && . \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
"Darwin"|"darwin")
|
"Darwin"|"darwin")
|
||||||
if ! grep -q "ghcup-env" "${HOME}/.bash_profile" ; then
|
if ! grep -q "ghcup-env" "${HOME}/.bash_profile" ; then
|
||||||
printf "\n%s" "[[ -f ~/.bashrc ]] && source ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
|
printf "\n%s" "[[ -f ~/.bashrc ]] && . ~/.bashrc # ghcup-env" >> "${HOME}/.bash_profile"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
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"
|
||||||
@@ -556,15 +589,19 @@ adjust_bashrc() {
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
zsh)
|
zsh)
|
||||||
sed -i -e '/# ghcup-env$/ s/^#*/#/' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
sed -i -e '/# ghcup-env$/d' "$(posix_realpath "${GHCUP_PROFILE_FILE}")"
|
||||||
printf "\n%s" "[ -f \"${GHCUP_DIR}/env\" ] && source \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
printf "\n%s" "[ -f \"${GHCUP_DIR}/env\" ] && . \"${GHCUP_DIR}/env\" # ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
if [ -e "$HOME/.profile" ] ; then
|
||||||
|
sed -i -e '/# ghcup-env$/d' "$(posix_realpath "$HOME/.profile")"
|
||||||
|
printf "\n%s" "[ -f \"${GHCUP_DIR}/env\" ] && . \"${GHCUP_DIR}/env\" # ghcup-env" >> "$HOME/.profile"
|
||||||
|
fi
|
||||||
echo
|
echo
|
||||||
echo "==============================================================================="
|
echo "==============================================================================="
|
||||||
echo
|
echo
|
||||||
warn "OK! ${GHCUP_PROFILE_FILE} has been modified. Restart your terminal for the changes to take effect,"
|
warn "OK! ${GHCUP_PROFILE_FILE} has been modified. Restart your terminal for the changes to take effect,"
|
||||||
warn "or type \"source ${GHCUP_DIR}/env\" to apply them in your current terminal session."
|
warn "or type \". ${GHCUP_DIR}/env\" to apply them in your current terminal session."
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -590,12 +627,12 @@ adjust_cabal_config() {
|
|||||||
else
|
else
|
||||||
cabal_bin="$HOME/AppData/Roaming/cabal/bin"
|
cabal_bin="$HOME/AppData/Roaming/cabal/bin"
|
||||||
fi
|
fi
|
||||||
ecabal user-config -a "extra-prog-path: $(cygpath -w "$GHCUP_BIN"), $(cygpath -w "$cabal_bin"), $(cygpath -w "$GHCUP_MSYS2"/mingw64/bin), $(cygpath -w "$GHCUP_MSYS2"/usr/bin)" -a "extra-include-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/include)" -a "extra-lib-dirs: $(cygpath -w "$GHCUP_MSYS2"/mingw64/lib)" -f init
|
ecabal user-config -a "extra-prog-path: $(cygpath -w "$GHCUP_BIN"), $(cygpath -w "$cabal_bin"), $(cygpath -w "$GHCUP_MSYS2"/${GHCUP_MSYS2_ENV_DIR}/bin), $(cygpath -w "$GHCUP_MSYS2"/usr/bin)" -a "extra-include-dirs: $(cygpath -w "$GHCUP_MSYS2"/${GHCUP_MSYS2_ENV_DIR}/include)" -a "extra-lib-dirs: $(cygpath -w "$GHCUP_MSYS2"/${GHCUP_MSYS2_ENV_DIR}/lib)" -f init
|
||||||
}
|
}
|
||||||
|
|
||||||
ask_cabal_config_init() {
|
ask_cabal_config_init() {
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG}" ] ; then
|
if [ -n "${BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG}" ] ; then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
@@ -636,7 +673,7 @@ ask_cabal_config_init() {
|
|||||||
|
|
||||||
do_cabal_config_init() {
|
do_cabal_config_init() {
|
||||||
case "${plat}" in
|
case "${plat}" in
|
||||||
MSYS*|MINGW*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
case $1 in
|
case $1 in
|
||||||
1)
|
1)
|
||||||
adjust_cabal_config
|
adjust_cabal_config
|
||||||
@@ -680,7 +717,7 @@ ask_hls() {
|
|||||||
*)
|
*)
|
||||||
echo "Possible choices are:"
|
echo "Possible choices are:"
|
||||||
echo
|
echo
|
||||||
echo "Y - Yes, install the haskell-langauge-server"
|
echo "Y - Yes, install the haskell-language-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."
|
||||||
@@ -738,6 +775,15 @@ 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
|
||||||
|
|
||||||
@@ -756,7 +802,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*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
echo " $(cygpath -w "$GHCUP_DIR")"
|
echo " $(cygpath -w "$GHCUP_DIR")"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -820,10 +866,19 @@ 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*)
|
MSYS*|MINGW*|CYGWIN*)
|
||||||
# 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)"
|
||||||
@@ -850,8 +905,9 @@ case $ask_stack_answer in
|
|||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
(_eghcup --cache install stack) || die "Stack installation failed"
|
(_eghcup --cache install stack) || die "Stack installation failed"
|
||||||
edo mkdir -p "${STACK_ROOT:-$HOME/.stack}"/hooks
|
stack_root="$(find_stack_root)"
|
||||||
hook_exe="${STACK_ROOT:-$HOME/.stack}"/hooks/ghc-install.sh
|
edo mkdir -p "${stack_root}"/hooks
|
||||||
|
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
|
||||||
|
|||||||
@@ -44,7 +44,11 @@ param (
|
|||||||
# The Msys2 sha256sum hash
|
# The Msys2 sha256sum hash
|
||||||
[string]$Msys2Hash,
|
[string]$Msys2Hash,
|
||||||
# Whether to disable creation of several desktop shortcuts
|
# Whether to disable creation of several desktop shortcuts
|
||||||
[switch]$DontWriteDesktopShortcuts
|
[switch]$DontWriteDesktopShortcuts,
|
||||||
|
# Whether to disable adjusting bashrc (in msys2 env) with PATH
|
||||||
|
[switch]$DontAdjustBashRc,
|
||||||
|
# The msys2 environment to use, see https://www.msys2.org/docs/environments/ (defauts to MINGW64, MINGW32 or CLANGARM64, depending on the architecture)
|
||||||
|
[string]$Msys2Env
|
||||||
)
|
)
|
||||||
|
|
||||||
$DefaultMsys2Version = "20221216"
|
$DefaultMsys2Version = "20221216"
|
||||||
@@ -185,6 +189,43 @@ function Exec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Only x86 32/64-bit is supported
|
||||||
|
$SupportedArchitectures = 'AMD64', 'x86'
|
||||||
|
if (!$SupportedArchitectures.contains($env:PROCESSOR_ARCHITECTURE)) {
|
||||||
|
Print-Msg -color Red -msg ("Unsupported processor architecture: {0}. Supported architectures: {1}." -f $env:PROCESSOR_ARCHITECTURE, ($SupportedArchitectures -join ", "))
|
||||||
|
Exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# set default Msys2Env if not set
|
||||||
|
if (!$Msys2Env) {
|
||||||
|
if ($env:PROCESSOR_ARCHITECTURE -eq 'x86') {
|
||||||
|
$Msys2Env = 'MINGW32'
|
||||||
|
} elseif ($env:PROCESSOR_ARCHITECTURE -eq 'AMD64') {
|
||||||
|
$Msys2Env = 'MINGW64'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# parse Msys2Env and set the corresponding variables
|
||||||
|
if ($Msys2Env -eq 'MINGW32') {
|
||||||
|
$ShellType = '-mingw32'
|
||||||
|
$PkgConf = 'mingw-w64-i686-pkgconf'
|
||||||
|
} elseif ($Msys2Env -eq 'MINGW64') {
|
||||||
|
$ShellType = '-mingw64'
|
||||||
|
$PkgConf = 'mingw-w64-x86_64-pkgconf'
|
||||||
|
} elseif ($Msys2Env -eq 'MSYS') {
|
||||||
|
$ShellType = '-msys2'
|
||||||
|
$PkgConf = 'pkgconf'
|
||||||
|
} elseif ($Msys2Env -eq 'UCRT64') {
|
||||||
|
$ShellType = '-ucrt64'
|
||||||
|
$PkgConf = 'mingw-w64-ucrt-x86_64-pkgconf'
|
||||||
|
} elseif ($Msys2Env -eq 'CLANG64') {
|
||||||
|
$ShellType = '-clang64'
|
||||||
|
$PkgConf = 'mingw-w64-clang-x86_64-pkgconf'
|
||||||
|
} else {
|
||||||
|
Print-Msg -color Red -msg ("Unsupported Msys2 environment: {0}. Supported environments are: MINGW64, MINGW32, MSYS, UCRT64, CLANG64" -f $Msys2Env)
|
||||||
|
Exit 1
|
||||||
|
}
|
||||||
|
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
$GhcupBasePrefixEnv = [System.Environment]::GetEnvironmentVariable('GHCUP_INSTALL_BASE_PREFIX', 'user')
|
$GhcupBasePrefixEnv = [System.Environment]::GetEnvironmentVariable('GHCUP_INSTALL_BASE_PREFIX', 'user')
|
||||||
@@ -476,7 +517,9 @@ 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
|
||||||
Remove-Item -Path "$archivePath"
|
# We ignore errors because we don't want the installation script to fail just because a temporary file can't be removed.
|
||||||
|
# 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'
|
||||||
@@ -490,7 +533,7 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
||||||
|
|
||||||
Print-Msg -msg 'Installing Dependencies...'
|
Print-Msg -msg 'Installing Dependencies...'
|
||||||
Exec "$Bash" '-lc' 'pacman --noconfirm -S --needed curl autoconf mingw-w64-x86_64-pkgconf'
|
Exec "$Bash" '-lc' ('pacman --noconfirm -S --needed curl autoconf {0}' -f $PkgConf)
|
||||||
|
|
||||||
Print-Msg -msg 'Updating SSL root certificate authorities...'
|
Print-Msg -msg 'Updating SSL root certificate authorities...'
|
||||||
Exec "$Bash" '-lc' 'pacman --noconfirm -S ca-certificates'
|
Exec "$Bash" '-lc' 'pacman --noconfirm -S ca-certificates'
|
||||||
@@ -598,9 +641,9 @@ 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 = ('{0} -mintty -c "pacman --noconfirm -S --needed base-devel gettext autoconf make libtool automake python p7zip patch unzip"' -f $ShellType)
|
||||||
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 $ShellType -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
|
||||||
@@ -645,10 +688,19 @@ 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 ;'
|
||||||
|
}
|
||||||
|
|
||||||
|
# set msys2 env export for the shell bootstrap script
|
||||||
|
$Msys2EnvExport = ('export GHCUP_MSYS2_ENV={0} ;' -f $Msys2Env)
|
||||||
|
# export GHCUP_MSYS2_ENV
|
||||||
|
$null = [Environment]::SetEnvironmentVariable("GHCUP_MSYS2_ENV", $Msys2Env, [System.EnvironmentVariableTarget]::User)
|
||||||
|
|
||||||
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} [ -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)
|
Exec "$Bash" '-lc' ('{4} {6} {7} {8} {9} {10} {12} {13} [ -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, $Msys2EnvExport)
|
||||||
} else {
|
} else {
|
||||||
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)
|
Exec "$Msys2Shell" $ShellType '-mintty' '-shell' 'bash' '-c' ('{4} {6} {7} {8} {9} {10} {12} {13} [ -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, $Msys2EnvExport)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,11 +27,7 @@ cd "gh-release-artifacts/${RELEASE}"
|
|||||||
# github
|
# github
|
||||||
gh release download "$RELEASE"
|
gh release download "$RELEASE"
|
||||||
|
|
||||||
# cirrus
|
|
||||||
curl -L -o "x86_64-portbld-freebsd-ghcup-${TAG}" \
|
|
||||||
"https://api.cirrus-ci.com/v1/artifact/github/haskell/ghcup-hs/build/binaries/out/x86_64-portbld-freebsd-ghcup-${TAG}?branch=${RELEASE}"
|
|
||||||
|
|
||||||
sha256sum ./*-ghcup-* > SHA256SUMS
|
sha256sum ./*-ghcup-* > SHA256SUMS
|
||||||
gpg --detach-sign -u "${SIGNER}" SHA256SUMS
|
gpg --detach-sign -u "${SIGNER}" SHA256SUMS
|
||||||
|
|
||||||
gh release upload "$RELEASE" "ghcup-${TAG}-src.tar.gz" "x86_64-portbld-freebsd-ghcup-${TAG}" SHA256SUMS SHA256SUMS.sig
|
gh release upload "$RELEASE" "ghcup-${TAG}-src.tar.gz" SHA256SUMS SHA256SUMS.sig
|
||||||
|
|||||||
@@ -845,7 +845,7 @@
|
|||||||
"dlHash": "et",
|
"dlHash": "et",
|
||||||
"dlOutput": "𥗚%ဖ-\u000e",
|
"dlOutput": "𥗚%ဖ-\u000e",
|
||||||
"dlSubdir": {
|
"dlSubdir": {
|
||||||
"RegexDir": "BP!a⠀"
|
"RegexDir": "BP!a𖫈"
|
||||||
},
|
},
|
||||||
"dlUri": "https:"
|
"dlUri": "https:"
|
||||||
},
|
},
|
||||||
@@ -17546,7 +17546,7 @@
|
|||||||
"dlHash": "knn",
|
"dlHash": "knn",
|
||||||
"dlOutput": "",
|
"dlOutput": "",
|
||||||
"dlSubdir": {
|
"dlSubdir": {
|
||||||
"RegexDir": "𢹂 "
|
"RegexDir": "𐞳 "
|
||||||
},
|
},
|
||||||
"dlUri": "http:qlay"
|
"dlUri": "http:qlay"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,11 @@ compileGhcCheckList = mapSecond CompileGHC
|
|||||||
, (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"})
|
||||||
@@ -164,10 +168,22 @@ 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"]})
|
||||||
|
|||||||
Reference in New Issue
Block a user