From d8833097795e331068747e49181ee7727744f7c1 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Thu, 27 Oct 2016 16:45:22 -0400 Subject: [PATCH] Add logic to automatially update CDN. --- .travis.yml | 11 ++++++ .travis/generate_index.py | 71 ++++++++++++++++++++++++++++++++++++++ .travis/publish-release.sh | 51 +++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100755 .travis/generate_index.py create mode 100755 .travis/publish-release.sh diff --git a/.travis.yml b/.travis.yml index 4813b8a8f..74e51028b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,14 @@ language: java branches: only: - master + - travis - "/^release.*/" env: global: - CLASSPATH=/usr/share/java/xalan-j2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xml-resolver.jar:$(pwd)/.travis - secure: "CyGQbyoAoFmAst01IZtu3aGGVCTRN/oo8aMZJPwnDRi9F3q/ptueFKYoQEWWEzDYzPMPAtvbDVDx5lhfyZxlm6HwyvU8Frdt+3RTkn287EiDk0fnUhZGSasLaWwZ5SxGuRq/yonc/oLfktK1e6Z9ZUAD9q0GnWncI6ZiLeJussWpRIz5W88Jaz2VJKGdiiHZbQDmCE6b5Oe9Ucu8gYAnmHbz0QbxacPm58+D7rrWVwF9haH0oDlwlMCfM1lI0/GNJVMAREGYLFJBVsieSuDunYz9kZg3ewr0wKud4spy9qUMAGt5yEAn9I+vQYqTgzWpbLAP8cOgSxsVJWbBN8JXUuoQRh1Pu78J0phDII8YouYB98o1JdkQeytrUXJmzfdRtmw/iKKp4qAKHK7v6R0KkcpDhjeiVVWrptc4vXbkpm16EFgv3/d+Gs++M5s6fag60mlth9u6IwZ/tSJbafvUqvPn977YJbua40SSzwwF9/8GP0GGDTp7SoO7oKaIVN9Gv9qMANOYIqOGA/KCyzQ3oLuhD14P5Hy2Gdfa8S4o9UZI43QWURljWniN9ycyZb53px/4WZc2adAcxcB+V64M3UHkLGU+MH7mJWJtLE1v/32fBYaBGEkTch2Ghj/oKV89+rav40ssKyol6IYjKN7uVXh3R3t4kT8jJPbDmUBhFoo=" + - secure: "pJBf2nm1HXQAqJTZ7+CdXAjBmppD2eOw4AlvSpkHDgUilKUBYfjSy1R5TY/CQ+TmlDOV6wX5FMVEj8XV0Kn7w5gQ+7n7J+dyDr6Cg51oYIhmHW+z+5+rc1yhikDdkQxZbQ2ervR0WaF35oZTsVnC7qw4UvAz/fHbmLBbWjjfyOhOlo7yXz+HMNt53CclZjn8BrU+O7EsQZAgY4t50iQy4D1v92hev1XKcV57ITGWvla28VZR8BBK2iMvuW+OM0DzPNJsyybwrVHOwZ0XVuDq0NNexMc6n85ISuIVhEzr2OeL5tnmpH9hECMzuVvBbNE2f7xnDJkl1XADIhEzgsljKbnNLmrP8o5Lalpi6mCB2WIPX2PRt9k2d6nj3Kx7vPNcF55f822/DfGO62LNGHressDEXAUhuyyzAHvxfp8ExxHEyj5eN3as8GY3F/fGNwGpDOfy9/yKetBVWdijdmWsqKCLIYze9JaliI3mJfUu6VzFVWalGApgVNPVUPtJaWB1qay3aDNpH2LqPu82sefD0StnjJgroKHqHBBT0MNlML2xR+HLVsU3krSZcPLFn3eWsz/Zc6Rl1ZlcarKiMAPKdUS7jVJSO/G8rfH6Y5h5jP31aV3i/0WTLoBxru69Eh4hs1QPvg1j9ZBGSKjWenP9wwxKKhY5OT6wL8tr/5e2WSw=" install: - sudo apt-get update -q @@ -25,6 +27,15 @@ script: - make check - make dist +after_success: +# Update CDN +- | + if [ "$TRAVIS_REPO_SLUG" = "docbook/xslt10-stylesheets" -a \ + "$TRAVIS_PULL_REQUEST" = "false" ]; then + export GH_TOKEN + .travis/publish-release.sh + fi + before_deploy: - git config --global user.email "builds@travis-ci.com" - git config --global user.name "Travis CI" diff --git a/.travis/generate_index.py b/.travis/generate_index.py new file mode 100755 index 000000000..a82d98fc2 --- /dev/null +++ b/.travis/generate_index.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# +# github pages allow directories to be navigated only if +# they contain an index.html file. +# This script traverses a directory tree starting at 'root', +# generating 'index.html' files with file (and directory) listings, +# unless the given directory already contains an 'index.html' file. + +import os +from os.path import * +import sys +import datetime + +if len(sys.argv) != 2: + print('Usage: {} '.format(sys.argv[0])) + sys.exit(-1) + +# start the traversal here... +root = abspath(sys.argv[1]) +# ...but print direcory names based on one level up (to include 'xsl/' etc.) +base = dirname(root) + +def make_index(dir, dirs, files): + filename = join(dir, 'index.html') + if exists(filename): + return + with open(filename, 'w') as output: + output.write(""" +Index of %s + + +

{}

+""".format(relpath(dir, base))) + output.write(''.format("Name", "Size", "Last Modified")) + output.write('') + for d in dirs: + s = os.stat(join(dir, d)) + format = '' + output.write(format.format(d, d, datetime.datetime.fromtimestamp(int(s.st_mtime)))) + for f in files: + s = os.stat(join(dir, f)) + if s.st_size > 1073741824: + size = '{} GB'.format(s.st_size / 1073741824) + elif s.st_size > 1048576: + size = '{} MB'.format(s.st_size / 1048576) + elif s.st_size > 1024: + size = '{} KB'.format(s.st_size / 1024) + else: + size = '{}   '.format(s.st_size) + format = '' + output.write(format.format(f, f, size, datetime.datetime.fromtimestamp(int(s.st_mtime)))) + output.write("""
{}{}{}
../
{}/{}
{}{}{}
+ +""") + +def process(dir): + all = os.listdir(dir) + dirs = sorted([d for d in all if isdir(join(dir, d))]) + files = sorted([f for f in all if isfile(join(dir, f)) if f != 'index.html']) + make_index(dir, dirs, files) + # recurse into subdirectory, skipping links (such as 'current') + for d in dirs: + if not islink(join(dir, d)): + process(join(dir, d)) + +process(root) diff --git a/.travis/publish-release.sh b/.travis/publish-release.sh new file mode 100755 index 000000000..1fc966a5e --- /dev/null +++ b/.travis/publish-release.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -e # Exit with nonzero exit code if anything fails +here=$(dirname "${BASH_SOURCE[0]}") +# Only commits to master should trigger deployment +# (add 'travis' for testing purposes.) +if [ "$TRAVIS_PULL_REQUEST" != "false" ] || \ + [ "$TRAVIS_BRANCH" != master -a \ + "$TRAVIS_BRANCH" != travis ]; then + echo "Skipping deployment" + exit 0 +fi + +# Remember the SHA of the current build. +SHA=$(git rev-parse --verify HEAD) + +# Clone the minimum of the CDN repo needed. +CDN_REPO="https://$GH_TOKEN@github.com/docbook/cdn.git" +git clone $CDN_REPO cdn --depth=1 -q +# Clean out existing content... +rm -rf cdn/release/xsl/snapshot +rm -rf cdn/release/xsl-nons/snapshot +# ...and copy the new one. +mkdir -p cdn/release/xsl +mkdir -p cdn/release/xsl-nons +cp -a dist/docbook-xsl-snapshot cdn/release/xsl/snapshot +cp -a dist/docbook-xsl-nons-snapshot cdn/release/xsl-nons/snapshot +# We could normally make "current" symbolic links to "snapshot" +# but github's policy doesn't allow to publish symbolic links in pages. +rm -rf cdn/release/xsl/current +rm -rf cdn/release/xsl-nons/current +cp -a cdn/release/xsl/snapshot cdn/release/xsl/current +cp -a cdn/release/xsl-nons/snapshot cdn/release/xsl-nons/current + +# If there are no changes, bail out. +# (Note that this doesn't detect additions.) +#if (cd cdn && git diff --quiet); then +# echo "No changes to the output on this push; exiting." +# exit 0 +#fi + +$here/generate_index.py cdn/release/xsl +$here/generate_index.py cdn/release/xsl-nons + +# Now prepare to commit and push to the CDN +cd cdn +git config user.name "Travis CI" +git config user.email "travis-ci" + +git add . +git commit -m "Deploy XSL Stylesheets to GitHub Pages: ${SHA}" +git push -q origin HEAD -- 2.40.0