chiark / gitweb /
New field: scandelete, like scanignore but deleting
authorDaniel Martí <mvdan@mvdan.cc>
Fri, 1 Nov 2013 12:46:19 +0000 (13:46 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Fri, 1 Nov 2013 12:46:19 +0000 (13:46 +0100)
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
fdroidserver/common.py

index 3f4ff4d698f8add1c07aa29d2eb05ad6a4bbec64..fc9a7869da30e40f6ded15b88c71caadf44fe389 100644 (file)
@@ -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
index 91650b30fcc71a807f330d6fe2b6b0cb3fe9796f..ee5a35133259b4fa880065fa39723313943e855d 100644 (file)
@@ -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()