From 5f610a0af908137758992e2355c5ed6df2d71723 Mon Sep 17 00:00:00 2001
From: romkatv <roman.perepelitsa@gmail.com>
Date: Wed, 28 Aug 2019 18:55:33 +0200
Subject: fix network interface and ip parsing

---
 internal/p10k.zsh | 73 ++++++++++++++++++++++++++-----------------------------
 1 file changed, 34 insertions(+), 39 deletions(-)

(limited to 'internal')

diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index fc262ade..7c1f1945 100755
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -212,44 +212,13 @@ _p9k_segment_in_use() {
 }
 
 function _p9k_parse_ip() {
-  local desiredInterface=${1:-'^[^ ]+'}
-
-  if [[ $_p9k_os == OSX ]]; then
-    [[ -x /sbin/ifconfig ]] || return
-    local rawInterfaces && rawInterfaces="$(/sbin/ifconfig -l 2>/dev/null)" || return
-    local -a interfaces=(${(A)=rawInterfaces})
-    local pattern="${desiredInterface}[^ ]?"
-    local -a relevantInterfaces
-    for rawInterface in $interfaces; do
-      [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=$MATCH
-    done
-    local newline=$'\n'
-    local interfaceName interface
-    for interfaceName in $relevantInterfaces; do
-      interface="$(/sbin/ifconfig $interfaceName 2>/dev/null)" || continue
-      [[ "${interface}" =~ "lo[0-9]*" ]] && continue
-      if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then
-        local ipFound="${match[3]}"
-        local -a interfaceStates=(${(s:,:)match[1]})
-        if (( ${interfaceStates[(I)UP]} )); then
-          _p9k_ret=$ipFound
-          return
-        fi
-      fi
-    done
-  else
-    [[ -x /sbin/ip ]] || return
-    local -a interfaces=( "${(f)$(/sbin/ip -brief -4 a show 2>/dev/null)}" )
-    local pattern="^${desiredInterface}[[:space:]]+UP[[:space:]]+([^/ ]+)"
-    local interface
-    for interface in "${(@)interfaces}"; do
-      if [[ "$interface" =~ $pattern ]]; then
-        _p9k_ret=$match[1]
-        return
-      fi
-    done
-  fi
-
+  local iface_regex="^${1:-.*}\$" iface ip
+  for iface ip in "${(@kv)_p9k_iface}"; do
+    if [[ $iface =~ $iface_regex ]]; then
+      _p9k_ret=$ip
+      return 0
+    fi
+  done
   return 1
 }
 
@@ -3075,6 +3044,23 @@ _p9k_preexec() {
   _p9k_timer_start=EPOCHREALTIME
 }
 
+function _p9k_set_iface() {
+  if [[ ! -x /sbin/ifconfig ]]; then
+    _p9k_iface=()
+    return
+  fi
+  local line
+  local iface
+  for line in ${(f)"$(/sbin/ifconfig 2>/dev/null)"}; do
+    if [[ $line == (#b)([^[:space:]:]##):[[:space:]]##flags=(<->)'<'* ]]; then
+      [[ $match[2] == *[13579] ]] && iface=$match[1] || iface=
+    elif [[ -n $iface && $line == (#b)[[:space:]]##inet[[:space:]]##([0-9.]##)* ]]; then
+      _p9k_iface[$iface]=$match[1]
+      iface=
+    fi
+  done
+}
+
 function _p9k_build_segment() {
   _p9k_segment_name=${_p9k_segment_name%_joined}
   if [[ $_p9k_segment_name == custom_* ]]; then
@@ -3093,6 +3079,8 @@ function _p9k_set_prompt() {
   PROMPT=$_p9k_prompt_prefix_left
   RPROMPT=
 
+  (( _p9k_fetch_iface )) && _p9k_set_iface
+
   local -i left_idx=1 right_idx=1 num_lines=$#_p9k_line_segments_left i
   for i in {1..$num_lines}; do
     local right=
@@ -3544,6 +3532,8 @@ _p9k_init_vars() {
   typeset -gi _p9k_num_cpus
   typeset -g  _p9k_pwd
   typeset -g  _p9k_pwd_a
+  typeset -gA _p9k_iface
+  typeset -gi _p9k_fetch_iface
 
   typeset -g  P9K_VISUAL_IDENTIFIER
   typeset -g  P9K_CONTENT
@@ -3686,7 +3676,7 @@ _p9k_init_params() {
   _p9k_declare -i POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH
   _p9k_declare -e POWERLEVEL9K_SHORTEN_DELIMITER
   _p9k_declare -i POWERLEVEL9K_SHORTEN_DIR_LENGTH
-  _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "^[^ ]+"
+  _p9k_declare -s POWERLEVEL9K_IP_INTERFACE ""
   _p9k_declare -s POWERLEVEL9K_VPN_IP_INTERFACE "tun"
   _p9k_declare -i POWERLEVEL9K_LOAD_WHICH 5
   _p9k_declare -b POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW 0
@@ -4328,6 +4318,11 @@ _p9k_init() {
   fi
 
   _p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select
+
+  if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k_segment_in_use public_ip ||
+     _p9k_segment_in_use ip || _p9k_segment_in_use vpn_ip; then
+     _p9k_fetch_iface=1
+  fi
 }
 
 _p9k_deinit() {
-- 
cgit v1.2.3