aboutsummaryrefslogtreecommitdiffhomepage
path: root/share/functions/__fish_hg_prompt.fish
blob: a982d5379a17df24090ec0b9c4dd1f9def441e8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Adapted from __terlar_git_prompt

set -g fish_color_hg_clean green
set -g fish_color_hg_modified yellow
set -g fish_color_hg_dirty red

set -g fish_color_hg_added green
set -g fish_color_hg_renamed magenta
set -g fish_color_hg_copied magenta
set -g fish_color_hg_deleted red
set -g fish_color_hg_untracked yellow
set -g fish_color_hg_unmerged red

set -g fish_prompt_hg_status_added '✚'
set -g fish_prompt_hg_status_modified '*'
set -g fish_prompt_hg_status_copied '⇒'
set -g fish_prompt_hg_status_deleted '✖'
set -g fish_prompt_hg_status_untracked '?'
set -g fish_prompt_hg_status_unmerged '!'

set -g fish_prompt_hg_status_order added modified copied deleted untracked unmerged

function __fish_hg_prompt --description 'Write out the hg prompt'
    set -l branch (hg branch ^/dev/null)
    if test -z $branch
        return
    end

    echo -n '|'

    set -l repo_status (hg status |cut -c 1-2|sort -u|uniq)

    # Show nice color for a clean repo
    if test -z "$repo_status"
        set_color $fish_color_hg_clean
        echo -n $branch'✓'
        set_color normal

    # Handle modified or dirty (unknown state)
    else
        set -l hg_statuses
        set -l modified

        # Take actions for the statuses of the files in the repo
        for line in $repo_status

            # Determine if we are modified or dirty
            if echo $line | grep -qc '^[AMCD]'
                set modified 1
            end

            # Add a character for each file status if we have one
            switch $line
                case 'A '               ; set hg_statuses $hg_statuses added
                case 'M ' ' M'          ; set hg_statuses $hg_statuses modified
                case 'C '               ; set hg_statuses $hg_statuses copied
                case 'D ' ' D'          ; set hg_statuses $hg_statuses deleted
                case '\? '              ; set hg_statuses $hg_statuses untracked
                case 'U*' '*U' 'DD' 'AA'; set hg_statuses $hg_statuses unmerged
            end
        end

        if set -q modified[1]
            set_color $fish_color_hg_modified
        else
            set_color $fish_color_hg_dirty
        end

        echo -n $branch'⚡'

        # Sort status symbols
        for i in $fish_prompt_hg_status_order
            if contains $i in $hg_statuses
                set -l color_name fish_color_hg_$i
                set -l status_name fish_prompt_hg_status_$i

                set_color $$color_name
                echo -n $$status_name
            end
        end

        set_color normal
    end

end