Skip to content

Commit

Permalink
Make processResources tasks depend on intellij extension and project …
Browse files Browse the repository at this point in the history
…version

Fixes #67
  • Loading branch information
zolotov committed May 4, 2016
1 parent 2b851c3 commit 1df7cc2
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 36 deletions.
9 changes: 6 additions & 3 deletions src/main/groovy/org/jetbrains/intellij/IntelliJPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ class IntelliJPlugin implements Plugin<Project> {

private static void configurePatchPluginXmlTask(@NotNull Project project) {
LOG.info("Configuring patch plugin.xml task")
project.tasks.withType(ProcessResources.class)*.doLast(new PatchPluginXmlTask())
def processResourcesTasks = project.tasks.withType(ProcessResources.class)
def patchPluginXmlAction = new PatchPluginXmlAction(project)
processResourcesTasks*.doLast(patchPluginXmlAction)
processResourcesTasks*.inputs*.properties(patchPluginXmlAction.properties)
}

private static void configurePrepareSandboxTask(@NotNull Project project) {
Expand Down Expand Up @@ -196,9 +199,9 @@ class IntelliJPlugin implements Plugin<Project> {
baseName = extension.pluginName
from("$prepareSandboxTask.destinationDir")
into(extension.pluginName)
dependsOn(prepareSandboxTask)
dependsOn(prepareSandboxTask)
}

ArchivePublishArtifact zipArtifact = new ArchivePublishArtifact(zip);
Configuration runtimeConfiguration = project.getConfigurations().getByName(JavaPlugin.RUNTIME_CONFIGURATION_NAME);
runtimeConfiguration.getArtifacts().add(zipArtifact);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,63 @@ import org.gradle.api.Project
import org.gradle.api.Task
import org.jetbrains.annotations.NotNull

class PatchPluginXmlTask implements Action<Task> {
class PatchPluginXmlAction implements Action<Task> {
private final Map<String, String> myProperties = new HashMap()

PatchPluginXmlAction(@NotNull Project project) {
myProperties.version = project.version
def extension = project.extensions.findByName(IntelliJPlugin.EXTENSION_NAME) as IntelliJPluginExtension
if (extension != null && extension.updateSinceUntilBuild) {
try {
def matcher = Utils.VERSION_PATTERN.matcher(Utils.ideaBuildNumber(extension.ideaDirectory))
if (matcher.find()) {
def since = matcher.group(2)
def dotPosition = since.indexOf('.')
if (dotPosition > 0) {
def until = extension.sameSinceUntilBuild ? since : since.substring(0, dotPosition) + ".9999"
myProperties.since = since
myProperties.until = until
}
}
} catch (IOException e) {
IntelliJPlugin.LOG.warn("Cannot read build.txt file", e)
}
}
}

@NotNull
public Map<String, String> getProperties() {
return myProperties
}

@Override
void execute(Task task) {
def (since, until) = sinceUntilBuild(task.project)
public void execute(Task task) {
Utils.outPluginXmlFiles(task.project).each { file ->
def pluginXml = Utils.parseXml(file)
if (since != null && until != null) {

if (myProperties.since && myProperties.until) {
def ideaVersionTag = pluginXml.'idea-version'
if (ideaVersionTag) {
ideaVersionTag*.'@since-build' = since
ideaVersionTag*.'@until-build' = until
ideaVersionTag*.'@since-build' = myProperties.since
ideaVersionTag*.'@until-build' = myProperties.until
} else {
pluginXml.children().add(0, new Node(null, 'idea-version', ['since-build': since, 'until-build': until]))
pluginXml.children().add(0, new Node(null, 'idea-version',
['since-build': myProperties.since, 'until-build': myProperties.until]))
}
}

def versionToSet = task.project.version
if (versionToSet && versionToSet != Project.DEFAULT_VERSION) {
if (myProperties.version && myProperties.version != Project.DEFAULT_VERSION) {
def version = pluginXml.version
if (version) {
version*.value = versionToSet
version*.value = myProperties.version
} else {
pluginXml.children().add(0, new Node(null, 'version', versionToSet));
pluginXml.children().add(0, new Node(null, 'version', myProperties.version));
}
}

def printer = new XmlNodePrinter(new PrintWriter(new FileWriter(file)))
printer.preserveWhitespace = true
printer.print(pluginXml)
}
}

static def sinceUntilBuild(@NotNull Project project) {
def extension = project.extensions.findByName(IntelliJPlugin.EXTENSION_NAME) as IntelliJPluginExtension
if (extension != null && extension.updateSinceUntilBuild) {
try {
def matcher = Utils.VERSION_PATTERN.matcher(Utils.ideaBuildNumber(extension.ideaDirectory))
if (matcher.find()) {
def since = matcher.group(2)
def dotPosition = since.indexOf('.')
if (dotPosition > 0) {
def until = extension.sameSinceUntilBuild ? since : since.substring(0, dotPosition) + ".9999"
return new Tuple(since, until)
}
}
} catch (IOException e) {
IntelliJPlugin.LOG.warn("Cannot read build.txt file", e)
}
}
return new Tuple(null, null)
}
}
34 changes: 34 additions & 0 deletions src/test/groovy/org/jetbrains/intellij/PatchPluginXmlSpec.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ intellij {
when:
def project = run(JavaPlugin.PROCESS_RESOURCES_TASK_NAME)
then:
println ouputPluginXml(project).text
ouputPluginXml(project).text == """<idea-plugin version="2">
<version>0.42.123</version>
<idea-version since-build="1" until-build="2">my_version</idea-version>
Expand All @@ -101,6 +102,39 @@ intellij {
"""
}

def 'skip patch task if intellij version did not changed'() {
given:
pluginXml << "<idea-plugin version=\"2\"></idea-plugin>"
buildFile << "version='0.42.123'\nintellij { version = '14.1.4' }"
when:
run(JavaPlugin.PROCESS_RESOURCES_TASK_NAME)
def project = run(JavaPlugin.PROCESS_RESOURCES_TASK_NAME)
then:
stdout.contains(":processResources UP-TO-DATE")
ouputPluginXml(project).text == """<idea-plugin version="2">
<version>0.42.123</version>
<idea-version since-build="141.1532.4" until-build="141.9999"/>
</idea-plugin>
"""
}

def 'patch version and since until builds on intellij version changing'() {
given:
pluginXml << "<idea-plugin version=\"2\"></idea-plugin>"
buildFile << "version='0.42.123'\nintellij { version = '14.1.3' }"
when:
run(JavaPlugin.PROCESS_RESOURCES_TASK_NAME)
buildFile << "\nintellij { version = '14.1.4' }"
def project = run(JavaPlugin.PROCESS_RESOURCES_TASK_NAME)
then:
!stdout.contains(":processResources UP-TO-DATE")
ouputPluginXml(project).text == """<idea-plugin version="2">
<version>0.42.123</version>
<idea-version since-build="141.1532.4" until-build="141.9999"/>
</idea-plugin>
"""
}

private static File ouputPluginXml(GradleProject project) {
new File(project.buildDirectory, "resources/main/META-INF/plugin.xml")
}
Expand Down

0 comments on commit 1df7cc2

Please sign in to comment.