#!/usr/bin/env fish
if not set --query HOME
echo "error: no HOME"
exit 1
end
set --function channel_root $HOME/.nix-defexpr/channels
set --function user_nixpkgs $HOME/.config/nixpkgs
set --function nixfiles (path resolve (status dirname)/..)
if set --query XDG_CONFIG_HOME
set --function hm_config_dir $XDG_CONFIG_HOME/home-manager
else
set --function hm_config_dir $HOME/.config/home-manager
end
for i in 1
if test ! -d $user_nixpkgs
echo "user nixpkgs folder $user_nixpkgs does not exist, creating it"
mkdir -p $user_nixpkgs
end
if test -L $hm_config_dir -a (path resolve $hm_config_dir) = (path resolve (status basename))
if test y = (read --nchars=1 --prompt-str="$hm_config_dir already exists as a symlink to the current directory. Remove it [yN]? ")
unlink $hm_config_dir
end
end
if test ! -d $hm_config_dir
echo "user home-manager configuration folder $hm_config_dir does not exist, creating it"
mkdir -p $hm_config_dir
end
if test ! -e $channel_root
if test -L $channel_root
# broken symlink
rm $channel_root
end
echo "channel root $channel_root does not exist, creating it"
mkdir -p $channel_root
else
if test ! -d $channel_root
echo "error: $channel_root is not a directory"
else if test -L $channel_root
echo "error: $channel_root is a symlink, please remove it"
else if path is --invert --perm write $channel_root
echo "error: $channel_root is not writable; might be a symlink"
else if path is --invert --type link $channel_root/*
for p in (path filter --invert --type link $channel_root/*)
# might be a broken symlink
if test -L $p -a ! -e $p
rm $p
else
echo "error: channel $p is not a broken symlink, don't know what to do with it"
end
end
# check again and fail if there are still unknown files
if path is --invert --type link $channel_root/*
echo "error: non-link(s) in $channel_root"
path filter --invert --type link $channel_root/*
else
continue
end
else
continue # with script
end
exit 1
end
end
set --function current_script_name (status basename)
switch $current_script_name
case darwin-rebuild
set --local darwin_config_source $nixfiles/system/$hostname.nix
set --local darwin_config_target $user_nixpkgs/darwin-configuration.nix
if test ! -e $darwin_config_target
ln -s $darwin_config_source $darwin_config_target
end
set --append argv -I darwin-config=$darwin_config_source
case nixos-rebuild
set --local nixos_config_source $nixfiles/system/$hostname.nix
set --local nixos_config_target $user_nixpkgs/configuration.nix
if test ! -e $nixos_config_target
ln -s $nixos_config_source $nixos_config_target
end
if ! fish_is_root_user
set --append argv --use-remote-sudo
end
set --append argv -I nixos-config=$nixos_config_source
case home-manager
set --local hm_config_source $nixfiles/user/$hostname.nix
set --local hm_config_target $hm_config_dir/home.nix
if test ! -e $hm_config_target
ln -s $hm_config_source $hm_config_target
end
set --export HOME_MANAGER_CONFIG $hm_config_source
end
set --function old_channels (path basename $channel_root/*)
function update_link --argument-names new_src target
set --function current_src (path resolve $target)
if test -e $current_src
if test $current_src = $new_src
# no need to re-link it
return
else
unlink $target
end
end
ln -s $new_src $target
end
for np in $NIX_PATH
echo $np | read --function --delimiter "=" channel new_src_rel
set --local new_src (path resolve $new_src_rel)
if test $channel = darwin-config
continue
end
if test $channel = nixpkgs-overlays
update_link $new_src $user_nixpkgs/overlays
continue
end
if set --local i (contains --index $channel $old_channels)
set --erase old_channels[$i]
end
update_link $new_src $channel_root/$channel
end
for old in $channel_root/$old_channels
rm $old
end
set --function i (contains --index (status dirname) $PATH)
if test -n $i
set --erase PATH[$i]
end
set --function cmd $current_script_name $argv
if contains -- -n $argv
set --prepend cmd echo
end
if set --query IN_NIX_SHELL
eval $cmd
else
nix-shell --run "$cmd"
end
bin/home-manager (view raw)