aboutsummaryrefslogtreecommitdiff
path: root/toolchain
diff options
context:
space:
mode:
authorVolker Krause <vkrause@kde.org>2021-01-30 12:37:15 +0100
committerVolker Krause <vkrause@kde.org>2021-02-01 16:21:08 +0000
commitb0a7296dfd922a3c105af8b404db07f98048d9f8 (patch)
tree06728cf07681c6b21460d208d6c726fcd548cec0 /toolchain
parent24d4578e80e978ee6f1d8deca2cb3a5ae5e9e18f (diff)
downloadextra-cmake-modules-b0a7296dfd922a3c105af8b404db07f98048d9f8.tar.gz
extra-cmake-modules-b0a7296dfd922a3c105af8b404db07f98048d9f8.tar.bz2
Remove fastlane metadata generation from a given APK
This is no longer needed now that the metadata happens as part of the build process rather than afterwards on the signing system. This allows us to simplify the code here a bit.
Diffstat (limited to 'toolchain')
-rwxr-xr-xtoolchain/generate-fastlane-metadata.py62
1 files changed, 11 insertions, 51 deletions
diff --git a/toolchain/generate-fastlane-metadata.py b/toolchain/generate-fastlane-metadata.py
index e0d7525d..bd5b8d44 100755
--- a/toolchain/generate-fastlane-metadata.py
+++ b/toolchain/generate-fastlane-metadata.py
@@ -192,33 +192,16 @@ def createMetadataArchive(applicationName):
archive.write(file, file)
os.chdir(oldcwd)
-# Main function for extracting metadata from APK files
-def processApkFile(apkFilepath):
- # First, determine the name of the application we have here
- # This is needed in order to locate the metadata files within the APK that have the information we need
-
- # Prepare the aapt (Android SDK command) to inspect the provided APK
- commandToRun = "aapt dump badging %s" % (apkFilepath)
- manifest = subprocess.check_output( commandToRun, shell=True ).decode('utf-8')
- # Search through the aapt output for the name of the application
- result = re.search(' name=\'([^\']*)\'', manifest)
- applicationName = result.group(1)
-
- # Attempt to look within the APK provided for the metadata information we will need
- with zipfile.ZipFile(apkFilepath, 'r') as contents:
- appdataFile = contents.open("assets/share/metainfo/%s.appdata.xml" % applicationName)
- desktopFileContent = None
- try:
- desktopFileContent = contents.read("assets/share/applications/%s.desktop" % applicationName)
- except:
- None
- processAppstreamData(applicationName, appdataFile.read(), desktopFileContent)
-
-# Extract meta data from appstream/desktop file contents
-def processAppstreamData(applicationName, appstreamData, desktopData):
+# Generate metadata for the given appstream and desktop files
+def processAppstreamFile(appstreamFileName, desktopFileName):
+ # appstreamFileName has the form <id>.appdata.xml or <id>.metainfo.xml, so we
+ # have to strip off two extensions
+ applicationName = os.path.splitext(os.path.splitext(os.path.basename(appstreamFileName))[0])[0]
+
data = {}
# Within this file we look at every entry, and where possible try to export it's content so we can use it later
- root = ET.fromstring(appstreamData)
+ appstreamFile = open(appstreamFileName, "rb")
+ root = ET.fromstring(appstreamFile.read())
for child in root:
# Make sure we start with a blank slate for this entry
output = {}
@@ -261,15 +244,9 @@ def processAppstreamData(applicationName, appstreamData, desktopData):
# Did we find any categories?
# Sometimes we don't find any within the Fastlane information, but without categories the F-Droid store isn't of much use
# In the event this happens, fallback to the *.desktop file for the application to see if it can provide any insight.
- if not 'categories' in data and desktopData:
- # The Python XDG extension/wrapper requires that it be able to read the file itself
- # To ensure it is able to do this, we transfer the content of the file from the APK out to a temporary file to keep it happy
- (fd, path) = tempfile.mkstemp(suffix=applicationName + ".desktop")
- handle = open(fd, "wb")
- handle.write(desktopData)
- handle.close()
+ if not 'categories' in data and desktopFileName:
# Parse the XDG format *.desktop file, and extract the categories within it
- desktopFile = xdg.DesktopEntry.DesktopEntry(path)
+ desktopFile = xdg.DesktopEntry.DesktopEntry(desktopFileName)
data['categories'] = { None: desktopFile.getCategories() }
# Try to figure out the source repository
@@ -293,16 +270,6 @@ def processAppstreamData(applicationName, appstreamData, desktopData):
# put the result in an archive file for easier use by Jenkins
createMetadataArchive(applicationName)
-# Generate metadata for the given appstream and desktop files
-def processAppstreamFile(appstreamFileName, desktopFileName):
- appstreamFile = open(appstreamFileName, "rb")
- desktopData = None
- if desktopFileName and os.path.exists(desktopFileName):
- desktopFile = open(desktopFileName, "rb")
- desktopData = desktopFile.read()
- applicationName = os.path.basename(appstreamFileName)[:-12]
- processAppstreamData(applicationName, appstreamFile.read(), desktopData)
-
# scan source directory for manifests/metadata we can work with
def scanSourceDir():
files = glob.iglob(arguments.source + "/**/AndroidManifest.xml*", recursive=True)
@@ -346,7 +313,6 @@ def scanSourceDir():
# Parse the command line arguments we've been given
parser = argparse.ArgumentParser(description='Generate fastlane metadata for Android apps from appstream metadata')
-parser.add_argument('--apk', type=str, required=False, help='APK file to extract metadata from')
parser.add_argument('--appstream', type=str, required=False, help='Appstream file to extract metadata from')
parser.add_argument('--desktop', type=str, required=False, help='Desktop file to extract additional metadata from')
parser.add_argument('--source', type=str, required=False, help='Source directory to find metadata in')
@@ -361,12 +327,6 @@ if arguments.appstream and os.path.exists(arguments.appstream):
processAppstreamFile(arguments.appstream, arguments.desktop)
sys.exit(0)
-# else, if we have an APK, try to find the appstream file in there
-# this ensures compatibility with the old metadata generation
-if arguments.apk and os.path.exists(arguments.apk):
- processApkFile(arguments.apk)
- sys.exit(0)
-
# else, look in the source dir for appstream/desktop files
# this follows roughly what get-apk-args from binary factory does
if arguments.source and os.path.exists(arguments.source):
@@ -374,5 +334,5 @@ if arguments.source and os.path.exists(arguments.source):
sys.exit(0)
# else: missing arguments
-print("Either one of --appstream, --apk or --source have to be provided!")
+print("Either one of --appstream or --source have to be provided!")
sys.exit(1)