Mám několik funkcí souvisejících s git svn, které zjišťují, zda musím stahovat/tlačit z/do úložiště.
Můj problém je v tom, že funkce, které jsem napsal ke shromažďování těchto informací, jsou příliš pomalé. Chtěl bych je nastavit jako asynchronní, aby PS1
zobrazuje výchozí, pokud jsou data vytvořená funkcemi připravena, chci je vytisknout.
Chtěl bych mít tyto informace ve výzvě – abych například věděl, zda musím stáhnout – aniž bych musel provádět git svn fetch
pokaždé.
Toto je funkce, kterou volám, abych přidal ↑ do mého PS1, pokud musím provést změny.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Toto jsou funkce, které volám, abych přidal ↓, pokud musím táhnout. První se používá k aktualizaci mého indexu každé 2 minuty, abych mohl provést (($latest > $current))
zkontrolovat.
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 "↓"
)
}
Aby byly asynchronní, pokusil jsem se je sestavit takto:
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
} &
}
To však vede ke stejně pomalému chování.
Zkoušel jsem vložit výsledky do souboru a poté si jej přečíst, ale tento přístup se mi nelíbí.
Přemýšlel jsem o použití PROMPT_COMMAND
. Ale to by nebylo asynchronní; bylo by to na vyžádání.
Mohl byste osvětlit, jak PS1
chová nebo co dělám špatně?
Předem děkuji.
PS:Mohl by někdo s 300 rep. přidat značky async a ps1?
EDIT:
Přidal jsem tyto řádky do svého .bashrc jako jednoduchý test, zdálo se, že to funguje, takže jejich přepsání (vrátil jsem svůj předchozí pokus) se zdá být dobrá věc 🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Vložím to do funkce a zkontroluji, zda úloha již běží, než ji zavolám.
Omlouvám se za to, nakonec se zdá, že vše, co jsem potřeboval, bylo o tom napsat. 🙂
Přijatá odpověď:
re:vaše řešení smyčky každou sekundu:můžete zapisovat do souboru v /tmp místo do vašeho domovského adresáře. A PS1=$(customW)$(< ~/.ps1)\$ '
by uložil fork/exec cat
.
re:původní otázka:jak získat asynchronní aktualizaci na PS1
:
Pro spuštění asynchronního zápisu do PS1
:
- nastavte
PROMPT_COMMAND
na funkci, která kontroluje, zda jsou data dostupná. - Pokud ano, aktualizujte
PS1
a zrušte nastaveníPROMPT_COMMAND
- Pokud ano, aktualizujte
- Pokud ne, opusťte
PS1
se starou nebo zástupnou hodnotou.
- Pokud ne, opusťte
Použijte soubor v /tmp
pro asynchronní IO, do kterého se má zapisovat, a PROMPT_COMMAND
ke čtení.
Myslím, že by to mělo fungovat.