7152a942802b01cb74d7c0b99f3106f8af17439d

Author
Marc Cornellà <hello@mcornella.com>
Committer
GitHub <noreply@github.com>
Date

Message

feat(init): show error and process tree if OMZ is loaded from non-zsh shells (#10234)

Diff

 1diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
 2index bf5902fc8c60930dbc331d8a821fa27e47614ea3..c389fc963bc9ce2d33e292f8042604a1508e5872 100644
 3--- a/oh-my-zsh.sh
 4+++ b/oh-my-zsh.sh
 5@@ -1,8 +1,40 @@
 6 # Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
 7 [ -n "$ZSH_VERSION" ] || {
 8-  # ANSI (\033[<code>m): 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red
 9-  printf "\033[1;31mERROR:\033[22m Oh My Zsh can't be loaded from: \033[1m${0#-}\033[22m. " >&2
10-  printf "You need to run \033[1;4mzsh\033[22;24m instead.\033[0m\n" >&2
11+  # ANSI formatting function (\033[<code>m)
12+  # 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
13+  f() {
14+    [ $# -gt 0 ] || return
15+    IFS=";" printf "\033[%sm" $*
16+  }
17+  # If stdout is not a terminal ignore all formatting
18+  [ -t 1 ] || f() { :; }
19+
20+  ptree() {
21+    # Get process tree of the current process
22+    pid=$$; pids="$pid"
23+    while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do
24+      pids="$pids $pid"; pid=$ppid
25+    done
26+
27+    # Show process tree
28+    case "$(uname)" in
29+    Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;;
30+    Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;;
31+    esac
32+
33+    # If ps command failed, try Busybox ps
34+    [ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0"
35+  }
36+
37+  {
38+    shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }")
39+    printf "$(f 1 31)Error:$(f 22) Oh My Zsh can't be loaded from: $(f 1)${shell}$(f 22). "
40+    printf "You need to run $(f 1)zsh$(f 22) instead.$(f 0)\n"
41+    printf "$(f 33)Here's the process tree:$(f 22)\n\n"
42+    ptree
43+    printf "$(f 0)\n"
44+  } >&2
45+
46   return 1
47 }
48