mirror of
https://github.com/oh-my-fish/oh-my-fish.git
synced 2024-11-25 09:41:40 +08:00
Implement safe shell reloading inside omf plugin
This commit adds an improved reload code for Oh My Fish, besides saving the history now the reloading technique keeps directory history and stack and clears fish_greeting, for a transparent transition. The reloading code is now safe regarding to background jobs. exec wipes fish job control, so the user-facing code under the (just- introduced by this commit) `omf reload` command is kept safe by a warning. For testing purposes, `omf update` and `omf remove` rolls automatic refresh only when `OMF_AUTO_RELOAD` variable is set. Recap of the commit: - Add improved reload code (omf.reload) - Add a safe reload code (omf.cli.reload) - Add `omf reload` command - Add opt-in reload to `omf update` and `omf remove` commands
This commit is contained in:
parent
d794969f23
commit
a716badfd4
|
@ -64,6 +64,12 @@ Remove a theme or package.
|
|||
|
||||
> Packages subscribed to `uninstall_<pkg>` events are notified before the package is removed, so custom cleanup of resources can be done. See [Uninstall](/docs/en-US/Packages.md#uninstall) for more information.
|
||||
|
||||
#### `omf reload`
|
||||
|
||||
Reload Oh My Fish and all plugins by using `exec` to replace current shell process with a brand new.
|
||||
|
||||
> This command try to be as safe as possible, mitigating side-effects caused by `exec` and preventing the reload in case of background processes.
|
||||
|
||||
#### `omf new pkg | theme` _`<name>`_
|
||||
|
||||
Scaffold out a new package or theme.
|
||||
|
|
18
pkg/omf/functions/cli/omf.cli.reload.fish
Normal file
18
pkg/omf/functions/cli/omf.cli.reload.fish
Normal file
|
@ -0,0 +1,18 @@
|
|||
function omf.cli.reload
|
||||
if not contains -- --force $argv
|
||||
if count (jobs) >/dev/null ^&1
|
||||
__omf.cli.reload.job_warning
|
||||
return 1
|
||||
end
|
||||
end
|
||||
omf.reload
|
||||
end
|
||||
|
||||
function __omf.cli.reload.job_warning
|
||||
echo (set_color -u)"Reload aborted. There are background jobs:"(set_color normal)
|
||||
echo
|
||||
jobs
|
||||
echo
|
||||
echo "For your safety, finish all background jobs before reloading Oh My Fish."
|
||||
echo "If you are absolutely sure of what you are doing, you can bypass this check using --force."
|
||||
end
|
|
@ -7,6 +7,9 @@ function omf.cli.remove -a name
|
|||
switch $code
|
||||
case 0
|
||||
echo (omf::em)"$name successfully removed."(omf::off)
|
||||
# Opt-in flag for testing
|
||||
set -q OMF_AUTO_RELOAD
|
||||
and omf.cli.reload
|
||||
case 1
|
||||
echo (omf::err)"$name could not be removed."(omf::off) 1^&2
|
||||
case 2
|
||||
|
|
|
@ -23,4 +23,8 @@ function omf.cli.update
|
|||
for package in $packages
|
||||
omf.packages.update $package
|
||||
end
|
||||
|
||||
# Opt-in flag for testing
|
||||
set -q OMF_AUTO_RELOAD
|
||||
and omf.cli.reload
|
||||
end
|
||||
|
|
11
pkg/omf/functions/core/omf.reload.fish
Normal file
11
pkg/omf/functions/core/omf.reload.fish
Normal file
|
@ -0,0 +1,11 @@
|
|||
function omf.reload -d "Reload fish process via exec, keeping some context"
|
||||
set -q CI; and return 0
|
||||
|
||||
history --save
|
||||
set -gx dirprev $dirprev
|
||||
set -gx dirnext $dirnext
|
||||
set -gx dirstack $dirstack
|
||||
set -gx fish_greeting ''
|
||||
|
||||
exec fish
|
||||
end
|
|
@ -40,6 +40,9 @@ function omf -d "Oh My Fish"
|
|||
case "doctor"
|
||||
omf.cli.doctor
|
||||
|
||||
case "reload"
|
||||
omf.cli.reload $arguments
|
||||
|
||||
case "i" "install" "get"
|
||||
omf.cli.install $arguments
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user