From ddecb91a0f3963eb11d00231da31c8736930bc28 Mon Sep 17 00:00:00 2001
From: romkatv <roman.perepelitsa@gmail.com>
Date: Mon, 13 Jan 2020 15:13:44 +0100
Subject: rust_version: support rustup; see #418

---
 internal/p10k.zsh | 38 ++++++++++++++++++++++++++++++++------
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index aa9fbdc7..8f56afe9 100644
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -2329,12 +2329,10 @@ prompt_rust_version() {
       dir=${dir:h}
     done
   fi
-  local rustc=$commands[rustc] so
+  local rustc=${commands[rustc]:A} toolchain deps=()
   if (( $+commands[ldd] )); then
-    if _p9k_cache_stat_get $0_so $rustc; then
-      so=$_p9k_cache_val[1]
-    else
-      local line match
+    if ! _p9k_cache_stat_get $0_so $rustc; then
+      local line match so
       for line in "${(@f)$(ldd $rustc 2>/dev/null)}"; do
         [[ $line == (#b)[[:space:]]#librustc_driver[^[:space:]]#.so' => '(*)' (0x'[[:xdigit:]]#')' ]] || continue
         so=$match[1]
@@ -2342,8 +2340,36 @@ prompt_rust_version() {
       done
       _p9k_cache_stat_set "$so"
     fi
+    deps+=$_p9k_cache_val[1]
+  fi
+  if (( $+commands[rustup] )); then
+    local rustup=${commands[rustup]:A}
+    local rustup_home=${RUSTUP_HOME:-~/.rustup}
+    local cfg=($rustup_home/settings.toml(.N))
+    deps+=($cfg $rustup_home/update-hashes/*(.N))
+    if [[ -z ${toolchain::=$RUSTUP_TOOLCHAIN} ]]; then
+      if ! _p9k_cache_stat_get $0_overrides $rustup $cfg; then
+        local lines=(${(f)"$(rustup override list 2>/dev/null)"})
+        local keys=(/ ${lines%%[[:space:]]#[^[:space:]]#})
+        local vals=(_ ${lines##*[[:space:]]})
+        _p9k_cache_stat_set ${keys:^vals}
+      fi
+      local -A overrides=($_p9k_cache_val)
+      local dir=$_p9k_pwd_a
+      while true; do
+        if (( $+overrides[$dir] )); then
+          toolchain=$overrides[$dir]
+          break
+        fi
+        if [[ -r $dir/rust-toolchain ]]; then
+          { toolchain="$(<$dir/rust-toolchain)" } 2>/dev/null
+          break
+        fi
+        dir=${dir:h}
+      done
+    fi
   fi
-  if ! _p9k_cache_stat_get $0_v $rustc $so; then
+  if ! _p9k_cache_stat_get $0_v$toolchain $rustc $deps; then
     _p9k_cache_stat_set "$($rustc --version 2>/dev/null)"
   fi
   local v=${${_p9k_cache_val[1]#rustc }%% *}
-- 
cgit v1.2.3


From 1cf99b34e550e0294cb5d300bbf5b4eb331687aa Mon Sep 17 00:00:00 2001
From: romkatv <roman.perepelitsa@gmail.com>
Date: Mon, 13 Jan 2020 15:17:29 +0100
Subject: give content expansion for rust_version access to full version
 through $P9K_RUST_VERSION; see #418

---
 internal/p10k.zsh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index 8f56afe9..400a53f9 100644
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -2320,6 +2320,7 @@ instant_prompt_root_indicator() { prompt_root_indicator; }
 ################################################################
 # Segment to display Rust version number
 prompt_rust_version() {
+  unset P9K_RUST_VERSION
   (( $+commands[rustc] )) || return
   if (( _POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY )); then
     local dir=$_p9k_pwd_a
@@ -2374,6 +2375,7 @@ prompt_rust_version() {
   fi
   local v=${${_p9k_cache_val[1]#rustc }%% *}
   [[ -n $v ]] || return
+  typeset -g P9K_RUST_VERSION=$_p9k_cache_val[1]
   _p9k_prompt_segment "$0" "darkorange" "$_p9k_color1" 'RUST_ICON' 0 '' "${v//\%/%%}"
 }
 
-- 
cgit v1.2.3