From 11ca7c3bcbc834cc6aaac579458e0546c13d8de7 Mon Sep 17 00:00:00 2001 From: Alexander Fedorov Date: Sat, 24 Jul 2021 11:56:28 +0300 Subject: [PATCH] Bug 553630 [Passage] publish general purpose passage bundles Port complete pom utility Signed-off-by: Alexander Fedorov --- releng/org.eclipse.passage.releng/.classpath | 15 ++ releng/org.eclipse.passage.releng/.project | 6 + releng/org.eclipse.passage.releng/pom.xml | 96 ++++++++ .../passage/releng/maven/CompletePom.java | 223 ++++++++++++++++++ 4 files changed, 340 insertions(+) create mode 100644 releng/org.eclipse.passage.releng/.classpath create mode 100644 releng/org.eclipse.passage.releng/pom.xml create mode 100644 releng/org.eclipse.passage.releng/src/org/eclipse/passage/releng/maven/CompletePom.java diff --git a/releng/org.eclipse.passage.releng/.classpath b/releng/org.eclipse.passage.releng/.classpath new file mode 100644 index 000000000..e1b830e8d --- /dev/null +++ b/releng/org.eclipse.passage.releng/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/releng/org.eclipse.passage.releng/.project b/releng/org.eclipse.passage.releng/.project index 211610a49..93990d68f 100644 --- a/releng/org.eclipse.passage.releng/.project +++ b/releng/org.eclipse.passage.releng/.project @@ -5,6 +5,11 @@ + + org.eclipse.jdt.core.javabuilder + + + org.eclipse.m2e.core.maven2Builder @@ -13,5 +18,6 @@ org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature diff --git a/releng/org.eclipse.passage.releng/pom.xml b/releng/org.eclipse.passage.releng/pom.xml new file mode 100644 index 000000000..44aac43cf --- /dev/null +++ b/releng/org.eclipse.passage.releng/pom.xml @@ -0,0 +1,96 @@ + + + + 4.0.0 + org.eclipse.passage + org.eclipse.passage.releng.pommod + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + + + + + org.apache.maven + maven-model + 3.5.3 + + + org.codehaus.plexus + plexus-utils + 3.1.0 + + + args4j + args4j + 2.33 + + + org.eclipse.jdt + org.eclipse.jdt.annotation + 2.1.100 + + + + + clean verify + pommod + + + maven-compiler-plugin + 3.7.0 + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.1 + + + package + + shade + + + + + org.eclipse.passage.releng.maven.CompletePom + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + \ No newline at end of file diff --git a/releng/org.eclipse.passage.releng/src/org/eclipse/passage/releng/maven/CompletePom.java b/releng/org.eclipse.passage.releng/src/org/eclipse/passage/releng/maven/CompletePom.java new file mode 100644 index 000000000..f1f78224c --- /dev/null +++ b/releng/org.eclipse.passage.releng/src/org/eclipse/passage/releng/maven/CompletePom.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright (c) 2021 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.releng.maven; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Calendar; + +import org.apache.maven.model.Developer; +import org.apache.maven.model.License; +import org.apache.maven.model.Model; +import org.apache.maven.model.Scm; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.apache.maven.model.io.xpp3.MavenXpp3Writer; +import org.eclipse.jdt.annotation.NonNull; +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; + +public final class CompletePom { + + public static void main(String[] args) { + CompletePom instance = new CompletePom(); + CmdLineParser parser = new CmdLineParser(instance); + try { + parser.parseArgument(args); + } catch (CmdLineException e) { + System.err.println(e.getMessage()); + parser.printUsage(System.err); + return; + } + try { + instance.run(); + } catch (IOException e) { + System.err.println(e.getMessage()); + } + } + + @Option(name = "-dir", usage = "Sets the base directory to scan for POM files", required = true) + public void setBase(@NonNull File dir) { + this.base = dir; + } + + @Option(name = "-dry", usage = "When set, files are not modified and result is dumped to sysout") + public void setDry(boolean dryRun) { + this.dry = dryRun; + } + + private final String year; + private File base; + private boolean dry; + + public CompletePom() { + this.year = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)); + } + + public void run() throws IOException { + System.out.println("Making POMs compliant for Maven Central."); //$NON-NLS-1$ + System.out.println("Processing *.pom files in " + base.getAbsolutePath() + "..."); //$NON-NLS-1$ //$NON-NLS-2$ + Files.find(base.toPath(), 20, (path, basicFileAttributes) -> path.toFile().getPath().endsWith(".pom")) //$NON-NLS-1$ + .forEach(path -> enhancePOMFile(path)); + System.out.println("Done."); //$NON-NLS-1$ + } + + private void enhancePOMFile(Path path) { + boolean modified = false; + Model model = load(path.toFile()); + + if (model.getName() == null) { + model.setName(model.getArtifactId()); + modified = true; + } + + if (model.getUrl() == null) { + model.setUrl("https://www.eclipse.org/passage"); //$NON-NLS-1$ + modified = true; + } + + if (model.getLicenses().isEmpty()) { + License license = new License(); + license.setName("The Eclipse Public License Version 2.0"); //$NON-NLS-1$ + license.setUrl("https://www.eclipse.org/legal/epl-v20.html"); //$NON-NLS-1$ + license.setDistribution("repo"); //$NON-NLS-1$ + model.addLicense(license); + modified = true; + } + + if (model.getScm() == null) { + Scm scm = new Scm(); + scm.setUrl("https://github.com/eclipse-passage/passage.git"); //$NON-NLS-1$ + scm.setConnection("git@github.com:eclipse-passage/passage.git"); //$NON-NLS-1$ + model.setScm(scm); + modified = true; + } + + if (model.getDevelopers().isEmpty()) { + Developer developer = new Developer(); + developer.setId("eclipse"); //$NON-NLS-1$ + developer.setName("Eclipse.org"); //$NON-NLS-1$ + developer.setEmail("info@eclipse.org"); //$NON-NLS-1$ + model.addDeveloper(developer); + modified = true; + } + String groupID = model.getGroupId(); + String artifactID = model.getArtifactId(); + String version = model.getVersion(); + String description = model.getDescription(); + + boolean exists = exists(groupID, artifactID, version); + + if (modified || dry) { + if (modified) { + System.out.println("--------------- Modified: " + path + " exists: " + exists); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + System.out.println("--------------- Unmodified: " + path + " exists " + exists); //$NON-NLS-1$ //$NON-NLS-2$ + } + save(model, path.toFile()); + if (!exists) { + String pomFileName = path.getFileName().toString(); + Path publish = path.getParent().resolve(pomFileName.substring(0, pomFileName.length() - 3) + "publish"); //$NON-NLS-1$ + String title = getJavadocWindowTitle(description, version); + String footer = getJavadocFooter(); + savePublish(publish.toFile(), title, footer); + } + System.out.println(); + } + } + + protected String getJavadocWindowTitle(String string, String version) { + return string + " " + version.substring(0, version.lastIndexOf('.')) + " API Specification"; //$NON-NLS-1$ //$NON-NLS-2$ + } + + protected String getJavadocFooter() { + String product = "Passage"; //$NON-NLS-1$ + return "Copyright © 2018, " + year //$NON-NLS-1$ + + "ArSysOp and others" //$NON-NLS-1$ + + ". Licensed under the Eclipse Public License v2.0. All rights reserved.
Submit a bug or feature
"; //$NON-NLS-1$ + } + + protected Model load(File file) { + try (FileReader reader = new FileReader(file)) { + return new MavenXpp3Reader().read(reader); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected void save(Model model, File target) { + MavenXpp3Writer writer = new MavenXpp3Writer(); + try { + if (dry) { + writer.write(System.out, model); + } else { + try (FileWriter fw = new FileWriter(target)) { + writer.write(fw, model); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected void savePublish(File target, String javadocWindowTitle, String javadocFooter) { + try { + if (dry) { + System.out.println(javadocWindowTitle); + System.out.println(javadocFooter); + } else { + try (FileOutputStream fos = new FileOutputStream(target)) { + PrintStream out = new PrintStream(fos, false, StandardCharsets.UTF_8); + out.println(javadocWindowTitle); + out.println(javadocFooter); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + protected boolean exists(String groupID, String artifactID, String version) { + String spec = String.format( + "https://oss.sonatype.org/service/local/lucene/search?g=%s&a=%s&v=%s&repositoryId=releases", // //$NON-NLS-1$ + groupID, artifactID, version); + try { + URL url = new URL(spec); + try (InputStream in = url.openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + if (line.contains("")) { //$NON-NLS-1$ + return !line.contains("0"); //$NON-NLS-1$ + } + } + } + } catch (IOException ex) { + // well, it does not exist for whatever reason + } + return false; + } + +}