diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 9078cd04..71fd20bc 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -826,6 +826,15 @@ def force_halt_build(timeout): vm.destroy() +def keep_when_not_allowed(): + """Control if APKs signed by keys not in AllowedAPKSigningKeys are removed.""" + return ( + (options is not None and options.keep_when_not_allowed) + or (config is not None and config.get('keep_when_not_allowed')) + or common.default_config['keep_when_not_allowed'] + ) + + def parse_commandline(): """Parse the command line. @@ -863,6 +872,8 @@ def parse_commandline(): help=_("Force build of disabled apps, and carries on regardless of scan problems. Only allowed in test mode.")) parser.add_argument("-a", "--all", action="store_true", default=False, help=_("Build all applications available")) + parser.add_argument("--keep-when-not-allowed", default=False, action="store_true", + help=argparse.SUPPRESS) parser.add_argument("-w", "--wiki", default=False, action="store_true", help=argparse.SUPPRESS) metadata.add_metadata_arguments(parser) @@ -1121,7 +1132,7 @@ def main(): logging.warn(_('AllowedAPKSigningKeys missing ' 'but reference binary supplied')) elif used_key not in expected_keys: - if options.test: + if options.test or keep_when_not_allowed(): logging.warning(_('Keeping failed build "{apkfilename}"') .format(apkfilename=unsigned_apk)) else: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index a6039dcb..550e7b5a 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -128,6 +128,7 @@ default_config = { 'gradle': os.path.join(FDROID_PATH, 'gradlew-fdroid'), 'sync_from_local_copy_dir': False, 'allow_disabled_algorithms': False, + 'keep_when_not_allowed': False, 'per_app_repos': False, 'make_current_version_link': False, 'current_version_name_source': 'Name', diff --git a/tests/build.TestCase b/tests/build.TestCase index ffaaee53..c6cc0570 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -40,6 +40,10 @@ class FakeProcess: print('FakeFDroidPopen', args, kwargs) +class Options: + keep_when_not_allowed = False + + class BuildTest(unittest.TestCase): '''fdroidserver/build.py''' @@ -51,6 +55,7 @@ class BuildTest(unittest.TestCase): os.chdir(self.basedir) fdroidserver.common.config = None fdroidserver.build.config = None + fdroidserver.build.options = None self._td = mkdtemp() self.testdir = self._td.name @@ -604,7 +609,7 @@ class BuildTest(unittest.TestCase): sdk_path = os.path.join(self.testdir, 'android-sdk') self.create_fake_android_home(sdk_path) with open('config.yml', 'w') as fp: - yaml.dump({'sdk_path': sdk_path}, fp) + yaml.dump({'sdk_path': sdk_path, 'keep_when_not_allowed': True}, fp) os.chmod('config.yml', 0o600) fdroidserver.common.build = fdroidserver.common.read_config() @@ -920,6 +925,51 @@ class BuildTest(unittest.TestCase): test_flag = ('--skip-scan', True) fdroidserver.build.build_server(app, build, vcs, '', '', '', False) + def test_keep_when_not_allowed_default(self): + self.assertFalse(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_config_true(self): + fdroidserver.build.config = {'keep_when_not_allowed': True} + self.assertTrue(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_config_false(self): + fdroidserver.build.config = {'keep_when_not_allowed': False} + self.assertFalse(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_options_true(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = True + self.assertTrue(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_options_false(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = False + self.assertFalse(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_options_true_override_config(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = True + fdroidserver.build.config = {'keep_when_not_allowed': False} + self.assertTrue(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_options_default_does_not_override(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = False + fdroidserver.build.config = {'keep_when_not_allowed': True} + self.assertTrue(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_all_true(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = True + fdroidserver.build.config = {'keep_when_not_allowed': True} + self.assertTrue(fdroidserver.build.keep_when_not_allowed()) + + def test_keep_when_not_allowed_all_false(self): + fdroidserver.build.options = Options + fdroidserver.build.options.keep_when_not_allowed = False + fdroidserver.build.config = {'keep_when_not_allowed': False} + self.assertFalse(fdroidserver.build.keep_when_not_allowed()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__))