2017-01-07 19:16:26 +01:00
|
|
|
#!@bash@/bin/bash
|
|
|
|
|
2017-05-16 16:09:18 +02:00
|
|
|
# This code explicitly requires GNU Core Utilities and we therefore
|
|
|
|
# need to ensure they are prioritized over any other similarly named
|
|
|
|
# tools on the system.
|
|
|
|
PATH=@coreutils@/bin:$PATH
|
|
|
|
|
2017-05-14 14:02:15 +02:00
|
|
|
set -euo pipefail
|
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
# Attempts to set the HOME_MANAGER_CONFIG global variable.
|
|
|
|
#
|
|
|
|
# If no configuration file can be found then this function will print
|
|
|
|
# an error message and exit with an error code.
|
|
|
|
function setConfigFile() {
|
|
|
|
if [[ -v HOME_MANAGER_CONFIG ]] ; then
|
|
|
|
if [[ ! -e "$HOME_MANAGER_CONFIG" ]] ; then
|
|
|
|
echo "No configure file found at $HOME_MANAGER_CONFIG"
|
|
|
|
exit 1
|
|
|
|
fi
|
2017-01-07 19:16:26 +01:00
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
HOME_MANAGER_CONFIG="$(realpath "$HOME_MANAGER_CONFIG")"
|
|
|
|
return
|
2017-01-11 22:55:31 +01:00
|
|
|
fi
|
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
local confFile
|
|
|
|
for confFile in "$HOME/.config/nixpkgs/home.nix" \
|
|
|
|
"$HOME/.nixpkgs/home.nix" ; do
|
|
|
|
if [[ -e "$confFile" ]] ; then
|
|
|
|
HOME_MANAGER_CONFIG="$confFile"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
2017-01-14 13:02:58 +01:00
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
echo "No configuration file found. " \
|
|
|
|
"Please create one at ~/.config/nixpkgs/home.nix"
|
|
|
|
exit 1
|
|
|
|
}
|
2017-01-15 21:07:39 +01:00
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
function setHomeManagerModulesPath() {
|
|
|
|
local modulesPath
|
|
|
|
for modulesPath in "@MODULES_PATH@" \
|
2017-07-11 19:50:29 +02:00
|
|
|
"$HOME/.config/nixpkgs/home-manager/modules" \
|
2017-05-20 23:39:54 +02:00
|
|
|
"$HOME/.nixpkgs/home-manager/modules" ; do
|
|
|
|
if [[ -e "$modulesPath" ]] ; then
|
|
|
|
export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$modulesPath"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
function doBuild() {
|
|
|
|
if [[ -z "$1" ]]; then
|
|
|
|
echo "Need to provide generation output path."
|
2017-01-15 21:07:39 +01:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
if [[ -e "$1" ]]; then
|
|
|
|
echo "The output path $1 already exists."
|
2017-01-16 00:14:52 +01:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
setConfigFile
|
|
|
|
setHomeManagerModulesPath
|
|
|
|
|
|
|
|
output="$(realpath "$1")"
|
2017-01-08 10:24:16 +01:00
|
|
|
|
2017-01-15 21:07:39 +01:00
|
|
|
if [[ $? -ne 0 ]]; then
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2017-02-14 18:25:30 +01:00
|
|
|
local extraArgs
|
2017-05-14 14:02:15 +02:00
|
|
|
extraArgs=""
|
2017-02-14 18:25:30 +01:00
|
|
|
|
|
|
|
for p in "${EXTRA_NIX_PATH[@]}"; do
|
|
|
|
extraArgs="$extraArgs -I $p"
|
|
|
|
done
|
|
|
|
|
2017-03-25 21:48:17 +01:00
|
|
|
if [[ -v VERBOSE ]]; then
|
2017-02-21 21:49:12 +01:00
|
|
|
extraArgs="$extraArgs --show-trace"
|
|
|
|
fi
|
|
|
|
|
|
|
|
nix-build $extraArgs \
|
2017-01-11 22:55:31 +01:00
|
|
|
"@HOME_MANAGER_EXPR_PATH@" \
|
2017-05-20 23:39:54 +02:00
|
|
|
--argstr confPath "$HOME_MANAGER_CONFIG" \
|
2017-08-17 10:16:27 +02:00
|
|
|
--argstr confAttr "$HOME_MANAGER_CONFIG_ATTRIBUTE" \
|
2017-01-11 22:55:31 +01:00
|
|
|
-A activation-script \
|
|
|
|
-o "$output"
|
|
|
|
}
|
|
|
|
|
2017-01-11 22:58:55 +01:00
|
|
|
function doSwitch() {
|
2017-01-07 19:16:26 +01:00
|
|
|
local wrkdir
|
|
|
|
wrkdir="$(mktemp -d)"
|
|
|
|
|
2017-05-20 23:39:54 +02:00
|
|
|
if doBuild "$wrkdir/generation" ; then
|
2017-01-11 00:36:05 +01:00
|
|
|
"$wrkdir/generation/activate"
|
|
|
|
fi
|
2017-01-07 19:16:26 +01:00
|
|
|
|
2017-01-08 22:06:53 +01:00
|
|
|
rm -r "$wrkdir"
|
2017-01-07 19:16:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function doListGens() {
|
2017-01-08 22:06:53 +01:00
|
|
|
pushd "/nix/var/nix/profiles/per-user/$USER" > /dev/null
|
|
|
|
ls --color=yes -gG --sort time home-manager-*-link \
|
2017-01-07 19:16:26 +01:00
|
|
|
| cut -d' ' -f 4-
|
2017-01-08 22:06:53 +01:00
|
|
|
popd > /dev/null
|
2017-01-07 19:16:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function doListPackages() {
|
|
|
|
local outPath
|
|
|
|
outPath="$(nix-env -q --out-path | grep -o '/.*home-manager-path$')"
|
2017-01-07 19:36:39 +01:00
|
|
|
if [[ -n "$outPath" ]] ; then
|
|
|
|
nix-store -q --references "$outPath" | sed 's/[^-]*-//'
|
|
|
|
else
|
|
|
|
echo "No home-manager packages seem to be installed."
|
|
|
|
fi
|
2017-01-07 19:16:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function doHelp() {
|
2017-01-15 23:32:57 +01:00
|
|
|
echo "Usage: $0 [OPTION] COMMAND"
|
|
|
|
echo
|
|
|
|
echo "Options"
|
|
|
|
echo
|
2017-05-20 23:39:54 +02:00
|
|
|
echo " -f FILE The home configuration file."
|
|
|
|
echo " Default is '~/.config/nixpkgs/home.nix'."
|
2017-08-17 10:16:27 +02:00
|
|
|
echo " -A ATTRIBUTE Optional attribute that selects a configuration"
|
|
|
|
echo " expression in the configuration file."
|
2017-02-14 18:25:30 +01:00
|
|
|
echo " -I PATH Add a path to the Nix expression search path."
|
2017-01-21 12:27:50 +01:00
|
|
|
echo " -v Verbose output"
|
2017-01-15 23:32:57 +01:00
|
|
|
echo " -n Do a dry run, only prints what actions would be taken"
|
|
|
|
echo " -h Print this help"
|
2017-01-07 19:16:26 +01:00
|
|
|
echo
|
|
|
|
echo "Commands"
|
2017-01-12 22:26:24 +01:00
|
|
|
echo " help Print this help"
|
2017-01-15 23:32:57 +01:00
|
|
|
echo " build Build configuration into result directory"
|
|
|
|
echo " switch Build and activate configuration"
|
2017-01-12 22:26:24 +01:00
|
|
|
echo " generations List all home environment generations"
|
|
|
|
echo " packages List all packages installed in home-manager-path"
|
2017-01-07 19:16:26 +01:00
|
|
|
}
|
|
|
|
|
2017-02-14 18:25:30 +01:00
|
|
|
EXTRA_NIX_PATH=()
|
2017-08-17 10:16:27 +02:00
|
|
|
HOME_MANAGER_CONFIG_ATTRIBUTE=""
|
2017-01-15 23:32:57 +01:00
|
|
|
|
2017-08-17 10:16:27 +02:00
|
|
|
while getopts f:I:A:vnh opt; do
|
2017-01-15 23:32:57 +01:00
|
|
|
case $opt in
|
|
|
|
f)
|
2017-05-20 23:39:54 +02:00
|
|
|
HOME_MANAGER_CONFIG="$OPTARG"
|
2017-01-15 23:32:57 +01:00
|
|
|
;;
|
2017-02-14 18:25:30 +01:00
|
|
|
I)
|
|
|
|
EXTRA_NIX_PATH+=("$OPTARG")
|
|
|
|
;;
|
2017-08-17 10:16:27 +02:00
|
|
|
A)
|
|
|
|
HOME_MANAGER_CONFIG_ATTRIBUTE="$OPTARG"
|
|
|
|
;;
|
2017-01-21 12:27:50 +01:00
|
|
|
v)
|
|
|
|
export VERBOSE=1
|
|
|
|
;;
|
2017-01-15 23:32:57 +01:00
|
|
|
n)
|
|
|
|
export DRY_RUN=1
|
|
|
|
;;
|
|
|
|
h)
|
|
|
|
doHelp
|
|
|
|
exit 0
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "Unknown option -$OPTARG" >&2
|
|
|
|
doHelp >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Get rid of the options.
|
|
|
|
shift "$((OPTIND-1))"
|
|
|
|
|
|
|
|
cmd="$*"
|
|
|
|
|
|
|
|
case "$cmd" in
|
2017-01-11 22:55:31 +01:00
|
|
|
build)
|
2017-05-20 23:39:54 +02:00
|
|
|
doBuild "result"
|
2017-01-11 22:55:31 +01:00
|
|
|
;;
|
2017-01-11 22:58:55 +01:00
|
|
|
switch)
|
2017-05-20 23:39:54 +02:00
|
|
|
doSwitch
|
2017-01-07 19:16:26 +01:00
|
|
|
;;
|
|
|
|
generations)
|
|
|
|
doListGens
|
|
|
|
;;
|
|
|
|
packages)
|
|
|
|
doListPackages
|
|
|
|
;;
|
|
|
|
help|--help)
|
|
|
|
doHelp
|
|
|
|
;;
|
|
|
|
*)
|
2017-01-15 23:32:57 +01:00
|
|
|
echo "Unknown command: $cmd"
|
|
|
|
doHelp >&2
|
2017-01-07 19:16:26 +01:00
|
|
|
exit 1
|
2017-01-08 22:08:17 +01:00
|
|
|
;;
|
2017-01-07 19:16:26 +01:00
|
|
|
esac
|