summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Cornellà <hello@mcornella.com>2021-12-02 11:12:18 +0100
committerMarc Cornellà <hello@mcornella.com>2021-12-13 10:50:50 +0100
commit4119f53004de987215e4ae2ce49d0f818ad58c63 (patch)
treec5e973449e0afbbc72382e17666f3b1d2326c162
parentd058801a18270800c906d92dd41e275f4da24397 (diff)
downloadzsh-4119f53004de987215e4ae2ce49d0f818ad58c63.tar.gz
zsh-4119f53004de987215e4ae2ce49d0f818ad58c63.tar.bz2
zsh-4119f53004de987215e4ae2ce49d0f818ad58c63.zip
perf(mercurial): optimize utility functions
-rw-r--r--plugins/mercurial/mercurial.plugin.zsh101
-rw-r--r--themes/minimal.zsh-theme32
2 files changed, 78 insertions, 55 deletions
diff --git a/plugins/mercurial/mercurial.plugin.zsh b/plugins/mercurial/mercurial.plugin.zsh
index 8b50da9d8..6e72f0b1e 100644
--- a/plugins/mercurial/mercurial.plugin.zsh
+++ b/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
}
diff --git a/themes/minimal.zsh-theme b/themes/minimal.zsh-theme
index e05df9c9b..588ab6982 100644
--- a/themes/minimal.zsh-theme
+++ b/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 '