mirror of
https://github.com/nix-community/nix-direnv.git
synced 2025-11-08 19:46:11 +01:00
simplify required version checks using sort --version-sort
This commit is contained in:
parent
adeced7980
commit
04b2367f01
2 changed files with 31 additions and 43 deletions
69
direnvrc
69
direnvrc
|
|
@ -1,6 +1,11 @@
|
||||||
# shellcheck shell=bash
|
# shellcheck shell=bash
|
||||||
|
|
||||||
REQUIRED_DIRENV_VERSION="2.21.3"
|
NIX_DIRENV_VERSION=2.5.1
|
||||||
|
|
||||||
|
# min required versions
|
||||||
|
BASH_MIN_VERSION=4
|
||||||
|
DIRENV_MIN_VERSION=2.21.3
|
||||||
|
NIX_MIN_VERSION=2.4
|
||||||
|
|
||||||
_NIX_DIRENV_LOG_PREFIX="nix-direnv: "
|
_NIX_DIRENV_LOG_PREFIX="nix-direnv: "
|
||||||
|
|
||||||
|
|
@ -31,28 +36,38 @@ _nix() {
|
||||||
nix --extra-experimental-features "nix-command flakes" "$@"
|
nix --extra-experimental-features "nix-command flakes" "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_require_version() {
|
||||||
|
local cmd=$1 version=$2 required=$3
|
||||||
|
if ! printf "%s\n" "$required" "$version" | sort --check=quiet --version-sort; then
|
||||||
|
_nix_direnv_fatal "$cmd version $version is less than the minimum required $required"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_require_cmd_version() {
|
||||||
|
local cmd=$1 required=$2 version
|
||||||
|
if ! has "$cmd"; then
|
||||||
|
_nix_direnv_fatal "command not found: $cmd"
|
||||||
|
fi
|
||||||
|
version=$($cmd --version)
|
||||||
|
[[ $version =~ ([0-9]+\.[0-9]+\.[0-9]+) ]]
|
||||||
|
_require_version "$cmd" "${BASH_REMATCH[1]}" "$required"
|
||||||
|
}
|
||||||
|
|
||||||
_nix_direnv_preflight () {
|
_nix_direnv_preflight () {
|
||||||
if [[ -z "$direnv" ]]; then
|
if [[ -z "$direnv" ]]; then
|
||||||
_nix_direnv_fatal "\$direnv environment variable was not defined. Was this script run inside direnv?"
|
_nix_direnv_fatal "\$direnv environment variable was not defined. Was this script run inside direnv?"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! has direnv_version || ! direnv_version "$REQUIRED_DIRENV_VERSION" 2>/dev/null; then
|
|
||||||
_nix_direnv_fatal "base direnv version is older than the required v$REQUIRED_DIRENV_VERSION."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n ${NIX_BIN_PREFIX:-} ]]; then
|
if [[ -n ${NIX_BIN_PREFIX:-} ]]; then
|
||||||
PATH_add "$NIX_BIN_PREFIX"
|
PATH_add "$NIX_BIN_PREFIX"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! has nix; then
|
# check command min versions, bash check uses $BASH_VERSION with _require_version
|
||||||
_nix_direnv_fatal "command not found: nix"
|
# instead of _require_cmd_version because _require_cmd_version uses =~ operator which
|
||||||
fi
|
# would be a syntax error on bash < 3
|
||||||
|
_require_version bash "$BASH_VERSION" "$BASH_MIN_VERSION"
|
||||||
nixversion=$(nix --version)
|
_require_cmd_version direnv "$DIRENV_MIN_VERSION"
|
||||||
[[ "$nixversion" =~ ([0-9]+)[^0-9]*([0-9]+)[^0-9]*([0-9]+)? ]]
|
_require_cmd_version nix "$NIX_MIN_VERSION"
|
||||||
if [[ ${BASH_REMATCH[1]} -lt 2 || ${BASH_REMATCH[1]} -eq 2 && ${BASH_REMATCH[2]} -lt 4 ]]; then
|
|
||||||
_nix_direnv_fatal "nix version ${BASH_REMATCH[0]} is older than the required 2.4."
|
|
||||||
fi
|
|
||||||
|
|
||||||
local layout_dir
|
local layout_dir
|
||||||
layout_dir=$(direnv_layout_dir)
|
layout_dir=$(direnv_layout_dir)
|
||||||
|
|
@ -99,31 +114,7 @@ EOF
|
||||||
#
|
#
|
||||||
# Checks that the nix-direnv version is at least as old as <version_at_least>.
|
# Checks that the nix-direnv version is at least as old as <version_at_least>.
|
||||||
nix_direnv_version() {
|
nix_direnv_version() {
|
||||||
declare major='2' minor='5' patch='1' # UPDATE(nix-direnv version)
|
_require_version nix-direnv $NIX_DIRENV_VERSION "$1"
|
||||||
|
|
||||||
[[ $1 =~ ^([^+-.]*)(\.?)([^+-.]*)(\.?)([^+-]*)(-?)([^+]*)(\+?)(.*)$ ]]
|
|
||||||
declare -a ver; ver=("${BASH_REMATCH[@]:1}")
|
|
||||||
|
|
||||||
req_major=${ver[0]}
|
|
||||||
req_minor=${ver[2]:=0}
|
|
||||||
req_patch=${ver[4]:=0}
|
|
||||||
|
|
||||||
if [[ ( ${ver[0]} != +([0-9]) ) \
|
|
||||||
|| ( ${ver[1]} == '.' && ${ver[2]} != +([0-9]) ) \
|
|
||||||
|| ( ${ver[3]} == '.' && ${ver[4]} != +([0-9]) ) \
|
|
||||||
|| ( ${ver[5]} == '-' && ${ver[6]} != +([0-9A-Za-z-])*(.+([0-9A-Za-z-])) ) \
|
|
||||||
|| ( ${ver[7]} == '+' && ${ver[8]} != +([0-9A-Za-z-])*(.+([0-9A-Za-z-])) ) \
|
|
||||||
|| ( ( -n ${ver[5]} || -n ${ver[7]} ) && ( -z ${ver[2]} || -z ${ver[4]} ) ) \
|
|
||||||
]]; then
|
|
||||||
_nix_direnv_fatal "error v$1 is not a valid semver version"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ($req_major -gt $major) \
|
|
||||||
|| ($req_major -eq $major && $req_minor -gt $minor) \
|
|
||||||
|| ($req_major -eq $major && $req_minor -eq $minor && $req_patch -gt $patch)
|
|
||||||
]]; then
|
|
||||||
_nix_direnv_fatal "error current version v$major.$minor.$patch is older than the desired version v$1"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_nix_export_or_unset() {
|
_nix_export_or_unset() {
|
||||||
|
|
|
||||||
|
|
@ -10,16 +10,13 @@ if [[ -z "$version" ]]; then
|
||||||
echo "USAGE: $0 version" 2>/dev/null
|
echo "USAGE: $0 version" 2>/dev/null
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
[[ $version =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(-?)([^+]*)(\+?)(.*)$ ]]
|
|
||||||
declare -a ver; ver=("${BASH_REMATCH[@]:1}")
|
|
||||||
|
|
||||||
if [[ "$(git symbolic-ref --short HEAD)" != "master" ]]; then
|
if [[ "$(git symbolic-ref --short HEAD)" != "master" ]]; then
|
||||||
echo "must be on master branch" 2>/dev/null
|
echo "must be on master branch" 2>/dev/null
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sed -i direnvrc \
|
sed -Ei "s!(NIX_DIRENV_VERSION=).*!\1$version!" direnvrc
|
||||||
-e 's!\(declare major=\).*\( # UPDATE(nix-direnv version)\)!\1'"${ver[0]@Q} minor=${ver[1]@Q} patch=${ver[2]@Q}"'\2!'
|
|
||||||
|
|
||||||
sed -i README.md templates/flake/.envrc \
|
sed -i README.md templates/flake/.envrc \
|
||||||
-e 's!\(nix-direnv/\).*\(/direnvrc\)!\1'"${version}"'\2!' \
|
-e 's!\(nix-direnv/\).*\(/direnvrc\)!\1'"${version}"'\2!' \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue