blob: cf434738ec8c9f36dfe33d8dc1b40bdad8228438 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#!/usr/bin/env fish
if not set --query HOME
echo "error: no HOME"
exit 1
end
set --query XDG_STATE_HOME || set --function XDG_STATE_HOME $HOME/.local/state
set --function nix_state_home $XDG_STATE_HOME/nix
set --function channel_root $nix_state_home/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
if test ! -e $user_nixpkgs && test -L $user_nixpkgs
echo "~/.config/nixpkgs is a broken symlink, deleting it"
rm $channel_root
end
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
if string match --quiet --entire "=" $np
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 set --local i (contains --index $channel $old_channels)
set --erase old_channels[$i]
end
update_link $new_src $channel_root/$channel
end
end
for old in $channel_root/$old_channels
rm $old
end
if set --function i (contains --index (status dirname) $PATH) && 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
|