diff --git a/.gitignore b/.gitignore index ea9b3fd..9d27ba7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,13 @@ # project _site .jekyll-cache .sass-cache +.user-doc-cache .vagrant # general .DS_Store Thumbs.db ehthumbs.db _data/blog-feed.json diff --git a/Makefile b/Makefile index 8f13595..3bdf34d 100644 --- a/Makefile +++ b/Makefile @@ -1,20 +1,24 @@ # Please note, this is a standard make file. The rakefile is included for # temporary purposes as it is currently used to generate translations. The # goal of this makefile is to avoid needing to install a ruby toolchain for # casual contributors. PORT ?= 8080 TAG = bitcoin-abc-org default: container .PHONY: container container: docker build -t $(TAG) . .PHONY: run run: container docker run -it -p $(PORT):80 $(TAG) serve: _config.yml bundler exec jekyll serve + +.PHONY: doc +doc: + ./scripts/fetch_documentation.sh diff --git a/Rakefile b/Rakefile index 0b8c138..487d33d 100644 --- a/Rakefile +++ b/Rakefile @@ -1,24 +1,29 @@ require 'bundler' Bundler.setup namespace :jekyll do - desc "serve jekyll site locally" - task :serve do - sh "bundle exec jekyll serve" - end - - desc "serve jekyll site locally" - task :build do - sh "bundle exec jekyll build" - end + desc "serve jekyll site locally" + task :serve do + sh "bundle exec jekyll serve" + end + + desc "build jekyll site" + task :build do + sh "bundle exec jekyll build" + end + + desc "populate the user documentation" + task :doc do + sh "scripts/fetch_documentation.sh" + end end namespace :docker do desc "build docker images" task :build => [:'jekyll:build'] do puts "Building bitcoincash docker image" sh "docker build -t bitcoinabcorg ." end end task :default => 'serve' diff --git a/scripts/fetch_documentation.sh b/scripts/fetch_documentation.sh new file mode 100755 index 0000000..466f9c0 --- /dev/null +++ b/scripts/fetch_documentation.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +# Github repository parameters +GITHUB_OWNER='Bitcoin-ABC' +GITHUB_REPO='bitcoin-abc' + +# Max number of release versions to display +MAX_RELEASES=15 + +# Min version for rpc docs generation +MIN_VERSION_RPC_DOCS='0.22.1' + +# Min version for man pages generation +MIN_VERSION_MAN_PAGES='0.22.1' + + +SCRIPT_DIR=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd) +TOPLEVEL=$(git -C "${SCRIPT_DIR}" rev-parse --show-toplevel) + +# Get the last MAX_RELEASES releases +RELEASES=$(curl -L -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases?per_page=${MAX_RELEASES}) + +# Extract releases version number +RELEASE_VERSIONS=($(echo ${RELEASES} | jq -r .[].name)) + +# Extract releases version number +RELEASE_TAGS=($(echo ${RELEASES} | jq -r .[].tag_name)) + +# Create the cache directory as needed. This is where the sources will be +# cloned, and where the docs will be built. +: "${CACHE_DIR:=${TOPLEVEL}/.user-doc-cache}" +mkdir -p "${CACHE_DIR}" + +SRC_DIR="${CACHE_DIR}/${GITHUB_REPO}" +if [ ! -d "${SRC_DIR}" ] +then + git clone "https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}.git" "${SRC_DIR}" +fi + +pushd "${SRC_DIR}" +git pull --tags origin master +popd + +version_greater_equal() +{ + printf '%s\n%s\n' "$2" "$1" | sort -V -C +} + +for i in "${!RELEASE_VERSIONS[@]}" +do + VERSION="${RELEASE_VERSIONS[$i]}" + TAG="${RELEASE_TAGS[$i]}" + + if version_greater_equal "${VERSION}" "${MIN_VERSION_RPC_DOCS}" + then + BUILD_RPC_DOCS="yes" + else + BUILD_RPC_DOCS="no" + fi + + if version_greater_equal "${VERSION}" "${MIN_VERSION_MAN_PAGES}" + then + BUILD_MAN_PAGES="yes" + else + BUILD_MAN_PAGES="no" + fi + + if [ "${BUILD_RPC_DOCS}" = "no" ] && [ "${BUILD_MAN_PAGES}" = "no" ] + then + continue + fi + + # Checkout the release tag + pushd "${SRC_DIR}" + git checkout "tags/${TAG}" + popd + + # Prepare some directories + WEBSITE_DIR="${TOPLEVEL}/_doc/${VERSION}" + mkdir -p "${WEBSITE_DIR}" + + VERSION_DIR="${CACHE_DIR}/${VERSION}" + mkdir -p "${VERSION_DIR}" + + BUILD_DIR="${SRC_DIR}/build_${VERSION}" + mkdir -p "${BUILD_DIR}" + + INSTALL_DIR="${BUILD_DIR}/install" + mkdir -p "${INSTALL_DIR}" + + pushd "${BUILD_DIR}" + + if [ "${BUILD_RPC_DOCS}" = "yes" ] && [ ! -d "${VERSION_DIR}/rpc" ] + then + # Build and install the release version + cmake -GNinja "${SRC_DIR}" -DCLIENT_VERSION_IS_RELEASE=ON -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" + ninja install/strip + + BITCOIND_PID_FILE="${VERSION_DIR}/bitcoind_${VERSION}.pid" + "${INSTALL_DIR}"/bin/bitcoind -regtest -daemon -pid="${BITCOIND_PID_FILE}" + + PID_WAIT_COUNT=0 + while [ ! -e "${BITCOIND_PID_FILE}" ] + do + ((PID_WAIT_COUNT+=1)) + if [ "${PID_WAIT_COUNT}" -gt 10 ] + then + echo "Timed out waiting for bitcoind PID file" + exit 1 + fi + sleep 0.5 + done + BITCOIND_PID=$(cat "${BITCOIND_PID_FILE}") + + ninja doc-rpc + + kill "${BITCOIND_PID}" + + # Cache the result + cp -R "${BUILD_DIR}/doc/rpc/en/${VERSION}/rpc" "${VERSION_DIR}/" + fi + + if [ "${BUILD_MAN_PAGES}" = "yes" ] && [ ! -d "${VERSION_DIR}/man" ] + then + # Build and install the man pages + cmake -GNinja "${SRC_DIR}" -DCLIENT_VERSION_IS_RELEASE=ON -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" + ninja install-manpages-html + mkdir -p "${VERSION_DIR}/man" + # Cache the result + cp "${INSTALL_DIR}"/share/man/html/* "${VERSION_DIR}/man/" + fi + + popd + + # Copy everything from the cache to the website directory + cp -R "${VERSION_DIR}"/* "${WEBSITE_DIR}/" + +done +