From a716badfd4777ecb1589cc636126a874ee8e8082 Mon Sep 17 00:00:00 2001 From: Derek Stavis Date: Tue, 23 Feb 2016 22:59:10 -0300 Subject: [PATCH] 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 --- README.md | 6 ++++++ pkg/omf/functions/cli/omf.cli.reload.fish | 18 ++++++++++++++++++ pkg/omf/functions/cli/omf.cli.remove.fish | 3 +++ pkg/omf/functions/cli/omf.cli.update.fish | 4 ++++ pkg/omf/functions/core/omf.reload.fish | 11 +++++++++++ pkg/omf/functions/omf.fish | 3 +++ 6 files changed, 45 insertions(+) create mode 100644 pkg/omf/functions/cli/omf.cli.reload.fish create mode 100644 pkg/omf/functions/core/omf.reload.fish diff --git a/README.md b/README.md index 89516af..51b295e 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,12 @@ Remove a theme or package. > Packages subscribed to `uninstall_` 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` _``_ Scaffold out a new package or theme. diff --git a/pkg/omf/functions/cli/omf.cli.reload.fish b/pkg/omf/functions/cli/omf.cli.reload.fish new file mode 100644 index 0000000..4746220 --- /dev/null +++ b/pkg/omf/functions/cli/omf.cli.reload.fish @@ -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 diff --git a/pkg/omf/functions/cli/omf.cli.remove.fish b/pkg/omf/functions/cli/omf.cli.remove.fish index 56c12d7..2348d15 100644 --- a/pkg/omf/functions/cli/omf.cli.remove.fish +++ b/pkg/omf/functions/cli/omf.cli.remove.fish @@ -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 diff --git a/pkg/omf/functions/cli/omf.cli.update.fish b/pkg/omf/functions/cli/omf.cli.update.fish index 0d11643..b280be9 100644 --- a/pkg/omf/functions/cli/omf.cli.update.fish +++ b/pkg/omf/functions/cli/omf.cli.update.fish @@ -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 diff --git a/pkg/omf/functions/core/omf.reload.fish b/pkg/omf/functions/core/omf.reload.fish new file mode 100644 index 0000000..41e3920 --- /dev/null +++ b/pkg/omf/functions/core/omf.reload.fish @@ -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 diff --git a/pkg/omf/functions/omf.fish b/pkg/omf/functions/omf.fish index 7b8c4c3..5ee4a52 100644 --- a/pkg/omf/functions/omf.fish +++ b/pkg/omf/functions/omf.fish @@ -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