blob: 39f3cf41a4b68f21fdba2b059b185385d07545e9 [file] [log] [blame]
package virgobuild
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.logging.LogLevel
import eclipsebuild.FileSemaphore
// new comment
// Derived from buildship Plugins
class VirgoToolsPlugin implements Plugin<Project> {
// virgo tasks names
static final String DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME = "downloadVirgoBuildTools"
static final String TASK_NAME_GENERATE_P2_INSTRUCTIONS = "generateP2Instructions"
@Override
public void apply(Project project) {
Config config = Config.on(project)
addTaskDownloadVirgoBuildTools(project, config)
}
static void generateP2Instructions(Project project, File assemblyFeatureDir) {
project.logger.info("Generating p2 instructions for '${assemblyFeatureDir}'.")
project.javaexec {
main = 'org.eclipse.equinox.launcher.Main'
classpath Config.on(project).equinoxLauncherJar
args = [
'-application',
'org.eclipse.virgo.build.p2tools.instructions.P2InstructionGeneratorApplication',
'-source',
assemblyFeatureDir
]
}
project.logger.info("Generated p2 instructions for '${assemblyFeatureDir}'.")
}
static void publishProduct(Project project, File productFileLocation, File javaProfileLocation) {
File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
publishProduct(project, repositoryDir, productFileLocation, javaProfileLocation)
}
// TODO remove unnecessary variable javaProfileLocation as this can be always oev.site/config/something?!
@Deprecated
static void publishProduct(Project project, File repositoryDir, File productFileLocation, File javaProfileLocation) {
project.logger.info("Publishing Virgo ${productFileLocation} to '${repositoryDir}'.")
project.javaexec {
main = 'org.eclipse.equinox.launcher.Main'
classpath Config.on(project).equinoxLauncherJar
args = [
'-application',
'org.eclipse.equinox.p2.publisher.ProductPublisher',
'-metadataRepository',
"file:${repositoryDir}",
'-artifactRepository',
"file:${repositoryDir}",
'-append',
'-compress',
'-publishArtifacts',
'-productFile',
productFileLocation,
// '-jreLocation',
// "${javaProfileLocation}",
'-configs',
'ANY.ANY.ANY',
'-flavor',
'tooling'
]
}
project.logger.info("Published Virgo ${productFileLocation} to '${repositoryDir}'.")
}
static void installProduct(Project project, String productIu, File destinationDir) {
File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
installProduct(project, productIu, repositoryDir, destinationDir)
}
@Deprecated
static void installProduct(Project project, String productIu, File repositoryDir, File destinationDir) {
project.logger.info("Installing Virgo '${productIu}' assembled from '${repositoryDir}' into '${destinationDir}'.")
project.javaexec {
main = 'org.eclipse.equinox.launcher.Main'
classpath Config.on(project).equinoxLauncherJar
args = [
'-application',
'org.eclipse.equinox.p2.director',
'-repository',
"file:${repositoryDir}",
'-installIU',
productIu,
'-tag',
'InitialState',
'-destination',
destinationDir,
'-profile',
'VIRGOProfile',
'-roaming'
]
}
project.logger.info("Installed Virgo '${productIu}' assembled from '${repositoryDir}' into '${destinationDir}'.")
}
static void mirrorP2UpdateSite(Project project, String source) {
File repositoryDir = project.file("${project.rootProject.projectDir}/org.eclipse.virgo.site/build/repository/")
mirrorP2UpdateSite(project, source, repositoryDir)
}
static void mirrorP2UpdateSite(Project project, String source, File destinationDir) {
project.logger.info("Mirrorring update site '${source}' into '${destinationDir}'.")
project.javaexec {
main = 'org.eclipse.equinox.launcher.Main'
classpath Config.on(project).equinoxLauncherJar
args = [
'-application',
'org.eclipse.equinox.p2.metadata.repository.mirrorApplication',
'-writeMode',
'-source',
"${source}",
'-destination',
"${destinationDir}",
]
}
project.javaexec {
main = 'org.eclipse.equinox.launcher.Main'
classpath Config.on(project).equinoxLauncherJar
args = [
'-application',
'org.eclipse.equinox.p2.artifact.repository.mirrorApplication',
'-writeMode',
'-source',
"${source}",
'-destination',
"${destinationDir}",
]
}
project.logger.info("Mirrorred update site '${source}' into '${destinationDir}'.")
}
static void addTaskDownloadVirgoBuildTools(Project project, Config config) {
project.task(DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME) {
group = Constants.gradleTaskGroupName
description = "Downloads the Virgo Build Tools to perform P2 operations with."
outputs.file config.virgoBuildToolsArchive
doLast { downloadVirgoBuildTools(project, config) }
}
}
static void downloadVirgoBuildTools(Project project, Config config) {
// if multiple builds start on the same machine (which is the case with a CI server)
// we want to prevent them downloading the same file to the same destination
def directoryLock = new FileSemaphore(config.virgoBuildToolsDir)
directoryLock.lock()
try {
downloadVirgoBuildToolsUnprotected(project, config)
} finally {
directoryLock.unlock()
}
}
static void downloadVirgoBuildToolsUnprotected(Project project, Config config) {
// download the archive
File virgoBuildToolsArchive = config.virgoBuildToolsArchive
project.logger.info("Download Virgo Build Tools from '${Constants.virgoBuildToolsDownloadUrl}' to '${virgoBuildToolsArchive.absolutePath}'")
project.ant.get(src: Constants.virgoBuildToolsDownloadUrl, dest: virgoBuildToolsArchive)
// extract it to the same location where it was extracted
project.logger.info("Extract '$virgoBuildToolsArchive' to '$virgoBuildToolsArchive.parentFile.absolutePath'")
project.ant.unzip(src: virgoBuildToolsArchive, dest: virgoBuildToolsArchive.parentFile, overwrite: true)
}
}