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.