15

我想在 python 中编写一些脚本,对源代码进行一些自动更改。如果脚本确定它需要更改文件,我想先将其从 perforce 中检查出来。我不关心签入,因为我总是想先构建和测试。

4

6 回答 6

21

Perforce 在其 C/C++ 工具周围有 Python 包装器,可用于 Windows 的二进制形式,以及其他平台的源代码:

http://www.perforce.com/perforce/loadsupp.html#api

您会发现他们的脚本 API 文档很有帮助:

http://www.perforce.com/perforce/doc.current/manuals/p4script/p4script.pdf

Python API 的使用与命令行客户端非常相似:

PythonWin 2.5.1 (r251:54863, May  1 2007, 17:47:05) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> import P4
>>> p4 = P4.P4()
>>> p4.connect() # connect to the default server, with the default clientspec
>>> desc = {"Description": "My new changelist description",
...         "Change": "new"
...         }
>>> p4.input = desc
>>> p4.run("changelist", "-i")
['Change 2579505 created.']
>>> 

我将从命令行验证它:

P:\>p4 changelist -o 2579505
# A Perforce Change Specification.
#
#  Change:      The change number. 'new' on a new changelist.
#  Date:        The date this specification was last modified.
#  Client:      The client on which the changelist was created.  Read-only.
#  User:        The user who created the changelist.
#  Status:      Either 'pending' or 'submitted'. Read-only.
#  Description: Comments about the changelist.  Required.
#  Jobs:        What opened jobs are to be closed by this changelist.
#               You may delete jobs from this list.  (New changelists only.)
#  Files:       What opened files from the default changelist are to be added
#               to this changelist.  You may delete files from this list.
#               (New changelists only.)

Change: 2579505

Date:   2008/10/08 13:57:02

Client: MYCOMPUTER-DT

User:   myusername

Status: pending

Description:
        My new changelist description
于 2008-10-08T19:02:38.783 回答
7

这是我想出的:

import os

def CreateNewChangeList(description):
    "Create a new changelist and returns the changelist number as a string"
    p4in, p4out = os.popen2("p4 changelist -i")
    p4in.write("change: new\n")
    p4in.write("description: " + description)
    p4in.close()
    changelist = p4out.readline().split()[1]
    return changelist

def OpenFileForEdit(file, changelist = ""):
    "Open a file for edit, if a changelist is passed in then open it in that list"
    cmd = "p4 edit "
    if changelist:
        cmd += " -c " + changelist + " "
    ret = os.popen(cmd + file).readline().strip()
    if not ret.endswith("opened for edit"):
        print "Couldn't open", file, "for edit:"
        print ret
        raise ValueError
于 2008-10-08T18:33:51.570 回答
4

另一个答案中提到的Perforce 的 P4 Python 模块是可行的方法,但如果安装此模块不是一个选项,您可以使用 -G 标志来帮助解析 p4.exe 输出:

p4 [ options ] command [ arg ... ]
    options:
            -c client -C charset -d dir -H host -G -L language
            -p port -P pass -s -Q charset -u user -x file
    The -G flag causes all output (and batch input for form commands
    with -i) to be formatted as marshalled Python dictionary objects.
于 2008-11-02T02:28:16.150 回答
3

从 p4python 源构建需要下载并提取为该版本推荐的 p4 api。例如,如果为 activepython 2.5 构建 Windows XP x86 版本的 P4Python 2008.2:

  • 下载并解压缩p4python 和p4api
  • 修复 p4python 的 setup.cfg 以指向 p4api 目录。

要打开文件进行编辑(执行签出),请在命令行上查看“p4 help open”。

如果您将文件添加到默认更改列表,则可以在不创建更改列表的情况下签出文件,但最好先创建一个更改列表。

如果没有 Visual Studio 2008,P4Python 目前不能为 activepython 2.6 编译;提供的库是用 2005 或 2003 构建的。强制 p4python 针对 mingw 构建几乎是不可能的,即使使用 pexport 的 python26.dll 并将提供的 .lib 文件重新组合/重新组装成 .a 文件。

在这种情况下,您可能宁愿使用子进程,并将 p4 结果作为编组的 python 对象返回。您可以编写自己的命令包装器,它接受一个 arg 数组,构造并运行命令,并返回结果字典。

您可以尝试更改所有内容,测试并成功,打开与“p4 diff -se //...”等效的文件不同的文件

于 2008-11-21T04:55:35.793 回答
2

您可能想查看 P4Python 模块。它在 perforce 网站上可用,它使事情变得非常简单。

于 2008-10-08T18:45:24.340 回答
2

请记住,为 p4api 安装 Python 的开发包,否则它会抱怨缺少标头。在 Ubuntu 10.10 中,只需做一个简单的:

apt-get install python2.6-dev

或者

apt-get install python3.1-dev
于 2010-11-22T04:33:38.387 回答