diff --git a/gradle/javaproject.gradle b/gradle/javaproject.gradle index 2b7844fe8bf4827e8a6a2a43aeeeb889afac9d2a..0a1cae015656c32809871c307873b51baeee7f07 100644 --- a/gradle/javaproject.gradle +++ b/gradle/javaproject.gradle @@ -63,51 +63,76 @@ buildscript { repositories repositoryConfig -// Gathering version and revision -def gatheringTask = new ch.systemsx.cisd.ant.task.subversion.GatherRevisionAndVersionTask() -List names = new ArrayList() -names.add(project.name) -includeFlat = { String[] projectNames -> names.addAll(Arrays.asList(projectNames)) } -try { - apply from: project.file('settings.gradle') -} catch (Exception e) { - println "Warning: Couldn't evaluate 'settings.gradle' in ${project.projectDir}. Possible reason: Other statements than 'includeFlat': ${e}" +def execute(command, arguments) { + new ByteArrayOutputStream().withStream { os -> + print "execute: ${command}" + arguments.collect({print " ${it}"}) + println '' + def result = exec { + executable = command + args = arguments + standardOutput = os + } + return os.toString().split('\n') + } } -gatheringTask.setProjectNames(names) -println "PROJECT: ${project.name}, gather revision for following projects: ${gatheringTask.projectNames}" -def antProject = new org.apache.tools.ant.Project() -antProject.setBaseDir(new File("${project.projectDir}")) -gatheringTask.setProject(antProject) -gatheringTask.setVersion("version") -gatheringTask.setRevision("revision") -gatheringTask.setClean("clean") - -try { - gatheringTask.execute() - versionNumber = antProject.getProperty("version") - revisionNumber = antProject.getProperty("revision") - cleanFlag = antProject.getProperty("clean") - - // set version - version=versionNumber+"-r"+revisionNumber - println "${project.name}: ${version}" - - // create BUILD INFO file + +def SVN_CMD = 'svn' + +def executeSVN(arguments) { + arguments.add(0, '--non-interactive') + return execute('svn', arguments) +} + +def calculateCleanFlag() { + for (childProject in project.childProjects.values()) { + if (childProject.cleanFlag == 'dirty') { + return 'dirty' + } + } + def output = executeSVN(['status', '../' + project.name]) + def lines = output.findAll({ (it.startsWith('?') || it.trim().isEmpty()) == false}) + return lines.isEmpty() ? 'clean' : 'dirty' +} + +def findMaximum(lines, key) { + return lines.findAll({ it.startsWith(key)}).collect({element -> element.split(':')[1].toInteger()}).max() +} + +def calculateBuildInfo() { + def output = executeSVN(['info', '-R', '../' + project.name]) + project.ext.revisionNumber = findMaximum(output, 'Revision:') + def maxLastChangedRev = findMaximum(output, 'Last Changed Rev:') + if (project.ext.revisionNumber < maxLastChangedRev) { + throw new GradleException("Maximum revision (${project.ext.revisionNumber}) is less than the maximum " + + "last changed revision ($maxLastChangedRev).") + } + project.ext.versionNumber = 'SNAPSHOT' + def url = output.findAll({ it.startsWith('URL:')})[0].split('URL:')[1].trim() + if (url.contains('/trunk') == false) { + pathElements = url.split('/') + project.ext.versionNumber = 'libraries' == pathElements[-2] ? pathElements[-3] : pathElements[-2] + } + for (childProject in project.childProjects.values()) { + project.ext.revisionNumber = Math.max(project.ext.revisionNumber, childProject.revisionNumber) + if (project.ext.versionNumber != childProject.versionNumber) { + throw new GradleException("Inconsistent version numbers: " + + "${project.name} at version ${project.ext.versionNumber} but " + + "${childProject.name} at version ${childProject.versionNumber}.") + } + } + version = "${project.ext.versionNumber}-r${project.ext.revisionNumber}" + project.ext.cleanFlag = calculateCleanFlag() + def buildInfo = "${project.ext.versionNumber}:${project.ext.revisionNumber}:${project.ext.cleanFlag}" + println "BUILD INFO for $project: $buildInfo" def targetsDist = 'targets/dist' - def distFolder = new File("${project.projectDir}/${targetsDist}") + def distFolder = new File("${project.projectDir}/$targetsDist") distFolder.deleteDir() distFolder.mkdirs() - - def writer = new FileWriter("${project.projectDir}/${targetsDist}/BUILD-${project.name}.INFO") - try { - writer.println("${versionNumber}:${revisionNumber}:${cleanFlag}") - } finally { - writer.close() - } -} catch (Exception e) { - println "skipping gathering" + file("${project.projectDir}/$targetsDist/BUILD-${project.name}.INFO") << buildInfo } +calculateBuildInfo() group="cisd"