163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/*
263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * Copyright (C) 2015 The Android Open Source Project
363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar *
463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * you may not use this file except in compliance with the License.
663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * You may obtain a copy of the License at
763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar *
863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar *
1063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * Unless required by applicable law or agreed to in writing, software
1163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
1263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * See the License for the specific language governing permissions and
1463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar * limitations under the License.
1563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar */
1663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar
1763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarpackage android.databinding;
1863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar
1963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.DefaultTask
2063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.artifacts.maven.MavenPom
2163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.file.FileCollection
2263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
2363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.tasks.Input;
2463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport org.gradle.api.tasks.TaskAction;
2563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarimport groovy.json.JsonSlurper;
2663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar
2763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarpublic class UploadToBintrayTask extends DefaultTask {
2863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String API_URL = "https://api.bintray.com";
2963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String PACKAGE_HEADER = "X-Bintray-Package"
3063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String VERSION_HEADER = "X-Bintray-Version"
3163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String PUBLISH_HEADER = "X-Bintray-Publish"
3263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String OVERRIDE_HEADER = "X-Bintray-Override"
3363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String EXPLODE_HEADER = "X-Bintray-Explode"
3463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    static final String CONTENT_PREFIX = "content/android/android-tools"
3563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String username;
3663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String apiKey;
3763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String pkg;
3863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String version;
3963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    FileCollection localFiles;
4063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String mavenRepoAbsPath;
4163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    String targetPath;
4263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    public void configureFrom(DefaultGroovyMavenDeployer deployer) {
4363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        String repoUrl = deployer.repository.url
4463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        if (repoUrl == null) {
4563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            throw new RuntimeException("Cannot find repo url for $deployer")
4663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        }
4763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar
4863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        def pom = deployer.pom
4963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        pkg = pom.groupId + "." + pom.artifactId
5063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        version = pom.version
5163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        mavenRepoAbsPath = repoUrl
5263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        targetPath = "${pkg.replaceAll("\\.", "/")}/${version}"
5363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        localFiles = project.fileTree(mavenRepoAbsPath + "/" + targetPath)
5463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    }
5563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    @TaskAction
5663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    public void upload() {
5763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        if (username == null || apiKey == null) {
5863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            throw new IllegalArgumentException("You should pass your bintray user and " +
5963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                    "api key as params e.g. ./gradlew ${BintrayPlugin.DEFAULT_TASK_NAME}" +
6063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                    " -P${BintrayPlugin.USER_PROP}=<my username>" +
6163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                    " -P${BintrayPlugin.API_KEY_PROP}=<my api key>")
6263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        }
6363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        println(log())
6463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        for (File localFile : localFiles) {
6563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            def p = ['curl', '-u', "$username:$apiKey", "-H",
6663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                     "$PACKAGE_HEADER: $pkg", "-H", "$VERSION_HEADER: $version",
678b7340d0b2e57d5a3d71135f778b7f90e274a5f3Yigit Boyar                     "-X", "PUT", "--data-binary", "@${localFile.getAbsolutePath()}",
6863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                     "$API_URL/$CONTENT_PREFIX/$targetPath/${localFile.name}"]
6963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            println("executing $p")
7063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            def execute = p.execute()
7163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            execute.waitFor()
7263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            if (execute.exitValue() != 0) {
7363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                throw new RuntimeException("failed to upload artifact. error: ${execute.err.text}")
7463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            }
7563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            def responseText = execute.text
7663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            def json = new JsonSlurper().parseText(responseText)
7763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            if (json.getAt("message") != "success") {
7863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                throw new RuntimeException("Cannot upload artifact. Error response: " +
7963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                        "${json.getAt("message")}")
8063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            }
8163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar            println("uploaded $localFile")
8263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        }
8363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    }
8463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar
8563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    public String log() {
8663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar        return "UploadToBintrayTask{" +
8763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                "username='" + username + '\'' +
8863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                ", apiKey='" + apiKey + '\'' +
8963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                ", pkg='" + pkg + '\'' +
9063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                ", version='" + version + '\'' +
9163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                ", localFile=" + localFiles +
9263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                ", mavenRepo=" + mavenRepoAbsPath +
9363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar                '}';
9463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar    }
9563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar}
96