如何通过Perforce Python API检索当天提交的变更列表

1 投票
4 回答
4104 浏览
提问于 2025-04-17 22:56

我刚接触Perforce的Python API,还在摸索中。目前为止,我已经能够根据文件名获取一些变更列表的信息,比如编号、描述等。我想要获取一个指定日期/时间范围内所有已提交的变更列表,这样我就可以收集到像更改的文件和每个变更列表的描述等信息。请问有没有办法通过这个API来实现呢?

谢谢

4 个回答

0

你需要加上 -l 这个选项,才能显示完整的描述内容,而 desc 不能通过 .desc 来获取。
这个方法在我用 python3 的时候是有效的。

from P4 import P4, P4Exception
p4 = P4()
p4.port = "A"
p4.user = "B"
p4.client = "C"

try:
    p4.connect()
    changelist = p4.run_changes('-l', '//server/folder/...@yyyy/mm/dd,@now')
    # p4.run("change","//server/folder/...@yyyy/mm/dd,@now") works as well
    for c in changelist:
      print(c['desc'])
      # or whatever you want, including: status, client, user, changelist...

except P4Exception:
    for e in p4.errors:
        print e

finally:
    p4.disconnect()
0

你也可以使用类似这样的代码:

from P4 import P4, P4Exception
p4 = P4()
p4.port = "A"
p4.user = "B"
p4.client = "C"

try:
    p4.connect()
    changelist = p4.run_changes('//server/folder/...@yyyy/mm/dd,@now')
    # p4.run("change","//server/folder/...@yyyy/mm/dd,@now") works as well
    for c in changelist:
      print c.desc
      # or whatever you want, including: status, client, user, changelist...

except P4Exception:
    for e in p4.errors:
        print e

finally:
    p4.disconnect()

在我看来,这种方式更正确,因为它使用了P4Python的API和正确的运行方法(调用p4 change命令),而且你还可以获得关于每个变更列表的更多信息。

Chee

2

下面的代码会输出今天在file.c文件上的变更列表:

import subprocess
import datetime
curr = datetime.datetime.now()
file = "file.c"
cmd = 'p4 changes -s submitted %s@%s/%s/%s,@now' % (file, curr.year, curr.month, curr.day)
print subprocess.check_call(cmd)

请注意,在运行上面的脚本之前,你需要在环境中设置好P4PORT和P4USER。如果不想设置的话,可以在命令中使用-p和-u选项来设置它们。

在上面的代码中,创建了一个查询,用来获取今天在file.c文件上的变更列表。你可以调整日期和文件名,以达到你想要的结果。

1

根据对P4Python文档的阅读和Perforce论坛上的一个问题,这段代码可能可以解决问题,但请注意,这段代码完全没有经过测试,所以使用时要小心。

在filelog命令中,...似乎是用来请求文件夹中所有文件的方式,所以你只需要把serverfolder替换成合适的值就可以了。

from P4 import P4, P4Exception
p4 = P4()
p4.port = "1"
p4.user = "User"
p4.client = "Client"

try:
    p4.connect()
    changelist = p4.run_filelog('//server/folder/...@yyyy/mm/dd,@now')
    for r in changelist:
      print r.depotFile
      print r.revisions[0].time

except P4Exception:
    for e in p4.errors:
        print e

finally:
    p4.disconnect()

** 是的,我本可以下载Perforce,安装它,添加一些文件,然后测试这段代码,但那样做似乎有点过于复杂了。

撰写回答