P4Python:合并实践指南之如何脚本化integrate流程
来源:向华 作者:龙智 发布时间:2022-07-08
什么是合
在大多数场景下,P4 的合并是都以 changelist 为单位进行合并的,但最小影响的单元还是文件。
比如在发布分支 //Game/rel 提交了一个 bug 修复,对应的 changelist 需要合并到主干分支 //Game/main。这是极其常见的合并场景。
合并操作总体分为两步:
- Integrate:生成合并
- Resolve & Submit:解决冲突并提交
在 Integrate 这一步,P4 将会生成合并,但本步经常会产生冲突(Conflict)。根据长期工作观察,大家经常出现困惑的是 integrate,本篇重点讲这一步的惯用技法。
第一步产生冲突后,需要处理才能完成提交,这一步就是 Resolve & Submit。我们后续文章再讲。
怎么合
mkdir -p /Country/City/Corpration/BU/Team
p4 integrate -f -c default //Game/main/…@1234,1234 //Game/rel/…
其中加了 -f 参数,是用来强制合并 changelist 1234 中涉及到的文件的所有历史版本。
这一步操作之后,能够精确完成来自 //Game/main 分支上的 changelist 1234 的合并工作,合并的目标是最后的参数所指向的分支 //Game/rel。
怎么自助合
import argparse
from P4 import P4, P4Exception
import traceback
class P4Integrater:
def __init__(self):
"""
初始化 integrate
"""
self.p4 = P4()
self.p4.connect()
parser = argparse.ArgumentParser()
parser.add_argument('-s','--src', required=True)
parser.add_argument('-d', '--dest', required=True)
parser.add_argument('-c', '--change', required=True)
self.args = parser.parse_args()
def run_integrate(self):
"""
执行 integrate
"""
try:
cmd_params = ['integrate', '-f', '-c', 'default', f'{self.args.src}/...@{self.args.change},{self.args.change}', f'{self.args.dest}/...']
self.p4.run(cmd_params)
print(f'[!DONE!] {self.args.src} ---> {self.args.dest} @{self.args.change}')
except P4Exception:
print(f'=============== Exception ===============')
traceback.print_exc()
if __name__ == "__main__":
_p = P4Integrater()
_p.run_integrate()
p4integrater.exe -s //Game/main -d //Game/rel -c 1234
[!DONE!] //Game/main ---> //Game/rel @1234
怎么批量合
p4integrater.exe -s //Game/main -d //Game/rel -c 45402,45317,45312
[!DONE!] //Game/main ---> //Game/rel @45402
[!DONE!] //Game/main ---> //Game/rel @45317
[!DONE!] //Game/main ---> //Game/rel @45312
# 批量执行 integrate,@func: run_integrate
for ch_num in self.args.change.split(","):
try:
cmd_params = ['integrate', '-f', '-c', 'default', f'{self.args.src}/...@{ch_num},{ch_num}', f'{self.args.dest}/...']
self.p4.run(cmd_params)
print(f'[!DONE!] {self.args.src} ---> {self.args.dest} @{ch_num}')
except P4Exception:
print(f'=============== Exception ===============')
traceback.print_exc()
如需免费试用Perforce Helix Core,请立即联系Perforce授权合作伙伴——龙智:
电话:400-775-5506
邮箱:marketing@shdsd.com