Add rollback functionality in nix-on-droid

This commit is contained in:
Tobias Happ 2019-11-27 22:22:05 +01:00 committed by Alexander Sosedkin
parent 8ad0e40c2b
commit 41fca9b4e9
2 changed files with 72 additions and 20 deletions

View file

@ -8,6 +8,8 @@ with lib;
let let
cfg = config.build; cfg = config.build;
profileDirectory = "/nix/var/nix/profiles/nix-on-droid";
# Programs that always should be available on the activation # Programs that always should be available on the activation
# script's PATH. # script's PATH.
activationBinPaths = lib.makeBinPath [ activationBinPaths = lib.makeBinPath [
@ -108,13 +110,6 @@ in
internal = true; internal = true;
description = "Package containing /etc files."; description = "Package containing /etc files.";
}; };
profileDirectory = mkOption {
type = types.path;
readOnly = true;
internal = true;
description = "Path to nix-on-droid profile.";
};
}; };
}; };
@ -126,8 +121,13 @@ in
build = { build = {
activationAfter.linkProfile = '' activationAfter.linkProfile = ''
generationDir="$(dirname "$(realpath $0)")" generationDir="$(dirname $0)"
$DRY_RUN_CMD nix-env --profile "${cfg.profileDirectory}" --set "$generationDir"
if [[ $generationDir =~ ^${profileDirectory}-([0-9]+)-link$ ]]; then
$DRY_RUN_CMD nix-env --profile "${profileDirectory}" --switch-generation "''${BASH_REMATCH[1]}"
else
$DRY_RUN_CMD nix-env --profile "${profileDirectory}" --set "$generationDir"
fi
''; '';
activationPackage = activationPackage =
@ -151,8 +151,6 @@ in
ln --symbolic ${config.environment.binSh} $out/filesystem/bin/sh ln --symbolic ${config.environment.binSh} $out/filesystem/bin/sh
ln --symbolic ${config.environment.usrBinEnv} $out/filesystem/usr/bin/env ln --symbolic ${config.environment.usrBinEnv} $out/filesystem/usr/bin/env
''; '';
profileDirectory = "/nix/var/nix/profiles/nix-on-droid";
}; };
}; };

View file

@ -5,18 +5,24 @@ PATH=@coreutils@/bin:@nix@/bin:${PATH:+:}$PATH
set -eu set -eu
set -o pipefail set -o pipefail
PROFILE_DIRECTORY="/nix/var/nix/profiles/nix-on-droid"
function errorEcho() { function errorEcho() {
>&2 echo $@ >&2 echo $@
} }
function doGenerations() {
nix-env --profile $PROFILE_DIRECTORY --list-generations
}
function doHelp() { function doHelp() {
echo "Usage: $0 [OPTION] COMMAND" echo "Usage: $0 [OPTION] COMMAND"
echo echo
echo "Options" echo "Options"
echo echo
echo " -v|--verbose Verbose output"
echo " -n|--dry-run Do a dry run, only prints what actions would be taken"
echo " -h|--help Print this help" echo " -h|--help Print this help"
echo " -n|--dry-run Do a dry run, only prints what actions would be taken"
echo " -v|--verbose Verbose output"
echo echo
echo "Options passed on to nix build" echo "Options passed on to nix build"
echo echo
@ -29,8 +35,16 @@ function doHelp() {
echo echo
echo "Commands" echo "Commands"
echo echo
echo " generations Show all generations"
echo
echo " help Print this help" echo " help Print this help"
echo
echo " rollback Rollback and activate configuration"
echo
echo " switch Build and activate configuration" echo " switch Build and activate configuration"
echo
echo " switch-generation NUM"
echo " Switch generation and activate configuration"
} }
function doSwitch() { function doSwitch() {
@ -55,15 +69,29 @@ function doSwitch() {
"${generationDir}/activate" "${generationDir}/activate"
} }
function doSwitchGeneration() {
local generationNum=$1
if [[ -x "${PROFILE_DIRECTORY}-${generationNum}-link/activate" ]]; then
echo "Run activation script..."
"${PROFILE_DIRECTORY}-${generationNum}-link/activate"
else
errorEcho "Activation was not successful, generation is either broken or already garbage collected."
errorEcho "See nix-on-droid generations for available generations."
exit 1
fi
}
COMMAND= COMMAND=
COMMAND_ARGS=()
PASSTHROUGH_OPTS=() PASSTHROUGH_OPTS=()
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
opt="$1" opt="$1"
shift shift
case $opt in case $opt in
help|switch) generations|help|rollback|switch|switch-generation)
COMMAND="$opt" COMMAND="$opt"
;; ;;
-h|--help) -h|--help)
@ -87,10 +115,17 @@ while [[ $# -gt 0 ]]; do
-v|--verbose) -v|--verbose)
export VERBOSE=1 export VERBOSE=1
;; ;;
*) *)
errorEcho "$0: unknown option '$opt'" case $COMMAND in
errorEcho "Run '$0 --help' for usage help" switch-generation)
exit 1 COMMAND_ARGS+=("$opt")
;;
*)
errorEcho "$0: unknown option '$opt'"
errorEcho "Run '$0 --help' for usage help"
exit 1
;;
esac
;; ;;
esac esac
done done
@ -101,12 +136,31 @@ if [[ -z $COMMAND ]]; then
fi fi
case $COMMAND in case $COMMAND in
switch) generations)
doSwitch doGenerations
;; ;;
help) help)
doHelp doHelp
;; ;;
rollback)
if [[ $(readlink $PROFILE_DIRECTORY) =~ ^nix-on-droid-([0-9]+)-link$ ]]; then
doSwitchGeneration $((${BASH_REMATCH[1]} - 1))
else
errorEcho "nix-on-droid profile link is broken, please run nix-on-droid switch to fix it."
exit 1
fi
;;
switch)
doSwitch
;;
switch-generation)
if [[ ${#COMMAND_ARGS[@]} -eq 1 ]]; then
doSwitchGeneration ${COMMAND_ARGS[0]}
else
errorEcho "switch-generation expects one argument, got ${#COMMAND_ARGS[@]}."
exit 1
fi
;;
*) *)
errorEcho "Unknown command: $COMMAND" errorEcho "Unknown command: $COMMAND"
doHelp >&2 doHelp >&2