J'ai quelques fonctions liées à git svn qui voient si je dois tirer/pousser depuis/vers le référentiel.
Mon problème est que les fonctions que j'ai écrites pour recueillir ces informations sont trop lentes. Je voudrais les rendre asynchrones pour que PS1
affiche une valeur par défaut, si bien que les données produites par les fonctions soient prêtes, je veux qu'elles soient imprimées.
J'aimerais avoir ces informations dans mon invite - pour que, par exemple, je sache si je dois tirer - sans faire de git svn fetch
à chaque fois.
C'est la fonction que j'appelle pour ajouter un ↑ à ma PS1 si je dois pousser mes modifications.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Ce sont les fonctions que j'appelle pour ajouter un ↓ si je dois tirer. Le premier sert à rafraîchir mon index toutes les 2 minutes pour que je puisse faire le (($latest > $current))
vérifier.
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 "↓"
)
}
Pour les rendre asynchrones, j'ai essayé de les assembler comme ceci :
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
} &
}
Mais cela produit le même comportement lent.
J'ai essayé de mettre les résultats dans un fichier et de les lire ensuite, mais je n'aime pas cette approche.
J'ai pensé à utiliser PROMPT_COMMAND
. Mais ce ne serait pas asynchrone; ce serait sur demande.
Pourriez-vous nous éclairer sur la façon dont PS1
se comporte ou sur ce que je fais mal ?
Merci d'avance.
PS :Quelqu'un avec 300 représentants pourrait-il ajouter les balises async et ps1 ?
MODIFIER :
J'ai ajouté ces lignes à mon .bashrc comme un simple test, cela semblait fonctionner, donc les avoir réécrites (j'ai annulé ma tentative précédente) semble être une bonne chose 🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Je vais mettre cela dans une fonction et vérifier si le travail est déjà en cours d'exécution avant de l'appeler.
Désolé pour cela, après tout, il semble que tout ce dont j'avais besoin était d'écrire à ce sujet. 🙂
Réponse acceptée :
re :votre solution d'une boucle toutes les secondes :vous pouvez écrire dans un fichier dans /tmp, au lieu de dans votre répertoire personnel. Et PS1=$(customW)$(< ~/.ps1)\$ '
économiserait un fork/exec de cat
.
re :la question d'origine :comment obtenir une mise à jour asynchrone sur PS1
:
Pour démarrer une écriture asynchrone sur PS1
:
- définir
PROMPT_COMMAND
à une fonction qui vérifie si les données sont disponibles. - Si c'est le cas, mettez à jour
PS1
et désélectionnezPROMPT_COMMAND
- Si c'est le cas, mettez à jour
- Sinon, laissez
PS1
avec l'ancienne valeur ou l'espace réservé.
- Sinon, laissez
Utiliser un fichier dans /tmp
pour l'E/S asynchrone à écrire, et PROMPT_COMMAND
à lire.
Je pense que cela devrait fonctionner.