chiark / gitweb /
Default to update=auto, find subprojects automatically
authorDaniel Martí <mvdan@mvdan.cc>
Sun, 3 Nov 2013 12:44:33 +0000 (13:44 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Sun, 3 Nov 2013 12:45:22 +0000 (13:45 +0100)
docs/fdroid.texi
fdroidserver/common.py

index 86d16c7a39d90474082c442c780a84ca6800fb43..7e5143548fff24cc3d71f5f1a0ce941ce87d3c29 100644 (file)
@@ -805,20 +805,19 @@ thus using it in any other case is not wise.
 
 @item update=xxx
 By default, 'android update project' is used to generate or update the
-build.xml file. Specifying update=no bypasses that.
+project and all its referenced projects. Specifying update=no bypasses that.
 
 Specifiying update=force forces rebuilding of the build.xml file at the
 same time - this is frequently needed with r14 of the Android platform
 tools. Be aware of any customisations in build.xml when using
 update=force.
 
+Default value is '@code{auto}', which uses the paths used in the
+project.properties file to find out what project paths to update.
+
 Otherwise, value can be a semicolon-separated list of directories in
 which to run 'android update project' relative to the main
 application directory (which may include '@code{subdir}' parameter).
-Default value is '@code{.}', and passing non-default value may be
-useful for multi-component projects. Note that @code{--subprojects}
-switch is automatically passed to 'android update project', so using
-explicit list may be needed only for peculiar source layouts.
 
 @item encoding=xxxx
 Adds a java.encoding property to local.properties with the given
index 5f1f34bd7ff6e2f1166e0c9828068b4dc3d2b157..e681814d7d24fd1f08f80e2417864f1dcb88f06a 100644 (file)
@@ -1363,15 +1363,31 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, sdk_path,
                     (app['id'], build['version']), p.stdout, p.stderr)
 
     # Generate (or update) the ant build file, build.xml...
-    updatemode = build.get('update', '.')
-    if (updatemode != 'no' and
-        'maven' not in build and 'gradle' not in build):
+    updatemode = build.get('update', 'auto')
+    if (updatemode != 'no'
+            and build.get('maven', 'no') == 'no'
+            and build.get('gradle', 'no') == 'no'):
         parms = [os.path.join(sdk_path, 'tools', 'android'),
-                'update', 'project', '-p', '.']
+                'update', 'project']
         if 'target' in build:
             parms.append('-t')
             parms.append(build['target'])
-        update_dirs = [d.strip() for d in updatemode.split(';')]
+        update_dirs = None
+        if updatemode == 'auto':
+            update_dirs = ['.']
+            with open(os.path.join(root_dir, 'project.properties')) as f:
+                for line in f.readlines():
+                    if not line.startswith('android.library.reference.'):
+                        continue
+                    path = line.split('=')[1].strip()
+                    relpath = os.path.join(root_dir, path)
+                    if not os.path.isdir(relpath):
+                        continue
+                    if verbose:
+                        print "Found subproject %s..." % path
+                    update_dirs.append(path)
+        else:
+            update_dirs = [d.strip() for d in updatemode.split(';')]
         # Force build.xml update if necessary...
         if updatemode == 'force' or 'target' in build:
             if updatemode == 'force':
@@ -1382,21 +1398,23 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, sdk_path,
                 os.remove(buildxml)
 
         for d in update_dirs:
-            cwd = os.path.join(root_dir, d)
             # Remove gen and bin dirs in libraries
             # rid of them...
             for baddir in [
                     'gen', 'bin', 'obj', # ant
                     'libs/armeabi-v7a', 'libs/armeabi', # jni
                     'libs/mips', 'libs/x86']:
-                badpath = os.path.join(cwd, baddir)
+                badpath = os.path.join(root_dir, d, baddir)
                 if os.path.exists(badpath):
                     print "Removing '%s'" % badpath
                     shutil.rmtree(badpath)
+            dparms = parms + ['-p', d]
             if verbose:
-                print "Update of '%s': exec '%s' in '%s'"%\
-                    (d," ".join(parms),cwd)
-            p = FDroidPopen(parms, cwd=cwd, verbose=verbose)
+                if d == '.':
+                    print "Updating main project..."
+                else:
+                    print "Updating subproject %s..." % d
+            p = FDroidPopen(dparms, cwd=root_dir, verbose=verbose)
             # check to see whether an error was returned without a proper exit code (this is the case for the 'no target set or target invalid' error)
             if p.returncode != 0 or (p.stderr != "" and p.stderr.startswith("Error: ")):
                 raise BuildException("Failed to update project at %s" % cwd,