Tengo algunas funciones relacionadas con git svn que ven si tengo que extraer/empujar desde/hacia el repositorio.
Mi problema es que las funciones que he escrito para recopilar esta información son demasiado lentas. Me gustaría hacerlos asíncronos para que PS1
muestra un valor predeterminado, si aunque los datos producidos por las funciones están listos, quiero que se impriman.
Me gustaría tener esta información en mi aviso, para que, por ejemplo, sepa si tengo que extraer, sin hacer git svn fetch
siempre.
Esta es la función a la que llamo para agregar un ↑ a mi PS1 si tengo que enviar mis cambios.
function hasToPush {
(($1 == 0)) &&
(git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}
Estas son las funciones que llamo para agregar un ↓ si tengo que tirar. El primero se usa para actualizar mi índice cada 2 minutos para que pueda hacer el (($latest > $current))
verificar.
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 hacerlos asíncronos, he intentado juntarlos así:
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
} &
}
Pero eso produce el mismo comportamiento lento.
He intentado poner los resultados en un archivo y luego leerlo después, pero no me gusta ese enfoque.
He pensado en usar PROMPT_COMMAND
. Pero eso no sería asíncrono; sería bajo demanda.
¿Podría arrojar algo de luz sobre cómo PS1
se comporta o en lo que estoy haciendo mal?
Gracias de antemano.
PD:¿Podría alguien con 300 representantes agregar las etiquetas async y ps1?
EDITAR:
Agregué esta línea a mi .bashrc como una prueba simple, pareció funcionar, por lo que haberlas reescrito (revertí mi intento anterior) parece que fue algo bueno 🙂
while true;
do
discoverScmInfo &>~/.ps1
sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '
Pondré esto en una función y verificaré si el trabajo ya se está ejecutando antes de llamarlo.
Lo siento, después de todo, parece que todo lo que necesitaba era escribir al respecto. 🙂
Respuesta aceptada:
re:su solución de un bucle cada segundo:podría escribir en un archivo en /tmp, en lugar de en su directorio de inicio. Y PS1=$(customW)$(< ~/.ps1)\$ '
guardaría un fork/exec de cat
.
re:la pregunta original:cómo obtener una actualización asíncrona para PS1
:
Para iniciar una escritura asíncrona en PS1
:
- establecer
PROMPT_COMMAND
a una función que verifica si los datos están disponibles. - Si es así, actualice
PS1
y desactivePROMPT_COMMAND
- Si es así, actualice
- Si no, deja
PS1
con el valor antiguo o marcador de posición.
- Si no, deja
Usa un archivo en /tmp
para que el E/S asíncrono escriba, y PROMPT_COMMAND
para leer.
Creo que esto debería funcionar.