From b83c3c9e18d0e9913de78adafe06c6c3c128c929 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Nov 2019 19:06:23 +0100 Subject: [PATCH 1/4] Support hex in versionCode Example: https://github.com/Wilm0r/giggity/blob/master/app/src/main/AndroidManifest.xml#L2 --- fdroidserver/checkupdates.py | 12 ++++++++++-- fdroidserver/common.py | 8 ++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index b166ca39..ea21bb66 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -168,10 +168,18 @@ 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): + try: + i_vercode = int(vercode, 0) + except ValueError: + i_vercode = int(vercode) + try: + i_hcode = int(hcode, 0) + except ValueError: + i_hcode = int(hcode) + if i_vercode > i_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..02a58390 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3209,10 +3209,14 @@ 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 local_rsync(options, fromdir, todir): From 0e071a689d5aa7dcbbe22537087b0eb69bf2b76f Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Thu, 28 Nov 2019 21:44:28 +0100 Subject: [PATCH 2/4] Support hex versionCode in build command line Example: fdroid build net.gaast.giggity:0x200 --- fdroidserver/common.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 02a58390..b5c4d2a5 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: From bbee2cf707c6a7207367124d52791e109734b2ed Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof Date: Tue, 3 Dec 2019 21:49:44 +0100 Subject: [PATCH 3/4] Add unit test for string_is_integer() --- tests/common.TestCase | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/common.TestCase b/tests/common.TestCase index d2d46ce4..89508b15 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1076,6 +1076,14 @@ 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')) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) From 7d40e893413526d23c8a697a12d5ad93147fd551 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 3 Dec 2019 23:51:48 +0100 Subject: [PATCH 4/4] checkupdates: split out vercode parsing into testable function --- fdroidserver/checkupdates.py | 11 ++--------- fdroidserver/common.py | 8 ++++++++ tests/common.TestCase | 8 ++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/fdroidserver/checkupdates.py b/fdroidserver/checkupdates.py index ea21bb66..0fde3536 100644 --- a/fdroidserver/checkupdates.py +++ b/fdroidserver/checkupdates.py @@ -168,15 +168,8 @@ def check_tags(app, pattern): if vercode: logging.debug("Manifest exists in subdir '{0}'. Found version {1} ({2})" .format(subdir, version, vercode)) - try: - i_vercode = int(vercode, 0) - except ValueError: - i_vercode = int(vercode) - try: - i_hcode = int(hcode, 0) - except ValueError: - i_hcode = int(hcode) - if i_vercode > i_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(i_vercode) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b5c4d2a5..9032cf8f 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -3224,6 +3224,14 @@ def string_is_integer(string): 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): '''Rsync method for local to local copying of things diff --git a/tests/common.TestCase b/tests/common.TestCase index 89508b15..33db7283 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1084,6 +1084,14 @@ class CommonTest(unittest.TestCase): 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__))