Saya memiliki beberapa fungsi terkait git svn yang melihat apakah saya harus menarik/mendorong dari/ke repositori.
Masalah saya adalah bahwa fungsi yang saya tulis untuk mengumpulkan informasi ini terlalu lambat. Saya ingin membuatnya asinkron sehingga PS1
menunjukkan default, jika meskipun data yang dihasilkan oleh fungsi sudah siap, saya ingin itu dicetak.
Saya ingin memiliki informasi ini di Prompt saya – sehingga, misalnya, saya tahu jika saya harus menarik – tanpa melakukan git svn fetch
setiap saat.
Ini adalah fungsi yang saya panggil untuk menambahkan ke PS1 saya jika saya harus mendorong perubahan saya.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Ini adalah fungsi yang saya panggil untuk menambahkan jika saya harus menarik. Yang pertama digunakan untuk me-refresh indeks saya setiap 2 menit sehingga saya dapat melakukan (($latest > $current))
periksa.
function loopingGitSvnFetch {
sleep 120
git svn fetch &>/dev/null
}
loopingGitSvnFetch &
function hasToPull {
(($1 == 0)) && (
latest=$(git svn log | awk 'NR==2' | cut -d ' ' -f1 | tr -d 'r')
current=$2
(($latest > $current)) && echo "↓"
)
}
Untuk membuatnya tidak sinkron, saya mencoba menggabungkannya seperti ini:
function async {
{
git diff-index --quiet --cached HEAD &>/dev/null
dirty=$(echo $?)
push=$(hasToPush $dirty)
gitsvn=$(git svn info 2> /dev/null | grep Revision)
gitsvn=${gitsvn#Revision: }
pull=$(hastoPull $dirty $gitsvn)
callback $push $pull
} &
}
Tapi itu menghasilkan perilaku lambat yang sama.
Saya sudah mencoba memasukkan hasil ke dalam file dan kemudian membacanya, tapi saya tidak suka pendekatan itu.
Saya telah berpikir untuk menggunakan PROMPT_COMMAND
. Tapi itu tidak akan async; itu akan sesuai permintaan.
Bisakah Anda menjelaskan bagaimana PS1
berperilaku atau apa yang saya lakukan salah?
Terima kasih sebelumnya.
PS:Bisakah seseorang dengan 300 perwakilan menambahkan tag async dan ps1?
EDIT:
Saya menambahkan baris ini ke .bashrc saya sebagai tes sederhana, sepertinya berhasil, jadi setelah menulis ulang (saya mengembalikan upaya saya sebelumnya) tampaknya adalah hal yang baik 🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Saya akan menempatkan ini dalam sebuah fungsi dan memeriksa apakah pekerjaan sudah berjalan sebelum memanggilnya.
Maaf tentang ini, lagipula sepertinya yang saya butuhkan hanyalah menulis tentangnya.
Jawaban yang Diterima:
re:solusi loop Anda setiap detik:Anda dapat menulis ke file di /tmp, alih-alih di direktori home Anda. Dan PS1=$(customW)$(< ~/.ps1)\$ '
akan menyimpan fork/exec dari cat
.
re:pertanyaan awal:bagaimana cara mendapatkan pembaruan async ke PS1
:
Untuk memulai async, tulis ke PS1
:
- setel
PROMPT_COMMAND
ke fungsi yang memeriksa apakah data tersedia. - Jika ya, perbarui
PS1
dan hapusPROMPT_COMMAND
- Jika ya, perbarui
- Jika tidak, tinggalkan
PS1
dengan nilai lama atau placeholder.
- Jika tidak, tinggalkan
Gunakan file di /tmp
untuk async IO untuk menulis, dan PROMPT_COMMAND
untuk membaca dari.
Saya pikir ini harus berhasil.