From 48559ecec5a1c402f4d4bf0dc6c8b1c09c555b1a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 7 Jun 2023 15:57:58 +0200 Subject: [PATCH] category with no apps should be ignored, even if defined in config https://gitlab.com/fdroid/fdroidclient/-/issues/2619#note_1421280589 The test needed to change because the test index files contained category definitions that were not ever used in the "copy tests/repo, generate java/gpg keys, update, and gpgsign" test in tests/run-tests. --- fdroidserver/index.py | 7 +++++++ tests/metadata.TestCase | 2 ++ tests/metadata/com.politedroid.yml | 2 ++ tests/metadata/dump/com.politedroid.yaml | 2 ++ tests/repo/entry.json | 2 +- tests/repo/index-v1.json | 2 ++ tests/repo/index-v2.json | 2 ++ tests/repo/index.xml | 4 ++-- tests/update.TestCase | 24 ++++++++++++++++++++++++ 9 files changed, 44 insertions(+), 3 deletions(-) diff --git a/fdroidserver/index.py b/fdroidserver/index.py index d05d159e..bef83ff6 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -743,9 +743,16 @@ def make_v2(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_ if categories_used_by_apps and not output['repo'].get(CATEGORIES_CONFIG_NAME): output['repo'][CATEGORIES_CONFIG_NAME] = dict() + # include definitions for "auto-defined" categories, e.g. just used in app metadata for category in sorted(categories_used_by_apps): if category not in output['repo'][CATEGORIES_CONFIG_NAME]: output['repo'][CATEGORIES_CONFIG_NAME][category] = dict() + # do not include defined categories if no apps use them + for category in list(output['repo'].get(CATEGORIES_CONFIG_NAME, list())): + if category not in categories_used_by_apps: + del output['repo'][CATEGORIES_CONFIG_NAME][category] + msg = _('Category "{category}" defined but not used for any apps!') + logging.warning(msg.format(category=category)) entry = {} entry["timestamp"] = repodict["timestamp"] diff --git a/tests/metadata.TestCase b/tests/metadata.TestCase index 15e2eddd..c46d5bbf 100755 --- a/tests/metadata.TestCase +++ b/tests/metadata.TestCase @@ -1863,6 +1863,8 @@ class MetadataTest(unittest.TestCase): AntiFeatures: - NonFreeNet Categories: + - Multimedia + - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid diff --git a/tests/metadata/com.politedroid.yml b/tests/metadata/com.politedroid.yml index 669520a6..cd474d6c 100644 --- a/tests/metadata/com.politedroid.yml +++ b/tests/metadata/com.politedroid.yml @@ -1,6 +1,8 @@ AntiFeatures: - NonFreeNet Categories: + - Multimedia + - Security - Time License: GPL-3.0-only SourceCode: https://github.com/miguelvps/PoliteDroid diff --git a/tests/metadata/dump/com.politedroid.yaml b/tests/metadata/dump/com.politedroid.yaml index 17e6a8f3..57cce841 100644 --- a/tests/metadata/dump/com.politedroid.yaml +++ b/tests/metadata/dump/com.politedroid.yaml @@ -161,6 +161,8 @@ Builds: versionCode: 6 versionName: '1.5' Categories: +- Multimedia +- Security - Time Changelog: '' CurrentVersion: '1.5' diff --git a/tests/repo/entry.json b/tests/repo/entry.json index 0e8828e0..56249552 100644 --- a/tests/repo/entry.json +++ b/tests/repo/entry.json @@ -3,7 +3,7 @@ "version": 20002, "index": { "name": "/index-v2.json", - "sha256": "b613858aa7a2ec476fcef5c841a5b8ff4b3b0f67f07678da981e2843f49c71ba", + "sha256": "5e3c0eaafd99d3518da2bb2bc7565b2ebcb17775a2f4ccc33b7336901ec71a6f", "size": 53283, "numPackages": 10 }, diff --git a/tests/repo/index-v1.json b/tests/repo/index-v1.json index 4b845994..33d0f9ce 100644 --- a/tests/repo/index-v1.json +++ b/tests/repo/index-v1.json @@ -174,6 +174,8 @@ "NonFreeNet" ], "categories": [ + "Multimedia", + "Security", "Time" ], "suggestedVersionName": "1.5", diff --git a/tests/repo/index-v2.json b/tests/repo/index-v2.json index f45c1514..d41b95b5 100644 --- a/tests/repo/index-v2.json +++ b/tests/repo/index-v2.json @@ -553,6 +553,8 @@ "metadata": { "added": 1498176000000, "categories": [ + "Multimedia", + "Security", "Time" ], "issueTracker": "https://github.com/miguelvps/PoliteDroid/issues", diff --git a/tests/repo/index.xml b/tests/repo/index.xml index 6935f675..24ebea24 100644 --- a/tests/repo/index.xml +++ b/tests/repo/index.xml @@ -311,8 +311,8 @@ APK is called F-Droid Privileged Extension. com.politedroid.6.png Activates silent mode during calendar events. GPL-3.0-only - Time - Time + Multimedia,Security,Time + Multimedia https://github.com/miguelvps/PoliteDroid https://github.com/miguelvps/PoliteDroid/issues diff --git a/tests/update.TestCase b/tests/update.TestCase index e859e04f..ac9a6f5e 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -1898,6 +1898,30 @@ class UpdateTest(unittest.TestCase): index['repo'][CATEGORIES_CONFIG_NAME], ) + def test_empty_categories_not_in_index(self): + """A category with no apps should be ignored, even if defined in config.""" + os.chdir(self.testdir) + os.mkdir('config') + Path('config/categories.yml').write_text('System: {name: S}\nTime: {name: T}\n') + os.mkdir('metadata') + os.mkdir('repo') + Path('config.yml').write_text( + 'repo_pubkey: ffffffffffffffffffffffffffffffffffffffff' + ) + + testapk = os.path.join('repo', 'com.politedroid_6.apk') + shutil.copy(os.path.join(self.basedir, testapk), testapk) + Path('metadata/com.politedroid.yml').write_text('Categories: [Time]') + + with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']): + fdroidserver.update.main() + with open('repo/index-v2.json') as fp: + index = json.load(fp) + self.assertEqual( + {'Time': {'name': {'en-US': 'T'}}}, + index['repo'][CATEGORIES_CONFIG_NAME], + ) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__))