starting to impl svn pub sub - to finish
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/61cae98e Tree: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/tree/61cae98e Diff: http://git-wip-us.apache.org/repos/asf/tomee-site-generator/diff/61cae98e Branch: refs/heads/master Commit: 61cae98edd940d8117f70ad12915a599f814bb24 Parents: 972cc35 Author: rmannibucau <rmannibu...@apache.org> Authored: Tue Jul 4 20:21:23 2017 +0200 Committer: rmannibucau <rmannibu...@apache.org> Committed: Tue Jul 4 20:21:23 2017 +0200 ---------------------------------------------------------------------- .gitignore | 3 +- README.adoc | 11 +++ pom.xml | 43 ++++++--- .../java/org/apache/tomee/website/SvnPub.java | 95 ++++++++++++++++++++ 4 files changed, 141 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/61cae98e/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index 8291ee8..5c494ca 100755 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties *~ -examples.cache.old \ No newline at end of file +examples.cache.old +.content-site-checkout http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/61cae98e/README.adoc ---------------------------------------------------------------------- diff --git a/README.adoc b/README.adoc index eb2a308..0fefd33 100755 --- a/README.adoc +++ b/README.adoc @@ -68,3 +68,14 @@ in `src/main/jbake/content/examples`. If you want to take into account another e need to delete the cache before re-running the generation. Finally note that the site generation will rely on the cache as well to generate the examples home page. + +== Publish (needs an ASF account) + +`SvnPub` is a main to push to the staging the site content once built, you need to set the system properties (`MAVEN_OPTS`) `site.password` +to your asf password and `site.username` if you user name is not `USER` environment variable for it to work. + +It will checkout/update the site from svn then copy the site folder from target directory to synchronize it with the svn version +and finally it will commit everything. + +You can set the system property `site.message` to not use the default commit message. + http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/61cae98e/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index a479edc..7a229e6 100755 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,9 @@ <jbake.http>false</jbake.http> <jbake.pdf>false</jbake.pdf> + <site.password>notset</site.password> + <site.message>notset</site.message> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> @@ -85,6 +88,11 @@ <artifactId>pegdown</artifactId> <version>1.6.0</version> </dependency> + <dependency> + <groupId>org.tmatesoft.svnkit</groupId> + <artifactId>svnkit</artifactId> + <version>1.8.9</version> + </dependency> </dependencies> <build> @@ -109,18 +117,33 @@ <goals> <goal>java</goal> </goals> + <configuration> + <includeProjectDependencies>true</includeProjectDependencies> + <mainClass>org.apache.tomee.website.JBake</mainClass> + <arguments> + <argument>${project.basedir}/src/main/jbake/</argument> + <argument>${project.build.directory}/${project.build.finalName}</argument> + <argument>${jbake.http}</argument> + <argument>${jbake.pdf}</argument> + </arguments> + </configuration> + </execution> + <execution> + <id>publish</id> + <phase>pre-site</phase> + <goals> + <goal>java</goal> + </goals> + <configuration> + <includeProjectDependencies>true</includeProjectDependencies> + <mainClass>org.apache.tomee.website.SvnPub</mainClass> + <arguments> + <argument>${site.password}</argument> + <argument>${site.message}</argument> + </arguments> + </configuration> </execution> </executions> - <configuration> - <includeProjectDependencies>true</includeProjectDependencies> - <mainClass>org.apache.tomee.website.JBake</mainClass> - <arguments> - <argument>${project.basedir}/src/main/jbake/</argument> - <argument>${project.build.directory}/${project.build.finalName}</argument> - <argument>${jbake.http}</argument> - <argument>${jbake.pdf}</argument> - </arguments> - </configuration> </plugin> </plugins> </build> http://git-wip-us.apache.org/repos/asf/tomee-site-generator/blob/61cae98e/src/main/java/org/apache/tomee/website/SvnPub.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/tomee/website/SvnPub.java b/src/main/java/org/apache/tomee/website/SvnPub.java new file mode 100644 index 0000000..9e3ec0a --- /dev/null +++ b/src/main/java/org/apache/tomee/website/SvnPub.java @@ -0,0 +1,95 @@ +/* + * 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.commons.io.FileUtils; +import org.tmatesoft.svn.core.SVNCommitInfo; +import org.tmatesoft.svn.core.SVNDepth; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNProperties; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; +import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; +import org.tmatesoft.svn.core.wc.SVNClientManager; +import org.tmatesoft.svn.core.wc.SVNRevision; +import org.tmatesoft.svn.core.wc.SVNUpdateClient; +import org.tmatesoft.svn.core.wc.SVNWCUtil; +import org.tmatesoft.svn.core.wc2.SvnRevert; +import org.tmatesoft.svn.core.wc2.SvnTarget; + +import java.io.File; +import java.io.IOException; +import java.util.Date; + +import static java.util.Arrays.asList; +import static java.util.Optional.ofNullable; + +public class SvnPub { + private SvnPub() { + // no-op + } + + public static void main(final String[] args) throws SVNException, IOException { + final String username = System.getProperty("site.username", System.getenv("USER")); + final String password = args == null || args.length == 0 ? + System.getProperty("site.password") : ofNullable(args[0]).filter(s -> !"notset".equalsIgnoreCase(s)).orElse(null); + if (password == null) { + throw new IllegalArgumentException("No site.password system property set"); + } + + + final ISVNAuthenticationManager authenticationManager = SVNWCUtil.createDefaultAuthenticationManager(username, password.toCharArray()); + final SVNClientManager client = SVNClientManager.newInstance(new DefaultSVNOptions(), authenticationManager); + final SVNUpdateClient update = client.getUpdateClient(); + update.setIgnoreExternals(true); + final File copy = new File(".content-site-checkout"); + if (copy.exists()) { + final SvnRevert revert = update.getOperationsFactory().createRevert(); + revert.setPreserveModifiedCopies(false); + revert.setRevertMissingDirectories(true); + revert.setDepth(SVNDepth.INFINITY); + revert.addTarget(SvnTarget.fromFile(copy)); + revert.run(); + + System.out.println("SVN site revision #" + update.doUpdate(copy, SVNRevision.HEAD, SVNDepth.INFINITY, false, true)); + } else { + System.out.println("Doing a site checkout, can be a bit long the first time but it is cached, grab a coffee ;)"); + System.out.println("SVN site revision #" + update.doCheckout( + SVNURL.parseURIEncoded("https://svn.apache.org/repos/asf/tomee/site/trunk/content/"), + copy, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true)); + } + + // synchronize the generated site and the copy + final File[] site = new File("target").listFiles(pathname -> pathname.getName().startsWith("site-") && pathname.isDirectory()); + if (site == null || site.length != 1) { + throw new IllegalArgumentException("Can't find the site: " + asList(site)); + } + FileUtils.copyDirectory(site[0], copy); + + System.out.println(client.getStatusClient().doStatus(copy, false)); + + // now update it remotely + final SVNCommitInfo commitInfo = client.getCommitClient().doCommit(new File[]{copy}, false, + ofNullable(args == null || args.length < 2 ? System.getProperty("site.message") : args[1]) + .orElseGet(() -> "(test) Update of the website on the " + new Date() + " from " + username), + new SVNProperties(), new String[]{""}, false, false, SVNDepth.INFINITY); + if (commitInfo.getErrorMessage() != null) { + throw new IllegalStateException(commitInfo.getErrorMessage().toString()); + } + System.out.println(commitInfo.toString()); + } +}