如何通过p4python获取所有变更号

1 投票
1 回答
1749 浏览
提问于 2025-04-17 19:53

我定期会进行一次 p4 同步,想知道到底同步了哪些内容。

所以我使用 p4.run_sync 得到的结果是一个包含每次变更的字典列表(这是我理解的)。

sync = p4.run_sync()

当我打印出这些字典的键时,结果是这样的:

sync dict Nr: 0 --------------
* totalFileSize
* rev
* totalFileCount
* clientFile
* fileSize
* action
* depotFile
* change
sync dict Nr: 1 --------------
* action
* clientFile
* rev
* depotFile
* fileSize
sync dict Nr: 2 --------------
* action
* clientFile
* rev
* depotFile
* fileSize

所以只有第一个字典里有一个变更编号!

那我该如何获取其他的变更编号呢?目前我在浏览其他字典的 depotFiles,并通过 p4.fstat 获取 headChange,但这看起来有点像是变通的做法...

其实我希望每个同步的变更编号都能直接获取到描述信息。

或者有没有更合适的方法来做到这一点呢?谢谢!

1 个回答

3

首先,p4.run_sync() 或任何 p4.run_COMMAND() 的返回结果是一个列表,而不是字典。这个列表中的每个元素可以是字典或者字符串,这取决于你使用的perforce服务器的支持情况,以及你是否关闭了标签。

根据p4.run的文档:

Whether the elements of the array are strings or dictionaries depends on
(a) server support for tagged output for the command, and
(b) whether tagged output was disabled by calling p4.tagged = False.
  • 当你运行 p4.run_sync()(相当于 p4 sync ...)时,你会获取到该目录下所有文件的最新版本。
  • 列表中的第一个文件包含了perforce同步到的最新变更编号,这个编号不一定是该文件被修改时的变更编号。
  • 变更编号仅对应于该目录下的最新变更。
  • 列表中其余的文件省略了这个冗余信息。这就是为什么在文件列表中的其他字典里没有 change 这个键的原因。

对于每个文件,你可以在 rev 这个键中找到修订号,这个修订号结合 depotFile 中的完整perforce路径,就对应了版本库中该文件的唯一版本(例如 //depot/branch1/dir1/file1#4)。

你可以通过 fstat 来利用这些信息。(这不是一种 hack 的方式,而是获取特定文件和修订对应的变更编号的正确方法)。

>>> result = p4.run_fstat("//depot/branch1/dir1/file1#4")
>>> print result[0]['headChange']
12345

这表示 //depot/branch1/dir1/file1 的第4个修订是作为变更 12345 的一部分出现的。

撰写回答