3ee22a4ebc
When not in the repo root dir `in_hg` used `hg summary` which is terribly slow on big repositories, and `hg_get_branch_name` called `hg branch` which is also pretty slow as well. Based on the [branch](https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/branch) plugin, I created the function `hg_get_dir` that fetch the `.hg` directory if it exists, going up in the directory tree. From there, we know if we're in an HG repository if `in_hg` returns a non empty string, and we can simply get the branch name from the content of the `.hg/branch` file. ### Benchmarks Based on 10 calls to `hg_get_branch_name` in subdir (so that the old `hg summary` is called), here are the average times: * Before: `/tmp/test.zsh 0.08s user 0.04s system 96% cpu 0.133 total` * After: `/tmp/test.zsh 0.00s user 0.00s system 71% cpu 0.008 total` It's faster and it uses less CPU! The other changes after that are purely esthetic (fit in 80 columns and indentation fix).
85 lines
2.1 KiB
Bash
85 lines
2.1 KiB
Bash
# Mercurial
|
|
alias hgc='hg commit'
|
|
alias hgb='hg branch'
|
|
alias hgba='hg branches'
|
|
alias hgbk='hg bookmarks'
|
|
alias hgco='hg checkout'
|
|
alias hgd='hg diff'
|
|
alias hged='hg diffmerge'
|
|
# pull and update
|
|
alias hgi='hg incoming'
|
|
alias hgl='hg pull -u'
|
|
alias hglr='hg pull --rebase'
|
|
alias hgo='hg outgoing'
|
|
alias hgp='hg push'
|
|
alias hgs='hg status'
|
|
alias hgsl='hg log --limit 20 --template "{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n" '
|
|
alias hgca='hg commit --amend'
|
|
# list unresolved files (since hg does not list unmerged files in the status command)
|
|
alias hgun='hg resolve --list'
|
|
|
|
function hg_get_dir() {
|
|
# Defines path as current directory
|
|
local current_dir=$PWD
|
|
# While current path is not root path
|
|
while [[ $current_dir != '/' ]]; do
|
|
if [[ -d "${current_dir}/.hg" ]]; then
|
|
echo "${current_dir}/.hg"
|
|
return
|
|
fi
|
|
# Defines path as parent directory and keeps looking for
|
|
current_dir="${current_dir:h}"
|
|
done
|
|
}
|
|
|
|
function in_hg() {
|
|
if [[ $(hg_get_dir) != "" ]]; then
|
|
echo 1
|
|
fi
|
|
}
|
|
|
|
function hg_get_branch_name() {
|
|
local hg_dir=$(hg_get_dir)
|
|
if [[ $hg_dir != "" ]]; then
|
|
if [[ -f "${hg_dir}/branch" ]]; then
|
|
echo $(<"${hg_dir}/branch")
|
|
else
|
|
echo "default"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function hg_prompt_info {
|
|
local branch=$(hg_get_branch_name)
|
|
if [[ $branch != "" ]]; then
|
|
echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_HG_PROMPT_PREFIX\
|
|
$ZSH_THEME_REPO_NAME_COLOR${display}$ZSH_PROMPT_BASE_COLOR\
|
|
$ZSH_PROMPT_BASE_COLOR$(hg_dirty)$ZSH_THEME_HG_PROMPT_SUFFIX\
|
|
$ZSH_PROMPT_BASE_COLOR"
|
|
}
|
|
|
|
function hg_dirty_choose {
|
|
if [ $(in_hg) ]; then
|
|
hg status 2> /dev/null | command grep -Eq '^\s*[ACDIM!?L]'
|
|
if [ $pipestatus[-1] -eq 0 ]; then
|
|
# Grep exits with 0 when "One or more lines were selected", return "dirty".
|
|
echo $1
|
|
else
|
|
# Otherwise, no lines were found, or an error occurred. Return clean.
|
|
echo $2
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function hg_dirty {
|
|
hg_dirty_choose $ZSH_THEME_HG_PROMPT_DIRTY $ZSH_THEME_HG_PROMPT_CLEAN
|
|
}
|
|
|
|
function hgic() {
|
|
hg incoming "$@" | grep "changeset" | wc -l
|
|
}
|
|
|
|
function hgoc() {
|
|
hg outgoing "$@" | grep "changeset" | wc -l
|
|
}
|