El nodo child_process spawn se cuelga al llamar a git shortlog -sn

Mi escenario

En mi aplicación de nodo estoy usando child_process.spawn para consultar información del repository actual

Creé una pequeña function para devolver una promise que se resuelve con la respuesta del command:

const spawn = require('child_process').spawn; const gitExec = command => ( new Promise((resolve, reject) => { const thread = spawn('git', command); const stdOut = []; const stdErr = []; thread.stdout.on('data', (data) => { stdOut.push(data.toString('utf8')); }); thread.stderr.on('data', (data) => { stdErr.push(data.toString('utf8')); }); thread.on('close', () => { if (stdErr.length) { reject(stdErr.join('')); return; } resolve(stdOut.join()); }); }) ); module.exports = gitExec; 

Llamar a la git branch funciona de la manera esperada:

 gitExec(['branch']) .then((branchInfo) => { console.log(branchInfo); }) 

(como se esperaba) resultados en

  * develop feature/forever feature/sourceconfig feature/testing master 

Según mi entender, esto demuestra el método que estoy usando para estar realmente trabajando.

Cuando se llama a git shortlog -sn el process generado se "cuelga" y no se resuelve en nada

 gitExec(['shortlog', '-sn']) .then((shortlogInfo) => { console.log(shortlogInfo); }) 

Llamar a git shortlog -sn través de la línea de command es el resultado esperado:

  154 Andreas Gack 89 Some other dude 6 Whoever else 

Mi (hasta ahora sin éxito) intenta

El uso de spawnSync (mientras cambio mi function gitExec para acomodar el enfoque sincrónico) devuelve un object tal como está documentado, por lo que el process parece salir realmente, pero los objects relevantes de la output del object stdout y stderr están vacíos.
El status del object es 0 que indica que el command se ejecutará con éxito

He leído acerca de tener que networkingefinir el maxBuffer en las opciones de maxBuffer , pero ni establecerlo en un valor (ridículamente) alto ni un valor muy pequeño marca una diferencia en el enfoque sincrónico o asynchronous.

Establecer la opción de shell en true tampoco hace una diferencia en todos los escenarios anteriores.

El problema ocurre tanto en mi Win10x64 como en las MacOs que ejecutan el nodo v6.9.xo 7.x.

También llamar al alias git log --pretty=short no proporciona un resultado

Mi pregunta real

  • ¿Alguien ha logrado consultar con éxito el git shortlog -sn través de child_process.spawn?
  • ¿Alguien sabe un module para Node que permite consultar el repository git local actual?

De alguna manera creo que los dos commands git branch y git shortlog manejan internamente su salida de una manera diferente.

Me encantaría crear un problema en su página github, pero en realidad no sé cómo identificar la causa real de ese problema.

Cualquier otra input es muy apreciada!

git shortlog cree que necesita leer algo de stdin es por eso que todo el process se bloquea. Para solucionarlo, puede pasar stdin del process principal como una opción y conectar todo lo demás como de costumbre. Entonces debería funcionar.

 const spawn = require('child_process').spawn; const gitExec = command => ( new Promise((resolve, reject) => { const thread = spawn('git', command, { stdio: ['inherit', 'pipe', 'pipe'] }); const stdOut = []; const stdErr = []; thread.stdout.on('data', (data) => { stdOut.push(data.toString('utf8')); }); thread.stderr.on('data', (data) => { stdErr.push(data.toString('utf8')); }); thread.on('close', () => { if (stdErr.length) { reject(stdErr.join('')); return; } resolve(stdOut.join()); }); }) ); module.exports = gitExec; 

Tal vez un poco más de context de la documentation de git :

Si no se pasan revisiones en la línea de command y la input estándar no es un terminal o no hay una bifurcación actual, git shortlog generará un resumen de la lectura de logging de la input estándar, sin reference al depósito actual.

Cuál es el caso cuando se genera un process secundario. Por lo tanto, espera que algo pase a través de stdin . Al establecer stdin en el process principal, git shortlog conoce el terminal y por lo tanto se ejecutará.

    Intereting Posts