From bdec7d86524cfef73a58b8b2c1eb930269a4bdbb Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Wed, 9 Jun 2021 10:08:33 +0200 Subject: [PATCH] [checkupdates] UpdateCheckData use tag by default Use the tag as version, if no version file was specified: UpdateCheckData: app/build.gradle|versionCode\s(\d+)|| Extract version from tag, if a regex was specified: UpdateCheckData: app/build.gradle|versionCode\s(\d+)||Android-([\d.]+) Use the tag for both if no file was specified: UpdateCheckData: |\+(\d+)||Android-([\d.]+) --- fdroidserver/checkupdates.py | 40 +++++++++++++++------------ tests/checkupdates.TestCase | 52 +++++++++++++++++++++++++++++++++--- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index f6e70aae..91d36fec 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -161,19 +161,22 @@ def check_tags(app, pattern): if app.UpdateCheckData: filecode, codeex, filever, verex = app.UpdateCheckData.split('|') - vercode = None - filecode = build_dir / filecode - if not filecode.is_file(): - logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) - continue - filecontent = filecode.read_text() + if filecode: + filecode = build_dir / filecode + if not filecode.is_file(): + logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filecode, tag)) + continue + filecontent = filecode.read_text() + else: + filecontent = tag m = re.search(codeex, filecontent) - if m: - vercode = m.group(1).strip() + if not m: + continue + + vercode = m.group(1).strip() - version = "??" if filever: if filever != '.': filever = build_dir / filever @@ -181,19 +184,22 @@ def check_tags(app, pattern): filecontent = filever.read_text() else: logging.debug("UpdateCheckData file {0} not found in tag {1}".format(filever, tag)) + else: + filecontent = tag + version = tag + if verex: m = re.search(verex, filecontent) if m: version = m.group(1) - if vercode: - logging.debug("UpdateCheckData found version {0} ({1})" - .format(version, vercode)) - i_vercode = common.version_code_string_to_int(vercode) - if i_vercode > common.version_code_string_to_int(hcode): - htag = tag - hcode = str(i_vercode) - hver = version + logging.debug("UpdateCheckData found version {0} ({1})" + .format(version, vercode)) + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): + htag = tag + hcode = str(i_vercode) + hver = version else: for subdir in possible_subdirs(app): root_dir = build_dir / subdir diff --git a/tests/checkupdates.TestCase b/tests/checkupdates.TestCase index 5c5380db..da49deaf 100755 --- a/tests/checkupdates.TestCase +++ b/tests/checkupdates.TestCase @@ -158,7 +158,7 @@ class CheckupdatesTest(unittest.TestCase): app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' - app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' + app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() @@ -187,7 +187,7 @@ class CheckupdatesTest(unittest.TestCase): app.metadatapath = 'metadata/' + app.id + '.yml' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'HTTP' - app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' + app.UpdateCheckData = r'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)' app.UpdateCheckIgnore = 'beta' respmock = mock.Mock() @@ -206,10 +206,10 @@ class CheckupdatesTest(unittest.TestCase): app.RepoType = 'git' app.CurrentVersionCode = 10108 app.UpdateCheckMode = 'Tags' - app.UpdateCheckData = 'b.txt|c(.*)|e.txt|v(.*)' + app.UpdateCheckData = r'b.txt|c(.*)|e.txt|v(.*)' vcs = mock.Mock() - vcs.latesttags.return_value = ['1.1.8', '1.1.9'] + vcs.latesttags.return_value = ['1.1.9', '1.1.8'] with mock.patch( 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' ) as _ignored, mock.patch.object( @@ -221,6 +221,50 @@ class CheckupdatesTest(unittest.TestCase): self.assertEqual(vername, '1.1.9') self.assertEqual(vercode, '10109') + app.UpdateCheckData = r'b.txt|c(.*)|.|v(.*)' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.0\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '10109') + + app.UpdateCheckData = r'b.txt|c(.*)||' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.9') + self.assertEqual(vercode, '10109') + + vcs.latesttags.return_value = ['Android-1.1.0', '1.1.8'] + app.UpdateCheckData = r'b.txt|c(.*)||Android-([\d.]+)' + with mock.patch( + 'pathlib.Path.read_text', lambda a: 'v1.1.9\nc10109' + ) as _ignored, mock.patch.object( + Path, 'is_file' + ) as mock_path, mock.patch('fdroidserver.common.getvcs', return_value=vcs): + _ignored # silence the linters + mock_path.is_file.return_falue = True + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '10109') + + app.UpdateCheckData = r'|\+(\d+)||Android-([\d.]+)' + vcs.latesttags.return_value = ['Android-1.1.0+1'] + with mock.patch('fdroidserver.common.getvcs', return_value=vcs): + vername, vercode, _tag = fdroidserver.checkupdates.check_tags(app, None) + self.assertEqual(vername, '1.1.0') + self.assertEqual(vercode, '1') + if __name__ == "__main__": parser = optparse.OptionParser()