Perl脚本执行p4 shelve时如何跳过编辑器实现非交互运行
非交互模式执行p4 shelve的可行方案
默认无参数调用p4 shelve时弹出编辑器,本质是操作默认变更列表的过程中,Perforce会自动生成新的编号变更列表,要求交互填写变更描述。无人工介入的服务端场景下,可通过以下三种方案实现自动搁置,同时获取对应已搁置变更列表编号:
- 方案1:预创建带描述的变更列表后执行搁置(稳定性最高,官方推荐)
先通过P4模块接口创建预填好描述的变更列表,将需要搁置的文件移入该列表后,指定变更列表编号执行shelve,全程不会触发交互编辑器。
参考实现代码:
use P4; my $client = $ENV{client}; my $p4 = P4->new(); $p4->Connect(); $p4->SetClient($client); # 拉取默认变更列表表单,填入预设描述 my $cl_spec = $p4->FetchChange(); $cl_spec->{'Description'} = "自动搁置:服务端定时任务提交代码变更"; # 提交表单生成新的带编号变更列表 my $shelve_cl = $p4->SaveChange($cl_spec); # 将默认变更列表下的所有打开文件移入新建的变更列表,若文件已在指定列表可跳过该步 $p4->Run('reopen', '-c', $shelve_cl, '//...'); # 指定变更列表执行搁置,无交互 $p4->Run('shelve', '-c', $shelve_cl); # $shelve_cl即为当前已搁置的变更列表编号,可直接用于后续流程
- 方案2:通过
-d参数直接传入变更描述,跳过交互
若不需要提前创建变更列表,可直接在shelve命令后追加-d参数传入预设描述,Perforce会自动创建带该描述的变更列表完成搁置,不会唤起编辑器。
参考实现代码:
# 替换原有shelve调用逻辑即可 my $shelve_res = $p4->Run('shelve', '-d', "自动搁置:服务端无交互场景提交"); # 从返回结果$shelve_res中解析`change`字段,即可获取自动生成的已搁置变更列表编号
该方案默认会搁置当前默认变更列表下的所有打开文件,若需要搁置指定文件,直接在命令参数后追加对应文件路径即可。
- 方案3:临时覆盖P4EDITOR环境变量(兜底方案)
若不想调整现有shelve调用逻辑,可在执行P4操作前临时覆盖P4EDITOR环境变量,将其设为自动写入描述、自动保存退出的命令,让系统唤起“编辑器”时自动完成表单填写,无需人工操作。
参考实现代码:
# Unix环境下设置 local $ENV{P4EDITOR} = 'echo "自动搁置:服务端无交互提交" >'; # Windows环境下替换为:local $ENV{P4EDITOR} = 'cmd /c echo 自动搁置:服务端无交互提交 >'; # 原有连接、shelve逻辑保持不变即可 my $p4 = P4->new(); $p4->Connect(); $p4->SetClient($client); $p4->Run('shelve');
注意:若解析shelve命令返回值取变更号有困难,可在搁置完成后调用
$p4->Run('changes', '-s', 'shelved', '-c', $client),拉取当前客户端下最新的已搁置变更列表,即可获取对应的变更列表编号。
内容的提问来源于stack exchange,提问作者Madhan Kumar
相关产品推荐
相关产品推荐

