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