Sled
Sled

Reputation: 18959

How to create separate change list when using the API?

I am trying to create a Groovy script that takes a list of change lists from our trunk and merges them one at a time into a release branch. I would like to have all the change lists locally because I want to run a test build before submitting upstream. However, whenever I run the script I find that when I look in P4V all the merges have been placed in the default change list. How can I keep them separate?

My code (in Groovy but using the Java API) is as follows:

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/...@$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
        )
}

If I try to IChangeList.update() I get the following error:

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

If instead of using IChangelist.UNKNOWN to existingCl.id + 10000 (which is larger than any existing change list number currently in use) then I get

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

Upvotes: 2

Views: 191

Answers (1)

J Brown
J Brown

Reputation: 456

To create the changelist in the server, call IClient.createChangelist():

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

Then to integrate into this particular change:

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

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

That integrateFiles() returns the integrated file(s), so check that the returned IFileSpec.getOpStatus() is FileSpecOpStatus.VALID.

Upvotes: 2

Related Questions