2012-01-03 22:39:30 +01:00
|
|
|
#!/usr/bin/env python
|
2012-01-03 16:37:29 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
#
|
|
|
|
# scanner.py - part of the FDroid server tools
|
|
|
|
# Copyright (C) 2010-12, Ciaran Gultnieks, ciaran@ciarang.com
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU Affero General Public License for more details.
|
|
|
|
#
|
|
|
|
# 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 sys
|
|
|
|
import os
|
2012-01-04 22:37:11 +01:00
|
|
|
import traceback
|
2012-01-03 16:37:29 +01:00
|
|
|
from optparse import OptionParser
|
|
|
|
import HTMLParser
|
|
|
|
import common
|
2012-01-03 22:39:30 +01:00
|
|
|
from common import BuildException
|
|
|
|
from common import VCSException
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
def main():
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Read configuration...
|
2012-09-13 09:23:12 +02:00
|
|
|
global build_server_always, mvn3
|
2012-10-01 14:19:00 +02:00
|
|
|
globals()['build_server_always'] = False
|
|
|
|
globals()['mvn3'] = "mvn3"
|
2012-02-26 18:14:15 +01:00
|
|
|
execfile('config.py', globals())
|
2012-01-03 16:37:29 +01:00
|
|
|
|
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Parse command line...
|
|
|
|
parser = OptionParser()
|
|
|
|
parser.add_option("-v", "--verbose", action="store_true", default=False,
|
|
|
|
help="Spew out even more information than normal")
|
|
|
|
parser.add_option("-p", "--package", default=None,
|
|
|
|
help="Scan only the specified package")
|
2012-03-06 20:55:40 +01:00
|
|
|
parser.add_option("--nosvn", action="store_true", default=False,
|
|
|
|
help="Skip svn repositories - for test purposes, because they are too slow.")
|
2012-02-26 15:18:58 +01:00
|
|
|
(options, args) = parser.parse_args()
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Get all apps...
|
|
|
|
apps = common.read_metadata(options.verbose)
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-03-11 22:59:25 +01:00
|
|
|
# Filter apps according to command-line options
|
|
|
|
if options.package:
|
|
|
|
apps = [app for app in apps if app['id'] == options.package]
|
|
|
|
if len(apps) == 0:
|
|
|
|
print "No such package"
|
|
|
|
sys.exit(1)
|
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
html_parser = HTMLParser.HTMLParser()
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
problems = []
|
2012-01-27 23:10:08 +01:00
|
|
|
|
2013-10-29 13:23:42 +01:00
|
|
|
build_dir = 'build'
|
|
|
|
if not os.path.isdir(build_dir):
|
|
|
|
print "Creating build directory"
|
|
|
|
os.makedirs(build_dir)
|
|
|
|
srclib_dir = os.path.join(build_dir, 'srclib')
|
|
|
|
extlib_dir = os.path.join(build_dir, 'extlib')
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
for app in apps:
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
skip = False
|
2012-03-11 22:59:25 +01:00
|
|
|
if app['Disabled']:
|
2012-02-26 15:18:58 +01:00
|
|
|
print "Skipping %s: disabled" % app['id']
|
|
|
|
skip = True
|
|
|
|
elif not app['builds']:
|
|
|
|
print "Skipping %s: no builds specified" % app['id']
|
|
|
|
skip = True
|
2012-03-06 20:55:40 +01:00
|
|
|
elif options.nosvn and app['Repo Type'] == 'svn':
|
|
|
|
skip = True
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
if not skip:
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
print "Processing " + app['id']
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
try:
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
build_dir = 'build/' + app['id']
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Set up vcs interface and make sure we have the latest code...
|
2012-09-08 10:56:20 +02:00
|
|
|
vcs = common.getvcs(app['Repo Type'], app['Repo'], build_dir, sdk_path)
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
for thisbuild in app['builds']:
|
2012-01-03 22:39:30 +01:00
|
|
|
|
2013-10-27 15:40:02 +01:00
|
|
|
if 'disable' in thisbuild:
|
2012-02-26 15:18:58 +01:00
|
|
|
print ("..skipping version " + thisbuild['version'] + " - " +
|
2013-10-26 11:26:47 +02:00
|
|
|
thisbuild.get('disable', thisbuild['commit'][1:]))
|
2012-02-26 15:18:58 +01:00
|
|
|
else:
|
|
|
|
print "..scanning version " + thisbuild['version']
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Prepare the source code...
|
2013-03-20 10:30:56 +01:00
|
|
|
root_dir, _ = common.prepare_source(vcs, app, thisbuild,
|
2013-10-29 13:23:42 +01:00
|
|
|
build_dir, srclib_dir, extlib_dir, sdk_path, ndk_path,
|
|
|
|
javacc_path, mvn3, options.verbose, False)
|
2012-01-28 10:41:46 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
# Do the scan...
|
|
|
|
buildprobs = common.scan_source(build_dir, root_dir, thisbuild)
|
|
|
|
for problem in buildprobs:
|
|
|
|
problems.append(problem +
|
|
|
|
' in ' + app['id'] + ' ' + thisbuild['version'])
|
2012-01-03 16:37:29 +01:00
|
|
|
|
2012-02-26 15:18:58 +01:00
|
|
|
except BuildException as be:
|
|
|
|
msg = "Could not scan app %s due to BuildException: %s" % (app['id'], be)
|
|
|
|
problems.append(msg)
|
|
|
|
except VCSException as vcse:
|
|
|
|
msg = "VCS error while scanning app %s: %s" % (app['id'], vcse)
|
|
|
|
problems.append(msg)
|
|
|
|
except Exception:
|
|
|
|
msg = "Could not scan app %s due to unknown error: %s" % (app['id'], traceback.format_exc())
|
|
|
|
problems.append(msg)
|
|
|
|
|
|
|
|
print "Finished:"
|
|
|
|
for problem in problems:
|
|
|
|
print problem
|
|
|
|
print str(len(problems)) + ' problems.'
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|
2012-01-03 16:37:29 +01:00
|
|
|
|