[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#987718: marked as done (unblock: fdroidserver/2.0.1-1)



Your message dated Thu, 20 May 2021 21:45:55 +0200
with message-id <CAM8zJQt05wiWKdJsJCrMjEG3PicKXe286e4h=kizXWJjEHfK9g@mail.gmail.com>
and subject line Re: Bug#987718: unblock: fdroidserver/2.0.1-1
has caused the Debian Bug report #987718,
regarding unblock: fdroidserver/2.0.1-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
987718: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=987718
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package fdroidserver

F-Droid is built on Debian and is a community with the same goals as
Debian, modeled after Debian.  The F-Droid community maintains stable
release branches for fdroidserver that are devoted to each Debian
release.  buster has 1.1.x and bullseye has 2.0.x.  I am both package
maintainer and upstream on this package, and a Debian Developer.  The
2.0.1 release includes only narrow bug and compatibility fixes.  This
package has an extensive autopkgtest suite.

These are specific issues that are fixed:

* corrupt app icons are published, instead of valid PNGs #987717
* stop setting up source repo when running lint/rewritemeta
https://gitlab.com/fdroid/fdroidserver/commit/92438bbf78532b89fb7619601cf75c95e7d7f0a0
* use latest SPDX license info
https://gitlab.com/fdroid/fdroidserver/commit/eca7b23fc9f742d9420ec068cf0d60e5bdcf497e
* crash on bad fastlane/triple-t files
https://gitlab.com/fdroid/fdroidserver/commit/cfbee12ad2a1385aaf0aa7d9076924373639d189
* crash on bad repo file:
https://gitlab.com/fdroid/fdroidserver/commit/240139baf9778536251b9deee4c0e071a2333ebb


Previous stable updates to fdroidserver are here:

* #960885
* #935809
* #856358
* #773166

--------------------------------------------------------------------

Here's the debdiff, note that the majority of the changes are to test
files, which are also part of the autopkgtest run:


diff -Nru fdroidserver-2.0/CHANGELOG.md fdroidserver-2.0.1/CHANGELOG.md
--- fdroidserver-2.0/CHANGELOG.md	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/CHANGELOG.md	2021-03-09 18:21:30.000000000 +0100
@@ -4,6 +4,20 @@
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 
+## [2.0.1] - 2020-03-09
+
+### Fixed
+
+* metadata: stop setting up source repo when running lint/rewritemeta
+* scanner: show error if scan_binary fails to run apkanalyzer
+* common: properly parse version from NDK's source.properties
+* update: stop extracting and storing XML icons, they're useless
+* index: raise error rather than crash on bad repo file
+* update: handle large, corrupt, or inaccessible fastlane/triple-t files
+* Update SPDX License List
+* checkupdates: set User-Agent to make gitlab.com happy
+* Run push_binary_transparency only once
+
 ## [2.0] - 2020-01-31
 
 For a more complete overview, see the [2.0
diff -Nru fdroidserver-2.0/debian/changelog fdroidserver-2.0.1/debian/changelog
--- fdroidserver-2.0/debian/changelog	2021-02-02 13:28:22.000000000 +0100
+++ fdroidserver-2.0.1/debian/changelog	2021-03-09 18:26:20.000000000 +0100
@@ -1,3 +1,9 @@
+fdroidserver (2.0.1-1) unstable; urgency=medium
+
+  * New upstream version 2.0.1
+
+ -- Hans-Christoph Steiner <hans@eds.org>  Tue, 09 Mar 2021 18:26:20 +0100
+
 fdroidserver (2.0-1) unstable; urgency=medium
 
   * New upstream version 2.0
diff -Nru fdroidserver-2.0/examples/fdroid_fetchsrclibs.py fdroidserver-2.0.1/examples/fdroid_fetchsrclibs.py
--- fdroidserver-2.0/examples/fdroid_fetchsrclibs.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/examples/fdroid_fetchsrclibs.py	2021-03-09 18:21:30.000000000 +0100
@@ -21,7 +21,7 @@
     options = parser.parse_args()
     common.options = options
     pkgs = common.read_pkg_args(options.appid, True)
-    allapps = metadata.read_metadata(pkgs)
+    allapps = metadata.read_metadata(pkgs, check_vcs=True)
     apps = common.read_app_args(options.appid, allapps, True)
     srclib_dir = os.path.join('build', 'srclib')
     os.makedirs(srclib_dir, exist_ok=True)
diff -Nru fdroidserver-2.0/fdroidserver/build.py fdroidserver-2.0.1/fdroidserver/build.py
--- fdroidserver-2.0/fdroidserver/build.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/build.py	2021-03-09 18:21:30.000000000 +0100
@@ -1013,7 +1013,7 @@
 
     # Read all app and srclib metadata
     pkgs = common.read_pkg_args(options.appid, True)
-    allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True)
+    allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True, check_vcs=True)
     apps = common.read_app_args(options.appid, allapps, True)
 
     for appid, app in list(apps.items()):
diff -Nru fdroidserver-2.0/fdroidserver/checkupdates.py fdroidserver-2.0.1/fdroidserver/checkupdates.py
--- fdroidserver-2.0/fdroidserver/checkupdates.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/checkupdates.py	2021-03-09 18:21:30.000000000 +0100
@@ -35,6 +35,7 @@
 from . import _
 from . import common
 from . import metadata
+from . import net
 from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException
 
 
@@ -63,7 +64,7 @@
         vercode = None
         if len(urlcode) > 0:
             logging.debug("...requesting {0}".format(urlcode))
-            req = urllib.request.Request(urlcode, None)
+            req = urllib.request.Request(urlcode, None, headers=net.HEADERS)
             resp = urllib.request.urlopen(req, None, 20)  # nosec B310 scheme is filtered above
             page = resp.read().decode('utf-8')
 
diff -Nru fdroidserver-2.0/fdroidserver/common.py fdroidserver-2.0.1/fdroidserver/common.py
--- fdroidserver-2.0/fdroidserver/common.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/common.py	2021-03-09 18:21:30.000000000 +0100
@@ -3819,7 +3819,7 @@
             with open(ndk_release_txt, 'r') as fp:
                 components.append((os.path.basename(ndk_path), fp.read()[:-1]))
 
-    pattern = re.compile('^Pkg.Revision=(.+)', re.MULTILINE)
+    pattern = re.compile(r'^Pkg.Revision *= *(.+)', re.MULTILINE)
     for root, dirs, files in os.walk(sdk_path):
         if 'source.properties' in files:
             source_properties = os.path.join(root, 'source.properties')
diff -Nru fdroidserver-2.0/fdroidserver/deploy.py fdroidserver-2.0.1/fdroidserver/deploy.py
--- fdroidserver-2.0/fdroidserver/deploy.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/deploy.py	2021-03-09 18:21:30.000000000 +0100
@@ -802,10 +802,10 @@
         if config.get('virustotal_apikey'):
             upload_to_virustotal(repo_section, config.get('virustotal_apikey'))
 
-        binary_transparency_remote = config.get('binary_transparency_remote')
-        if binary_transparency_remote:
-            push_binary_transparency(BINARY_TRANSPARENCY_DIR,
-                                     binary_transparency_remote)
+    binary_transparency_remote = config.get('binary_transparency_remote')
+    if binary_transparency_remote:
+        push_binary_transparency(BINARY_TRANSPARENCY_DIR,
+                                 binary_transparency_remote)
 
     if config.get('wiki_server') and config.get('wiki_path'):
         update_wiki()
diff -Nru fdroidserver-2.0/fdroidserver/lint.py fdroidserver-2.0.1/fdroidserver/lint.py
--- fdroidserver-2.0/fdroidserver/lint.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/lint.py	2021-03-09 18:21:30.000000000 +0100
@@ -683,6 +683,7 @@
     'Artistic-1.0-cl8',
     'Artistic-2.0',
     'Beerware',
+    'BSD-1-Clause',
     'BSD-2-Clause',
     'BSD-2-Clause-FreeBSD',
     'BSD-2-Clause-Patent',
@@ -692,6 +693,8 @@
     'BSD-4-Clause',
     'BSL-1.0',
     'BitTorrent-1.1',
+    'CAL-1.0',
+    'CAL-1.0-Combined-Work-Exception',
     'CATOSL-1.1',
     'CC-BY-4.0',
     'CC-BY-SA-4.0',
@@ -763,6 +766,7 @@
     'MS-RL',
     'MirOS',
     'Motosoto',
+    'MulanPSL-2.0',
     'Multics',
     'NASA-1.3',
     'NCSA',
@@ -778,9 +782,12 @@
     'ODbL-1.0',
     'OFL-1.0',
     'OFL-1.1',
+    'OFL-1.1-RFN',
+    'OFL-1.1-no-RFN',
     'OGTSL',
     'OLDAP-2.3',
     'OLDAP-2.7',
+    'OLDAP-2.8',
     'OSET-PL-2.1',
     'OSL-1.0',
     'OSL-1.1',
@@ -804,7 +811,9 @@
     'SPL-1.0',
     'SimPL-2.0',
     'Sleepycat',
+    'UCL-1.0',
     'UPL-1.0',
+    'Unicode-DFS-2016',
     'Unlicense',
     'VSL-1.0',
     'Vim',
diff -Nru fdroidserver-2.0/fdroidserver/metadata.py fdroidserver-2.0.1/fdroidserver/metadata.py
--- fdroidserver-2.0/fdroidserver/metadata.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/metadata.py	2021-03-09 18:21:30.000000000 +0100
@@ -541,7 +541,7 @@
         srclibs[srclibname] = parse_yaml_srclib(metadatapath)
 
 
-def read_metadata(appids={}, refresh=True, sort_by_time=False):
+def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False):
     """Return a list of App instances sorted newest first
 
     This reads all of the metadata files in a 'data' repository, then
@@ -597,7 +597,7 @@
         if appid in apps:
             _warn_or_exception(_("Found multiple metadata files for {appid}")
                                .format(appid=appid))
-        app = parse_metadata(metadatapath, appid in appids, refresh)
+        app = parse_metadata(metadatapath, check_vcs, refresh)
         check_metadata(app)
         apps[app.id] = app
 
diff -Nru fdroidserver-2.0/fdroidserver/scanner.py fdroidserver-2.0.1/fdroidserver/scanner.py
--- fdroidserver-2.0/fdroidserver/scanner.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/scanner.py	2021-03-09 18:21:30.000000000 +0100
@@ -106,6 +106,9 @@
     logging.info("Scanning APK for known non-free classes.")
     result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False)
     problems = 0
+    if result.returncode != 0:
+        problems += 1
+        logging.error(result.output)
     for suspect, regexp in CODE_SIGNATURES.items():
         matches = regexp.findall(result.output)
         if matches:
diff -Nru fdroidserver-2.0/fdroidserver/update.py fdroidserver-2.0.1/fdroidserver/update.py
--- fdroidserver-2.0/fdroidserver/update.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver/update.py	2021-03-09 18:21:30.000000000 +0100
@@ -768,23 +768,41 @@
 
 
 def _set_localized_text_entry(app, locale, key, f):
-    limit = config['char_limits'][key]
-    localized = _get_localized_dict(app, locale)
-    with open(f, errors='replace') as fp:
-        text = fp.read()[:limit]
-        if len(text) > 0:
-            if key in ('name', 'summary', 'video'):  # hardcoded as a single line
-                localized[key] = text.strip('\n')
-            else:
-                localized[key] = text
+    """Read a fastlane/triple-t metadata file and add an entry to the app
+
+    This reads more than the limit, in case there is leading or
+    trailing whitespace to be stripped
+
+    """
+    try:
+        limit = config['char_limits'][key]
+        localized = _get_localized_dict(app, locale)
+        with open(f, errors='replace') as fp:
+            text = fp.read(limit * 2)
+            if len(text) > 0:
+                if key in ('name', 'summary', 'video'):  # hardcoded as a single line
+                    localized[key] = text.strip('\n')[:limit]
+                else:
+                    localized[key] = text[:limit]
+    except Exception as e:
+        logging.error(_('{path}: {error}').format(path=f, error=str(e)))
 
 
 def _set_author_entry(app, key, f):
-    limit = config['char_limits']['author']
-    with open(f, errors='replace') as fp:
-        text = fp.read()[:limit]
-        if len(text) > 0:
-            app[key] = text.strip()
+    """read a fastlane/triple-t author file and add the entry to the app
+
+    This reads more than the limit, in case there is leading or
+    trailing whitespace to be stripped
+
+    """
+    try:
+        limit = config['char_limits']['author']
+        with open(f, errors='replace') as fp:
+            text = fp.read(limit * 2)
+            if len(text) > 0:
+                app[key] = text.strip()[:limit]
+    except Exception as e:
+        logging.error(_('{path}: {error}').format(path=f, error=str(e)))
 
 
 def _strip_and_copy_image(in_file, outpath):
@@ -1396,7 +1414,7 @@
 
     """
     icons_src = dict()
-    density_re = re.compile(r'^res/(.*)/{}\.(png|xml)$'.format(icon_name))
+    density_re = re.compile(r'^res/(.*)/{}\.png$'.format(icon_name))
     with zipfile.ZipFile(apkfile) as zf:
         for filename in zf.namelist():
             m = density_re.match(filename)
@@ -1659,7 +1677,7 @@
                                 .format(apkfilename=apkfile) + str(e))
 
         # extract icons from APK zip file
-        iconfilename = "%s.%s" % (apk['packageName'], apk['versionCode'])
+        iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode'])
         try:
             empty_densities = extract_apk_icons(iconfilename, apk, apkzip, repodir)
         finally:
@@ -1746,8 +1764,6 @@
         if m and m.group(4) == 'png':
             density = screen_resolutions[m.group(2)]
             pngs[m.group(3) + '/' + density] = m.group(0)
-
-    icon_type = None
     empty_densities = []
     for density in screen_densities:
         if density not in apk['icons_src']:
@@ -1755,7 +1771,7 @@
             continue
         icon_src = apk['icons_src'][density]
         icon_dir = get_icon_dir(repo_dir, density)
-        icon_type = '.png'
+        icon_dest = os.path.join(icon_dir, icon_filename)
 
         # Extract the icon files per density
         if icon_src.endswith('.xml'):
@@ -1766,48 +1782,44 @@
                     icon_src = name
             if icon_src.endswith('.xml'):
                 empty_densities.append(density)
-                icon_type = '.xml'
-        icon_dest = os.path.join(icon_dir, icon_filename + icon_type)
-
+                continue
         try:
             with open(icon_dest, 'wb') as f:
                 f.write(get_icon_bytes(apkzip, icon_src))
-            apk['icons'][density] = icon_filename + icon_type
+            apk['icons'][density] = icon_filename
         except (zipfile.BadZipFile, ValueError, KeyError) as e:
             logging.warning("Error retrieving icon file: %s %s", icon_dest, e)
             del apk['icons_src'][density]
             empty_densities.append(density)
 
     # '-1' here is a remnant of the parsing of aapt output, meaning "no DPI specified"
-    if '-1' in apk['icons_src']:
+    if '-1' in apk['icons_src'] and not apk['icons_src']['-1'].endswith('.xml'):
         icon_src = apk['icons_src']['-1']
-        icon_type = icon_src[-4:]
-        icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename + icon_type)
+        icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename)
         with open(icon_path, 'wb') as f:
             f.write(get_icon_bytes(apkzip, icon_src))
-        if icon_type == '.png':
-            im = None
-            try:
-                im = Image.open(icon_path)
-                dpi = px_to_dpi(im.size[0])
-                for density in screen_densities:
-                    if density in apk['icons']:
-                        break
-                    if density == screen_densities[-1] or dpi >= int(density):
-                        apk['icons'][density] = icon_filename + icon_type
-                        shutil.move(icon_path,
-                                    os.path.join(get_icon_dir(repo_dir, density), icon_filename + icon_type))
-                        empty_densities.remove(density)
-                        break
-            except Exception as e:
-                logging.warning(_("Failed reading {path}: {error}")
-                                .format(path=icon_path, error=e))
-            finally:
-                if im and hasattr(im, 'close'):
-                    im.close()
+        im = None
+        try:
+            im = Image.open(icon_path)
+            dpi = px_to_dpi(im.size[0])
+            for density in screen_densities:
+                if density in apk['icons']:
+                    break
+                if density == screen_densities[-1] or dpi >= int(density):
+                    apk['icons'][density] = icon_filename
+                    shutil.move(icon_path,
+                                os.path.join(get_icon_dir(repo_dir, density), icon_filename))
+                    empty_densities.remove(density)
+                    break
+        except Exception as e:
+            logging.warning(_("Failed reading {path}: {error}")
+                            .format(path=icon_path, error=e))
+        finally:
+            if im and hasattr(im, 'close'):
+                im.close()
 
     if apk['icons']:
-        apk['icon'] = icon_filename + icon_type
+        apk['icon'] = icon_filename
 
     return empty_densities
 
@@ -1822,7 +1834,6 @@
     :param repo_dir: The directory of the APK's repository
 
     """
-    icon_filename += '.png'
     # First try resizing down to not lose quality
     last_density = None
     for density in screen_densities:
@@ -2297,7 +2308,13 @@
                                            options.use_date_from_apk)
     cachechanged = cachechanged or fcachechanged
     apks += files
+    appid_has_apks = set()
+    appid_has_repo_files = set()
     for apk in apks:
+        if apk['apkName'].endswith('.apk'):
+            appid_has_apks.add(apk['packageName'])
+        else:
+            appid_has_repo_files.add(apk['packageName'])
         if apk['packageName'] not in apps:
             if options.create_metadata:
                 create_metadata_from_template(apk)
@@ -2316,6 +2333,15 @@
                 else:
                     logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.'))
 
+    mismatch_errors = ''
+    for appid in appid_has_apks:
+        if appid in appid_has_repo_files:
+            appid_files = ', '.join(glob.glob(os.path.join('repo', appid + '_[0-9]*.*')))
+            mismatch_errors += (_('{appid} has both APKs and files: {files}')
+                                .format(appid=appid, files=appid_files)) + '\n'
+    if mismatch_errors:
+        raise FDroidException(mismatch_errors)
+
     # Scan the archive repo for apks as well
     if len(repodirs) > 1:
         archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk)
diff -Nru fdroidserver-2.0/fdroidserver.egg-info/PKG-INFO fdroidserver-2.0.1/fdroidserver.egg-info/PKG-INFO
--- fdroidserver-2.0/fdroidserver.egg-info/PKG-INFO	2021-02-02 13:20:01.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver.egg-info/PKG-INFO	2021-03-09 18:22:29.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: fdroidserver
-Version: 2.0
+Version: 2.0.1
 Summary: F-Droid Server Tools
 Home-page: https://f-droid.org
 Author: The F-Droid Project
diff -Nru fdroidserver-2.0/fdroidserver.egg-info/SOURCES.txt fdroidserver-2.0.1/fdroidserver.egg-info/SOURCES.txt
--- fdroidserver-2.0/fdroidserver.egg-info/SOURCES.txt	2021-02-02 13:20:01.000000000 +0100
+++ fdroidserver-2.0.1/fdroidserver.egg-info/SOURCES.txt	2021-03-09 18:22:29.000000000 +0100
@@ -629,6 +629,13 @@
 tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt
 tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt
 tests/extra/manual-vmtools-test.py
+tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties
+tests/get_android_tools_versions/android-ndk/r11c/source.properties
+tests/get_android_tools_versions/android-ndk/r17c/source.properties
+tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties
+tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties
+tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties
+tests/get_android_tools_versions/android-sdk/tools/source.properties
 tests/getsig/getsig.java
 tests/getsig/make.sh
 tests/getsig/run.sh
diff -Nru fdroidserver-2.0/MANIFEST.in fdroidserver-2.0.1/MANIFEST.in
--- fdroidserver-2.0/MANIFEST.in	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/MANIFEST.in	2021-03-09 18:21:30.000000000 +0100
@@ -551,6 +551,13 @@
 include tests/exception.TestCase
 include tests/extra/manual-vmtools-test.py
 include tests/funding-usernames.yaml
+include tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties
+include tests/get_android_tools_versions/android-ndk/r11c/source.properties
+include tests/get_android_tools_versions/android-ndk/r17c/source.properties
+include tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties
+include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties
+include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties
+include tests/get_android_tools_versions/android-sdk/tools/source.properties
 include tests/getsig/getsig.java
 include tests/getsig/make.sh
 include tests/getsig/run.sh
diff -Nru fdroidserver-2.0/PKG-INFO fdroidserver-2.0.1/PKG-INFO
--- fdroidserver-2.0/PKG-INFO	2021-02-02 13:20:01.000000000 +0100
+++ fdroidserver-2.0.1/PKG-INFO	2021-03-09 18:22:30.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: fdroidserver
-Version: 2.0
+Version: 2.0.1
 Summary: F-Droid Server Tools
 Home-page: https://f-droid.org
 Author: The F-Droid Project
diff -Nru fdroidserver-2.0/setup.py fdroidserver-2.0.1/setup.py
--- fdroidserver-2.0/setup.py	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/setup.py	2021-03-09 18:21:30.000000000 +0100
@@ -53,7 +53,7 @@
     long_description = fh.read()
 
 setup(name='fdroidserver',
-      version='2.0',
+      version='2.0.1',
       description='F-Droid Server Tools',
       long_description=long_description,
       long_description_content_type='text/markdown',
diff -Nru fdroidserver-2.0/tests/common.TestCase fdroidserver-2.0.1/tests/common.TestCase
--- fdroidserver-2.0/tests/common.TestCase	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/common.TestCase	2021-03-09 18:21:30.000000000 +0100
@@ -1627,6 +1627,21 @@
                 {'AutoName': testvalue, 'id': 'nope'}]:
             self.assertEqual(testvalue, fdroidserver.common.get_app_display_name(app))
 
+    def test_get_android_tools_versions(self):
+        sdk_path = os.path.join(self.basedir, 'get_android_tools_versions')
+        fdroidserver.common.config = {'sdk_path': sdk_path}
+        components = fdroidserver.common.get_android_tools_versions()
+        expected = (
+            ('android-ndk/android-ndk-r21d', '21.3.6528147'),
+            ('android-ndk/r11c', '11.2.2725575'),
+            ('android-ndk/r17c', '17.2.4988734'),
+            ('android-sdk/patcher/v4', '1'),
+            ('android-sdk/platforms/android-30', '3'),
+            ('android-sdk/skiaparser/1', '6'),
+            ('android-sdk/tools', '26.1.1'),
+        )
+        self.assertSequenceEqual(expected, sorted(components))
+
 
 if __name__ == "__main__":
     os.chdir(os.path.dirname(__file__))
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,2 @@
+Pkg.Desc = Android NDK
+Pkg.Revision = 21.3.6528147
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r11c/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r11c/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r11c/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r11c/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,2 @@
+Pkg.Desc = Android NDK
+Pkg.Revision = 11.2.2725575
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r17c/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r17c/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r17c/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r17c/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,2 @@
+Pkg.Desc = Android NDK
+Pkg.Revision = 17.2.4988734
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,18 @@
+#
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+Pkg.Revision=1
+Pkg.Path=patcher;v4
+Pkg.Desc=SDK Patch Applier v4
\ No newline at end of file
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,9 @@
+Pkg.Desc=Android SDK Platform 11
+Pkg.UserSrc=false
+Platform.Version=11
+Platform.CodeName=
+Pkg.Revision=3
+AndroidVersion.ApiLevel=30
+Layoutlib.Api=15
+Layoutlib.Revision=1
+Platform.MinToolsRev=22
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,3 @@
+Pkg.Revision=6
+Pkg.Path=skiaparser;1
+Pkg.Desc=Layout Inspector image server for API 29-30
diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/tools/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/tools/source.properties
--- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/tools/source.properties	1970-01-01 01:00:00.000000000 +0100
+++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/tools/source.properties	2021-03-09 18:21:30.000000000 +0100
@@ -0,0 +1,6 @@
+Pkg.UserSrc=false
+Pkg.Revision=26.1.1
+Platform.MinPlatformToolsRev=20
+Pkg.Dependencies=emulator
+Pkg.Path=tools
+Pkg.Desc=Android SDK Tools
diff -Nru fdroidserver-2.0/tests/index.TestCase fdroidserver-2.0.1/tests/index.TestCase
--- fdroidserver-2.0/tests/index.TestCase	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/index.TestCase	2021-03-09 18:21:30.000000000 +0100
@@ -354,6 +354,15 @@
                               'https://gitlab.com/group/project/-/raw/master/fdroid'],
                              fdroidserver.index.get_mirror_service_urls(url))
 
+    def test_v1_sort_packages_with_invalid(self):
+        i = [{'packageName': 'org.smssecure.smssecure',
+              'apkName': 'smssecure-custom.fake',
+              'signer': None,
+              'versionCode': 11111}]
+
+        fdroidserver.index.v1_sort_packages(
+            i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints())
+
 
 if __name__ == "__main__":
     os.chdir(os.path.dirname(__file__))
diff -Nru fdroidserver-2.0/tests/repo/index-v1.json fdroidserver-2.0.1/tests/repo/index-v1.json
--- fdroidserver-2.0/tests/repo/index-v1.json	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/repo/index-v1.json	2021-03-09 18:21:30.000000000 +0100
@@ -54,7 +54,6 @@
       "name": "Caffeine Tile",
       "summary": "Test app for extracting icons when an XML one is default",
       "added": 1539129600000,
-      "icon": "info.zwanenburg.caffeinetile.4.xml",
       "packageName": "info.zwanenburg.caffeinetile",
       "lastUpdated": 1539129600000
     },
diff -Nru fdroidserver-2.0/tests/repo/index.xml fdroidserver-2.0.1/tests/repo/index.xml
--- fdroidserver-2.0/tests/repo/index.xml	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/repo/index.xml	2021-03-09 18:21:30.000000000 +0100
@@ -53,7 +53,6 @@
 		<lastupdated>2018-10-10</lastupdated>
 		<name>Caffeine Tile</name>
 		<summary>Test app for extracting icons when an XML one is default</summary>
-		<icon>info.zwanenburg.caffeinetile.4.xml</icon>
 		<desc>No description available</desc>
 		<license>Unknown</license>
 		<categories>Development</categories>
diff -Nru fdroidserver-2.0/tests/run-tests fdroidserver-2.0.1/tests/run-tests
--- fdroidserver-2.0/tests/run-tests	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/run-tests	2021-03-09 18:21:30.000000000 +0100
@@ -735,8 +735,9 @@
 $fdroid init
 $fdroid update --create-metadata --verbose
 $fdroid readmeta
-$fdroid deploy --local-copy-dir=/tmp/fdroid
-$fdroid deploy --local-copy-dir=/tmp/fdroid --verbose
+LOCAL_COPY_DIR=`create_test_dir`/fdroid
+$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR
+$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR --verbose
 
 # now test the errors work
 set +e
diff -Nru fdroidserver-2.0/tests/update.TestCase fdroidserver-2.0.1/tests/update.TestCase
--- fdroidserver-2.0/tests/update.TestCase	2021-02-01 22:53:44.000000000 +0100
+++ fdroidserver-2.0.1/tests/update.TestCase	2021-03-09 18:21:30.000000000 +0100
@@ -11,6 +11,7 @@
 import os
 import random
 import shutil
+import string
 import subprocess
 import sys
 import tempfile
@@ -706,8 +707,7 @@
 
         apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk')
         self.assertEqual(apk_info.get('versionName'), '1.3')
-        self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_coffee_on.xml',
-                                                 '-1': 'res/drawable/ic_coffee_on.xml'})
+        self.assertEqual(apk_info['icons_src'], {})
 
         apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk')
         self.assertEqual(apk_info.get('versionName'), '1.5')
@@ -1309,6 +1309,73 @@
         self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(' WhyIncludeWhitespace '))
         self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second']))
 
+    def test_set_localized_text_entry(self):
+        tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name,
+                                       dir=self.tmpdir)
+        os.chdir(tmptestsdir)
+        config = dict()
+        fdroidserver.common.fill_config_defaults(config)
+        fdroidserver.update.config = config
+        fdroidserver.update.options = fdroidserver.common.options
+
+        files = {
+            'full-description.txt': 'description',
+            'short-description.txt': 'summary',
+            'title.txt': 'name',
+            'video-url.txt': 'video',
+        }
+
+        for f, key in files.items():
+            limit = config['char_limits'][key]
+            with open(f, 'w') as fp:
+                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))
+            locale = 'ru_US'
+            app = dict()
+            fdroidserver.update._set_localized_text_entry(app, locale, key, f)
+            self.assertEqual(limit, len(app['localized'][locale][key]))
+
+            f = 'badlink-' + f
+            os.symlink('/path/to/nowhere', f)
+            app = dict()
+            fdroidserver.update._set_localized_text_entry(app, locale, key, f)
+            self.assertIsNone(app['localized'].get(locale, {}).get(key))
+
+    def test_set_author_entry(self):
+        tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name,
+                                       dir=self.tmpdir)
+        os.chdir(tmptestsdir)
+        config = dict()
+        fdroidserver.common.fill_config_defaults(config)
+        fdroidserver.update.config = config
+        fdroidserver.update.options = fdroidserver.common.options
+
+        f = 'contact-website.txt'
+        key = 'author'
+        url = 'https://f-droid.org/'
+        limit = config['char_limits']['author']
+        with open(f, 'w') as fp:
+            fp.write(url)
+            fp.write('\n')
+        app = dict()
+        fdroidserver.update._set_author_entry(app, key, f)
+        self.assertEqual(url, app[key])
+
+        f = 'limits.txt'
+        key = 'author'
+        limit = config['char_limits']['author']
+        for key in ('authorEmail', 'authorPhone', 'authorWebSite'):
+            with open(f, 'w') as fp:
+                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))
+            app = dict()
+            fdroidserver.update._set_author_entry(app, key, f)
+            self.assertEqual(limit, len(app[key]))
+
+        f = 'badlink.txt'
+        os.symlink('/path/to/nowhere', f)
+        app = dict()
+        fdroidserver.update._set_author_entry(app, key, f)
+        self.assertIsNone(app.get(key))
+
 
 if __name__ == "__main__":
     os.chdir(os.path.dirname(__file__))





unblock fdroidserver/2.0.1-1

-- System Information:
Debian Release: 10.9
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable'), (100, 'proposed-updates')
Architecture: amd64 (x86_64)

Kernel: Linux 4.19.0-16-amd64 (SMP w/8 CPU cores)
Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

--- End Message ---
--- Begin Message ---
The autopkgtest fails on ppc64el where zipalign is not installable, unblocked.

--- End Message ---

Reply to: