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',
'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,
'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:
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)
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
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
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)
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]
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.
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()