Browse Source

perf(mercurial): optimize utility functions

Marc Cornellà 2 years ago
parent
commit
4119f53004
2 changed files with 78 additions and 55 deletions
  1. 61 40
      plugins/mercurial/mercurial.plugin.zsh
  2. 17 15
      themes/minimal.zsh-theme

+ 61 - 40
plugins/mercurial/mercurial.plugin.zsh

@@ -21,65 +21,86 @@ alias hgo='hg outgoing'
 alias hglg='hg log --stat -v'
 alias hglgp='hg log --stat  -p -v'
 
+function hgic() {
+  hg incoming "$@" | grep "changeset" | wc -l
+}
+
+function hgoc() {
+  hg outgoing "$@" | grep "changeset" | wc -l
+}
+
+# functions
+function hg_root() {
+  local dir="$PWD"
+  while [[ "$dir" != "/" ]]; do
+    if [[ -d "$dir/.hg" ]]; then
+      echo "$dir"
+      return 0
+    fi
+    dir="${dir:h}"
+  done
+  return 1
+}
+
 function in_hg() {
-  if $(hg branch > /dev/null 2>&1); then
-    echo 1
-  fi
+  hg_root >/dev/null
 }
 
 function hg_get_branch_name() {
-  branch=`hg branch 2>/dev/null`
-  if [ $? -eq 0 ]; then
-    echo $branch
+  local dir
+  if ! dir=$(hg_root); then
+    return
   fi
-  unset branch
-}
 
-function hg_prompt_info {
-  local info rev branch dirty
-
-  if ! info=$(hg id --id --branch 2>/dev/null); then
+  if [[ ! -f "$dir/.hg/branch" ]]; then
+    echo default
     return
   fi
 
-  rev="${info[(w)1]}"
-  branch="${${info[(w)2]}:gs/%/%%}"
+  echo "$(<"$dir/.hg/branch")"
+}
 
-  if [[ "$rev" = *+ ]]; then
-    dirty="$ZSH_THEME_HG_PROMPT_DIRTY"
-  else
-    dirty="$ZSH_THEME_HG_PROMPT_CLEAN"
+function hg_get_bookmark_name() {
+  local dir
+  if ! dir=$(hg_root); then
+    return
   fi
 
-  echo "${ZSH_THEME_HG_PROMPT_PREFIX}${branch}${dirty}${ZSH_THEME_HG_PROMPT_SUFFIX}"
+  if [[ ! -f "$dir/.hg/bookmarks.current" ]]; then
+    return
+  fi
+
+  echo "$(<"$dir/.hg/bookmarks.current")"
 }
 
-function hg_dirty_choose {
-  hg status -mar 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'
-  if [ $? -eq 0 ]; then
-    if [ $pipestatus[-1] -eq 0 ]; then
-      # Grep exits with 0 when "One or more lines were selected", return "dirty".
-      echo $1
-      return
-    fi
+function hg_prompt_info {
+  local dir branch dirty
+  if ! dir=$(hg_root); then
+    return
   fi
-  echo $2
-}
 
-function hg_dirty {
-  hg_dirty_choose $ZSH_THEME_HG_PROMPT_DIRTY $ZSH_THEME_HG_PROMPT_CLEAN
-}
+  if [[ ! -f "$dir/.hg/branch" ]]; then
+    branch=default
+  else
+    branch="$(<"$dir/.hg/branch")"
+  fi
 
-function hgic() {
-  hg incoming "$@" | grep "changeset" | wc -l
-}
+  dirty="$(hg_dirty)"
 
-function hgoc() {
-  hg outgoing "$@" | grep "changeset" | wc -l
+  echo "${ZSH_THEME_HG_PROMPT_PREFIX}${branch:gs/%/%%}${dirty}${ZSH_THEME_HG_PROMPT_SUFFIX}"
 }
 
-function hg_get_bookmark_name() {
-  if [ $(in_hg) ]; then
-    echo $(hg id -B)
+function hg_dirty {
+  local hg_status
+  if ! hg_status="$(hg status -mar 2>/dev/null)"; then
+    return
   fi
+
+  # grep exits with 0 when dirty
+  if command grep -Eq '^\s*[ACDIM!?L]' <<< "$hg_status"; then
+    echo $ZSH_THEME_HG_PROMPT_DIRTY
+    return
+  fi
+
+  echo $ZSH_THEME_HG_PROMPT_CLEAN
 }

+ 17 - 15
themes/minimal.zsh-theme

@@ -2,23 +2,25 @@ ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[white]%}["
 ZSH_THEME_GIT_PROMPT_SUFFIX=""
 ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}●%{$fg[white]%}]%{$reset_color%} "
 ZSH_THEME_GIT_PROMPT_CLEAN="]%{$reset_color%} "
-ZSH_THEME_SVN_PROMPT_PREFIX=$ZSH_THEME_GIT_PROMPT_PREFIX
-ZSH_THEME_SVN_PROMPT_SUFFIX=$ZSH_THEME_GIT_PROMPT_SUFFIX
-ZSH_THEME_SVN_PROMPT_DIRTY=$ZSH_THEME_GIT_PROMPT_DIRTY
-ZSH_THEME_SVN_PROMPT_CLEAN=$ZSH_THEME_GIT_PROMPT_CLEAN
-ZSH_THEME_HG_PROMPT_PREFIX=$ZSH_THEME_GIT_PROMPT_PREFIX
-ZSH_THEME_HG_PROMPT_SUFFIX=$ZSH_THEME_GIT_PROMPT_SUFFIX
-ZSH_THEME_HG_PROMPT_DIRTY=$ZSH_THEME_GIT_PROMPT_DIRTY
-ZSH_THEME_HG_PROMPT_CLEAN=$ZSH_THEME_GIT_PROMPT_CLEAN
+
+ZSH_THEME_SVN_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX"
+ZSH_THEME_SVN_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX"
+ZSH_THEME_SVN_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY"
+ZSH_THEME_SVN_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN"
+
+ZSH_THEME_HG_PROMPT_PREFIX="$ZSH_THEME_GIT_PROMPT_PREFIX"
+ZSH_THEME_HG_PROMPT_SUFFIX="$ZSH_THEME_GIT_PROMPT_SUFFIX"
+ZSH_THEME_HG_PROMPT_DIRTY="$ZSH_THEME_GIT_PROMPT_DIRTY"
+ZSH_THEME_HG_PROMPT_CLEAN="$ZSH_THEME_GIT_PROMPT_CLEAN"
 
 vcs_status() {
-    if [[ $(whence in_svn) != "" ]] && in_svn; then
-        svn_prompt_info
-    elif [[ $(whence in_hg) != "" ]] && in_hg; then
-        hg_prompt_info
-    else
-        git_prompt_info
-    fi
+  if (( ${+functions[in_svn]} )) && in_svn; then
+    svn_prompt_info
+  elif (( ${+functions[in_hg]} )) && in_hg; then
+    hg_prompt_info
+  else
+    git_prompt_info
+  fi
 }
 
 PROMPT='%2~ $(vcs_status)»%b '