blob: f7a87d1f7ee005d061b11a121adc4b9334816310 [file] [log] [blame]
// BEGIN_EXCLUDE
import com.example.android.samples.build.SampleGenPlugin
apply plugin: SampleGenPlugin
samplegen {
pathToBuild "../../../../build"
pathToSamplesCommon "../../common"
}
task emitBrowseableAll {
println "Executing all tasks"
}
task emitGradleAll {
println "Executing all tasks"
}
task emitGradleZipAll {
println "Executing all tasks"
}
def tasksBrowseable = []
def tasksGradle = []
def tasksGradleZip = []
def samplesXml = (new XmlParser()).parse('samples.xml')
samplesXml.sample.each { sample ->
println "Creating task : " + sample.@name
//
//Browseable task
//
task "task${sample.@name}Browseable" (type:Copy) {
def outputPath =outPath("browseable", sample.@name);
//Get absolute path of input path
FileTree inputFileTree = project.fileTree(sample.@path)
def inputPath = inputFileTree.getFiles().iterator().next().parentFile.absolutePath //sample.@path
println "Input path : " + inputPath
mkdir outputPath
into outputPath
from("${inputPath}/AndroidManifest.xml")
from("${inputPath}/lint.xml")
from("${inputPath}/project.properties")
into("res") {
from("${inputPath}/res")
}
into("assets") {
from("${inputPath}/assets")
}
//Collect C++ files
into("jni") {
from("${inputPath}/jni")
}
//Collect java files
def javaDirs = ["${inputPath}/src"]
FileTree javaTree = null;
javaDirs.each { dir ->
FileTree tree = project.fileTree("${dir}")
javaTree = (javaTree == null) ? tree : javaTree.plus(tree)
}
println javaTree;
println javaDirs
Map collapsedPaths = collapsePaths(javaTree, javaDirs)
println collapsedPaths
javaDirs.each { srcPath ->
println srcPath
into("src") {
def javaPath = "${srcPath}"
from(javaPath)
setIncludeEmptyDirs(false)
include(["**/*.java", "**/*.xml"])
eachFile { FileCopyDetails fcd ->
if (fcd.file.isFile()) {
def filename = fcd.name;
String collapsed = collapsedPaths.get(fcd.file.path);
fcd.path = "src/${collapsed}";
} else {fcd.exclude()}
}
println "***************** done"
}
}
}
//
//Zipfile task
//
task "task${sample.@name}Gradle"(type:Copy) {
//dependsOn(preflight)
def outputPath =outPath("gradle", sample.@name);
def inputPath = sample.@path
// Copy entire sample into output -- since it's already in Gradle format, we'll explicitly exclude content that
// doesn't belong here.
mkdir outputPath
into outputPath
from("${inputPath}") {
// Paths to exclude from output
exclude ".classpath"
exclude ".cproject"
exclude ".project"
exclude ".settings"
exclude "bin"
exclude "gen"
exclude "obj"
exclude "libs"
exclude "**/proguard-project.txt"
exclude "${samplegen.targetSampleModule()}/**/README*.txt"
}
// Remove BEGIN_EXCLUDE/END_EXCLUDE blocks from source files
eachFile { file ->
if (file.name.endsWith(".gradle") || file.name.endsWith(".java")) {
// TODO(trevorjohns): Outputs a blank newline for each filtered line. Replace with java.io.FilterReader impl.
boolean outputLines = true;
def removeExcludeBlocksFilter = { line ->
if (line ==~ /\/\/ BEGIN_EXCLUDE/) {
outputLines = false;
} else if (line ==~ /\/\/ END_EXCLUDE/) {
outputLines = true;
} else if (outputLines) {
return line;
}
return ""
}
filter(removeExcludeBlocksFilter)
}
}
}
task "task${sample.@name}GradleZip"(type:Zip) {
def outputPath =outPath("browseable", "");
def folderName = "${sample.@name}"
archiveName = "${sample.@name}.zip"
def inputPath = outPath("gradle", sample.@name)
from inputPath
into folderName
include "**"
def outDir = project.file(outputPath)
destinationDir = outDir
}
//Add tasks to list
tasksBrowseable.add("task${sample.@name}Browseable")
tasksGradle.add("task${sample.@name}Gradle")
tasksGradleZip.add("task${sample.@name}GradleZip")
}
//Add generated tasks to dependency list
emitBrowseableAll.dependsOn(tasksBrowseable)
emitGradleAll.dependsOn(tasksGradle)
emitGradleZipAll.dependsOn([tasksGradle, tasksGradleZip])
String outPath(String buildType, String sampleName) {
/*
def repoInfo = "repo info platform/developers/build".execute().text
def buildPath = (repoInfo =~ /Mount path: (.*)/)[0][1]
*/
return "${samplegen.pathToBuild}/out/${buildType}/${sampleName}";
}
/**
* Collapse a path "IntelliJ-style" by putting dots rather than slashes between
* path components that have only one child. So the two paths
*
* com/example/android/foo/bar.java
* com/example/android/bar/foo.java
*
* Become
* com.example.android/foo/bar.java
* com.example.android/bar/foo.java
*
* @param path
* @param roots
* @return
*/
Map<String,String> collapsePaths(FileTree path, List<String> roots) {
Map result = new HashMap<String,String>();
println ("******************** Collapse *************************")
path.visit { FileVisitDetails f ->
if (f.isDirectory()) return;
StringBuilder collapsedPath = new StringBuilder("${f.name}");
File current = f.file;
//
// Starting at this file, walk back to the root of the path and
// substitute dots for any directory that has only one child.
//
// Don't substitute a dot for the separator between the end of the
// path and the filename, even if there's only one file in the directory.
if (!f.isDirectory()) {
current = current.parentFile;
collapsedPath.insert(0, "${current.name}/")
}
// For everything else, use a dot if there's only one child and
// a slash otherwise. Filter out the root paths, too--we only want
// the relative path. But wait, Groovy/Gradle is capricious and
// won't return the proper value from a call to roots.contains(String)!
// I'm using roots.sum here instead of tracking down why a list of
// strings can't return true from contains() when given a string that
// it quite obviously does contain.
current = current.parentFile;
while((current != null)
&& (roots.sum {String r-> return r.equals(current.absolutePath) ? 1 : 0 } == 0)) {
//Exclude files starting with "."
def files = 0
current.list().each { file ->
if (!file.startsWith("."))
files++
}
char separator = files > 1 ? '/' : '.';
collapsedPath.insert(0, "${current.name}${separator}");
current = current.parentFile;
}
result.put(f.file.path, collapsedPath.toString());
}
println ("******************** Results *************************")
result.each {entry -> println("${entry}\n\n");}
return result
}
//apply from: "ndkbuild.gradle"
// END_EXCLUDE