【兔头蒜笔记 | P4常用命令】p4 change

在开发基于 p4 的 publish 工具时,为了避免 default 里可能存在的更改项与当前需要提交的文件们混淆,因此需要为其创建一个干净的 changelist。

一些准备工作

import os
import stat
import subprocess


def connect_p4(data_pack):
    """
    Connect to p4 according to data_pack and return p4 instance if successful
    """
    # data_pack = [port, clnt, user, pswd]
    p4 = P4()
    p4.port = data_pack[0]
    p4.client = data_pack[1]
    p4.user = data_pack[2]

    # NOTE: This is to avoid p4 raising warnings when the depo is up-to-date
    #       https://perforce-user.perforce.narkive.com/VbxnHKt2/p4-why-is-being-up-to-date-a-warning
    p4.exception_level = 1
    try:
        p4.connect()
        return p4
    except P4Exception:
        for e in p4.errors:
            print(e)
        p4.disconnect()
        return None

通过 p4 change 命令 p4.run(“change”) 可以创建一个新的 changelist。

def test_change(data_pack):
    p4 = connect_p4(data_pack)
    if p4:
        res = p4.run("change")
        print(res)
    return

运行后会弹出一个临时文件,可以在这个临时文件里编辑各种信息:把 Files 整个删掉即可,再填入 description (必填)。
完成后保存退出。
在这里插入图片描述
命令返回的 res 可以 print 出来,是一个列表,包含了创建的 changlist ID
在这里插入图片描述
打开 p4,7291 就是我们刚刚创建的空的 changelist 了。
在这里插入图片描述
但是在工具中,不可能每次都弹出 tmp 文件让使用者手动输入,清除,这太鸡肋了。
官方的 p4 文档 中有一个 flag “-o”,可以将 changelist 规范输出,我们 print 出来看看。

def test_change(data_pack):
    p4 = connect_p4(data_pack)
    if p4:
        # res = p4.run("change")
        change = p4.run("change", "-o")
        print('change :', change)
    return

是个列表,里面是一个字典,写了 changelist 的详细信息。由此,我们可以对该字典值进行设置。
在这里插入图片描述
按下列执行后,除了 print 出信息后,p4 上并没有新创建的 changelist。

def test_change(data_pack):
    p4 = connect_p4(data_pack)
    if p4:
        # res = p4.run("change")
        change = p4.run("change", "-o")
        change[0]['Description'] = "Just for test."
        change[0]['Files'] = ""
        print('change :', change)
    return

再加一条将它 save了就 ok 啦。

change_list_id = p4.save_change(change)[0].split()[1]

在这里插入图片描述