diff --git a/scripts/install-nix-from-closure.sh b/scripts/install-nix-from-closure.sh index 0c2fe24c3..806f6eb65 100644 --- a/scripts/install-nix-from-closure.sh +++ b/scripts/install-nix-from-closure.sh @@ -261,7 +261,7 @@ if [ -z "$NIX_INSTALLER_NO_MODIFY_PROFILE" ]; then if [ -d "$HOME/.config/nushell" ]; then fn="$HOME/.config/nushell/env.nu" - printf '\nif ("%s" | path exists) { source "%s"; } # added by Nix installer\n' "$p_nu" "$p_nu" >> "$fn" + printf '\nif ("%s" | path exists) { use %s } # added by Nix installer\n' "$p_nu" "$p_nu" >> "$fn" added=1 p=${p_nu} fi diff --git a/scripts/nix-profile-daemon.nu.in b/scripts/nix-profile-daemon.nu.in index 1a347c14f..16c00e97b 100644 --- a/scripts/nix-profile-daemon.nu.in +++ b/scripts/nix-profile-daemon.nu.in @@ -1,51 +1,60 @@ -# Only execute this file once per shell. -if ('__ETC_PROFILE_NIX_SOURCED' in $env) { - return; -} -$env.__ETC_PROFILE_NIX_SOURCED = 1; +export-env { + # Only execute this file once per shell. + if ('__ETC_PROFILE_NIX_SOURCED' in $env) { + return; + } + $env.__ETC_PROFILE_NIX_SOURCED = 1; -mut NIX_LINK = [$env.HOME '.nix-profile'] | path join; -mut NIX_LINK_NEW = [$env.HOME '.local/state/nix/profile']; -if 'XDG_STATE_HOME' in $env { - $NIX_LINK_NEW = [$env.XDG_STATE_HOME 'nix/profile']; -} -$NIX_LINK_NEW = ($NIX_LINK_NEW | path join); -if ($NIX_LINK_NEW | path exists) { - $NIX_LINK = $NIX_LINK_NEW; -} + mut NIX_LINK = [$env.HOME '.nix-profile'] | path join; + mut NIX_LINK_NEW = [$env.HOME '.local/state/nix/profile']; + if 'XDG_STATE_HOME' in $env { + $NIX_LINK_NEW = [$env.XDG_STATE_HOME 'nix/profile']; + } + $NIX_LINK_NEW = ($NIX_LINK_NEW | path join); + if ($NIX_LINK_NEW | path exists) { + $NIX_LINK = $NIX_LINK_NEW; + } -$env.NIX_PROFILES = (['@localstatedir@/nix/profiles/default' $NIX_LINK] | str join ' '); + let NIX_PROFILES = (['@localstatedir@/nix/profiles/default' $NIX_LINK] | str join ' '); -# Populate bash completions, .desktop files, etc -if 'XDG_DATA_DIRS' not-in $env { - # According to XDG spec the default is /usr/local/share:/usr/share, don't set something that prevents that default - $env.XDG_DATA_DIRS = (['/usr/local/share' '/usr/share'] | str join (char esep)); + # Populate bash completions, .desktop files, etc + mut XDG_DATA_DIRS = ''; + if 'XDG_DATA_DIRS' not-in $env { + # According to XDG spec the default is /usr/local/share:/usr/share, don't set something that prevents that default + $XDG_DATA_DIRS = (['/usr/local/share' '/usr/share'] | str join (char esep)); + } + $XDG_DATA_DIRS = ( + $XDG_DATA_DIRS + | split row (char esep) + | append ([$NIX_LINK 'share'] | path join) + | append '/nix/var/nix/profiles/default/share' + | str join (char esep) + ); + + # Set $NIX_SSL_CERT_FILE so that Nixpkgs applications like curl work. + mut NIX_SSL_CERT_FILE = ''; + if ('NIX_SSL_CERT_FILE' in $env) { + # Allow users to override the NIX_SSL_CERT_FILE + } else if ('/etc/ssl/certs/ca-certificates.crt' | path exists) { # NixOS, Ubuntu, Debian, Gentoo, Arch + $NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'; + } else if ('/etc/ssl/ca-bundle.pem' | path exists) { # openSUSE Tumbleweed + $NIX_SSL_CERT_FILE = '/etc/ssl/ca-bundle.pem'; + } else if ('/etc/ssl/certs/ca-bundle.crt' | path exists) { # Old NixOS + $NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-bundle.crt'; + } else if ('/etc/pki/tls/certs/ca-bundle.crt' | path exists) { # Fedora, CentOS + $NIX_SSL_CERT_FILE = '/etc/pki/tls/certs/ca-bundle.crt'; + } else { + # Fall back to what is in the nix profiles, favouring whatever is defined last. + let last = $NIX_PROFILES + | split row (char space) + | where ([$it 'etc/ssl/certs/ca-bundle.crt'] | path join | path exists) + | last; + + $NIX_SSL_CERT_FILE = ([$last 'etc/ssl/certs/ca-bundle.crt'] | path join); + } + + $env.NIX_PROFILES = $NIX_PROFILES + $env.XDG_DATA_DIRS = $XDG_DATA_DIRS + $env.NIX_SSL_CERT_FILE = $NIX_SSL_CERT_FILE + $env.PATH = ($env.PATH | prepend '@localstatedir@/nix/profiles/default/bin' | prepend ([$NIX_LINK 'bin'] | path join)); } -$env.XDG_DATA_DIRS = ( - $env.XDG_DATA_DIRS - | split row (char esep) - | append ([$NIX_LINK 'share'] | path join) - | append '/nix/var/nix/profiles/default/share' - | str join (char esep) -); - -# Set $NIX_SSL_CERT_FILE so that Nixpkgs applications like curl work. -if ('NIX_SSL_CERT_FILE' in $env) { - # Allow users to override the NIX_SSL_CERT_FILE -} else if ('/etc/ssl/certs/ca-certificates.crt' | path exists) { # NixOS, Ubuntu, Debian, Gentoo, Arch - $env.NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'; -} else if ('/etc/ssl/ca-bundle.pem' | path exists) { # openSUSE Tumbleweed - $env.NIX_SSL_CERT_FILE = '/etc/ssl/ca-bundle.pem'; -} else if ('/etc/ssl/certs/ca-bundle.crt' | path exists) { # Old NixOS - $env.NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-bundle.crt'; -} else if ('/etc/pki/tls/certs/ca-bundle.crt' | path exists) { # Fedora, CentOS - $env.NIX_SSL_CERT_FILE = '/etc/pki/tls/certs/ca-bundle.crt'; -} else { - # Fall back to what is in the nix profiles, favouring whatever is defined last. - $env.NIX_PROFILES - | split row (char space) - | where ([$it 'etc/ssl/certs/ca-bundle.crt'] | path join | path exists) - | each { |it| $env.NIX_SSL_CERT_FILE = ([$it 'etc/ssl/certs/ca-bundle.crt'] | path join) } -} - -$env.PATH = ($env.PATH | prepend '@localstatedir@/nix/profiles/default/bin' | prepend ([$NIX_LINK 'bin'] | path join)); diff --git a/scripts/nix-profile.nu.in b/scripts/nix-profile.nu.in index b7723f855..d091668e8 100644 --- a/scripts/nix-profile.nu.in +++ b/scripts/nix-profile.nu.in @@ -1,54 +1,63 @@ -if ([$env.HOME $env.USER] | all {nu-check}) { +export-env { + if ([$env.HOME $env.USER] | all {nu-check}) { - # Set up the per-user profile. - mut NIX_LINK = [$env.HOME '.nix-profile'] | path join; - mut NIX_LINK_NEW = [$env.HOME '.local/state/nix/profile']; - if 'XDG_STATE_HOME' in $env { - $NIX_LINK_NEW = [$env.XDG_STATE_HOME 'nix/profile']; + # Set up the per-user profile. + mut NIX_LINK = [$env.HOME '.nix-profile'] | path join; + mut NIX_LINK_NEW = [$env.HOME '.local/state/nix/profile']; + if 'XDG_STATE_HOME' in $env { + $NIX_LINK_NEW = [$env.XDG_STATE_HOME 'nix/profile']; + } + $NIX_LINK_NEW = ($NIX_LINK_NEW | path join); + if ($NIX_LINK_NEW | path exists) { + $NIX_LINK = $NIX_LINK_NEW; + } + + # Set up environment. + # This part should be kept in sync with nixpkgs:nixos/modules/programs/environment.nix + let NIX_PROFILES = (['@localstatedir@/nix/profiles/default' $NIX_LINK] | str join ' '); + + # Populate bash completions, .desktop files, etc + mut XDG_DATA_DIRS = ''; + if 'XDG_DATA_DIRS' not-in $env { + # According to XDG spec the default is /usr/local/share:/usr/share, don't set something that prevents that default + $XDG_DATA_DIRS = (['/usr/local/share' '/usr/share'] | str join (char esep)); + } + $XDG_DATA_DIRS = ( + $XDG_DATA_DIRS + | split row (char esep) + | append ([$NIX_LINK 'share'] | path join) + | append '/nix/var/nix/profiles/default/share' + | str join (char esep) + ); + + # Set $NIX_SSL_CERT_FILE so that Nixpkgs applications like curl work. + mut NIX_SSL_CERT_FILE = ''; + if ('/etc/ssl/certs/ca-certificates.crt' | path exists) { # NixOS, Ubuntu, Debian, Gentoo, Arch + $NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'; + } else if ('/etc/ssl/ca-bundle.pem' | path exists) { # openSUSE Tumbleweed + $NIX_SSL_CERT_FILE = '/etc/ssl/ca-bundle.pem'; + } else if ('/etc/ssl/certs/ca-bundle.crt' | path exists) { # Old NixOS + $NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-bundle.crt'; + } else if ('/etc/pki/tls/certs/ca-bundle.crt' | path exists) { # Fedora, CentOS + $NIX_SSL_CERT_FILE = '/etc/pki/tls/certs/ca-bundle.crt'; + } else if ([$NIX_LINK 'etc/ssl/certs/ca-bundle.crt'] | path join | path exists) { # fall back to cacert in Nix profile + $NIX_SSL_CERT_FILE = ([$NIX_LINK 'etc/ssl/certs/ca-bundle.crt'] | path join); + } else if ([$NIX_LINK 'etc/ca-bundle.crt'] | path join | path exists) { # old cacert in Nix profile + $NIX_SSL_CERT_FILE = ([$NIX_LINK '/etc/ca-bundle.crt'] | path join); + } + + # Only use MANPATH if it is already set. In general `man` will just simply + # pick up `.nix-profile/share/man` because is it close to `.nix-profile/bin` + # which is in the $PATH. For more info, run `manpath -d`. + if ('MANPATH' in $env) { + export-env { + $env.MANPATH = ([$NIX_LINK 'share/man'] | path join | append $"(char esep)($env.MANPATH)") + } + } + + $env.NIX_PROFILES = $NIX_PROFILES + $env.XDG_DATA_DIRS = $XDG_DATA_DIRS + $env.NIX_SSL_CERT_FILE = $NIX_SSL_CERT_FILE + $env.PATH = ($env.PATH | prepend ([$NIX_LINK 'bin'] | path join)) } - $NIX_LINK_NEW = ($NIX_LINK_NEW | path join); - if ($NIX_LINK_NEW | path exists) { - $NIX_LINK = $NIX_LINK_NEW; - } - - # Set up environment. - # This part should be kept in sync with nixpkgs:nixos/modules/programs/environment.nix - $env.NIX_PROFILES = (['@localstatedir@/nix/profiles/default' $NIX_LINK] | str join ' '); - - # Populate bash completions, .desktop files, etc - if 'XDG_DATA_DIRS' not-in $env { - # According to XDG spec the default is /usr/local/share:/usr/share, don't set something that prevents that default - $env.XDG_DATA_DIRS = (['/usr/local/share' '/usr/share'] | str join (char esep)); - } - $env.XDG_DATA_DIRS = ( - $env.XDG_DATA_DIRS - | split row (char esep) - | append ([$NIX_LINK 'share'] | path join) - | append '/nix/var/nix/profiles/default/share' - | str join (char esep) - ); - - # Set $NIX_SSL_CERT_FILE so that Nixpkgs applications like curl work. - if ('/etc/ssl/certs/ca-certificates.crt' | path exists) { # NixOS, Ubuntu, Debian, Gentoo, Arch - $env.NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-certificates.crt'; - } else if ('/etc/ssl/ca-bundle.pem' | path exists) { # openSUSE Tumbleweed - $env.NIX_SSL_CERT_FILE = '/etc/ssl/ca-bundle.pem'; - } else if ('/etc/ssl/certs/ca-bundle.crt' | path exists) { # Old NixOS - $env.NIX_SSL_CERT_FILE = '/etc/ssl/certs/ca-bundle.crt'; - } else if ('/etc/pki/tls/certs/ca-bundle.crt' | path exists) { # Fedora, CentOS - $env.NIX_SSL_CERT_FILE = '/etc/pki/tls/certs/ca-bundle.crt'; - } else if ([$NIX_LINK 'etc/ssl/certs/ca-bundle.crt'] | path join | path exists) { # fall back to cacert in Nix profile - $env.NIX_SSL_CERT_FILE = ([$NIX_LINK 'etc/ssl/certs/ca-bundle.crt'] | path join); - } else if ([$NIX_LINK 'etc/ca-bundle.crt'] | path join | path exists) { # old cacert in Nix profile - $env.NIX_SSL_CERT_FILE = ([$NIX_LINK '/etc/ca-bundle.crt'] | path join); - } - - # Only use MANPATH if it is already set. In general `man` will just simply - # pick up `.nix-profile/share/man` because is it close to `.nix-profile/bin` - # which is in the $PATH. For more info, run `manpath -d`. - if ('MANPATH' in $env) { - $env.MANPATH = ([$NIX_LINK 'share/man'] | path join | append $"(char esep)($env.MANPATH)"); - } - - $env.PATH = ($env.PATH | prepend ([$NIX_LINK 'bin'] | path join)); }