From f23464001f40a52f2a7aa84a9c16c0fed3e3c3ca Mon Sep 17 00:00:00 2001 From: Fabian Homborg Date: Sun, 29 May 2016 14:10:10 +0200 Subject: Indent __fish_git_prompt --- share/functions/__fish_git_prompt.fish | 1019 ++++++++++++++++---------------- 1 file changed, 512 insertions(+), 507 deletions(-) (limited to 'share') diff --git a/share/functions/__fish_git_prompt.fish b/share/functions/__fish_git_prompt.fish index 909dd6bd..9591ef38 100644 --- a/share/functions/__fish_git_prompt.fish +++ b/share/functions/__fish_git_prompt.fish @@ -169,400 +169,405 @@ # flags Defaults to --bold blue function __fish_git_prompt_show_upstream --description "Helper function for __fish_git_prompt" - set -l show_upstream $__fish_git_prompt_showupstream - set -l svn_prefix # For better SVN upstream information - set -l informative - - set -l svn_url_pattern - set -l count - set -l upstream git - set -l verbose - set -l name - - # Default to informative if show_informative_status is set - if test -n "$__fish_git_prompt_show_informative_status" - set informative 1 - end - - set -l svn_remote - # get some config options from git-config - command git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' ^/dev/null | while read -lz key value - switch $key - case bash.showupstream - set show_upstream $value - test -n "$show_upstream"; or return - case svn-remote.'*'.url - set svn_remote $svn_remote $value - # Avoid adding \| to the beginning to avoid needing #?? later - if test -n "$svn_url_pattern" - set svn_url_pattern $svn_url_pattern"|$value" - else - set svn_url_pattern $value - end - set upstream svn+git # default upstream is SVN if available, else git - - # Save the config key (without .url) for later use - set -l remote_prefix (string replace -r '\.url$' '' -- $key) - set svn_prefix $svn_prefix $remote_prefix - end - end - - # parse configuration variables - # and clear informative default when needed - for option in $show_upstream - switch $option - case git svn - set upstream $option - set -e informative - case verbose - set verbose 1 - set -e informative - case informative - set informative 1 - case name - set name 1 - case none - return - end - end - - # Find our upstream - switch $upstream - case git - set upstream '@{upstream}' - case svn\* - # get the upstream from the 'git-svn-id: ...' in a commit message - # (git-svn uses essentially the same procedure internally) - set -l svn_upstream (git log --first-parent -1 --grep="^git-svn-id: \($svn_url_pattern\)" ^/dev/null) - if test (count $svn_upstream) -ne 0 - echo $svn_upstream[-1] | read -l __ svn_upstream __ - set svn_upstream (string replace -r '@.*' '' -- $svn_upstream) - set -l cur_prefix - for i in (seq (count $svn_remote)) - set -l remote $svn_remote[$i] - set -l mod_upstream (string replace "$remote" "" -- $svn_upstream) - if test "$svn_upstream" != "$mod_upstream" - # we found a valid remote - set svn_upstream $mod_upstream - set cur_prefix $svn_prefix[$i] - break - end - end - - if test -z "$svn_upstream" - # default branch name for checkouts with no layout: - if test -n "$GIT_SVN_ID" - set upstream $GIT_SVN_ID - else - set upstream git-svn - end - else - set upstream (string replace '/branches' '' -- $svn_upstream | string replace -a '/' '') - - # Use fetch config to fix upstream - set -l fetch_val (command git config "$cur_prefix".fetch) - if test -n "$fetch_val" - set -l IFS : - echo "$fetch_val" | read -l trunk pattern - set upstream (string replace -r -- "/$trunk\$" '' $pattern) /$upstream - end - end - else if test $upstream = svn+git - set upstream '@{upstream}' - end - end - - # Find how many commits we are ahead/behind our upstream - set count (command git rev-list --count --left-right $upstream...HEAD ^/dev/null) - - # calculate the result - if test -n "$verbose" - # Verbose has a space by default - set -l prefix "$___fish_git_prompt_char_upstream_prefix" - # Using two underscore version to check if user explicitly set to nothing - if not set -q __fish_git_prompt_char_upstream_prefix - set -l prefix " " - end - - echo $count | read -l behind ahead - switch "$count" - case '' # no upstream - case "0 0" # equal to upstream - echo "$prefix$___fish_git_prompt_char_upstream_equal" - case "0 *" # ahead of upstream - echo "$prefix$___fish_git_prompt_char_upstream_ahead$ahead" - case "* 0" # behind upstream - echo "$prefix$___fish_git_prompt_char_upstream_behind$behind" - case '*' # diverged from upstream - echo "$prefix$___fish_git_prompt_char_upstream_diverged$ahead-$behind" - end - if test -n "$count" -a -n "$name" - echo " "(command git rev-parse --abbrev-ref "$upstream" ^/dev/null) - end - else if test -n "$informative" - echo $count | read -l behind ahead - switch "$count" - case '' # no upstream - case "0 0" # equal to upstream - case "0 *" # ahead of upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead$ahead" - case "* 0" # behind upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_behind$behind" - case '*' # diverged from upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead$ahead$___fish_git_prompt_char_upstream_behind$behind" - end - else - switch "$count" - case '' # no upstream - case "0 0" # equal to upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_equal" - case "0 *" # ahead of upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead" - case "* 0" # behind upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_behind" - case '*' # diverged from upstream - echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_diverged" - end - end + set -l show_upstream $__fish_git_prompt_showupstream + set -l svn_prefix # For better SVN upstream information + set -l informative + + set -l svn_url_pattern + set -l count + set -l upstream git + set -l verbose + set -l name + + # Default to informative if show_informative_status is set + if test -n "$__fish_git_prompt_show_informative_status" + set informative 1 + end + + set -l svn_remote + # get some config options from git-config + command git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' ^/dev/null | while read -lz key value + switch $key + case bash.showupstream + set show_upstream $value + test -n "$show_upstream" + or return + case svn-remote.'*'.url + set svn_remote $svn_remote $value + # Avoid adding \| to the beginning to avoid needing #?? later + if test -n "$svn_url_pattern" + set svn_url_pattern $svn_url_pattern"|$value" + else + set svn_url_pattern $value + end + set upstream svn+git # default upstream is SVN if available, else git + + # Save the config key (without .url) for later use + set -l remote_prefix (string replace -r '\.url$' '' -- $key) + set svn_prefix $svn_prefix $remote_prefix + end + end + + # parse configuration variables + # and clear informative default when needed + for option in $show_upstream + switch $option + case git svn + set upstream $option + set -e informative + case verbose + set verbose 1 + set -e informative + case informative + set informative 1 + case name + set name 1 + case none + return + end + end + + # Find our upstream + switch $upstream + case git + set upstream '@{upstream}' + case svn\* + # get the upstream from the 'git-svn-id: ...' in a commit message + # (git-svn uses essentially the same procedure internally) + set -l svn_upstream (git log --first-parent -1 --grep="^git-svn-id: \($svn_url_pattern\)" ^/dev/null) + if test (count $svn_upstream) -ne 0 + echo $svn_upstream[-1] | read -l __ svn_upstream __ + set svn_upstream (string replace -r '@.*' '' -- $svn_upstream) + set -l cur_prefix + for i in (seq (count $svn_remote)) + set -l remote $svn_remote[$i] + set -l mod_upstream (string replace "$remote" "" -- $svn_upstream) + if test "$svn_upstream" != "$mod_upstream" + # we found a valid remote + set svn_upstream $mod_upstream + set cur_prefix $svn_prefix[$i] + break + end + end + + if test -z "$svn_upstream" + # default branch name for checkouts with no layout: + if test -n "$GIT_SVN_ID" + set upstream $GIT_SVN_ID + else + set upstream git-svn + end + else + set upstream (string replace '/branches' '' -- $svn_upstream | string replace -a '/' '') + + # Use fetch config to fix upstream + set -l fetch_val (command git config "$cur_prefix".fetch) + if test -n "$fetch_val" + set -l IFS : + echo "$fetch_val" | read -l trunk pattern + set upstream (string replace -r -- "/$trunk\$" '' $pattern) /$upstream + end + end + else if test $upstream = svn+git + set upstream '@{upstream}' + end + end + + # Find how many commits we are ahead/behind our upstream + set count (command git rev-list --count --left-right $upstream...HEAD ^/dev/null) + + # calculate the result + if test -n "$verbose" + # Verbose has a space by default + set -l prefix "$___fish_git_prompt_char_upstream_prefix" + # Using two underscore version to check if user explicitly set to nothing + if not set -q __fish_git_prompt_char_upstream_prefix + set -l prefix " " + end + + echo $count | read -l behind ahead + switch "$count" + case '' # no upstream + case "0 0" # equal to upstream + echo "$prefix$___fish_git_prompt_char_upstream_equal" + case "0 *" # ahead of upstream + echo "$prefix$___fish_git_prompt_char_upstream_ahead$ahead" + case "* 0" # behind upstream + echo "$prefix$___fish_git_prompt_char_upstream_behind$behind" + case '*' # diverged from upstream + echo "$prefix$___fish_git_prompt_char_upstream_diverged$ahead-$behind" + end + if test -n "$count" -a -n "$name" + echo " "(command git rev-parse --abbrev-ref "$upstream" ^/dev/null) + end + else if test -n "$informative" + echo $count | read -l behind ahead + switch "$count" + case '' # no upstream + case "0 0" # equal to upstream + case "0 *" # ahead of upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead$ahead" + case "* 0" # behind upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_behind$behind" + case '*' # diverged from upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead$ahead$___fish_git_prompt_char_upstream_behind$behind" + end + else + switch "$count" + case '' # no upstream + case "0 0" # equal to upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_equal" + case "0 *" # ahead of upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_ahead" + case "* 0" # behind upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_behind" + case '*' # diverged from upstream + echo "$___fish_git_prompt_char_upstream_prefix$___fish_git_prompt_char_upstream_diverged" + end + end end function __fish_git_prompt --description "Prompt function for Git" - # If git isn't installed, there's nothing we can do - # Return 1 so the calling prompt can deal with it - if not command -s git >/dev/null - return 1 - end - set -l repo_info (command git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree HEAD ^/dev/null) - test -n "$repo_info"; or return - - set -l git_dir $repo_info[1] - set -l inside_gitdir $repo_info[2] - set -l bare_repo $repo_info[3] - set -l inside_worktree $repo_info[4] - set -q repo_info[5]; and set -l sha $repo_info[5] - - set -l rbc (__fish_git_prompt_operation_branch_bare $repo_info) - set -l r $rbc[1] # current operation - set -l b $rbc[2] # current branch - set -l detached $rbc[3] - set -l w #dirty working directory - set -l i #staged changes - set -l s #stashes - set -l u #untracked - set -l c $rbc[4] # bare repository - set -l p #upstream - set -l informative_status - - __fish_git_prompt_validate_chars - __fish_git_prompt_validate_colors - - set -l space "$___fish_git_prompt_color$___fish_git_prompt_char_stateseparator$___fish_git_prompt_color_done" - - if test "true" = $inside_worktree - if test -n "$__fish_git_prompt_show_informative_status" - set informative_status "$space"(__fish_git_prompt_informative_status) - else - if test -n "$__fish_git_prompt_showdirtystate" - set -l config (command git config --bool bash.showDirtyState) - if test "$config" != "false" - set w (__fish_git_prompt_dirty) - set i (__fish_git_prompt_staged $sha) - end - end - - if test -n "$__fish_git_prompt_showstashstate" -a -r $git_dir/refs/stash - set s $___fish_git_prompt_char_stashstate - end - - if test -n "$__fish_git_prompt_showuntrackedfiles" - set -l config (command git config --bool bash.showUntrackedFiles) - if test "$config" != false - if command git ls-files --others --exclude-standard --error-unmatch -- '*' >/dev/null ^/dev/null - set u $___fish_git_prompt_char_untrackedfiles - end - end - end - end - - if test -n "$__fish_git_prompt_showupstream" -o "$__fish_git_prompt_show_informative_status" - set p (__fish_git_prompt_show_upstream) - end - end - - set -l branch_color $___fish_git_prompt_color_branch - set -l branch_done $___fish_git_prompt_color_branch_done - if test -n "$__fish_git_prompt_showcolorhints" - if test $detached = yes - set branch_color $___fish_git_prompt_color_branch_detached - set branch_done $___fish_git_prompt_color_branch_detached_done - end - end - - if test -n "$w" - set w "$___fish_git_prompt_color_dirtystate$w$___fish_git_prompt_color_dirtystate_done" - end - if test -n "$i" - set i "$___fish_git_prompt_color_stagedstate$i$___fish_git_prompt_color_stagedstate_done" - end - if test -n "$s" - set s "$___fish_git_prompt_color_stashstate$s$___fish_git_prompt_color_stashstate_done" - end - if test -n "$u" - set u "$___fish_git_prompt_color_untrackedfiles$u$___fish_git_prompt_color_untrackedfiles_done" - end - set b (string replace refs/heads/ '' -- $b) - if test -n "$b" - set b "$branch_color$b$branch_done" - end - if test -n "$c" - set c "$___fish_git_prompt_color_bare$c$___fish_git_prompt_color_bare_done" - end - if test -n "$r" - set r "$___fish_git_prompt_color_merging$r$___fish_git_prompt_color_merging_done" - end - if test -n "$p" - set p "$___fish_git_prompt_color_upstream$p$___fish_git_prompt_color_upstream_done" - end - - # Formatting - set -l f "$w$i$s$u" - if test -n "$f" - set f "$space$f" - end - set -l format $argv[1] - if test -z "$format" - set format " (%s)" - end - - printf "%s$format%s" "$___fish_git_prompt_color_prefix" "$___fish_git_prompt_color_prefix_done$c$b$f$r$p$informative_status$___fish_git_prompt_color_suffix" "$___git_ps_color_suffix_done" + # If git isn't installed, there's nothing we can do + # Return 1 so the calling prompt can deal with it + if not command -s git >/dev/null + return 1 + end + set -l repo_info (command git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree HEAD ^/dev/null) + test -n "$repo_info" + or return + + set -l git_dir $repo_info[1] + set -l inside_gitdir $repo_info[2] + set -l bare_repo $repo_info[3] + set -l inside_worktree $repo_info[4] + set -q repo_info[5] + and set -l sha $repo_info[5] + + set -l rbc (__fish_git_prompt_operation_branch_bare $repo_info) + set -l r $rbc[1] # current operation + set -l b $rbc[2] # current branch + set -l detached $rbc[3] + set -l w #dirty working directory + set -l i #staged changes + set -l s #stashes + set -l u #untracked + set -l c $rbc[4] # bare repository + set -l p #upstream + set -l informative_status + + __fish_git_prompt_validate_chars + __fish_git_prompt_validate_colors + + set -l space "$___fish_git_prompt_color$___fish_git_prompt_char_stateseparator$___fish_git_prompt_color_done" + + if test "true" = $inside_worktree + if test -n "$__fish_git_prompt_show_informative_status" + set informative_status "$space"(__fish_git_prompt_informative_status) + else + if test -n "$__fish_git_prompt_showdirtystate" + set -l config (command git config --bool bash.showDirtyState) + if test "$config" != "false" + set w (__fish_git_prompt_dirty) + set i (__fish_git_prompt_staged $sha) + end + end + + if test -n "$__fish_git_prompt_showstashstate" -a -r $git_dir/refs/stash + set s $___fish_git_prompt_char_stashstate + end + + if test -n "$__fish_git_prompt_showuntrackedfiles" + set -l config (command git config --bool bash.showUntrackedFiles) + if test "$config" != false + if command git ls-files --others --exclude-standard --error-unmatch -- '*' >/dev/null ^/dev/null + set u $___fish_git_prompt_char_untrackedfiles + end + end + end + end + + if test -n "$__fish_git_prompt_showupstream" -o "$__fish_git_prompt_show_informative_status" + set p (__fish_git_prompt_show_upstream) + end + end + + set -l branch_color $___fish_git_prompt_color_branch + set -l branch_done $___fish_git_prompt_color_branch_done + if test -n "$__fish_git_prompt_showcolorhints" + if test $detached = yes + set branch_color $___fish_git_prompt_color_branch_detached + set branch_done $___fish_git_prompt_color_branch_detached_done + end + end + + if test -n "$w" + set w "$___fish_git_prompt_color_dirtystate$w$___fish_git_prompt_color_dirtystate_done" + end + if test -n "$i" + set i "$___fish_git_prompt_color_stagedstate$i$___fish_git_prompt_color_stagedstate_done" + end + if test -n "$s" + set s "$___fish_git_prompt_color_stashstate$s$___fish_git_prompt_color_stashstate_done" + end + if test -n "$u" + set u "$___fish_git_prompt_color_untrackedfiles$u$___fish_git_prompt_color_untrackedfiles_done" + end + set b (string replace refs/heads/ '' -- $b) + if test -n "$b" + set b "$branch_color$b$branch_done" + end + if test -n "$c" + set c "$___fish_git_prompt_color_bare$c$___fish_git_prompt_color_bare_done" + end + if test -n "$r" + set r "$___fish_git_prompt_color_merging$r$___fish_git_prompt_color_merging_done" + end + if test -n "$p" + set p "$___fish_git_prompt_color_upstream$p$___fish_git_prompt_color_upstream_done" + end + + # Formatting + set -l f "$w$i$s$u" + if test -n "$f" + set f "$space$f" + end + set -l format $argv[1] + if test -z "$format" + set format " (%s)" + end + + printf "%s$format%s" "$___fish_git_prompt_color_prefix" "$___fish_git_prompt_color_prefix_done$c$b$f$r$p$informative_status$___fish_git_prompt_color_suffix" "$___git_ps_color_suffix_done" end ### helper functions function __fish_git_prompt_staged --description "__fish_git_prompt helper, tells whether or not the current branch has staged files" - set -l sha $argv[1] + set -l sha $argv[1] - set -l staged + set -l staged - if test -n "$sha" - command git diff-index --cached --quiet HEAD --; or set staged $___fish_git_prompt_char_stagedstate - else - set staged $___fish_git_prompt_char_invalidstate - end - echo $staged + if test -n "$sha" + command git diff-index --cached --quiet HEAD -- + or set staged $___fish_git_prompt_char_stagedstate + else + set staged $___fish_git_prompt_char_invalidstate + end + echo $staged end function __fish_git_prompt_dirty --description "__fish_git_prompt helper, tells whether or not the current branch has tracked, modified files" - set -l dirty - - set -l os - command git diff --no-ext-diff --quiet --exit-code - set os $status - if test $os -ne 0 - set dirty $___fish_git_prompt_char_dirtystate - end - echo $dirty + set -l dirty + + set -l os + command git diff --no-ext-diff --quiet --exit-code + set os $status + if test $os -ne 0 + set dirty $___fish_git_prompt_char_dirtystate + end + echo $dirty end set -g ___fish_git_prompt_status_order stagedstate invalidstate dirtystate untrackedfiles -function __fish_git_prompt_informative_status +function __fish_git_prompt_informative_status - set -l changedFiles (command git diff --name-status | cut -c 1-2) - set -l stagedFiles (command git diff --staged --name-status | cut -c 1-2) + set -l changedFiles (command git diff --name-status | cut -c 1-2) + set -l stagedFiles (command git diff --staged --name-status | cut -c 1-2) - set -l dirtystate (math (count $changedFiles) - (count (echo $changedFiles | grep "U"))) - set -l invalidstate (count (echo $stagedFiles | grep "U")) - set -l stagedstate (math (count $stagedFiles) - $invalidstate) - set -l untrackedfiles (count (command git ls-files --others --exclude-standard)) + set -l dirtystate (math (count $changedFiles) - (count (echo $changedFiles | grep "U"))) + set -l invalidstate (count (echo $stagedFiles | grep "U")) + set -l stagedstate (math (count $stagedFiles) - $invalidstate) + set -l untrackedfiles (count (command git ls-files --others --exclude-standard)) - set -l info + set -l info - if [ (math $dirtystate + $invalidstate + $stagedstate + $untrackedfiles) = 0 ] - set info $___fish_git_prompt_color_cleanstate$___fish_git_prompt_char_cleanstate$___fish_git_prompt_color_cleanstate_done - else - for i in $___fish_git_prompt_status_order - if [ $$i != "0" ] - set -l color_var ___fish_git_prompt_color_$i - set -l color_done_var ___fish_git_prompt_color_{$i}_done - set -l symbol_var ___fish_git_prompt_char_$i + if [ (math $dirtystate + $invalidstate + $stagedstate + $untrackedfiles) = 0 ] + set info $___fish_git_prompt_color_cleanstate$___fish_git_prompt_char_cleanstate$___fish_git_prompt_color_cleanstate_done + else + for i in $___fish_git_prompt_status_order + if [ $$i != "0" ] + set -l color_var ___fish_git_prompt_color_$i + set -l color_done_var ___fish_git_prompt_color_{$i}_done + set -l symbol_var ___fish_git_prompt_char_$i - set -l color $$color_var - set -l color_done $$color_done_var - set -l symbol $$symbol_var + set -l color $$color_var + set -l color_done $$color_done_var + set -l symbol $$symbol_var - set -l count + set -l count - if not set -q __fish_git_prompt_hide_$i - set count $$i - end + if not set -q __fish_git_prompt_hide_$i + set count $$i + end - set info "$info$color$symbol$count$color_done" - end - end - end + set info "$info$color$symbol$count$color_done" + end + end + end - echo $info + echo $info end # Keeping these together avoids many duplicated checks function __fish_git_prompt_operation_branch_bare --description "__fish_git_prompt helper, returns the current Git operation and branch" - # This function is passed the full repo_info array - set -l git_dir $argv[1] - set -l inside_gitdir $argv[2] - set -l bare_repo $argv[3] - set -q argv[5]; and set -l sha $argv[5] - - set -l branch - set -l operation - set -l detached no - set -l bare - set -l step - set -l total - set -l os - - if test -d $git_dir/rebase-merge - set branch (cat $git_dir/rebase-merge/head-name ^/dev/null) - set step (cat $git_dir/rebase-merge/msgnum ^/dev/null) - set total (cat $git_dir/rebase-merge/end ^/dev/null) - if test -f $git_dir/rebase-merge/interactive - set operation "|REBASE-i" - else - set operation "|REBASE-m" - end - else - if test -d $git_dir/rebase-apply - set step (cat $git_dir/rebase-apply/next ^/dev/null) - set total (cat $git_dir/rebase-apply/last ^/dev/null) - if test -f $git_dir/rebase-apply/rebasing - set branch (cat $git_dir/rebase-apply/head-name ^/dev/null) - set operation "|REBASE" - else if test -f $git_dir/rebase-apply/applying - set operation "|AM" - else - set operation "|AM/REBASE" - end - else if test -f $git_dir/MERGE_HEAD - set operation "|MERGING" - else if test -f $git_dir/CHERRY_PICK_HEAD - set operation "|CHERRY-PICKING" - else if test -f $git_dir/REVERT_HEAD - set operation "|REVERTING" - else if test -f $git_dir/BISECT_LOG - set operation "|BISECTING" - end - end - - if test -n "$step" -a -n "$total" - set operation "$operation $step/$total" - end - - if test -z "$branch" - set branch (command git symbolic-ref HEAD ^/dev/null; set os $status) - if test $os -ne 0 - set detached yes - set branch (switch "$__fish_git_prompt_describe_style" + # This function is passed the full repo_info array + set -l git_dir $argv[1] + set -l inside_gitdir $argv[2] + set -l bare_repo $argv[3] + set -q argv[5] + and set -l sha $argv[5] + + set -l branch + set -l operation + set -l detached no + set -l bare + set -l step + set -l total + set -l os + + if test -d $git_dir/rebase-merge + set branch (cat $git_dir/rebase-merge/head-name ^/dev/null) + set step (cat $git_dir/rebase-merge/msgnum ^/dev/null) + set total (cat $git_dir/rebase-merge/end ^/dev/null) + if test -f $git_dir/rebase-merge/interactive + set operation "|REBASE-i" + else + set operation "|REBASE-m" + end + else + if test -d $git_dir/rebase-apply + set step (cat $git_dir/rebase-apply/next ^/dev/null) + set total (cat $git_dir/rebase-apply/last ^/dev/null) + if test -f $git_dir/rebase-apply/rebasing + set branch (cat $git_dir/rebase-apply/head-name ^/dev/null) + set operation "|REBASE" + else if test -f $git_dir/rebase-apply/applying + set operation "|AM" + else + set operation "|AM/REBASE" + end + else if test -f $git_dir/MERGE_HEAD + set operation "|MERGING" + else if test -f $git_dir/CHERRY_PICK_HEAD + set operation "|CHERRY-PICKING" + else if test -f $git_dir/REVERT_HEAD + set operation "|REVERTING" + else if test -f $git_dir/BISECT_LOG + set operation "|BISECTING" + end + end + + if test -n "$step" -a -n "$total" + set operation "$operation $step/$total" + end + + if test -z "$branch" + set branch (command git symbolic-ref HEAD ^/dev/null; set os $status) + if test $os -ne 0 + set detached yes + set branch (switch "$__fish_git_prompt_describe_style" case contains command git describe --contains HEAD case branch @@ -572,185 +577,185 @@ function __fish_git_prompt_operation_branch_bare --description "__fish_git_promp case default '*' command git describe --tags --exact-match HEAD end ^/dev/null; set os $status) - if test $os -ne 0 - # Shorten the sha ourselves to 8 characters - this should be good for most repositories, - # and even for large ones it should be good for most commits - if set -q sha - set branch (string match -r '^.{8}' -- $sha)... - else - set branch unknown - end - end - set branch "($branch)" - end - end - - if test "true" = $inside_gitdir - if test "true" = $bare_repo - set bare "BARE:" - else - # Let user know they're inside the git dir of a non-bare repo - set branch "GIT_DIR!" - end - end - - echo $operation - echo $branch - echo $detached - echo $bare + if test $os -ne 0 + # Shorten the sha ourselves to 8 characters - this should be good for most repositories, + # and even for large ones it should be good for most commits + if set -q sha + set branch (string match -r '^.{8}' -- $sha)... + else + set branch unknown + end + end + set branch "($branch)" + end + end + + if test "true" = $inside_gitdir + if test "true" = $bare_repo + set bare "BARE:" + else + # Let user know they're inside the git dir of a non-bare repo + set branch "GIT_DIR!" + end + end + + echo $operation + echo $branch + echo $detached + echo $bare end function __fish_git_prompt_set_char - set -l user_variable_name "$argv[1]" - set -l char $argv[2] - set -l user_variable $$user_variable_name - - if test (count $argv) -ge 3 - if test -n "$__fish_git_prompt_show_informative_status" - set char $argv[3] - end - end - - set -l variable _$user_variable_name - set -l variable_done "$variable"_done - - if not set -q $variable - set -g $variable (set -q $user_variable_name; and echo $user_variable; or echo $char) - end + set -l user_variable_name "$argv[1]" + set -l char $argv[2] + set -l user_variable $$user_variable_name + + if test (count $argv) -ge 3 + if test -n "$__fish_git_prompt_show_informative_status" + set char $argv[3] + end + end + + set -l variable _$user_variable_name + set -l variable_done "$variable"_done + + if not set -q $variable + set -g $variable (set -q $user_variable_name; and echo $user_variable; or echo $char) + end end function __fish_git_prompt_validate_chars --description "__fish_git_prompt helper, checks char variables" - __fish_git_prompt_set_char __fish_git_prompt_char_cleanstate '✔' - __fish_git_prompt_set_char __fish_git_prompt_char_dirtystate '*' '✚' - __fish_git_prompt_set_char __fish_git_prompt_char_invalidstate '#' '✖' - __fish_git_prompt_set_char __fish_git_prompt_char_stagedstate '+' '●' - __fish_git_prompt_set_char __fish_git_prompt_char_stashstate '$' - __fish_git_prompt_set_char __fish_git_prompt_char_stateseparator ' ' '|' - __fish_git_prompt_set_char __fish_git_prompt_char_untrackedfiles '%' '…' - __fish_git_prompt_set_char __fish_git_prompt_char_upstream_ahead '>' '↑' - __fish_git_prompt_set_char __fish_git_prompt_char_upstream_behind '<' '↓' - __fish_git_prompt_set_char __fish_git_prompt_char_upstream_diverged '<>' - __fish_git_prompt_set_char __fish_git_prompt_char_upstream_equal '=' - __fish_git_prompt_set_char __fish_git_prompt_char_upstream_prefix '' + __fish_git_prompt_set_char __fish_git_prompt_char_cleanstate '✔' + __fish_git_prompt_set_char __fish_git_prompt_char_dirtystate '*' '✚' + __fish_git_prompt_set_char __fish_git_prompt_char_invalidstate '#' '✖' + __fish_git_prompt_set_char __fish_git_prompt_char_stagedstate '+' '●' + __fish_git_prompt_set_char __fish_git_prompt_char_stashstate '$' + __fish_git_prompt_set_char __fish_git_prompt_char_stateseparator ' ' '|' + __fish_git_prompt_set_char __fish_git_prompt_char_untrackedfiles '%' '…' + __fish_git_prompt_set_char __fish_git_prompt_char_upstream_ahead '>' '↑' + __fish_git_prompt_set_char __fish_git_prompt_char_upstream_behind '<' '↓' + __fish_git_prompt_set_char __fish_git_prompt_char_upstream_diverged '<>' + __fish_git_prompt_set_char __fish_git_prompt_char_upstream_equal '=' + __fish_git_prompt_set_char __fish_git_prompt_char_upstream_prefix '' end function __fish_git_prompt_set_color - set -l user_variable_name "$argv[1]" - set -l user_variable $$user_variable_name - set -l user_variable_bright - - set -l default default_done - switch (count $argv) - case 1 # No defaults given, use prompt color - set default $___fish_git_prompt_color - set default_done $___fish_git_prompt_color_done - case 2 # One default given, use normal for done - set default "$argv[2]" - set default_done (set_color normal) - case 3 # Both defaults given - set default "$argv[2]" - set default_done "$argv[3]" - end - - set -l variable _$user_variable_name - set -l variable_done "$variable"_done - - if not set -q $variable - if test -n "$user_variable" - set -g $variable (set_color $user_variable) - set -g $variable_done (set_color normal) - else - set -g $variable $default - set -g $variable_done $default_done - end - end + set -l user_variable_name "$argv[1]" + set -l user_variable $$user_variable_name + set -l user_variable_bright + + set -l default default_done + switch (count $argv) + case 1 # No defaults given, use prompt color + set default $___fish_git_prompt_color + set default_done $___fish_git_prompt_color_done + case 2 # One default given, use normal for done + set default "$argv[2]" + set default_done (set_color normal) + case 3 # Both defaults given + set default "$argv[2]" + set default_done "$argv[3]" + end + + set -l variable _$user_variable_name + set -l variable_done "$variable"_done + + if not set -q $variable + if test -n "$user_variable" + set -g $variable (set_color $user_variable) + set -g $variable_done (set_color normal) + else + set -g $variable $default + set -g $variable_done $default_done + end + end end function __fish_git_prompt_validate_colors --description "__fish_git_prompt helper, checks color variables" - # Base color defaults to nothing (must be done first) - __fish_git_prompt_set_color __fish_git_prompt_color '' '' - - # Normal colors - __fish_git_prompt_set_color __fish_git_prompt_color_prefix - __fish_git_prompt_set_color __fish_git_prompt_color_suffix - __fish_git_prompt_set_color __fish_git_prompt_color_bare - __fish_git_prompt_set_color __fish_git_prompt_color_merging - __fish_git_prompt_set_color __fish_git_prompt_color_cleanstate - __fish_git_prompt_set_color __fish_git_prompt_color_invalidstate - __fish_git_prompt_set_color __fish_git_prompt_color_upstream - - # Colors with defaults with showcolorhints - if test -n "$__fish_git_prompt_showcolorhints" - __fish_git_prompt_set_color __fish_git_prompt_color_flags (set_color --bold blue) - __fish_git_prompt_set_color __fish_git_prompt_color_branch (set_color green) - __fish_git_prompt_set_color __fish_git_prompt_color_dirtystate (set_color red) - __fish_git_prompt_set_color __fish_git_prompt_color_stagedstate (set_color green) - else - __fish_git_prompt_set_color __fish_git_prompt_color_flags - __fish_git_prompt_set_color __fish_git_prompt_color_branch - __fish_git_prompt_set_color __fish_git_prompt_color_dirtystate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done - __fish_git_prompt_set_color __fish_git_prompt_color_stagedstate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done - end - - # Branch_detached has a default, but is only used with showcolorhints - __fish_git_prompt_set_color __fish_git_prompt_color_branch_detached (set_color red) - - # Colors that depend on flags color - __fish_git_prompt_set_color __fish_git_prompt_color_stashstate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done - __fish_git_prompt_set_color __fish_git_prompt_color_untrackedfiles $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done + # Base color defaults to nothing (must be done first) + __fish_git_prompt_set_color __fish_git_prompt_color '' '' + + # Normal colors + __fish_git_prompt_set_color __fish_git_prompt_color_prefix + __fish_git_prompt_set_color __fish_git_prompt_color_suffix + __fish_git_prompt_set_color __fish_git_prompt_color_bare + __fish_git_prompt_set_color __fish_git_prompt_color_merging + __fish_git_prompt_set_color __fish_git_prompt_color_cleanstate + __fish_git_prompt_set_color __fish_git_prompt_color_invalidstate + __fish_git_prompt_set_color __fish_git_prompt_color_upstream + + # Colors with defaults with showcolorhints + if test -n "$__fish_git_prompt_showcolorhints" + __fish_git_prompt_set_color __fish_git_prompt_color_flags (set_color --bold blue) + __fish_git_prompt_set_color __fish_git_prompt_color_branch (set_color green) + __fish_git_prompt_set_color __fish_git_prompt_color_dirtystate (set_color red) + __fish_git_prompt_set_color __fish_git_prompt_color_stagedstate (set_color green) + else + __fish_git_prompt_set_color __fish_git_prompt_color_flags + __fish_git_prompt_set_color __fish_git_prompt_color_branch + __fish_git_prompt_set_color __fish_git_prompt_color_dirtystate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done + __fish_git_prompt_set_color __fish_git_prompt_color_stagedstate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done + end + + # Branch_detached has a default, but is only used with showcolorhints + __fish_git_prompt_set_color __fish_git_prompt_color_branch_detached (set_color red) + + # Colors that depend on flags color + __fish_git_prompt_set_color __fish_git_prompt_color_stashstate $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done + __fish_git_prompt_set_color __fish_git_prompt_color_untrackedfiles $___fish_git_prompt_color_flags $___fish_git_prompt_color_flags_done end set -l varargs for var in repaint describe_style show_informative_status showdirtystate showstashstate showuntrackedfiles showupstream - set varargs $varargs --on-variable __fish_git_prompt_$var + set varargs $varargs --on-variable __fish_git_prompt_$var end function __fish_git_prompt_repaint $varargs --description "Event handler, repaints prompt when functionality changes" - if status --is-interactive - if test $argv[3] = __fish_git_prompt_show_informative_status - # Clear characters that have different defaults with/without informative status - for name in cleanstate dirtystate invalidstate stagedstate stateseparator untrackedfiles upstream_ahead upstream_behind - set -e ___fish_git_prompt_char_$name - end - end - - commandline -f repaint ^/dev/null - end + if status --is-interactive + if test $argv[3] = __fish_git_prompt_show_informative_status + # Clear characters that have different defaults with/without informative status + for name in cleanstate dirtystate invalidstate stagedstate stateseparator untrackedfiles upstream_ahead upstream_behind + set -e ___fish_git_prompt_char_$name + end + end + + commandline -f repaint ^/dev/null + end end set -l varargs for var in '' _prefix _suffix _bare _merging _cleanstate _invalidstate _upstream _flags _branch _dirtystate _stagedstate _branch_detached _stashstate _untrackedfiles - set varargs $varargs --on-variable __fish_git_prompt_color$var + set varargs $varargs --on-variable __fish_git_prompt_color$var end set varargs $varargs --on-variable __fish_git_prompt_showcolorhints function __fish_git_prompt_repaint_color $varargs --description "Event handler, repaints prompt when any color changes" - if status --is-interactive - set -l var $argv[3] - set -e _$var - set -e _{$var}_done - if test $var = __fish_git_prompt_color -o $var = __fish_git_prompt_color_flags -o $var = __fish_git_prompt_showcolorhints - # reset all the other colors too - for name in prefix suffix bare merging branch dirtystate stagedstate invalidstate stashstate untrackedfiles upstream flags - set -e ___fish_git_prompt_color_$name - set -e ___fish_git_prompt_color_{$name}_done - end - end - commandline -f repaint ^/dev/null - end + if status --is-interactive + set -l var $argv[3] + set -e _$var + set -e _{$var}_done + if test $var = __fish_git_prompt_color -o $var = __fish_git_prompt_color_flags -o $var = __fish_git_prompt_showcolorhints + # reset all the other colors too + for name in prefix suffix bare merging branch dirtystate stagedstate invalidstate stashstate untrackedfiles upstream flags + set -e ___fish_git_prompt_color_$name + set -e ___fish_git_prompt_color_{$name}_done + end + end + commandline -f repaint ^/dev/null + end end set -l varargs for var in cleanstate dirtystate invalidstate stagedstate stashstate stateseparator untrackedfiles upstream_ahead upstream_behind upstream_diverged upstream_equal upstream_prefix - set varargs $varargs --on-variable __fish_git_prompt_char_$var + set varargs $varargs --on-variable __fish_git_prompt_char_$var end function __fish_git_prompt_repaint_char $varargs --description "Event handler, repaints prompt when any char changes" - if status --is-interactive - set -e _$argv[3] - commandline -f repaint ^/dev/null - end + if status --is-interactive + set -e _$argv[3] + commandline -f repaint ^/dev/null + end end -- cgit v1.2.3