1*86567ad5SAndroid Build Coastguard Worker#!/bin/bash 2*86567ad5SAndroid Build Coastguard Worker 3*86567ad5SAndroid Build Coastguard Workerset -e 4*86567ad5SAndroid Build Coastguard Worker 5*86567ad5SAndroid Build Coastguard Workerreadonly DEST_REPO="$(dirname $(readlink -f "$0"))/../.." 6*86567ad5SAndroid Build Coastguard Workerreadonly INPUT_REPO="m2repository" 7*86567ad5SAndroid Build Coastguard Workerreadonly STAGE_REPO="m2staged" 8*86567ad5SAndroid Build Coastguard Workerreadonly DEST_ANDROID_REPO="${DEST_REPO}/prebuilts/manifest-merger" 9*86567ad5SAndroid Build Coastguard Worker 10*86567ad5SAndroid Build Coastguard Workerif ! TEMP_DIR=$(mktemp -d); then 11*86567ad5SAndroid Build Coastguard Worker echo "ERROR: failed to create dir" 12*86567ad5SAndroid Build Coastguard Worker exit 1 13*86567ad5SAndroid Build Coastguard Workerfi 14*86567ad5SAndroid Build Coastguard Workerreadonly TEMP_DIR 15*86567ad5SAndroid Build Coastguard Worker 16*86567ad5SAndroid Build Coastguard Workerfunction cleanup() { 17*86567ad5SAndroid Build Coastguard Worker rm -rf "${TEMP_DIR}" 18*86567ad5SAndroid Build Coastguard Worker} 19*86567ad5SAndroid Build Coastguard Worker 20*86567ad5SAndroid Build Coastguard Workertrap cleanup EXIT 21*86567ad5SAndroid Build Coastguard Worker 22*86567ad5SAndroid Build Coastguard Workercd "${TEMP_DIR}" 23*86567ad5SAndroid Build Coastguard Worker 24*86567ad5SAndroid Build Coastguard Workerfunction usage() { 25*86567ad5SAndroid Build Coastguard Worker cat <<EOF 26*86567ad5SAndroid Build Coastguard WorkerUsage: $(basename $0) group:artifact:version[:classifier][@extension] [group:artifact:version[:classifier][@extension]...] 27*86567ad5SAndroid Build Coastguard Worker 28*86567ad5SAndroid Build Coastguard WorkerDownloads the specified artifacts into the appropriate subdirectory of ${DEST_REPO}/prebuilts 29*86567ad5SAndroid Build Coastguard Worker 30*86567ad5SAndroid Build Coastguard WorkerEOF 31*86567ad5SAndroid Build Coastguard Worker exit 1 32*86567ad5SAndroid Build Coastguard Worker} 33*86567ad5SAndroid Build Coastguard Worker 34*86567ad5SAndroid Build Coastguard Worker# usage: downloadArtifacts "$group:$artifact:$version[:classifier][@extension]..." 35*86567ad5SAndroid Build Coastguard Workerfunction downloadArtifacts() { 36*86567ad5SAndroid Build Coastguard Worker [ -z "$1" ] && usage 37*86567ad5SAndroid Build Coastguard Worker 38*86567ad5SAndroid Build Coastguard Worker echo "downloading dependencies into ${INPUT_REPO}" 39*86567ad5SAndroid Build Coastguard Worker rm -rf "${INPUT_REPO}" 40*86567ad5SAndroid Build Coastguard Worker for arg in $*; do 41*86567ad5SAndroid Build Coastguard Worker echo "importing ${arg}" 42*86567ad5SAndroid Build Coastguard Worker IFS=@ read -r dependency extension <<< "${arg}" 43*86567ad5SAndroid Build Coastguard Worker IFS=: read -ra FIELDS <<< "${dependency}" 44*86567ad5SAndroid Build Coastguard Worker local -r groupId="${FIELDS[0]}" 45*86567ad5SAndroid Build Coastguard Worker local -r artifactId="${FIELDS[1]}" 46*86567ad5SAndroid Build Coastguard Worker local -r version="${FIELDS[2]}" 47*86567ad5SAndroid Build Coastguard Worker local -r classifier="${FIELDS[3]}" 48*86567ad5SAndroid Build Coastguard Worker 49*86567ad5SAndroid Build Coastguard Worker # download the actual artifact 50*86567ad5SAndroid Build Coastguard Worker downloadArtifact "${groupId}" "${artifactId}" "${version}" "${classifier}" "${extension}" 51*86567ad5SAndroid Build Coastguard Worker 52*86567ad5SAndroid Build Coastguard Worker # try to download the sources jar 53*86567ad5SAndroid Build Coastguard Worker downloadArtifact "${groupId}" "${artifactId}" "${version}" "sources" "jar" || true 54*86567ad5SAndroid Build Coastguard Worker 55*86567ad5SAndroid Build Coastguard Worker # go to next artifact 56*86567ad5SAndroid Build Coastguard Worker done 57*86567ad5SAndroid Build Coastguard Worker echo "done downloading dependencies" 58*86567ad5SAndroid Build Coastguard Worker} 59*86567ad5SAndroid Build Coastguard Worker 60*86567ad5SAndroid Build Coastguard Worker# usage: generatePomFile "$pomFile" "$group" "$artifact" "$version" "$classifier" "$extension" 61*86567ad5SAndroid Build Coastguard Workerfunction generatePomFile() { 62*86567ad5SAndroid Build Coastguard Worker local -r pomFile="$1" 63*86567ad5SAndroid Build Coastguard Worker local -r groupId="$2" 64*86567ad5SAndroid Build Coastguard Worker local -r artifactId="$3" 65*86567ad5SAndroid Build Coastguard Worker local -r version="$4" 66*86567ad5SAndroid Build Coastguard Worker local -r classifier="$5" 67*86567ad5SAndroid Build Coastguard Worker local -r extension="$6" 68*86567ad5SAndroid Build Coastguard Worker 69*86567ad5SAndroid Build Coastguard Worker local pomDependencies="" 70*86567ad5SAndroid Build Coastguard Worker 71*86567ad5SAndroid Build Coastguard Worker echo "creating ${pomFile}" 72*86567ad5SAndroid Build Coastguard Worker cat <<EOF > "${pomFile}" 73*86567ad5SAndroid Build Coastguard Worker<?xml version="1.0" encoding="UTF-8"?> 74*86567ad5SAndroid Build Coastguard Worker<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 75*86567ad5SAndroid Build Coastguard Worker <modelVersion>4.0.0</modelVersion> 76*86567ad5SAndroid Build Coastguard Worker <groupId>com.google.android.build</groupId> 77*86567ad5SAndroid Build Coastguard Worker <artifactId>m2repository</artifactId> 78*86567ad5SAndroid Build Coastguard Worker <version>1.0</version> 79*86567ad5SAndroid Build Coastguard Worker <repositories> 80*86567ad5SAndroid Build Coastguard Worker <repository> 81*86567ad5SAndroid Build Coastguard Worker <id>google</id> 82*86567ad5SAndroid Build Coastguard Worker <name>Google</name> 83*86567ad5SAndroid Build Coastguard Worker <url>https://maven.google.com</url> 84*86567ad5SAndroid Build Coastguard Worker </repository> 85*86567ad5SAndroid Build Coastguard Worker <repository> 86*86567ad5SAndroid Build Coastguard Worker <id>jcenter</id> 87*86567ad5SAndroid Build Coastguard Worker <name>JCenter</name> 88*86567ad5SAndroid Build Coastguard Worker <url>https://jcenter.bintray.com</url> 89*86567ad5SAndroid Build Coastguard Worker </repository> 90*86567ad5SAndroid Build Coastguard Worker </repositories> 91*86567ad5SAndroid Build Coastguard Worker <dependencies> 92*86567ad5SAndroid Build Coastguard Worker <dependency> 93*86567ad5SAndroid Build Coastguard Worker <groupId>${groupId}</groupId> 94*86567ad5SAndroid Build Coastguard Worker <artifactId>${artifactId}</artifactId> 95*86567ad5SAndroid Build Coastguard Worker <version>${version}</version> 96*86567ad5SAndroid Build Coastguard WorkerEOF 97*86567ad5SAndroid Build Coastguard Worker 98*86567ad5SAndroid Build Coastguard Workerif [ -n "${classifier}" ]; then 99*86567ad5SAndroid Build Coastguard Worker cat <<EOF >> "${pomFile}" 100*86567ad5SAndroid Build Coastguard Worker <classifier>${classifier}</classifier> 101*86567ad5SAndroid Build Coastguard WorkerEOF 102*86567ad5SAndroid Build Coastguard Workerfi 103*86567ad5SAndroid Build Coastguard Worker 104*86567ad5SAndroid Build Coastguard Workerif [ -n "${extension}" ]; then 105*86567ad5SAndroid Build Coastguard Worker cat <<EOF >> "${pomFile}" 106*86567ad5SAndroid Build Coastguard Worker <type>${extension}</type> 107*86567ad5SAndroid Build Coastguard WorkerEOF 108*86567ad5SAndroid Build Coastguard Workerfi 109*86567ad5SAndroid Build Coastguard Worker 110*86567ad5SAndroid Build Coastguard Workercat <<EOF >> "${pomFile}" 111*86567ad5SAndroid Build Coastguard Worker </dependency> 112*86567ad5SAndroid Build Coastguard Worker </dependencies> 113*86567ad5SAndroid Build Coastguard Worker <build> 114*86567ad5SAndroid Build Coastguard Worker <plugins> 115*86567ad5SAndroid Build Coastguard Worker <plugin> 116*86567ad5SAndroid Build Coastguard Worker <groupId>org.apache.maven.plugins</groupId> 117*86567ad5SAndroid Build Coastguard Worker <artifactId>maven-dependency-plugin</artifactId> 118*86567ad5SAndroid Build Coastguard Worker <version>2.8</version> 119*86567ad5SAndroid Build Coastguard Worker <executions> 120*86567ad5SAndroid Build Coastguard Worker <execution> 121*86567ad5SAndroid Build Coastguard Worker <id>default-cli</id> 122*86567ad5SAndroid Build Coastguard Worker <configuration> 123*86567ad5SAndroid Build Coastguard Worker <includeScope>runtime</includeScope> 124*86567ad5SAndroid Build Coastguard Worker <addParentPoms>true</addParentPoms> 125*86567ad5SAndroid Build Coastguard Worker <copyPom>true</copyPom> 126*86567ad5SAndroid Build Coastguard Worker <useRepositoryLayout>true</useRepositoryLayout> 127*86567ad5SAndroid Build Coastguard Worker <outputDirectory>m2repository</outputDirectory> 128*86567ad5SAndroid Build Coastguard Worker </configuration> 129*86567ad5SAndroid Build Coastguard Worker </execution> 130*86567ad5SAndroid Build Coastguard Worker </executions> 131*86567ad5SAndroid Build Coastguard Worker </plugin> 132*86567ad5SAndroid Build Coastguard Worker </plugins> 133*86567ad5SAndroid Build Coastguard Worker </build> 134*86567ad5SAndroid Build Coastguard Worker</project> 135*86567ad5SAndroid Build Coastguard WorkerEOF 136*86567ad5SAndroid Build Coastguard Worker 137*86567ad5SAndroid Build Coastguard Worker echo "done creating ${pomFile}" 138*86567ad5SAndroid Build Coastguard Worker} 139*86567ad5SAndroid Build Coastguard Worker 140*86567ad5SAndroid Build Coastguard Worker# usage: downloadArtifact "$group" "$artifact" "$version" "$classifier" "$extension" 141*86567ad5SAndroid Build Coastguard Workerfunction downloadArtifact() { 142*86567ad5SAndroid Build Coastguard Worker local -r pomFile="${PWD}/pom.xml" 143*86567ad5SAndroid Build Coastguard Worker 144*86567ad5SAndroid Build Coastguard Worker generatePomFile "${pomFile}" "$@" 145*86567ad5SAndroid Build Coastguard Worker 146*86567ad5SAndroid Build Coastguard Worker echo "downloading one dependency into ${INPUT_REPO}" 147*86567ad5SAndroid Build Coastguard Worker mvn -f "${pomFile}" dependency:copy-dependencies 148*86567ad5SAndroid Build Coastguard Worker echo "done downloading one dependency into ${INPUT_REPO}" 149*86567ad5SAndroid Build Coastguard Worker} 150*86567ad5SAndroid Build Coastguard Worker 151*86567ad5SAndroid Build Coastguard Worker# generates an appropriately formatted repository for merging into existing repositories, 152*86567ad5SAndroid Build Coastguard Worker# by computing artifact metadata 153*86567ad5SAndroid Build Coastguard Workerfunction createStageRepo() ( 154*86567ad5SAndroid Build Coastguard Worker echo "staging to ${STAGE_REPO}" 155*86567ad5SAndroid Build Coastguard Worker rm -rf "${STAGE_REPO}" 156*86567ad5SAndroid Build Coastguard Worker 157*86567ad5SAndroid Build Coastguard Worker for f in $(find "${INPUT_REPO}" -type f ! -name "*.sha1" ! -name "*.md5"); do 158*86567ad5SAndroid Build Coastguard Worker local relPath="${f##${INPUT_REPO}}" 159*86567ad5SAndroid Build Coastguard Worker local relDir=$(dirname "${relPath}") 160*86567ad5SAndroid Build Coastguard Worker 161*86567ad5SAndroid Build Coastguard Worker local fileName=$(basename "${relPath}") 162*86567ad5SAndroid Build Coastguard Worker local writeChecksums=true 163*86567ad5SAndroid Build Coastguard Worker 164*86567ad5SAndroid Build Coastguard Worker local destDir="${STAGE_REPO}/${relDir}" 165*86567ad5SAndroid Build Coastguard Worker local destFile="${STAGE_REPO}/${relPath}" 166*86567ad5SAndroid Build Coastguard Worker if [ "${fileName}" == "maven-metadata-local.xml" ]; then 167*86567ad5SAndroid Build Coastguard Worker writeChecksums=false 168*86567ad5SAndroid Build Coastguard Worker destFile="${destDir}/maven-metadata.xml" 169*86567ad5SAndroid Build Coastguard Worker fi 170*86567ad5SAndroid Build Coastguard Worker 171*86567ad5SAndroid Build Coastguard Worker mkdir -p "${destDir}" 172*86567ad5SAndroid Build Coastguard Worker if ${writeChecksums}; then 173*86567ad5SAndroid Build Coastguard Worker local md5=$(md5sum "${f}" | sed 's/ .*//') 174*86567ad5SAndroid Build Coastguard Worker local sha1=$(sha1sum "${f}" | sed 's/ .*//') 175*86567ad5SAndroid Build Coastguard Worker echo -n ${md5} > "${destFile}.md5" 176*86567ad5SAndroid Build Coastguard Worker echo -n ${sha1} > "${destFile}.sha1" 177*86567ad5SAndroid Build Coastguard Worker fi 178*86567ad5SAndroid Build Coastguard Worker cp "${f}" "${destFile}" 179*86567ad5SAndroid Build Coastguard Worker done 180*86567ad5SAndroid Build Coastguard Worker 181*86567ad5SAndroid Build Coastguard Worker echo "done staging to ${STAGE_REPO}" 182*86567ad5SAndroid Build Coastguard Worker) 183*86567ad5SAndroid Build Coastguard Worker 184*86567ad5SAndroid Build Coastguard Workerfunction announceCopy() { 185*86567ad5SAndroid Build Coastguard Worker local -r input="$1" 186*86567ad5SAndroid Build Coastguard Worker local -r output="$2" 187*86567ad5SAndroid Build Coastguard Worker if [ -e "${input}" ]; then 188*86567ad5SAndroid Build Coastguard Worker echo "copying '${input}' to '${output}'" 189*86567ad5SAndroid Build Coastguard Worker cp -rT "${input}" "${output}" 190*86567ad5SAndroid Build Coastguard Worker fi 191*86567ad5SAndroid Build Coastguard Worker} 192*86567ad5SAndroid Build Coastguard Worker 193*86567ad5SAndroid Build Coastguard Workerfunction exportArtifact() { 194*86567ad5SAndroid Build Coastguard Worker echo "exporting" 195*86567ad5SAndroid Build Coastguard Worker 196*86567ad5SAndroid Build Coastguard Worker mkdir -p "${DEST_ANDROID_REPO}/com/android" 197*86567ad5SAndroid Build Coastguard Worker announceCopy "${STAGE_REPO}/com/android" "${DEST_ANDROID_REPO}/com/android" 198*86567ad5SAndroid Build Coastguard Worker rm -rf "${STAGE_REPO}/com/android" 199*86567ad5SAndroid Build Coastguard Worker 200*86567ad5SAndroid Build Coastguard Worker echo "done exporting" 201*86567ad5SAndroid Build Coastguard Worker} 202*86567ad5SAndroid Build Coastguard Worker 203*86567ad5SAndroid Build Coastguard Worker 204*86567ad5SAndroid Build Coastguard Workerfunction main() { 205*86567ad5SAndroid Build Coastguard Worker downloadArtifacts "$@" 206*86567ad5SAndroid Build Coastguard Worker createStageRepo 207*86567ad5SAndroid Build Coastguard Worker exportArtifact 208*86567ad5SAndroid Build Coastguard Worker} 209*86567ad5SAndroid Build Coastguard Worker 210*86567ad5SAndroid Build Coastguard Workermain "$@" 211