comma/,
DavHau 54149dc417
flake compatibility + index management (#11)
* compatibility to flake based systems

  - add flake.nix
  - provide interface for updating the index

* pin nix to version 2.3

* Update ,

Co-authored-by: Artturi <Artturin@artturin.com>

* remove db outdated error

Co-authored-by: Artturi <Artturin@artturin.com>
2022-02-17 14:06:02 +07:00

84 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# usage example:
# $ , yarn --help
# This finds a derivation providing a bin/yarn, and runs it with `nix run`.
# If there are multiple candidates, the user chooses one using `fzy`.
set -euo pipefail
picker=fzy
if [ -n "${COMMA_PICKER+1}" ]; then
picker="${COMMA_PICKER}"
fi
# Test that the picker exists
if ! [ -x "$(command -v "${picker}")" ]; then
>&2 echo "picker ${picker} is not found in PATH"
exit 1
fi
if [[ $# -lt 1 ]]; then
>&2 echo "usage: , <program> [arguments]"
exit 1
fi
if [[ "$1" == "--install" ]] || [[ "$1" == "-i" ]]; then
install=1
shift
elif [[ "$1" == "--update" ]] || [[ "$1" == "-u" ]]; then
${UPDATE_SCRIPT}
exit
else
install=""
fi
# if a nix-index exists locally; use that as it's likely much more recent
# than the prebuilt one.
database=$PREBUILT_NIX_INDEX_DB
if [ -f "${HOME}/.cache/nix-index/files" ]; then
database="${HOME}/.cache/nix-index"
fi
argv0=$1; shift
case "${argv0}" in
@OVERLAY_PACKAGES@)
attr="${argv0}"
;;
*)
attr="$(nix-locate --db "${database}" --top-level --minimal --at-root --whole-name "/bin/${argv0}")"
if [[ "$(echo "${attr}" | wc -l)" -ne 1 ]]; then
attr="$(echo "${attr}" | "${picker}")"
fi
;;
esac
if [[ -z $attr ]]; then
>&2 echo "no match"
exit 1
fi
# on flake based installations nixpkgs is specified via
# flake input and therefore NIX_PATH might be unset
if echo $NIX_PATH | grep -q "nixpkgs="; then
nixArgs=""
else
nixArgs="-I nixpkgs=${NIXPKGS}"
fi
if [[ -n $install ]]; then
nix-env $nixArgs -iA "nixpkgs.${attr%%.*}"
else
nix_version_greater_or_equal() {
local nix_version
nix_version=$(nix --version | cut -f3 -d ' ')
printf '%s\n%s' "$1" "$nix_version" | sort -C -V
}
if nix_version_greater_or_equal "2.4"; then
nix --extra-experimental-features 'nix-command flakes' shell "${NIXPKGS}#${attr}" -c "${argv0}" "$@"
else
nix run "nixpkgs.${attr}" -c "${argv0}" "$@"
fi
fi