Preencher PS1 de forma assíncrona

3

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. :)

    
por Alberto Zaccagni 23.11.2011 / 18:32

1 resposta

1

re: sua solução de um loop a cada segundo: você poderia gravar em um arquivo em / tmp, em vez de em seu diretório pessoal. E PS1=$(customW)$(< ~/.ps1)\$ ' salvaria um fork / exec de cat .

re: a pergunta original: como obter uma atualização assíncrona para PS1 : Para iniciar uma gravação async em PS1 :

  • defina PROMPT_COMMAND para uma função que verifique se os dados estão disponíveis.
    • Se for, atualize PS1 e desative PROMPT_COMMAND
    • Se não, deixe PS1 com o valor antigo ou de espaço reservado.

Use um arquivo em /tmp para o IO assíncrono para gravar e PROMPT_COMMAND para ler.

Acho que isso deve funcionar.

    
por 21.04.2015 / 19:14