2009-12-09 19 views
6

Estoy intentando configurar un archivo fab para implementar mi aplicación Django.Error de red: error fatal: local() encontró un error (código de retorno 2) al ejecutar 'git commit -m' message '

No puedo entender por qué estoy recibiendo este error:

Fatal error: local() encountered an error (return code 2) while executing 'git commit -m 'changed settings for prodserver'

$ fab create_branch_deploy_to_prodserver 
[localhost] run: git checkout prodserver_server 
[localhost] run: git merge master 
[localhost] run: cp settings_prodserver.py settings.py 
[localhost] run: git add settings.py 
[localhost] run: git commit -m 'changed settings for prodserver' 

Fatal error: local() encountered an error (return code 1) while executing 'git commit -m 'changed settings for prodserver'' 

Aborting. 

Aquí, si la función de la tela:

def create_branch_deploy_to_prodserver(): 
    local("git checkout prodserver_server") 
    local("git merge master") 
    local('cp settings_prodserver.py settings.py') # 
    #local('git rm fabfile.py') #This is also creating error so it's commented out 
    local('git add settings.py') 
    local("git commit -m 'changed settings for prodserver'") 

¿Es posible hacer un git commit de ¿Tela?

Respuesta

6

yo era capaz de diagnosticar el problema cuando he añadido captura = False a la declaración:

local('git rm fabfile.py', capture=False) 
local('git add settings.py', capture=False) 

Esto permitió que el error que se mostrará más detalladamente

Aparentemente, el mantenedor de Fabric revertirá el comportamiento de local a no capturar de forma predeterminada, en 1.0.

1

¿Es este un problema relacionado con Python como el descrito en this thread?

The main problem with this is that the stdout/stderr capturing is per-run/sudo invocation and not per-task.

It would be wonderful if you could explain me how I could collect outputand error by only modifying the file called fabfile_runner.py.
Idealy the fabric task itself could be unmodified, this would allow to upload the the factory the same file that you have tested manually.

Check out the Fabric source and look in the 'tests' folder, specifically tests/utils.py. It contains a single decorator, @mock_streams , which is capable of wrapping a function (any function in any Python code -- it's not Fabric specific, as I mentioned) and redirecting sys.stdout and/or sys.stderr for capture/examination.

It's designed for use around functions, being a decorator, so you could use it directly by modifying your fabfile_runner.py like so:

fabfile_runner.py

from StringIO import StringIO 
import sys 
from test_fabfile import hello_world 

def execute(task): 
    output = StringIO() 
    error = StringIO() 
    sys.stdout = output 
    sys.stderr = error 
    task() 
    sys.stdout = sys.__stdout__ 
    sys.stderr = sys.__stderr__ 
    return (output.getvalue(), error.getvalue()) 

output, error = execute(hello_world) 
print "output : %s" %output 
print "error : %s" %error 
Cuestiones relacionadas