From e07d35f91354a5faa5d66e676fd76094dbe10960 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Fri, 1 Nov 2013 13:46:19 +0100 Subject: [PATCH] New field: scandelete, like scanignore but deleting Also, many improvements: * scanning algorithm is much clearer * Now paths start by '/', which means the repo dir root. - If they don't, '/' is added - If they start by './', the dot is removed - If "." is in the paths, it is replaced by "/" * Handling/removing of problems is much easier * Removed last initfun/funambol bits --- docs/fdroid.texi | 14 ++++---- fdroidserver/common.py | 72 ++++++++++++++++++++++++++++++------------ 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/docs/fdroid.texi b/docs/fdroid.texi index 3f4ff4d6..fc9a7869 100644 --- a/docs/fdroid.texi +++ b/docs/fdroid.texi @@ -346,7 +346,7 @@ Along similar lines (and only in conjunction with @code{--test}, you can use @code{--force} to force a build of a Disabled application, where normally it would be completely ignored. Similarly a version that was found to contain ELFs or known non-free libraries can be forced to build. See also — -scanignore= in the Build Version section. +scanignore= and scandelete= in the Build Version section. If the build was unsuccessful, you can find out why by looking at the output in the logs/ directory. If that isn't illuminating, try building the app the @@ -908,17 +908,17 @@ You can use $$SDK$$, $$NDK$$ and $$MVN3$$ to substitute the paths to the android SDK and NDK directories, and maven 3 executable respectively e.g. for when you need to run @code{android update project} explicitly. -@item initfun=yes -Enables a selection of mad hacks to make com.funambol.android build. -Probably not useful for any other application. - @item scanignore=path1;path2;... Enables one or more files/paths to be exlcuded from the scan process. This should only be used where there is a very good reason, and probably accompanied by a comment explaining why it is necessary. -When scanning, files whose relative paths start with any of the paths -given here are ignored. +When scanning the source tree for problems, matching files whose relative +paths start with any of the paths given here are ignored. + +@item scandelete=path1;path2;... +Similar to scanignore=, but instead of ignoring files under the given paths, +it tells f-droid to delete the matching files directly. @item build=xxxx As for 'prebuild', but runs during the actual build phase (but before the diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 91650b30..ee5a3513 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -805,7 +805,7 @@ def write_metadata(dest, app, verbose=False): 'oldsdkloc', 'target', 'compilesdk', 'update', 'encoding', 'forceversion', 'forcevercode', 'rm', 'fixtrans', 'fixapos', 'extlibs', 'srclibs', - 'patch', 'prebuild', 'initfun', 'scanignore', 'build', + 'patch', 'prebuild', 'scanignore', 'scandelete', 'build', 'buildjni', 'gradle', 'maven', 'preassemble', 'bindir', 'antcommand', 'novcheck'] @@ -1342,7 +1342,7 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, sdk_path, raise BuildException('Missing subdir ' + root_dir) # Initialise submodules if requred... - if build.get('submodules', 'no') == 'yes': + if build.get('submodules', 'no') == 'yes': if verbose: print "Initialising submodules..." vcs.initsubmodules() @@ -1640,14 +1640,50 @@ def scan_source(build_dir, root_dir, thisbuild): 'youtubeandroidplayerapi', 'bugsense'] - if 'scanignore' in thisbuild: - ignore = [p.strip() for p in thisbuild['scanignore'].split(';')] - else: - ignore = [] - + def getpaths(field): + paths = [] + if field not in thisbuild: + return paths + for p in thisbuild[field].split(';'): + p = p.strip() + if p == '.': + p = '/' + elif p.startswith('./'): + p = p[1:] + elif not p.startswith('/'): + p = '/' + p; + if p not in paths: + paths.append(p) + return paths + + scanignore = getpaths('scanignore') + scandelete = getpaths('scandelete') + ms = magic.open(magic.MIME_TYPE) ms.load() + def toignore(fd): + for i in scanignore: + if fd.startswith(i): + return True + return False + + def todelete(fd): + for i in scandelete: + if fd.startswith(i): + return True + return False + + def removeproblem(what, fd, fp): + print 'Removing %s at %s' % (what, fd) + os.remove(fp) + + def handleproblem(what, fd, fp): + if todelete(fd): + removeproblem(what, fd, fp) + else: + problems.append('Found %s at %s' % (what, fd)) + # Iterate through all files in the source code... for r,d,f in os.walk(build_dir): for curfile in f: @@ -1657,36 +1693,30 @@ def scan_source(build_dir, root_dir, thisbuild): # Path (relative) to the file... fp = os.path.join(r, curfile) - fd = fp[len(build_dir)+1:] + fd = fp[len(build_dir):] # Check if this file has been explicitly excluded from scanning... - ignorethis = False - for i in ignore: - if fd.startswith(i): - ignorethis = True - break - if ignorethis: + if toignore(fd): continue for suspect in usual_suspects: if suspect in curfile.lower(): - problems.append('Found usual supect in filename ' + fp) + handleproblem('usual supect', fd, fp) mime = ms.file(fp) if mime == 'application/x-sharedlib': - problems.append('Found shared library at %s' % fd) + handleproblem('shared library', fd, fp) elif mime == 'application/x-archive': - problems.append('Found static library at %s' % fd) + handleproblem('static library', fd, fp) elif mime == 'application/x-executable': - problems.append('Found binary executable at %s' % fd) + handleproblem('binary executable', fd, fp) elif mime == 'application/jar' and fp.endswith('.apk'): - print 'Removing apk file at %s' % fd - os.remove(fp) + removeproblem('APK file', fd, fp) elif curfile.endswith('.java'): for line in file(fp): if 'DexClassLoader' in line: - problems.append('Found DexClassLoader in ' + fp) + handleproblem('DexClassLoader', fd, fp) break ms.close() -- 2.30.2