mirror of
https://github.com/nix-community/comma.git
synced 2024-09-11 12:05:28 +03:00
73 lines
1.6 KiB
Bash
Executable File
73 lines
1.6 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
|
|
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
|
|
|
|
if [[ -n $install ]]; then
|
|
nix-env -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
|