final P4_USER = 'user';
final P4_CLIENT_NAME = 'workspace-name';
final P4_BRANCH_MAPPING_NAME = 'BranchMappingToBeUsed'
final NO_FILES_TO_RESOLVE_CODE = '554768771'

pipeline {
    agent any
    stages {
		stage('Checkout') {
			steps {
				checkout perforce(
					credential: 'perforce-credentials',
					workspace: manualSpec(
						charset: 'winansi',
						cleanup: false,
						name: 'workspace-name',
						pinHost: false,
						spec: clientSpec(
							allwrite: false,
							backup: true,
							clobber: true,
							compress: false,
							line: 'UNIX',
							locked: false,
							modtime: true,
							rmdir: true,
							type: 'WRITABLE',
							streamName: '//streamName',
							view: '//streamName/... //workspace-name/...'
						)
					)
				)
			}
		}
		stage('Integration') {
			steps {
				script {
					def p4 = p4(
						credential: 'perforce-credentials',
						populate: autoClean(
							delete: true,
							modtime: false,
							quiet: true,
							replace: true,
							tidy: false
						),
						workspace: manualSpec(
							charset: 'winansi',
							cleanup: false,
							name: 'workspace-name',
							pinHost: false,
							spec: clientSpec(
								allwrite: false,
								backup: true,
								clobber: true,
								compress: false,
								line: 'UNIX',
								locked: false,
								modtime: true,
								rmdir: true,
								type: 'WRITABLE',
								streamName: '//streamName',
								view: '//streamName/... //workspace-name/...'
							)
						)
					)
					def cl = p4.fetch('change', '')
					cl.put('Change', 'new')
					cl.put('Client', P4_CLIENT_NAME)
					cl.put('User', P4_USER)
					cl.put('Status', 'new')
					cl.put('Description', 'Automatical branch synchronization by jenkins')
					def clToBeUsed = p4.save('change', cl)
					changeListToBeUsed = ((clToBeUsed.getAt('change').first() =~ /([0-9]+)/)[0][1])
					if (changeListToBeUsed == null) {
						error("Could not create change list. Resulting string: "+clToBeUsed.getAt('change').first())
					}
					p4.run('integrate', '-t', '-Rbds', '-c', changeListToBeUsed, '-b', P4_BRANCH_MAPPING_NAME)
					def createdChangelist = p4.run('describe', changeListToBeUsed)
					if (createdChangelist.first().get('depotFile0')==null) {
						echo 'No changes in upstream branch. Nothing to do.'
					} else {
						p4.run('resolve', '-am', '-Aactmdb', '-c', changeListToBeUsed)
						def filesToBeResolved = p4.run('resolve', '-n', '-c', changeListToBeUsed)
						if (!(filesToBeResolved.size()==1 && filesToBeResolved.first().get('code0')==NO_FILES_TO_RESOLVE_CODE)) {
							error("Could not resolve all merge conflicts. Synchronization needs to be done manually")
						}
					}
				}
			}
		}
	}

}