chiark / gitweb /
Set the FDroidOpen output default back to true
[fdroidserver.git] / fdroidserver / common.py
index 303b3b6b18e01ecb61a7bab9a3c63708b1ed6b93..32a924b5200664cd73aef5b555c076e6cc35566c 100644 (file)
@@ -41,8 +41,8 @@ options = None
 def get_default_config():
     return {
         'sdk_path': os.getenv("ANDROID_HOME"),
-        'ndk_path': "$ANDROID_NDK",
-        'build_tools': "19.0.3",
+        'ndk_path': os.getenv("ANDROID_NDK"),
+        'build_tools': "19.1.0",
         'ant': "ant",
         'mvn3': "mvn",
         'gradle': 'gradle',
@@ -51,7 +51,7 @@ def get_default_config():
         'stats_to_carbon': False,
         'repo_maxage': 0,
         'build_server_always': False,
-        'keystore': '$HOME/.local/share/fdroidserver/keystore.jks',
+        'keystore': os.path.join(os.getenv("HOME"), '.local', 'share', 'fdroidserver', 'keystore.jks'),
         'smartcardoptions': [],
         'char_limits': {
             'Summary': 50,
@@ -92,6 +92,11 @@ def read_config(opts, config_file='config.py'):
                                       'sun.security.pkcs11.SunPKCS11',
                                       '-providerArg', 'opensc-fdroid.cfg']
 
+    if any(k in config for k in ["keystore", "keystorepass", "keypass"]):
+        st = os.stat(config_file)
+        if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO:
+            logging.warn("unsafe permissions on {0} (should be 0600)!".format(config_file))
+
     defconfig = get_default_config()
     for k, v in defconfig.items():
         if k not in config:
@@ -107,11 +112,6 @@ def read_config(opts, config_file='config.py'):
     if not test_sdk_exists(config):
         sys.exit(3)
 
-    if any(k in config for k in ["keystore", "keystorepass", "keypass"]):
-        st = os.stat(config_file)
-        if st.st_mode & stat.S_IRWXG or st.st_mode & stat.S_IRWXO:
-            logging.warn("unsafe permissions on {0} (should be 0600)!".format(config_file))
-
     for k in ["keystorepass", "keypass"]:
         if k in config:
             write_password_file(k)
@@ -142,6 +142,9 @@ def test_sdk_exists(c):
     if not os.path.isdir(os.path.join(c['sdk_path'], 'build-tools')):
         logging.critical('Android SDK path "' + c['sdk_path'] + '" does not contain "build-tools/"!')
         return False
+    if not os.path.isdir(os.path.join(c['sdk_path'], 'build-tools', c['build_tools'])):
+        logging.critical('Configured build-tools version "' + c['build_tools'] + '" not found in the SDK!')
+        return False
     return True
 
 
@@ -858,12 +861,12 @@ def parse_androidmanifests(paths, ignoreversions=None):
     max_version = None
     max_vercode = None
     max_package = None
-    version = None
-    vercode = None
 
     for path in paths:
 
         gradle = has_extension(path, 'gradle')
+        version = None
+        vercode = None
         # Remember package name, may be defined separately from version+vercode
         package = max_package
 
@@ -890,20 +893,26 @@ def parse_androidmanifests(paths, ignoreversions=None):
                 if matches:
                     vercode = matches.group(1)
 
-        # Better some package name than nothing
-        if max_package is None:
+        # Always grab the package name and version name in case they are not
+        # together with the highest version code
+        if max_package is None and package is not None:
             max_package = package
+        if max_version is None and version is not None:
+            max_version = version
 
         if max_vercode is None or (vercode is not None and vercode > max_vercode):
             if not ignoresearch or not ignoresearch(version):
-                max_version = version
-                max_vercode = vercode
-                max_package = package
+                if version is not None:
+                    max_version = version
+                if vercode is not None:
+                    max_vercode = vercode
+                if package is not None:
+                    max_package = package
             else:
                 max_version = "Ignore"
 
     if max_version is None:
-        max_version = version if version else "Unknown"
+        max_version = "Unknown"
 
     return (max_version, max_vercode, max_package)
 
@@ -1133,23 +1142,37 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
         version_regex = re.compile(r".*'com\.android\.tools\.build:gradle:([^\.]+\.[^\.]+).*'.*")
         gradlepluginver = None
 
-        with open(os.path.join(root_dir, 'build.gradle')) as f:
-            for line in f:
-                match = version_regex.match(line)
-                if match:
-                    gradlepluginver = match.group(1)
-                    break
-        if '@' in build['gradle'] and not gradlepluginver:
-            gradle_dir = os.path.join(root_dir, build['gradle'].split('@', 1)[1])
-            gradle_dir = os.path.normpath(gradle_dir)
-            with open(os.path.join(root_dir, 'build.gradle')) as f:
+        gradle_files = [os.path.join(root_dir, 'build.gradle')]
+
+        # Parent dir build.gradle
+        parent_dir = os.path.normpath(os.path.join(root_dir, '..'))
+        if parent_dir.startswith(build_dir):
+            gradle_files.append(os.path.join(parent_dir, 'build.gradle'))
+
+        # Gradle execution dir build.gradle
+        if '@' in build['gradle']:
+            gradle_file = os.path.join(root_dir, build['gradle'].split('@', 1)[1], 'build.gradle')
+            gradle_file = os.path.normpath(gradle_file)
+            if gradle_file not in gradle_files:
+                gradle_files.append(gradle_file)
+
+        for path in gradle_files:
+            if gradlepluginver:
+                break
+            if not os.path.isfile(path):
+                continue
+            with open(path) as f:
                 for line in f:
                     match = version_regex.match(line)
                     if match:
                         gradlepluginver = match.group(1)
                         break
 
-        build['gradlepluginver'] = LooseVersion(gradlepluginver)
+        if gradlepluginver:
+            build['gradlepluginver'] = LooseVersion(gradlepluginver)
+        else:
+            logging.warn("Could not fetch the gradle plugin version, defaulting to 0.11")
+            build['gradlepluginver'] = LooseVersion('0.11')
 
         if build['target']:
             n = build["target"].split('-')[1]
@@ -1553,7 +1576,7 @@ def SilentPopen(commands, cwd=None, shell=False):
     return FDroidPopen(commands, cwd=cwd, shell=shell, output=False)
 
 
-def FDroidPopen(commands, cwd=None, shell=False, output=False):
+def FDroidPopen(commands, cwd=None, shell=False, output=True):
     """
     Run a command and capture the possibly huge output.
 
@@ -1580,7 +1603,7 @@ def FDroidPopen(commands, cwd=None, shell=False, output=False):
     while not stdout_reader.eof():
         while not stdout_queue.empty():
             line = stdout_queue.get()
-            if output or options.verbose:
+            if output:
                 # Output directly to console
                 sys.stdout.write(line)
                 sys.stdout.flush()