Eu tenho algumas funções relacionadas ao git svn que verificam se eu tenho que puxar / empurrar de / para o repositório.
Meu problema é que as funções que escrevi para coletar essas informações são muito lentas. Eu gostaria de torná-los assíncronos para que PS1
mostre um padrão, se os dados produzidos pelas funções estiverem prontos, eu quero que sejam impressos.
Eu gostaria de ter essas informações no meu prompt - para que, por exemplo, eu saiba se tenho que puxar - sem fazer uma git svn fetch
toda vez.
Esta é a função que eu chamo para adicionar um ↑ ao meu PS1 se eu tiver que empurrar minhas alterações.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Estas são as funções que eu chamo para adicionar um ↓ se eu tiver que puxar. O primeiro é usado para atualizar meu índice a cada 2 minutos para que eu possa fazer o (($latest > $current))
check.
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 "↓"
)
}
Para torná-los assíncronos, tentei colocá-los juntos assim:
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
} &
}
Mas isso produz o mesmo comportamento lento.
Eu tentei colocar os resultados em um arquivo e depois lê-lo depois, mas não gosto dessa abordagem.
Eu pensei em usar PROMPT_COMMAND
. Mas isso não seria assíncrono; seria sob demanda.
Você poderia lançar alguma luz sobre como o PS1
se comporta ou sobre o que estou fazendo de errado?
Obrigado antecipadamente.
PS: Alguém com 300 rep pode adicionar as tags async e ps1?
EDITAR:
Eu adicionei estas linhas ao meu .bashrc como um teste simples, ele pareceu funcionar, então tê-las reescrito (reverti minha tentativa anterior) parece ser uma coisa boa:)
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Vou colocar isso em uma função e verificar se o trabalho já está em execução antes de chamá-lo.
Desculpe por isso, afinal parece que tudo que eu precisava era escrever sobre isso. :)