Pull examples and docs from active branches
Project: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/commit/3c8d3037 Tree: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/tree/3c8d3037 Diff: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/diff/3c8d3037 Branch: refs/heads/master Commit: 3c8d3037d12581fa02383ee2552146332871d385 Parents: 88e7874 Author: dblevins <[email protected]> Authored: Sun Nov 25 20:35:16 2018 -0800 Committer: dblevins <[email protected]> Committed: Sun Nov 25 20:35:16 2018 -0800 ---------------------------------------------------------------------- .../java/org/apache/tomee/website/Docs.java | 44 +++++ .../java/org/apache/tomee/website/Example.java | 75 ++++++++ .../org/apache/tomee/website/Examples2.java | 192 +++++++++++++++++++ .../java/org/apache/tomee/website/JBake.java | 16 +- .../java/org/apache/tomee/website/Repos.java | 97 ++++++++++ .../java/org/apache/tomee/website/Source.java | 75 ++++++++ .../java/org/apache/tomee/website/Sources.java | 158 +++------------ 7 files changed, 526 insertions(+), 131 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Docs.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Docs.java b/src/main/java/org/apache/tomee/website/Docs.java new file mode 100644 index 0000000..500cf3a --- /dev/null +++ b/src/main/java/org/apache/tomee/website/Docs.java @@ -0,0 +1,44 @@ +/* + * 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. + */ +package org.apache.tomee.website; + +import org.apache.openejb.loader.IO; + +import java.io.File; +import java.io.IOException; + +public class Docs { + + private final Sources sources; + + public Docs(final Sources sources) { + this.sources = sources; + } + + public void prepare(final Source source) { + final File srcDocs = new File(source.getDir(), "docs"); + final File destDocs = sources.getDestinationFor(source, "docs"); + + if (!srcDocs.exists()) return; + + try { + IO.copyDirectory(srcDocs, destDocs); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Example.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Example.java b/src/main/java/org/apache/tomee/website/Example.java new file mode 100644 index 0000000..152729b --- /dev/null +++ b/src/main/java/org/apache/tomee/website/Example.java @@ -0,0 +1,75 @@ +/* + * 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. + */ +package org.apache.tomee.website; + +import java.io.File; + +public class Example { + private final File srcReadme; + private File destReadme; + private final String name; + private final String ext; + private final String href; + private final String category; + + public Example(final File srcReadme, final String name, final String ext, final String href, final String category) { + this.srcReadme = srcReadme; + this.name = name; + this.ext = ext; + this.href = href; + this.category = category; + } + + public void updateDestination(final File examplesDir) { + this.setDestReadme(new File(examplesDir, this.getName() + "." + this.getExt())); + } + + public File getDestReadme() { + return destReadme; + } + + public void setDestReadme(final File destReadme) { + this.destReadme = destReadme; + } + + public String getName() { + return name; + } + + public String getHref() { + return href; + } + + public File getSrcReadme() { + return srcReadme; + } + + public String getExt() { + return ext; + } + + public String getCategory() { + return category; + } + + public static Example from(final File readme) { + final String ext = readme.getName().replaceFirst("[^.]+\\.", ""); + final String exampleName = readme.getParentFile().getName(); + + return new Example(readme, exampleName, ext, exampleName + ".html", "Example"); + } +} http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Examples2.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Examples2.java b/src/main/java/org/apache/tomee/website/Examples2.java new file mode 100644 index 0000000..1891877 --- /dev/null +++ b/src/main/java/org/apache/tomee/website/Examples2.java @@ -0,0 +1,192 @@ +/* + * 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. + */ +package org.apache.tomee.website; + +import org.apache.openejb.loader.IO; +import org.apache.openejb.util.Join; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Examples2 { + + private final Sources sources; + + public Examples2(final Sources sources) { + this.sources = sources; + } + + public void prepare(final Source source) { + final File srcDir = new File(source.getDir(), "examples"); + final File destDir = sources.getDestinationFor(source, "examples"); + + // If we don't have examples in this codebase, skip + if (!srcDir.exists()) return; + + final List<Example> examples = Stream.of(srcDir.listFiles()) + .filter(File::isDirectory) + .filter(this::hasReadme) + .map(this::getReadme) + .map(Example::from) + .peek(example -> example.updateDestination(destDir)) + .peek(this::copyToDest) + .peek(this::addJbakeHeader) + .collect(Collectors.toList()); + + + // Add any missing JBake headers + + + // Create an index.adoc file + final StringBuilder index = new StringBuilder(); + for (final Example example : examples) { + index.append(" - ") + .append(example.getHref()) + .append("[") + .append(example.getName()) + .append("]") + .append(File.separator) + ; + } + + try { + IO.copy(IO.read(index.toString()), new File(destDir, "index.adoc")); + } catch (IOException e) { + throw new RuntimeException(e); + } +// https://javaee.github.io/javaee-spec/javadocs/javax/servlet/http/HttpServletMapping.html + } + + private void addJbakeHeader(final Example example) { + + if (example.getExt().startsWith("md")) { + + addMarkdownHeader(example); + + } else if (example.getExt().startsWith("a")) { + + addAsciidocHeader(example); + } + } + + private void addAsciidocHeader(final Example example) { + try { + String content = IO.slurp(example.getDestReadme()); + if (content.contains(":jbake-type:")) return; + + String header = "" + + ":jbake-type: page\n" + + ":jbake-status: published\n"; + + // The legacy Apache CMS setup for TomEE allowed a very similar header + // called "Title: " to specify the title in the created html page. + // If found, we convert it to the JBake version + // TODO all docs should be updated and this code removed + if (content.startsWith("Title:") || content.startsWith("title:")) { + final List<String> lines = new ArrayList<>(); + Collections.addAll(lines, content.split("\n")); + + // remove the legacy title syntax + final String titleLine = lines.remove(0); + + // update the header + header += ":jbake-title:" + titleLine.substring("title:".length()).trim() + "\n"; + + // update the content + content = Join.join("\n", lines); + } + + + // Prepend the JBake header for Asciidoc + content = header + content; + + // Update the destination readme file + IO.copy(IO.read(content), example.getDestReadme()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void addMarkdownHeader(final Example example) { + try { + final File readme = example.getDestReadme(); + String content = IO.slurp(readme); + + if (content.contains("~~~~~~")) return; + + + String header = "" + + "type=page\n" + + "status=published\n"; + + // The legacy Apache CMS setup for TomEE allowed a very similar header + // called "Title: " to specify the title in the created html page. + // If found, we convert it to the JBake version + // TODO all docs should be updated and this code removed + if (content.startsWith("Title:") || content.startsWith("title:")) { + final List<String> lines = new ArrayList<>(); + Collections.addAll(lines, content.split("\n")); + + // remove the legacy title syntax + final String titleLine = lines.remove(0); + + // update the header + header += "title=" + titleLine.substring("title:".length()).trim() + "\n"; + + // update the content + content = Join.join("\n", lines); + } + + // Prepend the JBake header for Markdown + content = header + "~~~~~~\n" + content; + + // Update the destination readme file + IO.copy(IO.read(content), example.getDestReadme()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Copy all the readme.mdtext to examples/foo-bar.mdtext + */ + private void copyToDest(final Example example) { + try { + IO.copy(example.getSrcReadme(), example.getDestReadme()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + private boolean hasReadme(final File dir) { + return getReadme(dir) != null; + } + + private File getReadme(final File dir) { + for (final File file : dir.listFiles()) { + if (file.getName().startsWith("README.")) return file; + } + + return null; + } +} http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/JBake.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/JBake.java b/src/main/java/org/apache/tomee/website/JBake.java index 0f667c3..e2e2ea9 100755 --- a/src/main/java/org/apache/tomee/website/JBake.java +++ b/src/main/java/org/apache/tomee/website/JBake.java @@ -38,14 +38,26 @@ public class JBake { final boolean startHttp = args == null || args.length < 2 || Boolean.parseBoolean(args[2]); // by default we dev final boolean skipPdf = args == null || args.length < 3 || Boolean.parseBoolean(args[3]); // by default...too slow sorry + final Sources sources = new Sources( + new File("target/jbake"), + new File("repos"), + new File("src/main/jbake"), + new Source("https://git-wip-us.apache.org/repos/asf/tomee.git", "master", "master"), + new Source("https://git-wip-us.apache.org/repos/asf/tomee.git", "tomee-7.1.0", "tomee-7.1"), + new Source("https://git-wip-us.apache.org/repos/asf/tomee.git", "tomee-7.0.5", "tomee-7.0"), + new Source("https://git-wip-us.apache.org/repos/asf/tomee.git", "tomee-8.0.0-M1", "tomee-8.0", true) + ); + + sources.prepare(); + final Runnable build = () -> { System.out.println("Building TomEE website in " + destination); final Orient orient = Orient.instance(); try { orient.startup(); - final Oven oven = new Oven(source, destination, new CompositeConfiguration() {{ - addConfiguration(ConfigUtil.load(source)); + final Oven oven = new Oven(sources.getDestination(), destination, new CompositeConfiguration() {{ + addConfiguration(ConfigUtil.load(sources.getDestination())); }}, true); oven.setupPaths(); http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Repos.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Repos.java b/src/main/java/org/apache/tomee/website/Repos.java new file mode 100644 index 0000000..6ee4713 --- /dev/null +++ b/src/main/java/org/apache/tomee/website/Repos.java @@ -0,0 +1,97 @@ +/* + * 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. + */ +package org.apache.tomee.website; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.PullResult; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.RefNotAdvertisedException; +import org.eclipse.jgit.internal.storage.file.FileRepository; + +import java.io.File; +import java.io.IOException; + +public class Repos { + + public static void download(final Source source) { + if (source.getDir().exists()) { + + try { + pull(source); + } catch (Exception e) { + System.out.println("Pull Failed. " + source); + e.printStackTrace(); + } + + } else { + + try { + clone(source); + } catch (Exception e) { + System.out.println("Clone Failed. " + source); + e.printStackTrace(); + } + } + } + + private static void clone(final Source source) throws Exception { + System.out.println(" > git clone " + source.getScmUrl()); + + jgit("clone", source.getScmUrl(), "-b", source.getBranch(), source.getDir().getAbsolutePath()); + } + + private static void pull(final Source source) throws IOException, GitAPIException { + System.out.println(" > git pull"); + + final Git git = new Git(new FileRepository(source.getDir().getAbsolutePath() + "/.git")); + + try { + final PullResult call = git.pull() + .setRemote("origin") + .setRemoteBranchName(source.getBranch()) + .call(); + + if (call.getMergeResult() != null) { + System.out.println(call.getMergeResult().getMergeStatus()); + } + + if (!call.isSuccessful()) { + System.out.println("Pull Failed. Will Remove and clone."); + // delete + deleteDirectory(source.getDir()); + // and try again + download(source); + } + } catch (RefNotAdvertisedException ignore) { + // we are on a tag + } + } + + public static void jgit(final String... args) throws Exception { + org.eclipse.jgit.pgm.Main.main(args); + } + + private static boolean deleteDirectory(File dir) { + File[] allContents = dir.listFiles(); + if (allContents != null) { + for (File file : allContents) { + deleteDirectory(file); + } + } + return dir.delete(); + } +} http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Source.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Source.java b/src/main/java/org/apache/tomee/website/Source.java new file mode 100644 index 0000000..af0afd6 --- /dev/null +++ b/src/main/java/org/apache/tomee/website/Source.java @@ -0,0 +1,75 @@ +/* + * 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. + */ +package org.apache.tomee.website; + +import org.apache.openejb.loader.IO; + +import java.io.File; +import java.io.IOException; + +public class Source { + private final String name; + private final String scmUrl; + private final String branch; + private final boolean latest; + private File dir; + + public Source(final String scmUrl, final String branch, final String name) { + this(scmUrl, branch, name, false); + } + + public Source(final String scmUrl, final String branch, final String name, final boolean latest) { + this.scmUrl = scmUrl; + this.branch = branch; + this.name = name; + this.latest = latest; + } + + public boolean isLatest() { + return latest; + } + + public String getScmUrl() { + return scmUrl; + } + + public String getBranch() { + return branch; + } + + public String getName() { + return name; + } + + public File getDir() { + return dir; + } + + public void setDir(final File dir) { + this.dir = dir; + } + + @Override + public String toString() { + return "Source{" + + "name='" + name + '\'' + + ", scmUrl='" + scmUrl + '\'' + + ", branch='" + branch + '\'' + + '}'; + } + +} http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/3c8d3037/src/main/java/org/apache/tomee/website/Sources.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/Sources.java b/src/main/java/org/apache/tomee/website/Sources.java index 5b64990..c08783e 100644 --- a/src/main/java/org/apache/tomee/website/Sources.java +++ b/src/main/java/org/apache/tomee/website/Sources.java @@ -17,11 +17,6 @@ package org.apache.tomee.website; import org.apache.openejb.loader.IO; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.PullResult; -import org.eclipse.jgit.api.errors.GitAPIException; -import org.eclipse.jgit.api.errors.RefNotAdvertisedException; -import org.eclipse.jgit.internal.storage.file.FileRepository; import java.io.File; import java.io.IOException; @@ -38,7 +33,7 @@ import java.util.List; * for new content. * * The prepare step will copy relevant asciidoc and markdown sources into the - * target/jbake/<name> directory. + * target/jbake/content/<name> directory. * */ public class Sources { @@ -59,10 +54,23 @@ public class Sources { Collections.addAll(this.sources, sources); } + public File getDestination() { + return destination; + } + + /** + * This is the heart of the code to merge several documentation + * sources into one tree. + */ public void prepare() { + final Docs docs = new Docs(this); + final Examples2 examples = new Examples2(this); + sources.stream() .peek(source -> source.setDir(new File(repos, source.getName()))) - .peek(Sources::download) + .peek(Repos::download) + .peek(docs::prepare) + .peek(examples::prepare) .forEach(Sources::done); ; @@ -73,6 +81,20 @@ public class Sources { } } + public File getDestinationFor(final Source source, final String... parts) { + final File content = new File(destination, "content"); + File dir = new File(content, source.getName()); + + for (final String part : parts) { + dir = new File(dir, part); + } + + if (!dir.exists()) { + if (!dir.mkdirs()) throw new RuntimeException("Could not make directory: " + dir.getAbsolutePath()); + } + return dir; + } + private static void done(final Source source) { System.out.println("Done " + source); } @@ -87,126 +109,4 @@ public class Sources { sources.prepare(); } - - private static void download(final Source source) { - if (source.getDir().exists()) { - - try { - pull(source); - } catch (Exception e) { - System.out.println("Pull Failed. " + source); - e.printStackTrace(); - } - - } else { - - try { - clone(source); - } catch (Exception e) { - System.out.println("Clone Failed. " + source); - e.printStackTrace(); - } - } - } - - private static void clone(final Source source) throws Exception { - System.out.println(" > git clone " + source.getScmUrl()); - - jgit("clone", source.getScmUrl(), "-b", source.getBranch(), source.getDir().getAbsolutePath()); - } - - private static void pull(final Source source) throws IOException, GitAPIException { - System.out.println(" > git pull"); - - final Git git = new Git(new FileRepository(source.getDir().getAbsolutePath() + "/.git")); - - try { - final PullResult call = git.pull() - .setRemote("origin") - .setRemoteBranchName(source.getBranch()) - .call(); - - if (call.getMergeResult() != null) { - System.out.println(call.getMergeResult().getMergeStatus()); - } - - if (!call.isSuccessful()) { - System.out.println("Pull Failed. Will Remove and clone."); - // delete - deleteDirectory(source.getDir()); - // and try again - download(source); - } - } catch (RefNotAdvertisedException ignore) { - // we are on a tag - } - } - - public static void jgit(final String... args) throws Exception { - org.eclipse.jgit.pgm.Main.main(args); - } - - - public static class Source { - private final String name; - private final String scmUrl; - private final String branch; - private final boolean latest; - private File dir; - - public Source(final String scmUrl, final String branch, final String name) { - this(scmUrl, branch, name, false); - } - - public Source(final String scmUrl, final String branch, final String name, final boolean latest) { - this.scmUrl = scmUrl; - this.branch = branch; - this.name = name; - this.latest = latest; - } - - public boolean isLatest() { - return latest; - } - - public String getScmUrl() { - return scmUrl; - } - - public String getBranch() { - return branch; - } - - public String getName() { - return name; - } - - public File getDir() { - return dir; - } - - public void setDir(final File dir) { - this.dir = dir; - } - - @Override - public String toString() { - return "Source{" + - "name='" + name + '\'' + - ", scmUrl='" + scmUrl + '\'' + - ", branch='" + branch + '\'' + - '}'; - } - } - - private static boolean deleteDirectory(File dir) { - File[] allContents = dir.listFiles(); - if (allContents != null) { - for (File file : allContents) { - deleteDirectory(file); - } - } - return dir.delete(); - } - }
