| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import groovy.xml.XmlParser |
| import groovy.util.Node |
| import groovy.json.JsonSlurper |
| import groovy.yaml.YamlSlurper |
| |
| /* groovylint-disable JavaIoPackageAccess */ |
| |
| ArrayList calculateBadges(Map project) { |
| def badges = [] |
| if (getStatus("https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/badge/icon") != 404) { |
| println 'Adding build status badge...' |
| badges.add(" [](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/)") |
| } |
| if (responseValid("https://img.shields.io/jenkins/tests.svg?jobUrl=https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/")) { |
| println 'Adding test status badge...' |
| badges.add(" [](https://ci-builds.apache.org/job/Sling/job/modules/job/sling-${project.folder}/job/master/test/?width=800&height=600)") |
| } |
| if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=coverage")) { |
| println 'Adding coverage status badge...' |
| badges.add(" [](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})") |
| } |
| if (responseValid("https://sonarcloud.io/api/project_badges/measure?project=apache_sling-${project.folder}&metric=alert_status")) { |
| println 'Adding quality status badge...' |
| badges.add(" [](https://sonarcloud.io/dashboard?id=apache_sling-${project.folder})") |
| } |
| if (project.artifactId) { |
| if (getStatus("https://www.javadoc.io/badge/org.apache.sling/${project.artifactId}.svg") != 404) { |
| println 'Adding JavaDoc badge...' |
| badges.add(" [](https://www.javadoc.io/doc/org.apache.sling/${project.artifactId})") |
| } |
| if (responseValid("https://maven-badges.herokuapp.com/maven-central/org.apache.sling/${project.artifactId}/badge.svg")) { |
| println 'Adding Maven release badge...' |
| badges.add(" [](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.sling%22%20a%3A%22${project.artifactId}%22)") |
| } |
| } |
| if (project.contrib) { |
| println 'Adding contrib status badge...' |
| badges.add(' [](https://github.com/apache/sling-aggregator/blob/master/docs/status/contrib.md)') |
| } |
| if (project.deprecated) { |
| println 'Adding deprecated status badge...' |
| badges.add(' [](https://github.com/apache/sling-aggregator/blob/master/docs/status/deprecated.md)') |
| } |
| if (project.group) { |
| println 'Adding group badge...' |
| badges.add(" [](https://github.com/apache/sling-aggregator/blob/master/docs/groups/${project.group}.md)") |
| } |
| return badges |
| } |
| |
| String getProjectGroup(String repoName, File aggregatorDir) { |
| println 'Loading manifest...' |
| |
| manifest = new XmlParser().parseText(new File(aggregatorDir, 'default.xml').text) |
| |
| def groupNode = projectGroup = manifest.project.find { |
| it.@path == repoName |
| } |
| if (groupNode != null) { |
| def groupName = groupNode['@groups'] |
| if (groupName != null) { |
| println "Using Group: ${groupName}" |
| return groupName |
| } |
| } |
| return '' |
| } |
| |
| int getStatus(String url) { |
| def get = new URL(url).openConnection() |
| get.setRequestProperty('User-Agent', 'curl/7.35.0') |
| def rc = get.getResponseCode() |
| println 'Retrieved status ' + rc + ' from ' + url |
| return rc |
| } |
| |
| Map parseMavenPom(File projectFolder, File aggregatorDir) { |
| File pomFile = new File(projectFolder, 'pom.xml') |
| String repoName = projectFolder.name |
| |
| println "Fetching from ${projectFolder}..." |
| |
| println 'Reading status lists...' |
| String[] contrib = new File(aggregatorDir, 'contrib-projects.txt').text.split('\\n') |
| assert contrib |
| |
| if (!pomFile.exists()) { |
| return null |
| } |
| |
| println 'Parsing pom.xml...' |
| Node pom = new XmlParser().parseText(pomFile.text) |
| |
| Map project = [:] |
| project['artifactId'] = pom.artifactId.text() |
| project['name'] = pom.name.text() |
| if (!project['name']) { |
| project['name'] = repoName |
| } |
| project['description'] = pom.description.text().replace('\n', ' ') |
| project['group'] = getProjectGroup(repoName, aggregatorDir) |
| project['folder'] = repoName |
| project['projectVersion'] = pom.version.text() |
| project['parentVersion'] = pom.parent.version.text() |
| project['javaVersion'] = pom.properties["sling.java.version"].text() |
| if (contrib.contains(repoName)) { |
| println 'Setting project status to contrib...' |
| project['contrib'] = true |
| } |
| |
| // parse .sling-module.json |
| project['buildJdks'] = '' |
| File slingModuleFile = new File(projectFolder, '.sling-module.json') |
| if (slingModuleFile.exists()) { |
| def jsonParser = new JsonSlurper() |
| def slingModule = jsonParser.parse(slingModuleFile) |
| if (slingModule.jenkins.jdks) { |
| project['buildJdks'] = slingModule.jenkins.jdks |
| } |
| } |
| |
| // parse .asf.yaml |
| File asfYamlFile = new File(projectFolder, '.asf.yaml') |
| if (asfYamlFile.exists()) { |
| def yamlParser = new YamlSlurper() |
| def asfYaml = yamlParser.parse(asfYamlFile) |
| def labels = asfYaml.github.labels |
| if (labels && labels.contains("deprecated")) { |
| println 'Setting project status to deprecated...' |
| project['deprecated'] = true |
| } |
| } |
| |
| return project |
| } |
| |
| boolean responseValid(String url) { |
| def get = new URL(url).openConnection() |
| get.setRequestProperty('User-Agent', 'curl/7.35.0') |
| int rc = get.responseCode |
| if (rc == 200) { |
| println "Retrieved valid response code ${rc} from ${url}" |
| String text = get.inputStream.text |
| if (text.contains('inaccessible') || text.contains('not found') || text.contains('not been found') |
| || text.contains('invalid') || text.contains('unknown') || text.contains('no tests found')) { |
| println "Retrieved invalid response from ${url}" |
| return false |
| } |
| return true |
| } |
| println "Retrieved invalid response code ${rc} from ${url}" |
| return false |
| } |