Refactor Jetpad Login into own client
This refactors the Jetpad interaction
into the Jetpad Client. We can then
reuse this client elsewhere in our
scripts.
Test: ./testReleaseNotes.py
Test: ./generateReleaseNotes.py 1593018000000
Change-Id: I55aabc5d2f74403211e2bceceab3055b24b16afc
diff --git a/development/JetpadClient.py b/development/JetpadClient.py
new file mode 100644
index 0000000..eedeb33
--- /dev/null
+++ b/development/JetpadClient.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python3
+#
+# Copyright (C) 2020 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import subprocess
+import datetime
+
+def getJetpadReleaseInfo(date):
+ try:
+ rawJetpadReleaseOutput = subprocess.check_output('span sql /span/global/androidx-jetpad:prod_instance \"SELECT GroupId, ArtifactId, ReleaseVersion, PreviousReleaseSHA, ReleaseSHA, Path, RequireSameVersionGroupBuild FROM LibraryReleases WHERE ReleaseDate = %s\"' % date, shell=True)
+ except subprocess.CalledProcessError:
+ print_e('FAIL: Failed to get jetpad release info for %s' % date)
+ return None
+ rawJetpadReleaseOutputLines = rawJetpadReleaseOutput.splitlines()
+ if len(rawJetpadReleaseOutputLines) <= 2:
+ print_e("Error: Date %s returned zero results from Jetpad. Please check your date" % args.date)
+ return None
+ jetpadReleaseOutput = iter(rawJetpadReleaseOutputLines)
+ return jetpadReleaseOutput
+
+def getReleaseInfoObject(date, includeAllCommits, jetpadReleaseInfo):
+ releaseDateTime = datetime.datetime.fromtimestamp(float(date)/1000.0)
+ releaseJsonObject = {}
+ releaseJsonObject["releaseDate"] = "%02d-%02d-%s" % (releaseDateTime.month, releaseDateTime.day, releaseDateTime.year)
+ releaseJsonObject["includeAllCommits"] = includeAllCommits
+ releaseJsonObject["modules"] = {}
+ for line in jetpadReleaseInfo:
+ if "androidx" not in line.decode(): continue
+ # Remove all white space and split line based on '|'
+ artifactIdReleaseLine = line.decode().replace(" ", "").split('|')
+ groupId = artifactIdReleaseLine[1]
+ artifactId = artifactIdReleaseLine[2]
+ version = artifactIdReleaseLine[3]
+ fromSHA = artifactIdReleaseLine[4]
+ untilSHA = artifactIdReleaseLine[5]
+ path = artifactIdReleaseLine[6]
+ if path[0] == '/': path = path[1:]
+ requiresSameVersion = False
+ if artifactIdReleaseLine[7] == "true":
+ requiresSameVersion = True
+ if groupId in releaseJsonObject["modules"]:
+ releaseJsonObject["modules"][groupId].append({
+ "groupId": groupId,
+ "artifactId": artifactId,
+ "version": version,
+ "fromSHA": fromSHA,
+ "untilSHA": untilSHA,
+ "requiresSameVersion": requiresSameVersion,
+ "path": path
+ })
+ else:
+ releaseJsonObject["modules"][groupId] = [{
+ "groupId": groupId,
+ "artifactId": artifactId,
+ "version": version,
+ "fromSHA": fromSHA,
+ "untilSHA": untilSHA,
+ "requiresSameVersion": requiresSameVersion,
+ "path": path
+ }]
+ return releaseJsonObject
+
+def getJetpadRelease(date, includeAllCommits):
+ print("Getting the release info from Jetpad...")
+ jetpadReleaseInfo = getJetpadReleaseInfo(date)
+ if not jetpadReleaseInfo:
+ exit(1)
+ print("Successful")
+ return getReleaseInfoObject(date, includeAllCommits, jetpadReleaseInfo)
+