Script Bash untuk Intergrasi dengan Git

Sehari-hari saya menggunakan gnome-terminal untuk melakukan pekerjaan saya. Selain itu saya juga hampir selalu menggunakan program untuk mengontrol versi kode yang dikenal dengan Git. Lalu, muncul keinginan untuk mengintegrasikan keduanya, bagaimana agar kedua program ini bisa terintegrasi sehingga dapat mempermudah pekerjaan saya?

Begin with the End

Nantinya gnome-terminal akan mampu mendeteksi apakah dia berada pada sebuah direktori yang terhubung dengan Git atau tidak, mampu mendeteksi nama branch yang sedang digunakan, dan juga mampu medeteksi state dari branch tersebut.

Pertama-tama script dimulai dengan memodifikasi tampilan bash prompt, yang biasa nya terlihat seperti

user@comp:~$ █

menjadi seperti

( ~ ) > █

Membuat function menggunakan bash script dapat dilakukan dengan cara seperti biasa menulis program menggunakan bahasa pemrograman lainnya.

function _prompt_command(){
}

Untuk mengubah tampilan prompt diperlukan variabel bash yang dikenal dengan identifier PS1. Cara assign nilai pada variabel bash memerlukan kata kunci export. Membuat tampilan ( ~ ) faktanya memerlukan kode yang cukup panjang sehingga saya memisah assign nilai variabel PS1 ini dengan cara append nilai ke variabel. Fungsi lengkap nya akan tampak seperti ini

function _prompt_command() {
    export PS1='\n\[\e[1;31m\]( '
    export PS1=$PS1'\[\e[1;33m\]\W \[\e[1;31m\]) '
    export PS1=$PS1'\[\e[1;32m\]> '
    export PS1=$PS1'\[\e[0m\] '
}
PROMPT_COMMAND=_prompt_command

Langkah selanjutnya adalah menambahkan integrasi ke Git. Supaya lebih rapi saya membuat sebuah fungsi lagi khusus untuk fungsionalitas deteksi Git ini. Dan nantinya fungsi tersebut dapat dengah mudah dimasukan kedalam fungsi _promp_command.

function _prompt_command() {
    export PS1='\n\[\e[1;31m\]( '
    export PS1=$PS1'\[\e[1;33m\]\W \[\e[1;31m\]) '
    export PS1=$PS1"`_git_prompt`"
    export PS1=$PS1'\[\e[1;32m\]> '
    export PS1=$PS1'\[\e[0m\] '
}
PROMPT_COMMAND=_prompt_command

Keseluruhan kode yang dapat digunakan, dan tinggal ditambahkan ke akhir berkas .bashrc akan tampak seperti berikut

# ====================================================================

function _git_prompt() {
    local git_status="`git status -unormal 2>&1`"
    if ! [[ "$git_status" =~ Not\ a\ git\ repo ]]; then
        if [[ "$git_status" =~ nothing\ to\ commit ]]; then
            local ansi=42
        elif [[ "$git_status" =~ nothing\ added\ to\ commit\ but\ untracked\ files\ present ]]; then
            local ansi=43
        else
            local ansi=41
        fi
        if [[ "$git_status" =~ On\ branch\ ([^[:space:]]+) ]]; then
            branch=${BASH_REMATCH[1]}
        else
            branch="(`git describe --all --contains --abbrev=4 HEAD 2> /dev/null ||
                echo HEAD`)"
        fi
        echo -n '\[\e[0;37;'"$ansi"';1m\]'" $branch "'\[\e[0m\] '
    fi
}

function _prompt_command() {
    export PS1='\n\[\e[1;31m\]( '
    export PS1=$PS1'\[\e[1;33m\]\W \[\e[1;31m\]) '
    export PS1=$PS1"`_git_prompt`"
    export PS1=$PS1'\[\e[1;32m\]> '
    export PS1=$PS1'\[\e[0m\] '
}
PROMPT_COMMAND=_prompt_command

# ====================================================================
# Git Integration
# ====================================================================

Saya sebenarnya belum terlalu men-_debug_ fungsi _git_prompt, kode tersebut merupakan hasil pengembaraan saya di Google, sudah cukup lama sehingga saya lupa sumber aslinya. Seluruh tampilan karakter dalam variabel PS1 juga bisa diubah, dan disesuaikan dengan keinginan.