#!/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 "$@"