import java.nio.file.Paths

def jobName = "<%= job_name %>"
def jobPackageName = "<%= package_name %>"
def upstreamJobNames = [<%= upstream_jobs.each_key.map { |job_name| "'#{job_name}'" }.join(", ") %>]
def upstreamPackageNames = [<%= upstream_jobs.each_value.map { |package_name| "'#{package_name}'" }.join(", ") %>]
<%= render_template('library.pipeline') %>
def triggeredByUpstream = false
def upstreamBuilds = []

stage('waiting for upstream jobs to finish') {
    def triggerBuild    = getTriggerBuild(currentBuild)
    if (triggerBuild) {
        triggeredByUpstream = true;
    }
    else {
        triggeredByUpstream = false;
        triggerBuild = [null, null];
    }

    upstreamBuilds = getUpstreamBuilds(upstreamJobNames, triggerBuild[0], triggerBuild[1])
    if (upstreamBuilds == null)
    {
        currentBuild.result = 'NOT_BUILT';
        return;
    }
    if (!waitForUpstreamBuilds(upstreamBuilds)) {
        currentBuild.result = 'NOT_BUILT';
        return
    }
}

if (currentBuild.result == 'NOT_BUILT')
{
    return;
}

node(label: 'autoproj-jenkins') {
    def fullWorkspaceDir = pwd()
    def autoproj = "${fullWorkspaceDir}/dev/.autoproj/bin/autoproj"
    dir('dev/install/log') { deleteDir() }

    def jobPackagePrefix = null
    def upstreamPackagePrefixes = null

    stage('bootstrap') {
        <%= render_template('bootstrap.pipeline', seed: seed, poll: false, vcs: buildconf_vcs, gemfile: gemfile, autoproj_install_path: autoproj_install_path, vcs_credentials: vcs_credentials, indent: 4) %>

        def jenkins_dependency_overrides = "<%= render_template 'jenkins_dependency_overrides.rb', escape: true, package_name: package_name, upstream_jobs: upstream_jobs %>"
        writeFile file: 'dev/autoproj/overrides.d/99_jenkins_dependency_overrides.rb',
            text: jenkins_dependency_overrides

        def packagePrefixes = sh(script: "${autoproj} locate --no-cache --prefix '${jobPackageName}' ${upstreamPackageNames.join(" ")}", returnStdout: true).
            split("\n")

        jobPackagePrefix        = packagePrefixes[0]
        upstreamPackagePrefixes = packagePrefixes.tail()
    }

    stage('install upstream artifacts') {
        installUpstreamArtifacts(autoproj, fullWorkspaceDir,
            jobPackageName, jobPackagePrefix,
            upstreamJobNames, upstreamPackagePrefixes, upstreamBuilds)
    }

    dir('dev') {
        stage('prepare build') {
            <%= render_template("import-#{vcs.type}.pipeline",
                                poll: true,
                                patch: true,
                                allow_unused: true,
                                package_dir: package_dir,
                                vcs: vcs,
                                credentials: vcs_credentials.for(vcs),
                                package_name: package_name,
                                indent: 8) %>
            sh "${autoproj} test disable '<%= package_name %>'"
            sh "${autoproj} osdeps '<%= package_name %>' 'pkg-config'"
        }

        stage('build') {
            try {
                sh "${autoproj} build --force --deps=f '<%= package_name %>' -p1"
            }
            catch(err) {
                archive includes: 'install/<%= package_name %>/log/<%= package_name %>-*.log'
                archive includes: 'install/log/autoproj-osdeps.log'
                throw(err)
            }
            archive includes: 'install/<%= package_name %>/log/<%= package_name %>-*.log'
            archive includes: 'install/log/autoproj-osdeps.log'
        }
    }

    stage('handle downstream') {
        handleDownstream(autoproj, fullWorkspaceDir,
            jobName, jobPackagePrefix, "<%= artifact_glob %>")
        if (! triggeredByUpstream) {
            <% downstream_jobs.each_key do |job_name| %>
            build job: "<%= job_name %>", wait: false
            <% end %>
        }
    }

    stage('tests') {
        def test_timestamp_path = "${fullWorkspaceDir}/test-timestamp"
        touch file: test_timestamp_path
        def test_output_path    = "${fullWorkspaceDir}/test"
        def autoproj_test_failed = false
        dir('dev')
        {
            try {
                sh "${autoproj} test enable '<%= package_name %>'"
                sh "${autoproj} osdeps '<%= package_name %>'"
                sh "${autoproj} build --deps=f '<%= package_name %>' -p1"
                sh "${autoproj} test -p=1 '<%= package_name %>'"
            }
            catch(err) { autoproj_test_failed = true }

            try { sh "${autoproj} jenkins postprocess-tests --after=${test_timestamp_path} ${test_output_path} '<%= package_name %>'" }
            catch(err) { autoproj_test_failed = true }
        }
        try { junit allowEmptyResults: true, keepLongStdio: true, testResults: "test/*.xml" }
        catch(err) { autoproj_test_failed = true }

        if (autoproj_test_failed)
        {
            currentBuild.result = 'UNSTABLE'
        }
    }

    // Move the current package prefix to a separate folder, to ensure that
    // other workspaces don't have access to it. It's not strictly required,
    // but is a good sanity check
    dir('lastPrefix') { deleteDir() }
    sh "mv '${jobPackagePrefix}' lastPrefix"
}