Ho alcune funzioni relative a git svn che vedono se devo eseguire il pull/push da/verso il repository.
Il mio problema è che le funzioni che ho scritto per raccogliere queste informazioni sono troppo lente. Vorrei renderli asincroni in modo che PS1
mostra un default, se però i dati prodotti dalle funzioni sono pronti voglio che vengano stampati.
Vorrei avere queste informazioni nel mio prompt, in modo che, ad esempio, sappia se devo eseguire il pull, senza eseguire un git svn fetch
ogni volta.
Questa è la funzione che chiamo per aggiungere un ↑ alla mia PS1 se devo eseguire il push delle mie modifiche.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Queste sono le funzioni che chiamo per aggiungere un ↓ se devo tirare. Il primo viene utilizzato per aggiornare il mio indice ogni 2 minuti in modo da poter eseguire (($latest > $current))
controlla.
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 "↓"
)
}
Per renderli asincroni, ho provato a metterli insieme in questo modo:
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
} &
}
Ma questo produce lo stesso comportamento lento.
Ho provato a inserire i risultati in un file e poi a leggerlo, ma questo approccio non mi piace.
Ho pensato di usare PROMPT_COMMAND
. Ma non sarebbe asincrono; sarebbe su richiesta.
Potresti far luce su come PS1
si comporta o su cosa sbaglio?
Grazie in anticipo.
PS:qualcuno con 300 rappresentanti potrebbe aggiungere i tag async e ps1?
MODIFICA:
Ho aggiunto queste righe al mio .bashrc come semplice test, sembrava funzionare, quindi averle riscritte (ho ripristinato il mio precedente tentativo) sembra essere stata una buona cosa 🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Lo inserirò in una funzione e verificherò se il lavoro è già in esecuzione prima di chiamarlo.
Mi dispiace per questo, dopotutto sembra che tutto ciò di cui avevo bisogno fosse scriverlo. 🙂
Risposta accettata:
re:la tua soluzione di un ciclo ogni secondo:potresti scrivere su un file in /tmp, invece che nella tua home directory. E PS1=$(customW)$(< ~/.ps1)\$ '
salverebbe un fork/exec di cat
.
re:la domanda originale:come ottenere un aggiornamento asincrono su PS1
:
Per avviare un asincrono, scrivi su PS1
:
- imposta
PROMPT_COMMAND
a una funzione che controlla se i dati sono disponibili. - Se lo è, aggiorna
PS1
e deselezionaPROMPT_COMMAND
- Se lo è, aggiorna
- In caso contrario, lascia
PS1
con il valore vecchio o segnaposto.
- In caso contrario, lascia
Usa un file in /tmp
per l'IO asincrono in cui scrivere e PROMPT_COMMAND
da cui leggere.
Penso che dovrebbe funzionare.