diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index b166ca39..0fde3536 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -168,10 +168,11 @@ def check_tags(app, pattern): if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) - if int(vercode) > int(hcode): + i_vercode = common.version_code_string_to_int(vercode) + if i_vercode > common.version_code_string_to_int(hcode): hpak = package htag = tag - hcode = str(int(vercode)) + hcode = str(i_vercode) hver = version if not hpak: diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 7e145519..9032cf8f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -497,6 +497,11 @@ def read_pkg_args(appid_versionCode_pairs, allow_vercodes=False): for p in appid_versionCode_pairs: if allow_vercodes and ':' in p: package, vercode = p.split(':') + try: + i_vercode = int(vercode, 0) + except ValueError: + i_vercode = int(vercode) + vercode = str(i_vercode) else: package, vercode = p, None if package not in vercodes: @@ -3209,10 +3214,22 @@ def parse_xml(path): def string_is_integer(string): try: - int(string) + int(string, 0) return True except ValueError: - return False + try: + int(string) + return True + except ValueError: + return False + + +def version_code_string_to_int(vercode): + """Convert an version code string of any base into an int""" + try: + return int(vercode, 0) + except ValueError: + return int(vercode) def local_rsync(options, fromdir, todir): diff --git a/tests/common.TestCase b/tests/common.TestCase index d2d46ce4..33db7283 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1076,6 +1076,22 @@ class CommonTest(unittest.TestCase): with gzip.open(expected_log_path, 'r') as f: self.assertEqual(f.read(), mocklogcontent) + def test_string_is_integer(self): + self.assertTrue(fdroidserver.common.string_is_integer('0x10')) + self.assertTrue(fdroidserver.common.string_is_integer('010')) + self.assertTrue(fdroidserver.common.string_is_integer('123')) + self.assertFalse(fdroidserver.common.string_is_integer('0xgg')) + self.assertFalse(fdroidserver.common.string_is_integer('01g')) + self.assertFalse(fdroidserver.common.string_is_integer('o123')) + + def test_version_code_string_to_int(self): + self.assertEqual(16, fdroidserver.common.version_code_string_to_int('0x10')) + self.assertEqual(198712389, fdroidserver.common.version_code_string_to_int('198712389')) + self.assertEqual(8, fdroidserver.common.version_code_string_to_int('0o10')) + self.assertEqual(10, fdroidserver.common.version_code_string_to_int('010')) + self.assertEqual(123, fdroidserver.common.version_code_string_to_int('0000123')) + self.assertEqual(-42, fdroidserver.common.version_code_string_to_int('-42')) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__))