xref: /aosp_15_r20/prebuilts/manifest-merger/import-maven-artifacts.sh (revision 86567ad5df2013e6541421db437c5b7f97e1fb56)
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