/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

plugins { id 'org.apache.beam.module' }
applyPythonNature()

description = "Apache Beam :: SDKs :: Python :: Container :: Distroless"
int min_python_version=project.ext.minPythonVersion
int max_python_version=project.ext.maxPythonVersion


tasks.register("buildAll") {
    for(int ver=min_python_version; ver<=max_python_version; ++ver) {
        dependsOn ':sdks:python:container:distroless:py3' + ver + ':docker'
    }
}

for(int i=min_python_version; i<=max_python_version; ++i) {
    String min_version = "3" + min_python_version
    String cur = "3" + i
    String prev = "3" + (i-1)
    tasks.register("push" + cur) {
        if (cur != min_version) {
            // Enforce ordering to allow the prune step to happen between runs.
            // This will ensure we don't use up too much space (especially in CI environments)
            if (!project.hasProperty("skip-python-3" + prev + "-images")) {
                mustRunAfter(":sdks:python:container:distroless:push" + prev)
            }
        }
        dependsOn ':sdks:python:container:distroless:py' + cur + ':docker'

        doLast {
            if (project.hasProperty("prune-images")) {
                exec {
                    executable("docker")
                    args("system", "prune", "-a", "--force")
                }
            }
        }
    }
}

tasks.register("pushAll") {
    for(int ver=min_python_version; ver<=max_python_version; ++ver) {
        if (!project.hasProperty("skip-python-3" + ver + "-images")) {
            dependsOn ':sdks:python:container:distroless:push3' + ver
        }
    }
}
