mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-20 13:50:12 +01:00
Merge branch 'master' into 'master'
fix pyflakes error and a bunch of PEP8 fixes lots of little fixes here, the first commit fixes the minor error that `pyflakes` raised, then the rest are all PEP8 fixes, as reported by the `pep8` command line tool.
This commit is contained in:
commit
ae3d1b036f
3
fdroid
3
fdroid
@ -38,6 +38,7 @@ commands = {
|
||||
"server": "Interact with the repo HTTP server",
|
||||
}
|
||||
|
||||
|
||||
def print_help():
|
||||
print "usage: fdroid [-h|--help] <command> [<args>]"
|
||||
print
|
||||
@ -46,6 +47,7 @@ def print_help():
|
||||
print " " + cmd + ' '*(15-len(cmd)) + summary
|
||||
print
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
if len(sys.argv) <= 1:
|
||||
@ -85,4 +87,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -37,8 +37,9 @@ from common import BuildException, VCSException, FDroidPopen, SilentPopen
|
||||
|
||||
try:
|
||||
import paramiko
|
||||
except:
|
||||
paramiko = None
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def get_builder_vm_id():
|
||||
vd = os.path.join('builder', '.vagrant')
|
||||
@ -244,7 +245,9 @@ def release_vm():
|
||||
def build_server(app, thisbuild, vcs, build_dir, output_dir, force):
|
||||
"""Do a build on the build server."""
|
||||
|
||||
if not paramiko:
|
||||
try:
|
||||
paramiko
|
||||
except NameError:
|
||||
raise BuildException("Paramiko is required to use the buildserver")
|
||||
if options.verbose:
|
||||
logging.getLogger("paramiko").setLevel(logging.DEBUG)
|
||||
|
@ -30,7 +30,8 @@ import HTMLParser
|
||||
from distutils.version import LooseVersion
|
||||
import logging
|
||||
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
from common import BuildException
|
||||
from common import VCSException
|
||||
from metadata import MetaDataException
|
||||
@ -79,6 +80,7 @@ def check_http(app):
|
||||
msg = "Could not complete http check for app {0} due to unknown error: {1}".format(app['id'], traceback.format_exc())
|
||||
return (None, msg)
|
||||
|
||||
|
||||
# Check for a new version by looking at the tags in the source repo.
|
||||
# Whether this can be used reliably or not depends on
|
||||
# the development procedures used by the project's developers. Use it with
|
||||
@ -157,6 +159,7 @@ def check_tags(app, pattern):
|
||||
msg = "Could not scan app {0} due to unknown error: {1}".format(app['id'], traceback.format_exc())
|
||||
return (None, msg, None)
|
||||
|
||||
|
||||
# Check for a new version by looking at the AndroidManifest.xml at the HEAD
|
||||
# of the source repo. Whether this can be used reliably or not depends on
|
||||
# the development procedures used by the project's developers. Use it with
|
||||
@ -232,6 +235,7 @@ def check_repomanifest(app, branch=None):
|
||||
msg = "Could not scan app {0} due to unknown error: {1}".format(app['id'], traceback.format_exc())
|
||||
return (None, msg)
|
||||
|
||||
|
||||
def check_repotrunk(app, branch=None):
|
||||
|
||||
try:
|
||||
@ -262,6 +266,7 @@ def check_repotrunk(app, branch=None):
|
||||
msg = "Could not scan app {0} due to unknown error: {1}".format(app['id'], traceback.format_exc())
|
||||
return (None, msg)
|
||||
|
||||
|
||||
# Check for a new version by looking at the Google Play Store.
|
||||
# Returns (None, "a message") if this didn't work, or (version, None) for
|
||||
# the details of the current version.
|
||||
@ -296,6 +301,7 @@ def check_gplay(app):
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -348,7 +354,6 @@ def main():
|
||||
common.getappname(app), version))
|
||||
return
|
||||
|
||||
|
||||
for app in apps:
|
||||
|
||||
if options.autoonly and app['Auto Update Mode'] in ('None', 'Static'):
|
||||
@ -515,4 +520,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -17,7 +17,9 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os, sys, re
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import shutil
|
||||
import glob
|
||||
import stat
|
||||
@ -34,6 +36,7 @@ import metadata
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def get_default_config():
|
||||
return {
|
||||
'sdk_path': os.getenv("ANDROID_HOME"),
|
||||
@ -56,6 +59,7 @@ def get_default_config():
|
||||
'keyaliases': {},
|
||||
}
|
||||
|
||||
|
||||
def read_config(opts, config_file='config.py'):
|
||||
"""Read the repository config
|
||||
|
||||
@ -120,8 +124,9 @@ def read_config(opts, config_file='config.py'):
|
||||
|
||||
return config
|
||||
|
||||
|
||||
def test_sdk_exists(c):
|
||||
if c['sdk_path'] == None:
|
||||
if c['sdk_path'] is None:
|
||||
# c['sdk_path'] is set to the value of ANDROID_HOME by default
|
||||
logging.critical('No Android SDK found! ANDROID_HOME is not set and sdk_path is not in config.py!')
|
||||
logging.info('You can use ANDROID_HOME to set the path to your SDK, i.e.:')
|
||||
@ -138,6 +143,7 @@ def test_sdk_exists(c):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def write_password_file(pwtype, password=None):
|
||||
'''
|
||||
writes out passwords to a protected file instead of passing passwords as
|
||||
@ -145,13 +151,14 @@ def write_password_file(pwtype, password=None):
|
||||
'''
|
||||
filename = '.fdroid.' + pwtype + '.txt'
|
||||
fd = os.open(filename, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0600)
|
||||
if password == None:
|
||||
if password is None:
|
||||
os.write(fd, config[pwtype])
|
||||
else:
|
||||
os.write(fd, password)
|
||||
os.close(fd)
|
||||
config[pwtype + 'file'] = filename
|
||||
|
||||
|
||||
# Given the arguments in the form of multiple appid:[vc] strings, this returns
|
||||
# a dictionary with the set of vercodes specified for each package.
|
||||
def read_pkg_args(args, allow_vercodes=False):
|
||||
@ -173,6 +180,7 @@ def read_pkg_args(args, allow_vercodes=False):
|
||||
|
||||
return vercodes
|
||||
|
||||
|
||||
# On top of what read_pkg_args does, this returns the whole app metadata, but
|
||||
# limiting the builds list to the builds matching the vercodes specified.
|
||||
def read_app_args(args, allapps, allow_vercodes=False):
|
||||
@ -211,6 +219,7 @@ def read_app_args(args, allapps, allow_vercodes=False):
|
||||
|
||||
return apps
|
||||
|
||||
|
||||
def has_extension(filename, extension):
|
||||
name, ext = os.path.splitext(filename)
|
||||
ext = ext.lower()[1:]
|
||||
@ -218,6 +227,7 @@ def has_extension(filename, extension):
|
||||
|
||||
apk_regex = None
|
||||
|
||||
|
||||
def apknameinfo(filename):
|
||||
global apk_regex
|
||||
filename = os.path.basename(filename)
|
||||
@ -230,12 +240,15 @@ def apknameinfo(filename):
|
||||
raise Exception("Invalid apk name: %s" % filename)
|
||||
return result
|
||||
|
||||
|
||||
def getapkname(app, build):
|
||||
return "%s_%s.apk" % (app['id'], build['vercode'])
|
||||
|
||||
|
||||
def getsrcname(app, build):
|
||||
return "%s_%s_src.tar.gz" % (app['id'], build['vercode'])
|
||||
|
||||
|
||||
def getappname(app):
|
||||
if app['Name']:
|
||||
return app['Name']
|
||||
@ -243,9 +256,11 @@ def getappname(app):
|
||||
return app['Auto Name']
|
||||
return app['id']
|
||||
|
||||
|
||||
def getcvname(app):
|
||||
return '%s (%s)' % (app['Current Version'], app['Current Version Code'])
|
||||
|
||||
|
||||
def getvcs(vcstype, remote, local):
|
||||
if vcstype == 'git':
|
||||
return vcs_git(remote, local)
|
||||
@ -263,12 +278,14 @@ def getvcs(vcstype, remote, local):
|
||||
return getsrclib(remote, 'build/srclib', raw=True)
|
||||
raise VCSException("Invalid vcs type " + vcstype)
|
||||
|
||||
|
||||
def getsrclibvcs(name):
|
||||
srclib_path = os.path.join('srclibs', name + ".txt")
|
||||
if not os.path.exists(srclib_path):
|
||||
raise VCSException("Missing srclib " + name)
|
||||
return metadata.parse_srclib(srclib_path)['Repo Type']
|
||||
|
||||
|
||||
class vcs:
|
||||
def __init__(self, remote, local):
|
||||
|
||||
@ -354,6 +371,7 @@ class vcs:
|
||||
def getsrclib(self):
|
||||
return self.srclib
|
||||
|
||||
|
||||
class vcs_git(vcs):
|
||||
|
||||
def repotype(self):
|
||||
@ -562,6 +580,7 @@ class vcs_gitsvn(vcs):
|
||||
return None
|
||||
return p.stdout.strip()
|
||||
|
||||
|
||||
class vcs_svn(vcs):
|
||||
|
||||
def repotype(self):
|
||||
@ -604,6 +623,7 @@ class vcs_svn(vcs):
|
||||
return line[18:]
|
||||
return None
|
||||
|
||||
|
||||
class vcs_hg(vcs):
|
||||
|
||||
def repotype(self):
|
||||
@ -676,6 +696,7 @@ class vcs_bzr(vcs):
|
||||
return [tag.split(' ')[0].strip() for tag in
|
||||
p.stdout.splitlines()]
|
||||
|
||||
|
||||
def retrieve_string(app_dir, string, xmlfiles=None):
|
||||
|
||||
res_dirs = [
|
||||
@ -706,6 +727,7 @@ def retrieve_string(app_dir, string, xmlfiles=None):
|
||||
|
||||
return string.replace("\\'", "'")
|
||||
|
||||
|
||||
# Return list of existing files that will be used to find the highest vercode
|
||||
def manifest_paths(app_dir, flavour):
|
||||
|
||||
@ -720,6 +742,7 @@ def manifest_paths(app_dir, flavour):
|
||||
|
||||
return [path for path in possible_manifests if os.path.isfile(path)]
|
||||
|
||||
|
||||
# Retrieve the package name. Returns the name, or None if not found.
|
||||
def fetch_real_name(app_dir, flavour):
|
||||
app_search = re.compile(r'.*<application.*').search
|
||||
@ -744,6 +767,7 @@ def fetch_real_name(app_dir, flavour):
|
||||
return result
|
||||
return None
|
||||
|
||||
|
||||
# Retrieve the version name
|
||||
def version_name(original, app_dir, flavour):
|
||||
for f in manifest_paths(app_dir, flavour):
|
||||
@ -754,6 +778,7 @@ def version_name(original, app_dir, flavour):
|
||||
return string
|
||||
return original
|
||||
|
||||
|
||||
def get_library_references(root_dir):
|
||||
libraries = []
|
||||
proppath = os.path.join(root_dir, 'project.properties')
|
||||
@ -771,6 +796,7 @@ def get_library_references(root_dir):
|
||||
libraries.append(path)
|
||||
return libraries
|
||||
|
||||
|
||||
def ant_subprojects(root_dir):
|
||||
subprojects = get_library_references(root_dir)
|
||||
for subpath in subprojects:
|
||||
@ -781,6 +807,7 @@ def ant_subprojects(root_dir):
|
||||
subprojects.insert(0, relp)
|
||||
return subprojects
|
||||
|
||||
|
||||
def remove_debuggable_flags(root_dir):
|
||||
# Remove forced debuggable flags
|
||||
logging.info("Removing debuggable flags")
|
||||
@ -791,6 +818,7 @@ def remove_debuggable_flags(root_dir):
|
||||
if p.returncode != 0:
|
||||
raise BuildException("Failed to remove debuggable flags of %s" % path)
|
||||
|
||||
|
||||
# Extract some information from the AndroidManifest.xml at the given path.
|
||||
# Returns (version, vercode, package), any or all of which might be None.
|
||||
# All values returned are strings.
|
||||
@ -856,6 +884,7 @@ def parse_androidmanifests(paths):
|
||||
|
||||
return (max_version, max_vercode, max_package)
|
||||
|
||||
|
||||
class BuildException(Exception):
|
||||
def __init__(self, value, detail=None):
|
||||
self.value = value
|
||||
@ -877,6 +906,7 @@ class BuildException(Exception):
|
||||
ret += "\n==== detail begin ====\n%s\n==== detail end ====" % self.detail.strip()
|
||||
return ret
|
||||
|
||||
|
||||
class VCSException(Exception):
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
@ -884,6 +914,7 @@ class VCSException(Exception):
|
||||
def __str__(self):
|
||||
return repr(self.value)
|
||||
|
||||
|
||||
# Get the specified source library.
|
||||
# Returns the path to it. Normally this is the path to be used when referencing
|
||||
# it, which may be a subdirectory of the actual project. If you want the base
|
||||
@ -1210,6 +1241,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
||||
|
||||
return (root_dir, srclibpaths)
|
||||
|
||||
|
||||
# Split and extend via globbing the paths from a field
|
||||
def getpaths(build_dir, build, field):
|
||||
paths = []
|
||||
@ -1222,6 +1254,7 @@ def getpaths(build_dir, build, field):
|
||||
paths += [r[len(build_dir)+1:] for r in glob.glob(full_path)]
|
||||
return paths
|
||||
|
||||
|
||||
# Scan the source code in the given directory (and all subdirectories)
|
||||
# and return the number of fatal problems encountered
|
||||
def scan_source(build_dir, root_dir, thisbuild):
|
||||
@ -1421,6 +1454,7 @@ class KnownApks:
|
||||
lst.reverse()
|
||||
return lst
|
||||
|
||||
|
||||
def isApkDebuggable(apkfile, config):
|
||||
"""Returns True if the given apk file is debuggable
|
||||
|
||||
@ -1461,13 +1495,16 @@ class AsynchronousFileReader(threading.Thread):
|
||||
'''Check whether there is no more content to expect.'''
|
||||
return not self.is_alive() and self._queue.empty()
|
||||
|
||||
|
||||
class PopenResult:
|
||||
returncode = None
|
||||
stdout = ''
|
||||
|
||||
|
||||
def SilentPopen(commands, cwd=None, shell=False):
|
||||
return FDroidPopen(commands, cwd=cwd, shell=shell, output=False)
|
||||
|
||||
|
||||
def FDroidPopen(commands, cwd=None, shell=False, output=True):
|
||||
"""
|
||||
Run a command and capture the possibly huge output.
|
||||
@ -1507,6 +1544,7 @@ def FDroidPopen(commands, cwd=None, shell=False, output=True):
|
||||
result.returncode = p.returncode
|
||||
return result
|
||||
|
||||
|
||||
def remove_signing_keys(build_dir):
|
||||
comment = re.compile(r'[ ]*//')
|
||||
signing_configs = re.compile(r'^[\t ]*signingConfigs[ \t]*{[ \t]*$')
|
||||
@ -1568,12 +1606,14 @@ def remove_signing_keys(build_dir):
|
||||
|
||||
logging.info("Cleaned %s of keysigning configs at %s" % (propfile, path))
|
||||
|
||||
|
||||
def replace_config_vars(cmd):
|
||||
cmd = cmd.replace('$$SDK$$', config['sdk_path'])
|
||||
cmd = cmd.replace('$$NDK$$', config['ndk_path'])
|
||||
cmd = cmd.replace('$$MVN3$$', config['mvn3'])
|
||||
return cmd
|
||||
|
||||
|
||||
def place_srclib(root_dir, number, libpath):
|
||||
if not number:
|
||||
return
|
||||
@ -1595,4 +1635,3 @@ def place_srclib(root_dir, number, libpath):
|
||||
o.write(line)
|
||||
if not placed:
|
||||
o.write('android.library.reference.%d=%s\n' % (number, relpath))
|
||||
|
||||
|
@ -25,7 +25,9 @@ import urllib
|
||||
from optparse import OptionParser
|
||||
from ConfigParser import ConfigParser
|
||||
import logging
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
|
||||
|
||||
# Get the repo type and address from the given web page. The page is scanned
|
||||
# in a rather naive manner for 'git clone xxxx', 'hg clone xxxx', etc, and
|
||||
@ -88,6 +90,7 @@ def getrepofrompage(url):
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -163,7 +166,7 @@ def main():
|
||||
sys.exit(1)
|
||||
elif url.startswith('http://code.google.com/p/'):
|
||||
if not url.endswith('/'):
|
||||
url += '/';
|
||||
url += '/'
|
||||
projecttype = 'googlecode'
|
||||
sourcecode = url + 'source/checkout'
|
||||
if options.repo:
|
||||
@ -305,4 +308,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -35,6 +35,7 @@ from common import FDroidPopen, BuildException
|
||||
config = {}
|
||||
options = None
|
||||
|
||||
|
||||
def write_to_config(key, value):
|
||||
'''write a key/value to the local config.py'''
|
||||
with open('config.py', 'r') as f:
|
||||
@ -45,6 +46,7 @@ def write_to_config(key, value):
|
||||
with open('config.py', 'w') as f:
|
||||
f.writelines(data)
|
||||
|
||||
|
||||
def disable_in_config(key, value):
|
||||
'''write a key/value to the local config.py, then comment it out'''
|
||||
with open('config.py', 'r') as f:
|
||||
@ -124,14 +126,14 @@ def main():
|
||||
|
||||
# track down where the Android SDK is, the default is to use the path set
|
||||
# in ANDROID_HOME if that exists, otherwise None
|
||||
if options.android_home != None:
|
||||
if options.android_home is not None:
|
||||
test_config['sdk_path'] = options.android_home
|
||||
elif not common.test_sdk_exists(test_config):
|
||||
# if neither --android-home nor the default sdk_path exist, prompt the user
|
||||
default_sdk_path = '/opt/android-sdk'
|
||||
while not options.no_prompt:
|
||||
s = raw_input('Enter the path to the Android SDK (' + default_sdk_path + ') here:\n> ')
|
||||
if re.match('^\s*$', s) != None:
|
||||
if re.match('^\s*$', s) is not None:
|
||||
test_config['sdk_path'] = default_sdk_path
|
||||
else:
|
||||
test_config['sdk_path'] = s
|
||||
@ -246,7 +248,7 @@ def main():
|
||||
password = genpassword()
|
||||
write_to_config('keystorepass', password)
|
||||
write_to_config('keypass', password)
|
||||
if options.repo_keyalias == None:
|
||||
if options.repo_keyalias is None:
|
||||
repo_keyalias = socket.getfqdn()
|
||||
write_to_config('repo_keyalias', repo_keyalias)
|
||||
if not options.distinguished_name:
|
||||
@ -260,7 +262,7 @@ def main():
|
||||
logging.info(' Android SDK Build Tools:\t' + os.path.dirname(aapt))
|
||||
logging.info(' Android NDK (optional):\t' + ndk_path)
|
||||
logging.info(' Keystore for signing key:\t' + keystore)
|
||||
if repo_keyalias != None:
|
||||
if repo_keyalias is not None:
|
||||
logging.info(' Alias for key in store:\t' + repo_keyalias)
|
||||
logging.info('\nTo complete the setup, add your APKs to "' +
|
||||
os.path.join(fdroiddir, 'repo') + '"' +
|
||||
|
@ -30,6 +30,7 @@ from common import FDroidPopen
|
||||
options = None
|
||||
config = None
|
||||
|
||||
|
||||
def devices():
|
||||
p = FDroidPopen(["adb", "devices"])
|
||||
if p.returncode != 0:
|
||||
@ -115,4 +116,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -20,7 +20,8 @@
|
||||
from optparse import OptionParser
|
||||
import re
|
||||
import logging
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
|
||||
config = None
|
||||
options = None
|
||||
@ -118,6 +119,7 @@ regex_pedantic = {
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options, appid, app_count, warn_count
|
||||
@ -240,4 +242,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -17,10 +17,13 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os, re, glob
|
||||
import os
|
||||
import re
|
||||
import glob
|
||||
import cgi
|
||||
import logging
|
||||
|
||||
|
||||
class MetaDataException(Exception):
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
@ -181,6 +184,7 @@ valuetypes = {
|
||||
[])
|
||||
}
|
||||
|
||||
|
||||
# Check an app's metadata information for integrity errors
|
||||
def check_metadata(info):
|
||||
for k, t in valuetypes.iteritems():
|
||||
@ -198,6 +202,7 @@ def check_metadata(info):
|
||||
elif k == 'bool':
|
||||
build[attr] = False
|
||||
|
||||
|
||||
# Formatter for descriptions. Create an instance, and call parseline() with
|
||||
# each line of the description source from the metadata. At the end, call
|
||||
# end() and then text_plain, text_wiki and text_html will contain the result.
|
||||
@ -213,8 +218,10 @@ class DescriptionFormatter:
|
||||
text_wiki = ''
|
||||
text_html = ''
|
||||
linkResolver = None
|
||||
|
||||
def __init__(self, linkres):
|
||||
self.linkResolver = linkres
|
||||
|
||||
def endcur(self, notstates=None):
|
||||
if notstates and self.state in notstates:
|
||||
return
|
||||
@ -224,13 +231,16 @@ class DescriptionFormatter:
|
||||
self.endul()
|
||||
elif self.state == self.stOL:
|
||||
self.endol()
|
||||
|
||||
def endpara(self):
|
||||
self.text_plain += '\n'
|
||||
self.text_html += '</p>'
|
||||
self.state = self.stNONE
|
||||
|
||||
def endul(self):
|
||||
self.text_html += '</ul>'
|
||||
self.state = self.stNONE
|
||||
|
||||
def endol(self):
|
||||
self.text_html += '</ol>'
|
||||
self.state = self.stNONE
|
||||
@ -262,7 +272,6 @@ class DescriptionFormatter:
|
||||
self.ital = not self.ital
|
||||
txt = txt[2:]
|
||||
|
||||
|
||||
def linkify(self, txt):
|
||||
linkified_plain = ''
|
||||
linkified_html = ''
|
||||
@ -342,6 +351,7 @@ class DescriptionFormatter:
|
||||
def end(self):
|
||||
self.endcur()
|
||||
|
||||
|
||||
# Parse multiple lines of description as written in a metadata file, returning
|
||||
# a single string in plain text format.
|
||||
def description_plain(lines, linkres):
|
||||
@ -351,6 +361,7 @@ def description_plain(lines, linkres):
|
||||
ps.end()
|
||||
return ps.text_plain
|
||||
|
||||
|
||||
# Parse multiple lines of description as written in a metadata file, returning
|
||||
# a single string in wiki format. Used for the Maintainer Notes field as well,
|
||||
# because it's the same format.
|
||||
@ -361,6 +372,7 @@ def description_wiki(lines):
|
||||
ps.end()
|
||||
return ps.text_wiki
|
||||
|
||||
|
||||
# Parse multiple lines of description as written in a metadata file, returning
|
||||
# a single string in HTML format.
|
||||
def description_html(lines, linkres):
|
||||
@ -370,6 +382,7 @@ def description_html(lines,linkres):
|
||||
ps.end()
|
||||
return ps.text_html
|
||||
|
||||
|
||||
def parse_srclib(metafile, **kw):
|
||||
|
||||
thisinfo = {}
|
||||
@ -405,6 +418,7 @@ def parse_srclib(metafile, **kw):
|
||||
|
||||
return thisinfo
|
||||
|
||||
|
||||
# Read all metadata. Returns a list of 'app' objects (which are dictionaries as
|
||||
# returned by the parse_metadata function.
|
||||
def read_metadata(xref=True, package=None, store=True):
|
||||
@ -437,6 +451,7 @@ def read_metadata(xref=True, package=None, store=True):
|
||||
|
||||
return apps
|
||||
|
||||
|
||||
# Get the type expected for a given metadata field.
|
||||
def metafieldtype(name):
|
||||
if name in ['Description', 'Maintainer Notes']:
|
||||
@ -453,6 +468,7 @@ def metafieldtype(name):
|
||||
return 'unknown'
|
||||
return 'string'
|
||||
|
||||
|
||||
def flagtype(name):
|
||||
if name in ['extlibs', 'srclibs', 'patch', 'rm', 'buildjni',
|
||||
'update', 'scanignore', 'scandelete']:
|
||||
@ -461,6 +477,7 @@ def flagtype(name):
|
||||
return 'script'
|
||||
return 'string'
|
||||
|
||||
|
||||
# Parse metadata for a single application.
|
||||
#
|
||||
# 'metafile' - the filename to read. The package id for the application comes
|
||||
@ -687,6 +704,7 @@ def parse_metadata(metafile):
|
||||
|
||||
return thisinfo
|
||||
|
||||
|
||||
# Write a metadata file.
|
||||
#
|
||||
# 'dest' - The path to the output file
|
||||
@ -786,7 +804,6 @@ def write_metadata(dest, app):
|
||||
mf.write('.\n')
|
||||
mf.write('\n')
|
||||
|
||||
|
||||
if app['Archive Policy']:
|
||||
writefield('Archive Policy')
|
||||
writefield('Auto Update Mode')
|
||||
@ -804,5 +821,3 @@ def write_metadata(dest, app):
|
||||
mf.write('\n')
|
||||
writecomments(None)
|
||||
mf.close()
|
||||
|
||||
|
||||
|
@ -26,12 +26,14 @@ import glob
|
||||
from optparse import OptionParser
|
||||
import logging
|
||||
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
from common import FDroidPopen, BuildException
|
||||
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -170,4 +172,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -17,7 +17,9 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os, metadata
|
||||
import os
|
||||
import metadata
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
@ -28,4 +30,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -20,11 +20,13 @@
|
||||
import os
|
||||
from optparse import OptionParser
|
||||
import logging
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -51,4 +53,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -22,13 +22,15 @@ import traceback
|
||||
from optparse import OptionParser
|
||||
import logging
|
||||
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
from common import BuildException
|
||||
from common import VCSException
|
||||
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -113,4 +115,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -28,6 +28,7 @@ import common
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def update_awsbucket(repo_section):
|
||||
'''
|
||||
Upload the contents of the directory `repo_section` (including
|
||||
@ -113,6 +114,7 @@ def update_awsbucket(repo_section):
|
||||
else:
|
||||
logging.info(' skipping ' + s3url)
|
||||
|
||||
|
||||
def update_serverwebroot(repo_section):
|
||||
rsyncargs = ['rsync', '-u', '-r', '--delete']
|
||||
if options.verbose:
|
||||
@ -133,6 +135,7 @@ def update_serverwebroot(repo_section):
|
||||
[indexjar, config['serverwebroot'] + repo_section]) != 0:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def main():
|
||||
global config, options
|
||||
|
||||
@ -154,7 +157,7 @@ def main():
|
||||
logging.critical("The only commands currently supported are 'init' and 'update'")
|
||||
sys.exit(1)
|
||||
|
||||
if config.get('nonstandardwebroot') == True:
|
||||
if config.get('nonstandardwebroot') is True:
|
||||
standardwebroot = False
|
||||
else:
|
||||
standardwebroot = True
|
||||
|
@ -32,29 +32,36 @@ import time
|
||||
from PIL import Image
|
||||
import logging
|
||||
|
||||
import common, metadata
|
||||
import common
|
||||
import metadata
|
||||
from common import FDroidPopen
|
||||
from metadata import MetaDataException
|
||||
|
||||
|
||||
def get_densities():
|
||||
return ['640', '480', '320', '240', '160', '120']
|
||||
|
||||
|
||||
def dpi_to_px(density):
|
||||
return (int(density) * 48) / 160
|
||||
|
||||
|
||||
def px_to_dpi(px):
|
||||
return (int(px) * 160) / 48
|
||||
|
||||
|
||||
def get_icon_dir(repodir, density):
|
||||
if density is None:
|
||||
return os.path.join(repodir, "icons")
|
||||
return os.path.join(repodir, "icons-%s" % density)
|
||||
|
||||
|
||||
def get_icon_dirs(repodir):
|
||||
for density in get_densities():
|
||||
yield get_icon_dir(repodir, density)
|
||||
yield os.path.join(repodir, "icons")
|
||||
|
||||
|
||||
def update_wiki(apps, apks):
|
||||
"""Update the wiki
|
||||
|
||||
@ -256,6 +263,7 @@ def update_wiki(apps, apks):
|
||||
# Purge server cache to ensure counts are up to date
|
||||
site.pages['Repository Maintenance'].purge()
|
||||
|
||||
|
||||
def delete_disabled_builds(apps, apkcache, repodirs):
|
||||
"""Delete disabled build outputs.
|
||||
|
||||
@ -277,6 +285,7 @@ def delete_disabled_builds(apps, apkcache, repodirs):
|
||||
if apkfilename in apkcache:
|
||||
del apkcache[apkfilename]
|
||||
|
||||
|
||||
def resize_icon(iconpath, density):
|
||||
|
||||
if not os.path.isfile(iconpath):
|
||||
@ -299,6 +308,7 @@ def resize_icon(iconpath, density):
|
||||
except Exception, e:
|
||||
logging.error("Failed resizing {0} - {1}".format(iconpath, e))
|
||||
|
||||
|
||||
def resize_all_icons(repodirs):
|
||||
"""Resize all icons that exceed the max size
|
||||
|
||||
@ -311,6 +321,7 @@ def resize_all_icons(repodirs):
|
||||
for iconpath in glob.glob(icon_glob):
|
||||
resize_icon(iconpath, density)
|
||||
|
||||
|
||||
def scan_apks(apps, apkcache, repodir, knownapks):
|
||||
"""Scan the apks in the given repo directory.
|
||||
|
||||
@ -581,6 +592,7 @@ def scan_apks(apps, apkcache, repodir, knownapks):
|
||||
|
||||
repo_pubkey_fingerprint = None
|
||||
|
||||
|
||||
def make_index(apps, apks, repodir, archive, categories):
|
||||
"""Make a repo index.
|
||||
|
||||
@ -598,6 +610,7 @@ def make_index(apps, apks, repodir, archive, categories):
|
||||
el = doc.createElement(name)
|
||||
el.appendChild(doc.createTextNode(value))
|
||||
parent.appendChild(el)
|
||||
|
||||
def addElementCDATA(name, value, doc, parent):
|
||||
el = doc.createElement(name)
|
||||
el.appendChild(doc.createCDATASection(value))
|
||||
@ -684,6 +697,7 @@ def make_index(apps, apks, repodir, archive, categories):
|
||||
addElement('summary', app['Summary'], doc, apel)
|
||||
if app['icon']:
|
||||
addElement('icon', app['icon'], doc, apel)
|
||||
|
||||
def linkres(link):
|
||||
for app in apps:
|
||||
if app['id'] == link:
|
||||
@ -826,7 +840,6 @@ def make_index(apps, apks, repodir, archive, categories):
|
||||
f.close()
|
||||
|
||||
|
||||
|
||||
def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversions):
|
||||
|
||||
for app in apps:
|
||||
@ -860,6 +873,7 @@ def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversi
|
||||
config = None
|
||||
options = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global config, options
|
||||
@ -1055,4 +1069,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
@ -31,6 +31,7 @@ from common import FDroidPopen
|
||||
options = None
|
||||
config = None
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
global options, config
|
||||
@ -116,5 +117,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user