|
|
@@ -89,7 +89,7 @@ fs::path system_binaries_dir() noexcept { |
|
|
|
} |
|
|
|
|
|
|
|
#if _WIN32 |
|
|
|
void fixup_path_env(const wil::unique_hkey& env_hkey, fs::path want_path) { |
|
|
|
void fixup_path_env(const options& opts, const wil::unique_hkey& env_hkey, fs::path want_path) { |
|
|
|
DWORD len = 0; |
|
|
|
// Get the length |
|
|
|
auto err = ::RegGetValueW(env_hkey.get(), |
|
|
@@ -135,6 +135,10 @@ void fixup_path_env(const wil::unique_hkey& env_hkey, fs::path want_path) { |
|
|
|
dds_log(info, "PATH is up-to-date"); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (opts.dry_run) { |
|
|
|
dds_log(info, "The PATH environment variable would be modified."); |
|
|
|
return; |
|
|
|
} |
|
|
|
// It's not there. Add it now. |
|
|
|
auto want_str = want_entry.string(); |
|
|
|
path_elems.insert(path_elems.begin(), want_str); |
|
|
@@ -161,7 +165,7 @@ void fixup_path_env(const wil::unique_hkey& env_hkey, fs::path want_path) { |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
void fixup_system_path(const options&) { |
|
|
|
void fixup_system_path(const options& opts [[maybe_unused]]) { |
|
|
|
#if !_WIN32 |
|
|
|
// We install into /usr/local/bin, and every nix-like system we support already has that on the |
|
|
|
// global PATH |
|
|
@@ -177,7 +181,7 @@ void fixup_system_path(const options&) { |
|
|
|
"Failed to open user-local environment variables registry " |
|
|
|
"entry"); |
|
|
|
} |
|
|
|
fixup_path_env(env_hkey, "C:/bin"); |
|
|
|
fixup_path_env(opts, env_hkey, "C:/bin"); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@@ -188,44 +192,42 @@ void fixup_user_path(const options& opts) { |
|
|
|
if (dds::contains(profile_content, "$HOME/.local/bin")) { |
|
|
|
// We'll assume that this is properly loading .local/bin for .profile |
|
|
|
dds_log(info, "[.br.cyan[{}]] is okay"_styled, profile_file.string()); |
|
|
|
} else if (opts.dry_run) { |
|
|
|
dds_log(info, |
|
|
|
"Would update [.br.cyan[{}]] to have ~/.local/bin on $PATH"_styled, |
|
|
|
profile_file.string()); |
|
|
|
} else { |
|
|
|
// Let's add it |
|
|
|
profile_content |
|
|
|
+= ("\n# This entry was added by 'dds install-yourself' for the user-local " |
|
|
|
"binaries path\nPATH=$HOME/bin:$HOME/.local/bin:$PATH\n"); |
|
|
|
if (opts.dry_run) { |
|
|
|
dds_log(info, |
|
|
|
"Would update [.br.cyan[{}]] to have ~/.local/bin on $PATH"_styled, |
|
|
|
profile_file.string()); |
|
|
|
} else { |
|
|
|
dds_log(info, |
|
|
|
"Updating [.br.cyan[{}]] with a user-local binaries PATH entry"_styled, |
|
|
|
profile_file.string()); |
|
|
|
auto tmp_file = profile_file; |
|
|
|
tmp_file += ".tmp"; |
|
|
|
auto bak_file = profile_file; |
|
|
|
bak_file += ".bak"; |
|
|
|
// Move .profile back into place if we abore for any reason |
|
|
|
neo_defer { |
|
|
|
if (!fs::exists(profile_file)) { |
|
|
|
safe_rename(bak_file, profile_file); |
|
|
|
} |
|
|
|
}; |
|
|
|
// Write the temporary version |
|
|
|
dds::write_file(tmp_file, profile_content).value(); |
|
|
|
// Make a backup |
|
|
|
safe_rename(profile_file, bak_file); |
|
|
|
// Move the tmp over the final location |
|
|
|
safe_rename(tmp_file, profile_file); |
|
|
|
// Okay! |
|
|
|
dds_log(info, |
|
|
|
"[.br.green[{}]] was updated. Prior contents are safe in [.br.cyan[{}]]"_styled, |
|
|
|
profile_file.string(), |
|
|
|
bak_file.string()); |
|
|
|
dds_log( |
|
|
|
info, |
|
|
|
".bold.cyan[NOTE:] Running applications may need to be restarted to see this change"_styled); |
|
|
|
} |
|
|
|
dds_log(info, |
|
|
|
"Updating [.br.cyan[{}]] with a user-local binaries PATH entry"_styled, |
|
|
|
profile_file.string()); |
|
|
|
auto tmp_file = profile_file; |
|
|
|
tmp_file += ".tmp"; |
|
|
|
auto bak_file = profile_file; |
|
|
|
bak_file += ".bak"; |
|
|
|
// Move .profile back into place if we abore for any reason |
|
|
|
neo_defer { |
|
|
|
if (!fs::exists(profile_file)) { |
|
|
|
safe_rename(bak_file, profile_file); |
|
|
|
} |
|
|
|
}; |
|
|
|
// Write the temporary version |
|
|
|
dds::write_file(tmp_file, profile_content).value(); |
|
|
|
// Make a backup |
|
|
|
safe_rename(profile_file, bak_file); |
|
|
|
// Move the tmp over the final location |
|
|
|
safe_rename(tmp_file, profile_file); |
|
|
|
// Okay! |
|
|
|
dds_log(info, |
|
|
|
"[.br.green[{}]] was updated. Prior contents are safe in [.br.cyan[{}]]"_styled, |
|
|
|
profile_file.string(), |
|
|
|
bak_file.string()); |
|
|
|
dds_log( |
|
|
|
info, |
|
|
|
".bold.cyan[NOTE:] Running applications may need to be restarted to see this change"_styled); |
|
|
|
} |
|
|
|
|
|
|
|
auto fish_config = dds::user_config_dir() / "fish/config.fish"; |
|
|
@@ -236,6 +238,10 @@ void fixup_user_path(const options& opts) { |
|
|
|
dds_log(info, |
|
|
|
"Fish configuration in [.br.cyan[{}]] is okay"_styled, |
|
|
|
fish_config.string()); |
|
|
|
} else if (opts.dry_run) { |
|
|
|
dds_log(info, |
|
|
|
"Would update [.br.cyan[{}]] to have ~/.local/bin on $PATH"_styled, |
|
|
|
fish_config.string()); |
|
|
|
} else { |
|
|
|
dds_log( |
|
|
|
info, |
|
|
@@ -278,7 +284,7 @@ void fixup_user_path(const options& opts) { |
|
|
|
"Failed to open user-local environment variables registry " |
|
|
|
"entry"); |
|
|
|
} |
|
|
|
fixup_path_env(env_hkey, "%LocalAppData%/bin"); |
|
|
|
fixup_path_env(opts, env_hkey, "%LocalAppData%/bin"); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@@ -302,7 +308,7 @@ int _install_yourself(const options& opts) { |
|
|
|
dest_path += ".exe"; |
|
|
|
} |
|
|
|
|
|
|
|
if (fs::weakly_canonical(dest_path) == fs::canonical(self_exe)) { |
|
|
|
if (fs::absolute(dest_path).lexically_normal() == fs::canonical(self_exe)) { |
|
|
|
dds_log(error, |
|
|
|
"We cannot install over our own executable (.br.red[{}])"_styled, |
|
|
|
self_exe.string()); |