在python中运行多个gerrit查询

时间:2015-02-18 05:49:16

标签: python git

我正在尝试在python中运行gerrit cherry pick查询

query_to_run='git fetch https://gerritserver.com/projectname refs/changes/51/1151/1 ' + '&&' +  ' git cherry-pick FETCH_HEAD'

我收到错误: 致命:无法找到远程参考&& 意外的命令流结束

我的代码与其他gerrit查询一起使用,但不是这个,是&&这引起了问题!

感谢 普拉蒂巴

1 个答案:

答案 0 :(得分:0)

&&令牌对Git或Gerrit没有意义,但是由shell解释。默认情况下,子进程模块不会将命令传递给shell但直接运行进程,因此query_to_run中的字符串将作为单个命令发送。要强制subprocess.Popen(),subprocess.check_call()或您用来将命令传递给shell的任何内容,请传递shell = True:

subprocess.check_call(query_to_run, shell=True)

但是,不鼓励使用shell = True,在这种情况下是不必要的。 &&所做的只是运行一个命令,如果成功,则运行另一个命令。它基本上等同于这个Python语句序列:

subprocess.check_call(command1)
subprocess.check_call(command2)

或者,如果您希望在任一命令失败时不抛出异常:

subprocess.call(command1) != 0 and subprocess.call(command2) != 0

除此之外,我强烈建议通过将参数列表传递给流程执行函数而不是字符串来养成良好的习惯。传递字符串很多时候都很好,但是当参数包含空格时,你突然需要考虑引用。

将所有内容放在一起,这就是认为您的代码应该如下所示:

try:
    subprocess.check_call(['git', 'fetch', 
                           'https://gerritserver.com/projectname',
                           'refs/changes/51/1151/1'])
    subprocess.check_call(['git', 'cherry-pick', 'FETCH_HEAD'])
except (EnvironmentError, subprocess.CalledProcessError):
    # Suitable error handling here. I'm not sure about
    # the possibility of EnvironmentError exceptions.

另外,关于术语的说明:您正在谈论Gerrit 查询,但使用该语言可能会让人感到困惑。通过Gerrit查询,通常意味着在UI(或等效的REST API)中的搜索框中输入Lucene查询字符串。