Compare commits
28 Commits
cabal-inst
...
fix-symlin
| Author | SHA1 | Date | |
|---|---|---|---|
| 7ec9d90aab | |||
| 326bf510c9 | |||
| ce3d1f4309 | |||
| b31ba883e4 | |||
| e5d1c04616 | |||
| 34ff0ed9cf | |||
| 85bd87d5f3 | |||
| 8b274214af | |||
| 069e3102f4 | |||
| 8623b32721 | |||
| 6342e8edf0 | |||
| bbd8f0c84c | |||
| 873c951d6e | |||
| d9c864d3c5 | |||
| 4280d7109a | |||
| c8855c068f | |||
| 90503061e9 | |||
| 672ebf6426 | |||
| fd76fde23a | |||
| e24c9a3ffe | |||
| 2641d50c21 | |||
| 202f3ea3ba | |||
| 4f09e3ff7e | |||
| 1148219130 | |||
| 4b47800dfb | |||
| e2c4db9132 | |||
| 90af68b211 | |||
| 80603662b4 |
@@ -113,7 +113,7 @@ test:linux:recommended:
|
|||||||
test:linux:latest:
|
test:linux:latest:
|
||||||
extends: .test_ghcup_version:linux
|
extends: .test_ghcup_version:linux
|
||||||
variables:
|
variables:
|
||||||
GHC_VERSION: "8.10.1"
|
GHC_VERSION: "8.10.2"
|
||||||
CABAL_VERSION: "3.2.0.0"
|
CABAL_VERSION: "3.2.0.0"
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
@@ -136,7 +136,7 @@ test:mac:recommended:
|
|||||||
test:mac:latest:
|
test:mac:latest:
|
||||||
extends: .test_ghcup_version:darwin
|
extends: .test_ghcup_version:darwin
|
||||||
variables:
|
variables:
|
||||||
GHC_VERSION: "8.10.1"
|
GHC_VERSION: "8.10.2"
|
||||||
CABAL_VERSION: "3.2.0.0"
|
CABAL_VERSION: "3.2.0.0"
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@ test:freebsd:recommended:
|
|||||||
test:freebsd:latest:
|
test:freebsd:latest:
|
||||||
extends: .test_ghcup_version:freebsd
|
extends: .test_ghcup_version:freebsd
|
||||||
variables:
|
variables:
|
||||||
GHC_VERSION: "8.10.1"
|
GHC_VERSION: "8.10.2"
|
||||||
CABAL_VERSION: "3.2.0.0"
|
CABAL_VERSION: "3.2.0.0"
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
|
|||||||
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,5 +1,21 @@
|
|||||||
# Revision history for ghcup
|
# Revision history for ghcup
|
||||||
|
|
||||||
|
## 0.1.10 -- 2020-08-14
|
||||||
|
|
||||||
|
* Show stray Cabals (useful for pre-releases or compiled ones)
|
||||||
|
|
||||||
|
## 0.1.9 -- 2020-08-14
|
||||||
|
|
||||||
|
* Fix bug when uninstalling all cabal versions
|
||||||
|
* Fix bug when setting a non-installed ghc version as current default
|
||||||
|
* Use yaml instead of generated json for download info for ease of adding new GHC versions #44
|
||||||
|
* Allow pre-release versions of GHC/cabal
|
||||||
|
* Add XDG dirs support (set `GHCUP_USE_XDG_DIRS`) wrt #39
|
||||||
|
* Allow to specify regex for tarball subdir (e.g. `ghc-.*`)
|
||||||
|
* Allow installing arbitrary bindists more seamlessly:
|
||||||
|
- e.g. installing GHC HEAD: `ghcup -n install ghc -u '{"dlHash": "", "dlSubdir": { "RegexDir": "ghc-.*"}, "dlUri": "https://gitlab.haskell.org/api/v4/projects/1/jobs/artifacts/master/raw/ghc-x86_64-fedora27-linux.tar.xz?job=validate-x86_64-linux-fedora27" }' head`
|
||||||
|
* Avoid duplicate edits to .bashrc/.zshrc wrt #43
|
||||||
|
|
||||||
## 0.1.8 -- 2020-07-21
|
## 0.1.8 -- 2020-07-21
|
||||||
|
|
||||||
* Fix bug in logging thread dying on newlines
|
* Fix bug in logging thread dying on newlines
|
||||||
|
|||||||
26
README.md
26
README.md
@@ -9,11 +9,15 @@ Similar in scope to [rustup](https://github.com/rust-lang-nursery/rustup.rs), [p
|
|||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
* [Installation](#installation)
|
* [Installation](#installation)
|
||||||
|
* [Simple bootstrap](#simple-bootstrap)
|
||||||
|
* [Manual install](#manual-install)
|
||||||
|
* [Vim integration](#vim-integration)
|
||||||
* [Usage](#usage)
|
* [Usage](#usage)
|
||||||
* [Manpages](#manpages)
|
* [Manpages](#manpages)
|
||||||
* [Shell-completion](#shell-completion)
|
* [Shell-completion](#shell-completion)
|
||||||
* [Cross support](#cross-support)
|
* [Cross support](#cross-support)
|
||||||
* [XDG support](#xdg-support)
|
* [XDG support](#xdg-support)
|
||||||
|
* [Installing custom bindists](#installing-custom-bindists)
|
||||||
* [Design goals](#design-goals)
|
* [Design goals](#design-goals)
|
||||||
* [How](#how)
|
* [How](#how)
|
||||||
* [Known users](#known-users)
|
* [Known users](#known-users)
|
||||||
@@ -37,6 +41,10 @@ Then adjust your `PATH` in `~/.bashrc` (or similar, depending on your shell) lik
|
|||||||
export PATH="$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH"
|
export PATH="$HOME/.cabal/bin:$HOME/.ghcup/bin:$PATH"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Vim integration
|
||||||
|
|
||||||
|
See [ghcup.vim](https://github.com/hasufell/ghcup.vim).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
See `ghcup --help`.
|
See `ghcup --help`.
|
||||||
@@ -97,7 +105,7 @@ For distributions with non-standard locations of cross toolchain and
|
|||||||
libraries, this may need some tweaking of `build.mk` or configure args.
|
libraries, this may need some tweaking of `build.mk` or configure args.
|
||||||
See `ghcup compile ghc --help` for further information.
|
See `ghcup compile ghc --help` for further information.
|
||||||
|
|
||||||
### Cross support
|
### XDG support
|
||||||
|
|
||||||
To enable XDG style directories, set the environment variable `GHCUP_USE_XDG_DIRS` to anything.
|
To enable XDG style directories, set the environment variable `GHCUP_USE_XDG_DIRS` to anything.
|
||||||
|
|
||||||
@@ -107,6 +115,22 @@ Then you can control the locations via XDG environment variables as such:
|
|||||||
* `XDG_CACHE_HOME`: logs and download files will be stored in `ghcup` subdir
|
* `XDG_CACHE_HOME`: logs and download files will be stored in `ghcup` subdir
|
||||||
* `XDG_BIN_HOME`: binaries end up here (default: `~/.local/bin`)
|
* `XDG_BIN_HOME`: binaries end up here (default: `~/.local/bin`)
|
||||||
|
|
||||||
|
### Installing custom bindists
|
||||||
|
|
||||||
|
There are a couple of good use cases to install custom bindists:
|
||||||
|
|
||||||
|
1. manually built bindists (e.g. with patches)
|
||||||
|
- example: `ghcup -n install ghc -u '{"dlHash": "", "dlSubdir": { "RegexDir": "ghc-.*"}, "dlUri": "file:///home/mearwald/tmp/ghc-eff-patches/ghc-8.10.2-x86_64-deb10-linux.tar.xz" }' 8.10.2-eff`
|
||||||
|
2. GHC head CI bindists
|
||||||
|
- example: `ghcup -n install ghc -u '{"dlHash": "", "dlSubdir": { "RegexDir": "ghc-.*"}, "dlUri": "https://gitlab.haskell.org/api/v4/projects/1/jobs/artifacts/master/raw/ghc-x86_64-fedora27-linux.tar.xz?job=validate-x86_64-linux-fedora27" }' head`
|
||||||
|
3. DWARF bindists
|
||||||
|
- example: `ghcup -c -n install ghc -u '{"dlHash": "", "dlSubdir": { "RegexDir": "ghc-.*"}, "dlUri": "https://downloads.haskell.org/~ghc/8.10.2/ghc-8.10.2-x86_64-deb10-linux-dwarf.tar.xz" }' 8.10.2-dwarf`
|
||||||
|
|
||||||
|
Since the version parser is pretty lax, `8.10.2-eff` and `head` are both valid versions
|
||||||
|
and produce the binaries `ghc-8.10.2-eff` and `ghc-head` respectively.
|
||||||
|
GHCup always needs to know which version the bindist corresponds to (this is not automatically
|
||||||
|
detected).
|
||||||
|
|
||||||
## Design goals
|
## Design goals
|
||||||
|
|
||||||
1. simplicity
|
1. simplicity
|
||||||
|
|||||||
@@ -910,7 +910,7 @@ Report bugs at <https://gitlab.haskell.org/haskell/ghcup-hs/issues>|]
|
|||||||
settings@Settings{dirs = Dirs{..}, ..} <- toSettings opt
|
settings@Settings{dirs = Dirs{..}, ..} <- toSettings opt
|
||||||
|
|
||||||
-- create ~/.ghcup dir
|
-- create ~/.ghcup dir
|
||||||
createDirRecursive newDirPerms baseDir
|
createDirRecursive' baseDir
|
||||||
|
|
||||||
-- logger interpreter
|
-- logger interpreter
|
||||||
logfile <- flip runReaderT settings $ initGHCupFileLogging [rel|ghcup.log|]
|
logfile <- flip runReaderT settings $ initGHCupFileLogging [rel|ghcup.log|]
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ _done() {
|
|||||||
download_ghcup() {
|
download_ghcup() {
|
||||||
_plat="$(uname -s)"
|
_plat="$(uname -s)"
|
||||||
_arch=$(uname -m)
|
_arch=$(uname -m)
|
||||||
_ghver="0.1.8"
|
_ghver="0.1.10"
|
||||||
_base_url="https://downloads.haskell.org/~ghcup"
|
_base_url="https://downloads.haskell.org/~ghcup"
|
||||||
|
|
||||||
case "${_plat}" in
|
case "${_plat}" in
|
||||||
@@ -235,7 +235,7 @@ if [ -z "${BOOTSTRAP_HASKELL_NONINTERACTIVE}" ] ; then
|
|||||||
if ! grep -q "ghcup-env" "${GHCUP_PROFILE_FILE}" ; then
|
if ! grep -q "ghcup-env" "${GHCUP_PROFILE_FILE}" ; then
|
||||||
echo "# ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
echo "# ghcup-env" >> "${GHCUP_PROFILE_FILE}"
|
||||||
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME" >> "${GHCUP_PROFILE_FILE}"
|
echo "set -q GHCUP_INSTALL_BASE_PREFIX[1]; or set GHCUP_INSTALL_BASE_PREFIX \$HOME" >> "${GHCUP_PROFILE_FILE}"
|
||||||
echo "test -f $GHCUP_DIR/env ; and set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN/bin \$PATH" >> "${GHCUP_PROFILE_FILE}"
|
echo "test -f $GHCUP_DIR/env ; and set -gx PATH \$HOME/.cabal/bin $GHCUP_BIN \$PATH" >> "${GHCUP_PROFILE_FILE}"
|
||||||
fi
|
fi
|
||||||
break ;;
|
break ;;
|
||||||
*)
|
*)
|
||||||
|
|||||||
@@ -19,6 +19,6 @@ package ghcup
|
|||||||
constraints: http-io-streams -brotli
|
constraints: http-io-streams -brotli
|
||||||
|
|
||||||
package libarchive
|
package libarchive
|
||||||
flags: +static
|
flags: -system-libarchive
|
||||||
|
|
||||||
allow-newer: base, ghc-prim, template-haskell
|
allow-newer: base, ghc-prim, template-haskell
|
||||||
|
|||||||
121
ghcup-0.0.2.yaml
121
ghcup-0.0.2.yaml
@@ -1,4 +1,3 @@
|
|||||||
# !!! if you use RegexDir, then the version must be bumped !!!
|
|
||||||
---
|
---
|
||||||
toolRequirements:
|
toolRequirements:
|
||||||
GHC:
|
GHC:
|
||||||
@@ -1160,7 +1159,7 @@ ghcupDownloads:
|
|||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~ghc/8.10.2/ghc-8.10.2-x86_64-alpine3.10-linux-integer-simple.tar.xz
|
dlUri: https://downloads.haskell.org/~ghc/8.10.2/ghc-8.10.2-x86_64-alpine3.10-linux-integer-simple.tar.xz
|
||||||
dlSubdir: ghc-8.10.2
|
dlSubdir: ghc-8.10.2-x86_64-unknown-linux
|
||||||
dlHash: 14d09a508f2a3a11875c140be8e6c5f6982ac5cd448f089ca10b7adc955fec76
|
dlHash: 14d09a508f2a3a11875c140be8e6c5f6982ac5cd448f089ca10b7adc955fec76
|
||||||
Linux_AmazonLinux:
|
Linux_AmazonLinux:
|
||||||
unknown_versioning: *ghc-8102-64-centos
|
unknown_versioning: *ghc-8102-64-centos
|
||||||
@@ -1189,6 +1188,83 @@ ghcupDownloads:
|
|||||||
unknown_versioning: *ghc-8102-32-deb9
|
unknown_versioning: *ghc-8102-32-deb9
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: *ghc-8102-32-deb9
|
unknown_versioning: *ghc-8102-32-deb9
|
||||||
|
Linux_Alpine:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: https://files.hasufell.de/ghc/ghc-8.10.2-i386-alpine-linux.tar.xz
|
||||||
|
dlSubdir: ghc-8.10.2
|
||||||
|
dlHash: 9ee1cf1e85e9536088b3c9e80e975074e525ea378cd4eb156071bbc4b7b38327
|
||||||
|
9.0.1-alpha1:
|
||||||
|
viTags:
|
||||||
|
- Prerelease
|
||||||
|
- base-4.15.0.0
|
||||||
|
viSourceDL:
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-src.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0.20200821
|
||||||
|
dlHash: 8a3a36a0d770dbe678dbc084c3cc9a426749ac9d695f34fa30dc4da1564be6cb
|
||||||
|
viArch:
|
||||||
|
A_64:
|
||||||
|
Linux_Debian:
|
||||||
|
'9': &ghc-901a1-64-deb9
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-deb9-linux.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: a58b508e5d9f85a5831c7e451766105c4b2188987b3110ac62c8182e3e6ed0f6
|
||||||
|
'10': &ghc-901a1-64-deb10
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-deb10-linux-dwarf.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: 963d4cef71780f24d23cd947d33f61e9ee338f85e2aed06ec588fdb8be339a04
|
||||||
|
unknown_versioning: *ghc-901a1-64-deb9
|
||||||
|
Linux_Ubuntu:
|
||||||
|
unknown_versioning: &ghc-901a1-64-fedora
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-fedora27-linux.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: e6c241d7945fe84e03501c8a9b947a5f50ad489cdf2b6e286d5de76046a8a6f3
|
||||||
|
'16.04': *ghc-901a1-64-deb9
|
||||||
|
'18.04': *ghc-901a1-64-deb9
|
||||||
|
Linux_Mint:
|
||||||
|
unknown_versioning: *ghc-901a1-64-deb10
|
||||||
|
Linux_Fedora:
|
||||||
|
'27': *ghc-901a1-64-fedora
|
||||||
|
unknown_versioning: *ghc-901a1-64-fedora
|
||||||
|
Linux_CentOS:
|
||||||
|
'7': &ghc-901a1-64-centos
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-centos7-linux.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: e9be471727d6753514667781335018be0fed91483bf80da3f24d21c2e49086e9
|
||||||
|
unknown_versioning: *ghc-901a1-64-centos
|
||||||
|
Linux_RedHat:
|
||||||
|
unknown_versioning: *ghc-901a1-64-centos
|
||||||
|
Linux_Alpine:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-alpine3.10-linux-integer-simple.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: 8a73cbcebe8aac004dda4411873b6cd57169af9af74cbeb636d695852da1f10c
|
||||||
|
Linux_AmazonLinux:
|
||||||
|
unknown_versioning: *ghc-901a1-64-centos
|
||||||
|
Linux_UnknownLinux:
|
||||||
|
unknown_versioning: *ghc-901a1-64-fedora
|
||||||
|
Darwin:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-apple-darwin.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: 5bb43fe34997222ae092f3c255d0545dd8ff17409d00f56a356aece9042ace2a
|
||||||
|
FreeBSD:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-x86_64-unknown-freebsd.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: 2cb2763fa59bff4c045b7012170132a7a49f09e4f0f894c5367f990b60c38830
|
||||||
|
A_32:
|
||||||
|
Linux_Debian:
|
||||||
|
'9': &ghc-901a1-32-deb9
|
||||||
|
dlUri: https://downloads.haskell.org/~ghc/9.0.1-alpha1/ghc-9.0.0.20200821-i386-deb9-linux.tar.xz
|
||||||
|
dlSubdir: ghc-9.0.0
|
||||||
|
dlHash: 8b025e0c66bb4e21c050755d4c77b7cea66d0269f00f5206c3cef51861aa360f
|
||||||
|
unknown_versioning: *ghc-901a1-32-deb9
|
||||||
|
Linux_Ubuntu:
|
||||||
|
unknown_versioning: *ghc-901a1-32-deb9
|
||||||
|
Linux_Mint:
|
||||||
|
unknown_versioning: *ghc-901a1-32-deb9
|
||||||
|
Linux_UnknownLinux:
|
||||||
|
unknown_versioning: *ghc-901a1-32-deb9
|
||||||
Cabal:
|
Cabal:
|
||||||
2.4.1.0:
|
2.4.1.0:
|
||||||
viTags: []
|
viTags: []
|
||||||
@@ -1295,8 +1371,31 @@ ghcupDownloads:
|
|||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-i386-unknown-linux.tar.xz
|
dlUri: https://downloads.haskell.org/~cabal/cabal-install-3.2.0.0/cabal-install-3.2.0.0-i386-unknown-linux.tar.xz
|
||||||
dlHash: 2b3ac28549916de5f3379241797eaf60e84b6c001f2abbe73d9fadbbaf768e93
|
dlHash: 2b3ac28549916de5f3379241797eaf60e84b6c001f2abbe73d9fadbbaf768e93
|
||||||
|
3.4.0.0-rc1:
|
||||||
|
viTags:
|
||||||
|
- Prerelease
|
||||||
|
viArch:
|
||||||
|
A_64:
|
||||||
|
Linux_Ubuntu:
|
||||||
|
unknown_versioning: &cabal-3400rc1-ubuntu
|
||||||
|
dlUri: http://oleg.fi/cabal-install-3.4.0.0-rc1/cabal-install-3.4.0.0-x86_64-ubuntu-16.04.tar.xz
|
||||||
|
dlHash: 4a693eeacf91993d639b0296a366af7aec6899992352595835f7671e5adef4c6
|
||||||
|
Linux_Alpine:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: http://oleg.fi/cabal-install-3.4.0.0-rc1/cabal-install-3.4.0.0-x86_64-alpine-3.11.6-static-noofd.tar.xz
|
||||||
|
dlHash: 143160e1768c9c21bad613f720a37aad34051f41fb3473f5f28c030f9ccb7aca
|
||||||
|
Linux_UnknownLinux:
|
||||||
|
unknown_versioning: *cabal-3400rc1-ubuntu
|
||||||
|
Darwin:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: http://oleg.fi/cabal-install-3.4.0.0-rc1/cabal-install-3.4.0.0-x86_64-darwin-sierra.tar.xz
|
||||||
|
dlHash: 98e362a57c3b5c1a76f75ede2c2a7c29439902a3e21c3e4f8dcd701e276b164f
|
||||||
|
FreeBSD:
|
||||||
|
unknown_versioning:
|
||||||
|
dlUri: http://oleg.fi/cabal-install-3.4.0.0-rc1/cabal-install-3.4.0.0-amd64-freebsd-12.1-release.tar.xz
|
||||||
|
dlHash: 0035cc5d35db15d254037a9448697e1daff0a6d21b12c8d43d72522c82cc7319
|
||||||
GHCup:
|
GHCup:
|
||||||
0.1.8:
|
0.1.10:
|
||||||
viTags:
|
viTags:
|
||||||
- Recommended
|
- Recommended
|
||||||
- Latest
|
- Latest
|
||||||
@@ -1306,22 +1405,22 @@ ghcupDownloads:
|
|||||||
A_64:
|
A_64:
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: &ghcup-64
|
unknown_versioning: &ghcup-64
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.8/x86_64-linux-ghcup-0.1.8
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.10/x86_64-linux-ghcup-0.1.10
|
||||||
dlHash: 7ffcd4c3de156e895b648c75a36c762be2a4932883f3cd598f7a483c97d4a8a9
|
dlHash: 87661bd127f857b990174ac8d96ad4bd629865306b2058c8cc64d3b36ed317c9
|
||||||
Darwin:
|
Darwin:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.8/x86_64-apple-darwin-ghcup-0.1.8
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.10/x86_64-apple-darwin-ghcup-0.1.10
|
||||||
dlHash: b6efc25013a20734e93ad7ae4ecf319f19eeee2129d515d568ccf0003f26615f
|
dlHash: e71666fde6a7700f307e1a55720859d3a042fe27c68ff32f3d1181f4436b7391
|
||||||
FreeBSD:
|
FreeBSD:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.8/x86_64-portbld-freebsd-ghcup-0.1.8
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.10/x86_64-portbld-freebsd-ghcup-0.1.10
|
||||||
dlHash: 442cdfe1b4525a327d9566e6270f909f7deba21c16dd4c7912537cf67e6cd521
|
dlHash: b5ef1b0454f1a9c5a62b378c1e9c48c2b794d64a22086adf482b064dfb34e68d
|
||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning: *ghcup-64
|
unknown_versioning: *ghcup-64
|
||||||
A_32:
|
A_32:
|
||||||
Linux_UnknownLinux:
|
Linux_UnknownLinux:
|
||||||
unknown_versioning: &ghcup-32
|
unknown_versioning: &ghcup-32
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/0.1.8/i386-linux-ghcup-0.1.8
|
dlUri: https://downloads.haskell.org/~ghcup/0.1.10/i386-linux-ghcup-0.1.10
|
||||||
dlHash: 18ab162920cea662feae4b08f39d3879e9e416fde7b734afd8072c39d3c43cde
|
dlHash: 50ac43199b64bc0724400b0a3db674bef3ec53cf6d41acc04a2c4ca8557e534f
|
||||||
Linux_Alpine:
|
Linux_Alpine:
|
||||||
unknown_versioning: *ghcup-32
|
unknown_versioning: *ghcup-32
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
cabal-version: 3.0
|
cabal-version: 3.0
|
||||||
name: ghcup
|
name: ghcup
|
||||||
version: 0.1.8
|
version: 0.1.10
|
||||||
synopsis: ghc toolchain installer as an exe/library
|
synopsis: ghc toolchain installer as an exe/library
|
||||||
description:
|
description:
|
||||||
A rewrite of the shell script ghcup, for providing
|
A rewrite of the shell script ghcup, for providing
|
||||||
@@ -112,7 +112,7 @@ common io-streams
|
|||||||
build-depends: io-streams >=1.5
|
build-depends: io-streams >=1.5
|
||||||
|
|
||||||
common libarchive
|
common libarchive
|
||||||
build-depends: libarchive >= 2.2.5.0
|
build-depends: libarchive >= 3.0.0.0
|
||||||
|
|
||||||
common lzma
|
common lzma
|
||||||
build-depends: lzma >=0.0.0.3
|
build-depends: lzma >=0.0.0.3
|
||||||
|
|||||||
107
lib/GHCup.hs
107
lib/GHCup.hs
@@ -273,12 +273,14 @@ installCabalBindist dlinfo ver (PlatformRequest {..}) = do
|
|||||||
installCabal' path inst = do
|
installCabal' path inst = do
|
||||||
lift $ $(logInfo) "Installing cabal"
|
lift $ $(logInfo) "Installing cabal"
|
||||||
let cabalFile = [rel|cabal|]
|
let cabalFile = [rel|cabal|]
|
||||||
liftIO $ createDirRecursive newDirPerms inst
|
liftIO $ createDirRecursive' inst
|
||||||
destFileName <- lift $ parseRel (toFilePath cabalFile <> "-" <> verToBS ver)
|
destFileName <- lift $ parseRel (toFilePath cabalFile <> "-" <> verToBS ver)
|
||||||
|
let destPath = inst </> destFileName
|
||||||
handleIO (throwE . CopyError . show) $ liftIO $ copyFile
|
handleIO (throwE . CopyError . show) $ liftIO $ copyFile
|
||||||
(path </> cabalFile)
|
(path </> cabalFile)
|
||||||
(inst </> destFileName)
|
(destPath)
|
||||||
Overwrite
|
Overwrite
|
||||||
|
lift $ chmod_777 destPath
|
||||||
|
|
||||||
|
|
||||||
-- | Installs cabal into @~\/.ghcup\/bin/cabal-\<ver\>@ and
|
-- | Installs cabal into @~\/.ghcup\/bin/cabal-\<ver\>@ and
|
||||||
@@ -346,9 +348,11 @@ setGHC ver sghc = do
|
|||||||
let verBS = verToBS (_tvVersion ver)
|
let verBS = verToBS (_tvVersion ver)
|
||||||
ghcdir <- lift $ ghcupGHCDir ver
|
ghcdir <- lift $ ghcupGHCDir ver
|
||||||
|
|
||||||
|
whenM (lift $ fmap not $ ghcInstalled ver) (throwE (NotInstalled GHC (ver ^. tvVersion % to prettyVer)))
|
||||||
|
|
||||||
-- symlink destination
|
-- symlink destination
|
||||||
Settings { dirs = Dirs {..} } <- lift ask
|
Settings { dirs = Dirs {..} } <- lift ask
|
||||||
liftIO $ hideError AlreadyExists $ createDirRecursive newDirPerms binDir
|
liftIO $ createDirRecursive' binDir
|
||||||
|
|
||||||
-- first delete the old symlinks (this fixes compatibility issues
|
-- first delete the old symlinks (this fixes compatibility issues
|
||||||
-- with old ghcup)
|
-- with old ghcup)
|
||||||
@@ -420,7 +424,7 @@ setCabal ver = do
|
|||||||
|
|
||||||
-- symlink destination
|
-- symlink destination
|
||||||
Settings {dirs = Dirs {..}} <- lift ask
|
Settings {dirs = Dirs {..}} <- lift ask
|
||||||
liftIO $ hideError AlreadyExists $ createDirRecursive newDirPerms binDir
|
liftIO $ createDirRecursive' binDir
|
||||||
|
|
||||||
whenM (liftIO $ fmap not $ doesFileExist (binDir </> targetFile))
|
whenM (liftIO $ fmap not $ doesFileExist (binDir </> targetFile))
|
||||||
$ throwE
|
$ throwE
|
||||||
@@ -504,6 +508,9 @@ listVersions av lt criteria pfreq = do
|
|||||||
GHC -> do
|
GHC -> do
|
||||||
slr <- strayGHCs avTools
|
slr <- strayGHCs avTools
|
||||||
pure $ (sort (slr ++ lr))
|
pure $ (sort (slr ++ lr))
|
||||||
|
Cabal -> do
|
||||||
|
slr <- strayCabals avTools
|
||||||
|
pure $ (sort (slr ++ lr))
|
||||||
_ -> pure lr
|
_ -> pure lr
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
ghcvers <- listVersions av (Just GHC) criteria pfreq
|
ghcvers <- listVersions av (Just GHC) criteria pfreq
|
||||||
@@ -552,6 +559,33 @@ listVersions av lt criteria pfreq = do
|
|||||||
[i|Could not parse version of stray directory #{toFilePath e}|]
|
[i|Could not parse version of stray directory #{toFilePath e}|]
|
||||||
pure Nothing
|
pure Nothing
|
||||||
|
|
||||||
|
strayCabals :: (MonadReader Settings m, MonadCatch m, MonadThrow m, MonadLogger m, MonadIO m)
|
||||||
|
=> Map.Map Version [Tag]
|
||||||
|
-> m [ListResult]
|
||||||
|
strayCabals avTools = do
|
||||||
|
cabals <- getInstalledCabals
|
||||||
|
fmap catMaybes $ forM cabals $ \case
|
||||||
|
Right ver ->
|
||||||
|
case Map.lookup ver avTools of
|
||||||
|
Just _ -> pure Nothing
|
||||||
|
Nothing -> do
|
||||||
|
lSet <- fmap (maybe False (== ver)) $ cabalSet
|
||||||
|
pure $ Just $ ListResult
|
||||||
|
{ lTool = Cabal
|
||||||
|
, lVer = ver
|
||||||
|
, lCross = Nothing
|
||||||
|
, lTag = []
|
||||||
|
, lInstalled = True
|
||||||
|
, lStray = maybe True (const False) (Map.lookup ver avTools)
|
||||||
|
, lNoBindist = False
|
||||||
|
, fromSrc = False -- actually, we don't know :>
|
||||||
|
, ..
|
||||||
|
}
|
||||||
|
Left e -> do
|
||||||
|
$(logWarn)
|
||||||
|
[i|Could not parse version of stray directory #{toFilePath e}|]
|
||||||
|
pure Nothing
|
||||||
|
|
||||||
-- NOTE: this are not cross ones, because no bindists
|
-- NOTE: this are not cross ones, because no bindists
|
||||||
toListResult :: (MonadReader Settings m, MonadIO m, MonadCatch m) => Tool -> (Version, [Tag]) -> m ListResult
|
toListResult :: (MonadReader Settings m, MonadIO m, MonadCatch m) => Tool -> (Version, [Tag]) -> m ListResult
|
||||||
toListResult t (v, tags) = case t of
|
toListResult t (v, tags) = case t of
|
||||||
@@ -617,43 +651,39 @@ rmGHCVer :: ( MonadReader Settings m
|
|||||||
-> Excepts '[NotInstalled] m ()
|
-> Excepts '[NotInstalled] m ()
|
||||||
rmGHCVer ver = do
|
rmGHCVer ver = do
|
||||||
isSetGHC <- lift $ fmap (maybe False (== ver)) $ ghcSet (_tvTarget ver)
|
isSetGHC <- lift $ fmap (maybe False (== ver)) $ ghcSet (_tvTarget ver)
|
||||||
dir <- lift $ ghcupGHCDir ver
|
|
||||||
let d' = toFilePath dir
|
|
||||||
exists <- liftIO $ doesDirectoryExist dir
|
|
||||||
|
|
||||||
|
whenM (lift $ fmap not $ ghcInstalled ver) (throwE (NotInstalled GHC (ver ^. tvVersion % to prettyVer)))
|
||||||
|
dir <- lift $ ghcupGHCDir ver
|
||||||
|
|
||||||
if exists
|
-- this isn't atomic, order matters
|
||||||
then do
|
when isSetGHC $ do
|
||||||
-- this isn't atomic, order matters
|
lift $ $(logInfo) [i|Removing ghc symlinks|]
|
||||||
when isSetGHC $ do
|
liftE $ rmPlain (_tvTarget ver)
|
||||||
lift $ $(logInfo) [i|Removing ghc symlinks|]
|
|
||||||
liftE $ rmPlain (_tvTarget ver)
|
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing directory recursively: #{d'}|]
|
lift $ $(logInfo) [i|Removing directory recursively: #{toFilePath dir}|]
|
||||||
liftIO $ deleteDirRecursive dir
|
liftIO $ deleteDirRecursive dir
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing ghc-x.y.z symlinks|]
|
lift $ $(logInfo) [i|Removing ghc-x.y.z symlinks|]
|
||||||
lift $ rmMinorSymlinks ver
|
lift $ rmMinorSymlinks ver
|
||||||
|
|
||||||
lift $ $(logInfo) [i|Removing/rewiring ghc-x.y symlinks|]
|
lift $ $(logInfo) [i|Removing/rewiring ghc-x.y symlinks|]
|
||||||
-- first remove
|
-- first remove
|
||||||
handle (\(_ :: ParseError) -> pure ()) $ lift $ rmMajorSymlinks ver
|
handle (\(_ :: ParseError) -> pure ()) $ lift $ rmMajorSymlinks ver
|
||||||
-- then fix them (e.g. with an earlier version)
|
-- then fix them (e.g. with an earlier version)
|
||||||
v' <-
|
v' <-
|
||||||
handle
|
handle
|
||||||
(\(e :: ParseError) -> lift $ $(logWarn) [i|#{e}|] >> pure Nothing)
|
(\(e :: ParseError) -> lift $ $(logWarn) [i|#{e}|] >> pure Nothing)
|
||||||
$ fmap Just
|
$ fmap Just
|
||||||
$ getMajorMinorV (_tvVersion ver)
|
$ getMajorMinorV (_tvVersion ver)
|
||||||
forM_ v' $ \(mj, mi) -> lift (getGHCForMajor mj mi (_tvTarget ver))
|
forM_ v' $ \(mj, mi) -> lift (getGHCForMajor mj mi (_tvTarget ver))
|
||||||
>>= mapM_ (\v -> liftE $ setGHC v SetGHC_XY)
|
>>= mapM_ (\v -> liftE $ setGHC v SetGHC_XY)
|
||||||
|
|
||||||
Settings { dirs = Dirs {..} } <- lift ask
|
Settings { dirs = Dirs {..} } <- lift ask
|
||||||
|
|
||||||
liftIO
|
liftIO
|
||||||
$ hideError doesNotExistErrorType
|
$ hideError doesNotExistErrorType
|
||||||
$ deleteFile
|
$ deleteFile
|
||||||
$ (baseDir </> [rel|share|])
|
$ (baseDir </> [rel|share|])
|
||||||
else throwE (NotInstalled GHC (ver ^. tvVersion % to prettyVer))
|
|
||||||
|
|
||||||
|
|
||||||
-- | Delete a cabal version. Will try to fix the @cabal@ symlink
|
-- | Delete a cabal version. Will try to fix the @cabal@ symlink
|
||||||
@@ -994,7 +1024,7 @@ compileCabal dls tver bghc jobs patchdir PlatformRequest{..} = do
|
|||||||
]
|
]
|
||||||
|
|
||||||
tmp <- lift withGHCupTmpDir
|
tmp <- lift withGHCupTmpDir
|
||||||
liftIO $ createDirRecursive newDirPerms (tmp </> [rel|bin|])
|
liftIO $ createDirRecursive' (tmp </> [rel|bin|])
|
||||||
newEnv <- lift $ addToCurrentEnv (("PREFIX", toFilePath tmp) : ghcEnv)
|
newEnv <- lift $ addToCurrentEnv (("PREFIX", toFilePath tmp) : ghcEnv)
|
||||||
lift $ $(logDebug) [i|Environment: #{newEnv}|]
|
lift $ $(logDebug) [i|Environment: #{newEnv}|]
|
||||||
|
|
||||||
@@ -1047,17 +1077,12 @@ upgradeGHCup dls mtarget force pfreq = do
|
|||||||
tmp <- lift withGHCupTmpDir
|
tmp <- lift withGHCupTmpDir
|
||||||
let fn = [rel|ghcup|]
|
let fn = [rel|ghcup|]
|
||||||
p <- liftE $ download dli tmp (Just fn)
|
p <- liftE $ download dli tmp (Just fn)
|
||||||
let fileMode' =
|
|
||||||
newFilePerms
|
|
||||||
`unionFileModes` ownerExecuteMode
|
|
||||||
`unionFileModes` groupExecuteMode
|
|
||||||
`unionFileModes` otherExecuteMode
|
|
||||||
let fullDest = fromMaybe (binDir </> fn) mtarget
|
let fullDest = fromMaybe (binDir </> fn) mtarget
|
||||||
liftIO $ hideError NoSuchThing $ deleteFile fullDest
|
liftIO $ hideError NoSuchThing $ deleteFile fullDest
|
||||||
handleIO (throwE . CopyError . show) $ liftIO $ copyFile p
|
handleIO (throwE . CopyError . show) $ liftIO $ copyFile p
|
||||||
fullDest
|
fullDest
|
||||||
Overwrite
|
Overwrite
|
||||||
liftIO $ setFileMode (toFilePath fullDest) fileMode'
|
lift $ chmod_777 fullDest
|
||||||
pure latestVer
|
pure latestVer
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ getDownloads urlSource = do
|
|||||||
else -- access in less than 5 minutes, re-use file
|
else -- access in less than 5 minutes, re-use file
|
||||||
liftIO $ readFile json_file
|
liftIO $ readFile json_file
|
||||||
else do
|
else do
|
||||||
liftIO $ createDirRecursive newDirPerms cacheDir
|
liftIO $ createDirRecursive' cacheDir
|
||||||
getModTime >>= \case
|
getModTime >>= \case
|
||||||
Just modTime -> dlWithMod modTime json_file
|
Just modTime -> dlWithMod modTime json_file
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
@@ -330,7 +330,7 @@ download dli dest mfn
|
|||||||
scheme = view (dlUri % uriSchemeL' % schemeBSL') dli
|
scheme = view (dlUri % uriSchemeL' % schemeBSL') dli
|
||||||
cp = do
|
cp = do
|
||||||
-- destination dir must exist
|
-- destination dir must exist
|
||||||
liftIO $ hideError AlreadyExists $ createDirRecursive newDirPerms dest
|
liftIO $ createDirRecursive' dest
|
||||||
destFile <- getDestFile
|
destFile <- getDestFile
|
||||||
fromFile <- parseAbs path
|
fromFile <- parseAbs path
|
||||||
liftIO $ copyFile fromFile destFile Strict
|
liftIO $ copyFile fromFile destFile Strict
|
||||||
@@ -340,7 +340,7 @@ download dli dest mfn
|
|||||||
lift $ $(logInfo) [i|downloading: #{uri'}|]
|
lift $ $(logInfo) [i|downloading: #{uri'}|]
|
||||||
|
|
||||||
-- destination dir must exist
|
-- destination dir must exist
|
||||||
liftIO $ hideError AlreadyExists $ createDirRecursive newDirPerms dest
|
liftIO $ createDirRecursive' dest
|
||||||
destFile <- getDestFile
|
destFile <- getDestFile
|
||||||
|
|
||||||
-- download
|
-- download
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import GHCup.Utils.Prelude
|
|||||||
import GHCup.Utils.String.QQ
|
import GHCup.Utils.String.QQ
|
||||||
|
|
||||||
#if !defined(TAR)
|
#if !defined(TAR)
|
||||||
import Codec.Archive
|
import Codec.Archive hiding ( Directory )
|
||||||
#endif
|
#endif
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
@@ -621,3 +621,25 @@ runBuildAction bdir instdir action = do
|
|||||||
when (keepDirs == Never || keepDirs == Errors) $ liftIO $ deleteDirRecursive
|
when (keepDirs == Never || keepDirs == Errors) $ liftIO $ deleteDirRecursive
|
||||||
bdir
|
bdir
|
||||||
pure v
|
pure v
|
||||||
|
|
||||||
|
|
||||||
|
-- | More permissive version of 'createDirRecursive'. This doesn't
|
||||||
|
-- error when the destination is a symlink to a directory.
|
||||||
|
createDirRecursive' :: Path b -> IO ()
|
||||||
|
createDirRecursive' p =
|
||||||
|
handleIO (\e -> if isAlreadyExistsError e then isSymlinkDir e else throwIO e)
|
||||||
|
. createDirRecursive newDirPerms
|
||||||
|
$ p
|
||||||
|
|
||||||
|
where
|
||||||
|
isSymlinkDir e = do
|
||||||
|
ft <- getFileType p
|
||||||
|
case ft of
|
||||||
|
SymbolicLink -> do
|
||||||
|
rp <- canonicalizePath p
|
||||||
|
rft <- getFileType rp
|
||||||
|
case rft of
|
||||||
|
Directory -> pure ()
|
||||||
|
_ -> throwIO e
|
||||||
|
_ -> throwIO e
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
|
||||||
{-|
|
{-|
|
||||||
Module : GHCup.Utils.File
|
Module : GHCup.Utils.File
|
||||||
@@ -25,6 +26,7 @@ import Control.Concurrent.Async
|
|||||||
import Control.Exception ( evaluate )
|
import Control.Exception ( evaluate )
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
|
import Control.Monad.Logger
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
import Control.Monad.Trans.State.Strict
|
import Control.Monad.Trans.State.Strict
|
||||||
import Data.ByteString ( ByteString )
|
import Data.ByteString ( ByteString )
|
||||||
@@ -33,6 +35,7 @@ import Data.Functor
|
|||||||
import Data.IORef
|
import Data.IORef
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Sequence ( Seq, (|>) )
|
import Data.Sequence ( Seq, (|>) )
|
||||||
|
import Data.String.Interpolate
|
||||||
import Data.Text ( Text )
|
import Data.Text ( Text )
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import Data.Word8
|
import Data.Word8
|
||||||
@@ -46,6 +49,7 @@ import System.IO.Error
|
|||||||
import System.Posix.Directory.ByteString
|
import System.Posix.Directory.ByteString
|
||||||
import System.Posix.FD as FD
|
import System.Posix.FD as FD
|
||||||
import System.Posix.FilePath hiding ( (</>) )
|
import System.Posix.FilePath hiding ( (</>) )
|
||||||
|
import System.Posix.Files.ByteString
|
||||||
import System.Posix.Foreign ( oExcl )
|
import System.Posix.Foreign ( oExcl )
|
||||||
import "unix" System.Posix.IO.ByteString
|
import "unix" System.Posix.IO.ByteString
|
||||||
hiding ( openFd )
|
hiding ( openFd )
|
||||||
@@ -375,7 +379,7 @@ toProcessError :: ByteString
|
|||||||
-> Maybe ProcessStatus
|
-> Maybe ProcessStatus
|
||||||
-> Either ProcessError ()
|
-> Either ProcessError ()
|
||||||
toProcessError exe args mps = case mps of
|
toProcessError exe args mps = case mps of
|
||||||
Just (SPPB.Exited (ExitFailure i)) -> Left $ NonZeroExit i exe args
|
Just (SPPB.Exited (ExitFailure xi)) -> Left $ NonZeroExit xi exe args
|
||||||
Just (SPPB.Exited ExitSuccess ) -> Right ()
|
Just (SPPB.Exited ExitSuccess ) -> Right ()
|
||||||
Just (Terminated _ _ ) -> Left $ PTerminated exe args
|
Just (Terminated _ _ ) -> Left $ PTerminated exe args
|
||||||
Just (Stopped _ ) -> Left $ PStopped exe args
|
Just (Stopped _ ) -> Left $ PStopped exe args
|
||||||
@@ -434,3 +438,15 @@ isBrokenSymlink p =
|
|||||||
$ do
|
$ do
|
||||||
_ <- canonicalizePath p
|
_ <- canonicalizePath p
|
||||||
pure False
|
pure False
|
||||||
|
|
||||||
|
|
||||||
|
chmod_777 :: (MonadLogger m, MonadIO m) => Path a -> m ()
|
||||||
|
chmod_777 (toFilePath -> fp) = do
|
||||||
|
let exe_mode =
|
||||||
|
newFilePerms
|
||||||
|
`unionFileModes` ownerExecuteMode
|
||||||
|
`unionFileModes` groupExecuteMode
|
||||||
|
`unionFileModes` otherExecuteMode
|
||||||
|
$(logDebug) [i|chmod 777 #{fp}|]
|
||||||
|
liftIO $ setFileMode fp exe_mode
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ Here we define our main logger.
|
|||||||
module GHCup.Utils.Logger where
|
module GHCup.Utils.Logger where
|
||||||
|
|
||||||
import GHCup.Types
|
import GHCup.Types
|
||||||
|
import GHCup.Utils
|
||||||
|
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
@@ -69,7 +70,7 @@ initGHCupFileLogging context = do
|
|||||||
Settings {dirs = Dirs {..}} <- ask
|
Settings {dirs = Dirs {..}} <- ask
|
||||||
let logfile = logsDir </> context
|
let logfile = logsDir </> context
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
createDirRecursive newDirPerms logsDir
|
createDirRecursive' logsDir
|
||||||
hideError doesNotExistErrorType $ deleteFile logfile
|
hideError doesNotExistErrorType $ deleteFile logfile
|
||||||
createRegularFile newFilePerms logfile
|
createRegularFile newFilePerms logfile
|
||||||
pure logfile
|
pure logfile
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ ghcupURL = [uri|https://www.haskell.org/ghcup/data/ghcup-0.0.2.yaml|]
|
|||||||
|
|
||||||
-- | The current ghcup version.
|
-- | The current ghcup version.
|
||||||
ghcUpVer :: PVP
|
ghcUpVer :: PVP
|
||||||
ghcUpVer = [pver|0.1.8|]
|
ghcUpVer = [pver|0.1.10|]
|
||||||
|
|
||||||
-- | ghcup version as numeric string.
|
-- | ghcup version as numeric string.
|
||||||
numericVer :: String
|
numericVer :: String
|
||||||
|
|||||||
Reference in New Issue
Block a user