[pyar] subprocess y svn pre-commit

Andrés Gattinoni andresgattinoni en gmail.com
Vie Ago 19 19:31:39 ART 2011


2011/8/19 Andrés Gattinoni <andresgattinoni en gmail.com>:
> Hice un hook para el SVN que se ejecuta en pre-commit haciendo chequeo
> de sintaxis de PHP, BASH y Javascript.
> El script funciona perfecto cuando comiteo algunos archivos, pero para
> probar hoy se me ocurrió re-commitear todo el proyecto y se complicó
> un poco la cosa.
> [...]
> Por qué puede ser que se quede ahí?

Bueno, encontré el problema... parece que cuando hay un cartel rojo
enorme en la documentación es bueno leerlo.
La cuestión es que yo estaba haciendo wait() en el proceso antes de
leer la salida, y cuando la salida es muy grande se deadlockea.

Con eso todo bien, lo corregí e hice algunos otros cambios, pero ahora
me encuentro con otro problema que no estoy pudiendo resolver.
El script hace muchos subprocess.Popen() para llamar a los intépretes
correspondientes y chequear la sintaxis. Después de chequear varios me
tira este error:

Traceback (most recent call last):
  File "/home/subversion/svn_test/hooks/pre-commit", line 188, in <module>
    sys.exit(main(sys.argv))
  File "/home/subversion/svn_test/hooks/pre-commit", line 184, in main
    return check_commit(rep, txn)
  File "/home/subversion/svn_test/hooks/pre-commit", line 169, in check_commit
    errors += check_file(f, checkers, rep, txn)
  File "/home/subversion/svn_test/hooks/pre-commit", line 148, in check_file
    r = check(tmpfile, filename)
  File "/home/subversion/svn_test/hooks/pre-commit", line 85, in check_php
    return run([_PHP_PATH, '-l', filename], filename, realname)
  File "/home/subversion/svn_test/hooks/pre-commit", line 67, in run
    stderr=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1039, in _execute_child
    errpipe_read, errpipe_write = os.pipe()
OSError: [Errno 24] Too many open files

Según entiendo eso es por los file descriptors que va a abriendo para
stdout y stderr al usar subprocess.PIPE. El tema es que no sé cómo
hacer para que se cierren esos descriptores cuando no los uso. Intenté
hacerlo explícitamente pero no cambia nada.
Saben cuál es la forma de resolverlo?

Este es el script actualizado:
http://pastebin.com/zsbzLABn

Saludos,

A



More information about the pyar mailing list