diff --git a/fdroidserver/common.py b/fdroidserver/common.py index aa81cb91..bd831f1e 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1336,27 +1336,63 @@ def parse_androidmanifests(paths, app): vercode = None package = None + flavour = None + if app.builds and 'gradle' in app.builds[-1] and app.builds[-1].gradle: + flavour = app.builds[-1].gradle[-1] + if has_extension(path, 'gradle'): with open(path, 'r') as f: + inside_flavour_group = 0 + inside_required_flavour = 0 for line in f: if gradle_comment.match(line): continue - # Grab first occurence of each to avoid running into - # alternative flavours and builds. - if not package: - matches = psearch_g(line) - if matches: - s = matches.group(2) - if app_matches_packagename(app, s): - package = s - if not version: - matches = vnsearch_g(line) - if matches: - version = matches.group(2) - if not vercode: - matches = vcsearch_g(line) - if matches: - vercode = matches.group(1) + + if inside_flavour_group > 0: + if inside_required_flavour > 0: + matches = psearch_g(line) + if matches: + s = matches.group(2) + if app_matches_packagename(app, s): + package = s + + matches = vnsearch_g(line) + if matches: + version = matches.group(2) + + matches = vcsearch_g(line) + if matches: + vercode = matches.group(1) + + if '{' in line: + inside_required_flavour += 1 + if '}' in line: + inside_required_flavour -= 1 + else: + if flavour and (flavour in line): + inside_required_flavour = 1 + + if '{' in line: + inside_flavour_group += 1 + if '}' in line: + inside_flavour_group -= 1 + else: + if "productFlavors" in line: + inside_flavour_group = 1 + if not package: + matches = psearch_g(line) + if matches: + s = matches.group(2) + if app_matches_packagename(app, s): + package = s + if not version: + matches = vnsearch_g(line) + if matches: + version = matches.group(2) + if not vercode: + matches = vcsearch_g(line) + if matches: + vercode = matches.group(1) else: try: xml = parse_xml(path) diff --git a/tests/common.TestCase b/tests/common.TestCase index 06b17a04..35bc01e1 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -612,6 +612,49 @@ class CommonTest(unittest.TestCase): sig = fdroidserver.common.metadata_find_developer_signature('org.smssecure.smssecure') self.assertEqual('b30bb971af0d134866e158ec748fcd553df97c150f58b0a963190bbafbeb0868', sig) + def test_parse_androidmanifests(self): + source_files_dir = os.path.join(os.path.dirname(__file__), 'source-files') + app = fdroidserver.metadata.App() + app.id = 'org.fdroid.fdroid' + paths = [ + os.path.join(source_files_dir, 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), + os.path.join(source_files_dir, 'fdroid', 'fdroidclient', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('0.94-test', '940', 'org.fdroid.fdroid'), + fdroidserver.common.parse_androidmanifests(paths, app)) + + def test_parse_androidmanifests_with_flavor(self): + source_files_dir = os.path.join(os.path.dirname(__file__), 'source-files') + + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['devVersion'] + app.builds = [build] + app.id = 'org.fdroid.fdroid.dev' + paths = [ + os.path.join(source_files_dir, 'fdroid', 'fdroidclient', 'AndroidManifest.xml'), + os.path.join(source_files_dir, 'fdroid', 'fdroidclient', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('0.95-dev', '949', 'org.fdroid.fdroid.dev'), + fdroidserver.common.parse_androidmanifests(paths, app)) + + app = fdroidserver.metadata.App() + build = fdroidserver.metadata.Build() + build.gradle = ['free'] + app.builds = [build] + app.id = 'eu.siacs.conversations' + paths = [ + os.path.join(source_files_dir, 'eu.siacs.conversations', 'build.gradle'), + ] + for path in paths: + self.assertTrue(os.path.isfile(path)) + self.assertEqual(('1.23.1', '245', 'eu.siacs.conversations'), + fdroidserver.common.parse_androidmanifests(paths, app)) + if __name__ == "__main__": parser = optparse.OptionParser() diff --git a/tests/source-files/fdroid/fdroidclient/build.gradle b/tests/source-files/fdroid/fdroidclient/build.gradle index 1d994dc8..8971f235 100644 --- a/tests/source-files/fdroid/fdroidclient/build.gradle +++ b/tests/source-files/fdroid/fdroidclient/build.gradle @@ -129,6 +129,21 @@ android { compileSdkVersion 21 buildToolsVersion '22.0.1' + defaultConfig { + + flavorDimensions "default" + + productFlavors { + devVersion { + applicationId "org.fdroid.fdroid.dev" + dimension "default" + versionCode 949 + versionName "0.95-dev" + } + } + + } + sourceSets { main { manifest.srcFile 'AndroidManifest.xml'