perforce - 扩展p4交换输出以包括与源集成的更改

时间:2015-11-09 13:32:45

标签: perforce

我们有一个从主干流出的代码行 - > A - > B我们有人直接或在主干中工作,我们通过分支B合并公开发布。

现在我需要提供分支A中的更改列表,而不是分支B中的更改,以便我们可以传递给QA团队。为此,我运行此命令:

p4 interchanges -b integrate_branch_a_to_branch_b

但是我们已经在那里进行了更改,这些更改已经从一个大的更改列表中的主干到A集成(但实际上由多个提交的更改列表组成)。我需要将这些内容包含在我的更改说明中。根据Perforce文档(https://www.perforce.com/perforce/r15.1/manuals/cmdref/p4_changes.html),如果我传递-i标志,p4更改命令应该执行此操作。

所以我所拥有的是一个编号为12345的变更清单,已提交给分支机构A(作为集群的集成)。我想扩展它以列出提交给trunk的每个更改列表,正如p4交换将显示我已经运行它来预览CL#12345中的内容。

我试过这个命令:

p4 changes -i -s submitted //myproject/branches/a/...@12345,12345

我认为应该有用,给我这样的东西:

Change 12345 on 2015/10/30 by user@host 'trunk -> a'
Change 12344 on 2015/10/29 by user@host 'fixed bug two'
Change 12343 on 2015/10/29 by user@host 'fixed bug one'

但是它给了我成千上万的变化,其中大部分都超出了我所要求的变更清单范围,比这个项目的任何分支的第一次修订还要晚 - 从我们整合了一些共享来自// otherproject /到// myproject /的库代码。如果我删除" -i"旗帜,它按照我预期的方式运作 - 它仅列出更改列表12345。

这只是这个命令中的错误,还是我的语法错了?我似乎无法找到一种方法来获得我需要的东西。我可以回过头来找一下干线的最后一次整合 - >答:当然,我会在我的脚本中手动过滤旧的更改列表 - 但如果我不必这样做会更容易。

P4服务器版本字符串为:P4D / LINUX26X86_64 / 2014.2 / 962050(2014/11/13)

3 个答案:

答案 0 :(得分:0)

因此,如果我理解正确,那么您正在寻找从A - >中集成的所有更改。 B,但是对于来自主干的任何集成 - >您希望看到单个更改而不是单个集成更改吗?

虽然您无法在单个表达式中执行此操作,但您可以运行两个交换命令:

 p4 interchanges -b integrate_branch_a_to_branch_b  
 p4 interchanges -b integrate_trunk_to_branch_b

第二个命令将列出尚未集成到分支B中的主干中的所有个别更改。

这里你会有一些重复,因为第一个命令(A-> B)也会显示仅集成的更改,但这应该很容易过滤掉。

答案 1 :(得分:0)

这就是我最终的结果:

- p4 interchanges -b integrate_branch_a_to_branch_b
- for each change:
    - p4 describe -s change, and figure out if there were any "branch" 
    or "integrate" actions
    - if no, then it's a direct edit and we are interested in it
    - if yes, then it's an integration from our source branch (trunk) and 
    we need to find the original changelists
    - for each change where yes:
        - p4 integrate -n //myproject/branches/a/...@change,change //myproject/branches/b/....
        - if output (stderr) contains 'already integrated' then ignore
        because it has already been integrated
        - else run p4 changes -s submitted -i -l /myproject/branches/a/...
        (this will give us a list of all changelists that made up the
        single integrate changelist 12345 that I described above)
        - for each change there:
            - run p4 integrate -n //myproject/branches/trunk/...@change,change /myproject/branches/b/...
            - if output (stderr) contains 'already integrated' then ignore 
            because it has already been integrated
            - else run p4 describe -s change and check if standard output
            contains //myproject/branches/trunk - if not then it was an integrate
            *to* trunk from somewhere else and we don't care about it 
            (this is intended to fix the - issue where p4 changes goes
            beyond the first revision that I am interested in)

首先运行p4交换以获取要使用的未集成更改的列表。然后,对于每次更改,我们都要处理,要么发现#1)它真的没有整合,而且#2)它对于我们的要求来说并不太旧。

我也知道一个更改列表,我们上次运行完整的QA测试,因此当我们开始读取比我感兴趣的更旧的更改时,可以在底部循环中提前中断(解决p4更改-i)问题)。

似乎工作。但是非常麻烦。

答案 2 :(得分:0)

您正在寻找的命令存在:

p4 interchanges -b integrate_trunk_to_branch_b @12345

我知道文档有点令人费解:

interchanges -- Report changes not yet integrated

p4 interchanges [options] fromFile[revRange] toFile
p4 interchanges [options] -b branch [toFile[revRange] ...]
p4 interchanges [options] -b branch -s fromFile[revRange] [toFile ...]
p4 interchanges [options] -S stream [-P parent] [file[revRange] ...]

toFile位引用目标,但revRange引用源,因此您只需在命令中指定上边界。

您是否在为脚本使用Python或Ruby等脚本语言?