2016-03-04 36 views
2

我正在嘗試創建一個Groovy腳本,它從我們的trunk中獲取更改列表的列表,並將它們逐個合併到發佈分支中。我想在本地提供所有更改列表,因爲我想在提交上游之前運行測試版本。但是,每當我運行該腳本時,我發現當我查看P4V時,所有合併都已放入默認更改列表中。我怎樣才能讓他們分開?如何在使用API​​時創建單獨的更改列表?

我的代碼(在Groovy,但使用Java API)如下:

final changeListNumbers = [ 579807, 579916, 579936 ] 
final targetBranch = "1.0.7" 

changeListNumbers.each { changeListNumber -> 
    final existingCl = server.getChangelist(changeListNumber) 
    final cl = new Changelist(
      IChangelist.UNKNOWN, 
      client.getName(), 
      server.userName, 
      ChangelistStatus.NEW, 
      new Date(), 
      "${existingCl.id} - ${existingCl.description}", 
      false, 
      server 
     ); 

    cl.fileSpecs = mergeChangeListToBranch(client, cl, changeListNumber, targetBranch) 
} 

def List<IFileSpec> mergeChangeListToBranch(final IClient client, final IChangelist changeList, final srcChangeListNumber, final String branchVersion){ 
    final projBase = '//Clients/Initech' 
    final trunkBasePath = "$projBase/trunk" 
    final branchBasePath = "$projBase/release" 

    final revisionedTrunkPath = "$trunkBasePath/[email protected]$srcChangeListNumber,$srcChangeListNumber" 

    final branchPath = "$branchBasePath/$branchVersion/..." 
    println "trunk path: $revisionedTrunkPath\nbranch path is: $branchPath" 
    mergeFromTo(client, changeList, revisionedTrunkPath, branchPath) 
} 

def List<IFileSpec> mergeFromTo(final IClient client, final IChangelist changeList,final String sourceFile, final String destFile){ 
    mergeFromTo(
      client, 
      changeList, 
      new FileSpec( new FilePath(FilePath.PathType.DEPOT, sourceFile) ), 
      new FileSpec( new FilePath(FilePath.PathType.DEPOT, destFile ) ) 
     ) 
} 

def List<IFileSpec> mergeFromTo(final IClient client, final IChangelist changeList, final FileSpec sourceFile, final FileSpec destFile){ 
    final resolveOptions = new ResolveFilesAutoOptions() 
    resolveOptions.safeMerge = true 

    client.resolveFilesAuto(
      client.integrateFiles(sourceFile, destFile, null, null), 
//   client.integrateFiles(changeList.id, false, null, null, sourceFile, destFile), 
      resolveOptions 
     ) 
} 

如果我嘗試IChangeList.update()我得到以下錯誤:

Caught: com.perforce.p4java.exception.RequestException: Error in change specification. 
Error detected at line 7. 
Invalid status 'new'. 

如果不是使用IChangelist.UNKNOWNexistingCl.id + 10000(它大於當前使用的任何現有更改列表編號)然後我得到

Caught: com.perforce.p4java.exception.RequestException: Tried to update new or default changelist 

回答

2

要在服務器中創建變更列表,請撥打IClient.createChangelist()

final existingCl = server.getChangelist(changeListNumber) 
cl = new Changelist( 
     IChangelist.UNKNOWN, 
     ... snip ... 
    ); 
cl = client.createChangelist(cl); 
cl.fileSpecs = mergeChangeListToBranch(client, cl, ... 

然後融入這個特別的變化:

IntegrateFilesOptions intOpts = new IntegrateFilesOptions() 
intOpts.setChangelistId(cl.getId()) 

client.integrateFiles(sourceFile, destFile, null, intOpts) 

integrateFiles()返回集成文件(S),所以檢查返回的IFileSpec.getOpStatus()FileSpecOpStatus.VALID

相關問題