diff --git a/internal/configure.zsh b/internal/configure.zsh index 39429f9..84d374b 100644 --- a/internal/configure.zsh +++ b/internal/configure.zsh @@ -27,14 +27,6 @@ function _p9k_can_configure() { $0_error "$__p9k_cfg_path_u is a special file" return 1 } - [[ -r $__p9k_root_dir/config/p10k-lean.zsh ]] || { - $0_error "cannot read $__p9k_root_dir_u/config/p10k-lean.zsh" - return 1 - } - [[ -r $__p9k_root_dir/config/p10k-classic.zsh ]] || { - $0_error "cannot read $__p9k_root_dir_u/config/p10k-classic.zsh" - return 1 - } [[ ! -e $__p9k_zshrc || -f $__p9k_zshrc || -h $__p9k_zshrc ]] || { $0_error "$__p9k_zshrc_u a special file" return 1 @@ -43,6 +35,13 @@ function _p9k_can_configure() { $0_error "$__p9k_zshrc_u is not readable" return 1 } + local style + for style in lean lean-8colors classic rainbow pure; do + [[ -r $__p9k_root_dir/config/p10k-$style.zsh ]] || { + $0_error "$__p9k_root_dir_u/config/p10k-$style.zsh is not readable" + return 1 + } + done (( LINES >= __p9k_wizard_lines && COLUMNS >= __p9k_wizard_columns )) || { $0_error "terminal size too small; must be at least $__p9k_wizard_columns x $__p9k_wizard_lines" diff --git a/internal/wizard.zsh b/internal/wizard.zsh index a479009..63e4991 100755 --- a/internal/wizard.zsh +++ b/internal/wizard.zsh @@ -1491,7 +1491,25 @@ function ask_zshrc_edit() { clear flowing -c "%BApply changes to %b%2F${__p9k_zshrc_u//\\/\\\\}%f%B?%b" print -P "" - print -P "%B(y) Yes (recommended).%b" + local modifiable=y + if [[ -e $__p9k_zshrc && ! -w $__p9k_zshrc ]]; then + local -a stat + zstat -A stat +uid -- $__p9k_zshrc || quit -c + if (( stat[1] == EUID )); then + flowing -c %3FNOTE:%f %2F${__p9k_zshrc_u//\\/\\\\}%f %3Fis readonly.%f + else + modifiable= + flowing -c \ + %3FWARNING:%f %2F${__p9k_zshrc_u//\\/\\\\}%f %3Fis readonly and \ + not owned by the user. Cannot modify it.%f + fi + print -P "" + fi + if [[ $modifiable == y ]]; then + print -P "%B(y) Yes (recommended).%b" + else + print -P "%1F(y) Yes (disabled).%f" + fi print -P "" print -P "%B(n) No. I know which changes to apply and will do it myself.%b" print -P "" @@ -1500,18 +1518,24 @@ function ask_zshrc_edit() { print -P "" local key= - read -k key${(%):-"?%BChoice [ynrq]: %b"} || quit -c + read -k key${(%):-"?%BChoice [${modifiable}nrq]: %b"} || quit -c case $key in q) quit;; r) return 1;; n) return 0;; y) - [[ ! -e $__p9k_zshrc || -w $__p9k_zshrc ]] || (echo "Zshrc is readonly ignoring..."; return 1) + [[ $modifiable == y ]] || continue write_zshrc=1 if [[ -n $zshrc_content ]]; then zshrc_backup="$(mktemp ${TMPDIR:-/tmp}/.zshrc.XXXXXXXXXX)" || quit -c cp -p $__p9k_zshrc $zshrc_backup || quit -c + local -i writable=1 + if [[ ! -w $zshrc_backup ]]; then + chmod u+w -- $zshrc_backup || quit -c + writable=0 + fi print -r -- $zshrc_content >$zshrc_backup || quit -c + (( writable )) || chmod u-w -- $zshrc_backup || quit -c zshrc_backup_u=${${TMPDIR:+\$TMPDIR}:-/tmp}/${(q-)zshrc_backup:t} fi break @@ -1755,6 +1779,12 @@ function change_zshrc() { [[ ! -e $__p9k_zshrc ]] || cp -p $__p9k_zshrc $tmp || return { + local -i writable=1 + if [[ ! -w $tmp ]]; then + chmod u+w -- $tmp || return + writable=0 + fi + print -n >$tmp || return if (( !zshrc_has_instant_prompt )); then @@ -1774,6 +1804,7 @@ fi" || return # To customize prompt, run \`p10k configure\` or edit ${(%)__p9k_cfg_path_u}. [[ ! -f ${(%)__p9k_cfg_path_u} ]] || source ${(%)__p9k_cfg_path_u}" || return fi + (( writable )) || chmod u-w -- $tmp || return zf_mv -f -- $tmp $__p9k_zshrc || return } always { zf_rm -f -- $tmp