From 3a90000ed83b0d541366220a9fc37e5abaa4e0ec Mon Sep 17 00:00:00 2001 From: "David A. Harding" Date: Sat, 17 May 2014 01:00:16 -0400 Subject: [PATCH] Add Makefile For Easy Automated Testing Immediately After Building New Makefile lets testers build the static HTML files and then run a few automated tests to catch problems like missing files and links. The Makefile is not required; the site can still be built using just Jekyll. This commit also fixes several image-related errors reported by `make test` by adding the missing PNG images. --- Makefile | 109 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 24 ++++++++++ _config.yml | 1 + img/bubble.png | Bin 0 -> 5637 bytes img/bubbleinfo.png | Bin 0 -> 5428 bytes img/bubblewarn.png | Bin 0 -> 5343 bytes 6 files changed, 134 insertions(+) create mode 100644 Makefile create mode 100644 img/bubble.png create mode 100644 img/bubbleinfo.png create mode 100644 img/bubblewarn.png diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f48c95f8 --- /dev/null +++ b/Makefile @@ -0,0 +1,109 @@ +## Optional Makefile: only used for testing & maintainer automation; +## not used to build live site + +S=@ ## Silent: only print errors by default; + ## run `make S='' [other args]` to print commands as they're run + +## Old versions of jekyll must not call "build". If you have one of +## these versions, either run make like this: make JEKYLL_COMMAND=jekyll +## or create the JEKYLL_COMMAND environmental variable: +# echo 'export JEKYLL_COMMAND=jekyll' >> ~/.bashrc +# exec bash +# make +JEKYLL_COMMAND ?= "bundle exec jekyll build" +SITEDIR=_site +JEKYLL_LOG=._jekyll.log + +####################### +## REGULAR ARGUMENTS ## +####################### + +## `make` (no arguments): just build +default: build + +## `make test`: don't build, but do run all tests +test: pre-build-tests post-build-tests + +## `make valid`: build and run fast tests +valid: pre-build-tests-fast build post-build-tests-fast + +## `make all`: build and run all tests +all: pre-build-tests build post-build-tests + + + +## Pre-build tests which, aggregated together, take less than 5 seconds to run on a typical PC +pre-build-tests-fast: check-for-non-ascii-urls + +## Post-build tests which, aggregated together, take less than 5 seconds to run on a typical PC +post-build-tests-fast: check-for-build-errors ensure-each-svg-has-a-png check-for-liquid-errors \ + check-for-missing-anchors check-for-broken-markdown-reference-links + +## All pre-build tests, including those which might take multiple minutes +pre-build-tests: pre-build-tests-fast + @ true + +## All post-build tests, including those which might take multiple minutes +post-build-tests: post-build-tests-fast + @ true ## SOMEDAY: use linkchecker to find broken links + @ ## after this bug is fixed: https://github.com/wummel/linkchecker/issues/513 + + + + + +################# +## SUB-TARGETS ## +################# +ERROR_ON_OUTPUT="sed '1s/^/ERROR:\n/' | if grep . ; then sed 1iERROR ; false ; else true ; fi" + +## Always build using the default locale so log messages can be grepped. +## This should not affect webpage output. +build: + $S export LANG=C.UTF-8 ; eval $(JEKYLL_COMMAND) 2>&1 | tee $(JEKYLL_LOG) + + +## Jekyll annoyingly returns success even when it emits errors and +## exceptions, so we'll grep its output for error strings +check-for-build-errors: + $S egrep -i '(error|warn|exception)' $(JEKYLL_LOG) \ + | eval $(ERROR_ON_OUTPUT) + + +## Old browser support requires each SVG image also be available as a +## PNG with the same base name +ensure-each-svg-has-a-png: + $S find $(SITEDIR)/img -name '*.svg' | while read file \ + ; do test -f $${file%.svg}.png || echo "$$file missing corresponding PNG" \ + ; done | eval $(ERROR_ON_OUTPUT) + + +## Some Jekyll errors leave error messages in the text +check-for-liquid-errors: + $S grep -r 'Liquid syntax error:' $(SITEDIR)/ | eval $(ERROR_ON_OUTPUT) + + +## Report missing anchors for local links defined in the references file. +# +## Takes less than 1 second here as of 2014-05-16 -harding +check-for-missing-anchors: + $S sed -n 's!^\[[^]]*]: \+!!; s/ .*//; /#/s!^/!!p' _includes/references.md \ + | sort -u \ + | while read link ; do file="$(SITEDIR)/$${link%#*}.html" \ + ; anchor="$${link##*#}" \ + ; egrep -ql '(id|name)=.'$$anchor'[^a-zA-Z0-9_-]' $$file \ + || echo "$$file#$$anchor not found" \ + ; done | eval $(ERROR_ON_OUTPUT) + +check-for-broken-markdown-reference-links: +## Report Markdown reference-style links which weren't converted to HTML +## links in the output, indicating there's no reference definition + $S find $(SITEDIR) -name '*.html' | xargs grep '\]\[' | eval $(ERROR_ON_OUTPUT) + +check-for-non-ascii-urls: +## Always check all translated urls don't contain non-ASCII +## characters or spaces. + $S find _translations -name '*.yml' | while read file \ + ; do grep -H . $$file | sed -n -e '/url:/,$$p' \ + | grep -P '[^\x00-\x7f]|[a-z\-] [a-z\-]' \ + ; done | eval $(ERROR_ON_OUTPUT) diff --git a/README.md b/README.md index ad1d6bf3..c82814bc 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,30 @@ from _site/ to the root of your web server. If you have no web server, run http://127.0.0.1:4000/. This server requires you to add a trailing ".html" by hand in your browser address bar. +#### Building With Make + +After you've installed Jekyll and the other depenencies, you can +optionally use GNU Make to automatically build the site and run several +tests. You will first need to install Make using your package manager; +for example: + + sudo apt-get install make + +Then in your local bitcoin.org repository, run one of the following +commands: + + ## To just build the site, the equivalent of: bundle exec jekyll build + make + + ## After you build the site, you can run all of the tests (may take awhile) + make test + + ## Or you can build the site and run some quick tests with one command: + make valid + + ## Or build the site and run all tests + make all + ## Developer Documentation Each part of the documentation can be found in the [_includes](https://github.com/bitcoin/bitcoin.org/tree/master/_includes) diff --git a/_config.yml b/_config.yml index fe10cd49..4be9af4f 100644 --- a/_config.yml +++ b/_config.yml @@ -132,6 +132,7 @@ plugins: ./_plugins exclude: - Gemfile - Gemfile.lock + - Makefile future: true lsi: false diff --git a/img/bubble.png b/img/bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..481bec3c98f59d8d0e3874b708cf3cb0cfd76c48 GIT binary patch literal 5637 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 literal 0 HcmV?d00001 diff --git a/img/bubbleinfo.png b/img/bubbleinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..d83fb147864a81bd6b723fd30ebb9b6b0b5f232b GIT binary patch literal 5428 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 literal 0 HcmV?d00001