#!/bin/bash set -e readonly DEST_REPO="$(dirname $(readlink -f "$0"))/../.." readonly INPUT_REPO="m2repository" readonly STAGE_REPO="m2staged" readonly DEST_ANDROID_REPO="${DEST_REPO}/prebuilts/manifest-merger" if ! TEMP_DIR=$(mktemp -d); then echo "ERROR: failed to create dir" exit 1 fi readonly TEMP_DIR function cleanup() { rm -rf "${TEMP_DIR}" } trap cleanup EXIT cd "${TEMP_DIR}" function usage() { cat <<EOF Usage: $(basename $0) group:artifact:version[:classifier][@extension] [group:artifact:version[:classifier][@extension]...] Downloads the specified artifacts into the appropriate subdirectory of ${DEST_REPO}/prebuilts EOF exit 1 } # usage: downloadArtifacts "$group:$artifact:$version[:classifier][@extension]..." function downloadArtifacts() { [ -z "$1" ] && usage echo "downloading dependencies into ${INPUT_REPO}" rm -rf "${INPUT_REPO}" for arg in $*; do echo "importing ${arg}" IFS=@ read -r dependency extension <<< "${arg}" IFS=: read -ra FIELDS <<< "${dependency}" local -r groupId="${FIELDS[0]}" local -r artifactId="${FIELDS[1]}" local -r version="${FIELDS[2]}" local -r classifier="${FIELDS[3]}" # download the actual artifact downloadArtifact "${groupId}" "${artifactId}" "${version}" "${classifier}" "${extension}" # try to download the sources jar downloadArtifact "${groupId}" "${artifactId}" "${version}" "sources" "jar" || true # go to next artifact done echo "done downloading dependencies" } # usage: generatePomFile "$pomFile" "$group" "$artifact" "$version" "$classifier" "$extension" function generatePomFile() { local -r pomFile="$1" local -r groupId="$2" local -r artifactId="$3" local -r version="$4" local -r classifier="$5" local -r extension="$6" local pomDependencies="" echo "creating ${pomFile}" cat <<EOF > "${pomFile}" <?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion> <groupId>com.google.android.build</groupId> <artifactId>m2repository</artifactId> <version>1.0</version> <repositories> <repository> <id>google</id> <name>Google</name> <url>https://maven.google.com</url> </repository> <repository> <id>jcenter</id> <name>JCenter</name> <url>https://jcenter.bintray.com</url> </repository> </repositories> <dependencies> <dependency> <groupId>${groupId}</groupId> <artifactId>${artifactId}</artifactId> <version>${version}</version> EOF if [ -n "${classifier}" ]; then cat <<EOF >> "${pomFile}" <classifier>${classifier}</classifier> EOF fi if [ -n "${extension}" ]; then cat <<EOF >> "${pomFile}" <type>${extension}</type> EOF fi cat <<EOF >> "${pomFile}" </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> <executions> <execution> <id>default-cli</id> <configuration> <includeScope>runtime</includeScope> <addParentPoms>true</addParentPoms> <copyPom>true</copyPom> <useRepositoryLayout>true</useRepositoryLayout> <outputDirectory>m2repository</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> EOF echo "done creating ${pomFile}" } # usage: downloadArtifact "$group" "$artifact" "$version" "$classifier" "$extension" function downloadArtifact() { local -r pomFile="${PWD}/pom.xml" generatePomFile "${pomFile}" "$@" echo "downloading one dependency into ${INPUT_REPO}" mvn -f "${pomFile}" dependency:copy-dependencies echo "done downloading one dependency into ${INPUT_REPO}" } # generates an appropriately formatted repository for merging into existing repositories, # by computing artifact metadata function createStageRepo() ( echo "staging to ${STAGE_REPO}" rm -rf "${STAGE_REPO}" for f in $(find "${INPUT_REPO}" -type f ! -name "*.sha1" ! -name "*.md5"); do local relPath="${f##${INPUT_REPO}}" local relDir=$(dirname "${relPath}") local fileName=$(basename "${relPath}") local writeChecksums=true local destDir="${STAGE_REPO}/${relDir}" local destFile="${STAGE_REPO}/${relPath}" if [ "${fileName}" == "maven-metadata-local.xml" ]; then writeChecksums=false destFile="${destDir}/maven-metadata.xml" fi mkdir -p "${destDir}" if ${writeChecksums}; then local md5=$(md5sum "${f}" | sed 's/ .*//') local sha1=$(sha1sum "${f}" | sed 's/ .*//') echo -n ${md5} > "${destFile}.md5" echo -n ${sha1} > "${destFile}.sha1" fi cp "${f}" "${destFile}" done echo "done staging to ${STAGE_REPO}" ) function announceCopy() { local -r input="$1" local -r output="$2" if [ -e "${input}" ]; then echo "copying '${input}' to '${output}'" cp -rT "${input}" "${output}" fi } function exportArtifact() { echo "exporting" mkdir -p "${DEST_ANDROID_REPO}/com/android" announceCopy "${STAGE_REPO}/com/android" "${DEST_ANDROID_REPO}/com/android" rm -rf "${STAGE_REPO}/com/android" echo "done exporting" } function main() { downloadArtifacts "$@" createStageRepo exportArtifact } main "$@"