Those tests don't make sense anymore as the Cuirass 1.0 version has removed
the possibility to execute a custom registration procedure.
* gnu/tests/cuirass.scm: Remove it.
* gnu/local.mk (GNU_SYSTEM_MODULES): Ditto.
* gnu/packages/linux.scm (efibootmgr): Update to 17.
[source]: Use GIT-FETCH and GIT-FILE-NAME.
Add a patch to build against efivar@37.
* gnu/packages/patches/efibootmgr-remove-extra-decl.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/patches/busybox-CVE-2021-28831.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/busybox.scm (busybox): Apply it.
* gnu/packages/patches/ungoogled-chromium-system-opus.patch: New file.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
* gnu/packages/chromium.scm (%preserved-third-party-files): Adjust for 89.
(%chromium-version): Remove variable.
(%ungoogled-revision): Set to 89.0.4389.90-1.
(%ungoogled-origin): Conditionally set file name based on commit/tag.
(%guix-patches): Add the new file.
(libvpx/chromium): Update to 1.9.0-104-gb5d77a48d.
(ungoogled-chromium)[version]: Use %UNGOOGLED-REVISION.
[source]: Update hash.
[arguments]: Adjust #:configure-flags for build system changes. Don't build
with external WebRTC SSL library. Remove obsolete substitution.
[inputs]: Remove OPENSSL. Change from PIPEWIRE to PIPEWIRE-0.3.
* gnu/packages/patches/mpg321-CVE-2019-14247.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/mp3.scm (mpg321)[source]: Apply it.
Signed-off-by: Léo Le Bouter <lle-bout@zaclys.net>
Signed-off-by: Leo Famulari <leo@famulari.name>
This is a followup to commit 31d289a475,
which added, but did not use, "unzip-symlink.patch", which is
redundant with the pre-existing "unzip-initialize-symlink-flag.patch".
* gnu/packages/patches/unzip-symlink.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove it.
* gnu/packages/patches/gdk-pixbuf-CVE-2020-29385.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/gtk.scm (gdk-pixbuf)[replacement]: New field.
(gdk-pixbuf/fixed): New variable.
(gdk-pixbuf+svg): Use package/inherit.
* gnu/packages/patches/glib-CVE-2021-28153.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/glib.scm (glib/fixed): Add the new patch.
* gnu/packages/patches/geary-CVE-2020-24661.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/gnome.scm (geary): Apply it.
* gnu/packages/patches/evolution-CVE-2020-11879.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/gnome.scm (evolution): Apply it.
Unmaintained upstream and its only dependent (python-gssapi) dropped it.
* gnu/packages/patches/python-shouldbe-0.1.2-cpy3.8.patch: Remove.
* gnu/local.mk: Drop patch file.
* gnu/packages/python-xyz.scm (python-shouldbe): Remove.
* gnu/packages/patches/bsdiff-CVE-2014-9862.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/compression.scm (bsdiff): Apply it.
* gnu/packages/patches/cgal-security-pr-5371.patch: New patch. Downloaded from
<https://patch-diff.githubusercontent.com/raw/CGAL/cgal/pull/5371.patch>, with
hunks on files matching pattern "*Convex_decomposition_3*" removed because
they don't exist in cgal's released sources.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/graphics.scm (cgal): Update to 5.2.
[source]: Apply patch.
* gnu/packages/patches/python-2.7-CVE-2021-3177.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/python.scm (python-2.7)[replacement]: New field.
(python-2.7/fixed): New variable.
TALOS-2020-1222 has yet to be disclosed and has no known CVE number.
TALOS-2020-1223 has CVE-2020-28599 assigned.
* gnu/packages/engineering.scm (openscad): Update to 2021.01.
[patches]: Remove. Boost 1.72 is supported now upstream.
[arguments]: In replacement 'check phase, disable some tests requiring
experimental "lazy-union" feature. Also disable PDF-related tests requiring
ghostscript and failing either way.
* gnu/local.mk (dist_patch_DATA): Remove patch.
* gnu/packages/patches/openscad-parser-boost-1.72.patch: Ditto.
* gnu/packages/patches/qemu-CVE-2021-20203.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/virtualization.scm (qemu): Apply it.
* gnu/packages/patches/http-parser-fix-assertion-on-armhf.patch: Remove it.
* gnu/local.mk (dist_patch_DATA): Update it.
* gnu/packages/web.scm (http-parser)[source]: Remove a test assertion failing
on i686-linux.
[arguments]: Remove the "assertion.patch" that is merged upstream.
[native-inputs]: Ditto.
[synopsis]: Wrap it.
* gnu/packages/patches/python-3.8-CVE-2021-3177.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/python.scm (python-3.8)[replacement]: New field.
(python-3.8/fixed): New variable.
* gnu/packages/patches/python-3.9-CVE-2021-3177.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/python.scm (python-3.9)[source]: Use it.
* gnu/packages/diffoscope.scm (diffoscope): Update to 166.
[source]: Add patch to use magic.open compatibility interface.
* gnu/packages/patches/diffoscope-revert-to-magic-open.patch: New file.
* gnu/local.mk [dist_patch_DATA]: New patch.
By only testing the final Rust in the bootstrap chain, the total build time is
reduced by approximately 30%, from about 11 hours to 8 hours on a fast
machine. Combined with commit df93fc21a4, the total Rust bootstrap chain
build time should have been halved.
* gnu/packages/patches/rust-1.25-accept-more-detailed-gdb-lines.patch:
Delete file.
* gnu/local.mk (dist_patch_DATA): De-register it.
* gnu/packages/rust.scm (rust-1.29): Do not apply the above patch.
(rust-1.30): Remove the "doc" output. Disable tests.
[phases]{set-env}: Do not set CFG_DISABLE_CROSS_TESTS.
{relax-gdb-auto-load-safe-path, patch-tests, patch-cargo-index-update}
{patch-aarch64-test, remove-unsupported-tests, disable-amd64-avx-test}
{patch-cargo-tests, patch-cargo-env-shebang}
{ignore-cargo-package-tests}: Remove phases.
{configure}: Remove the doc and gdb bindings and their respective
configuration entries in the generated config.toml file.
{check}: Remove phase.
[native-inputs]{bison, flex, gdb, procps}: Remove inputs.
{python-2}: Replace by python-wrapper.
{rust-1.29}: Do not export variable.
{rust-1.30}: Likewise.
(rust-1.31): Likewise.
[arguments]: Remove field.
(rust-1.32): Do not export variable.
[source]: Remove patch.
[phases]{override-jemalloc}: Order following 'configure.
{remove-flaky-test, patch-aarch64-test}: Remove deletions.
(rust-1.33): Do not export variable.
[arguments]: Remove field.
(rust-1.34): Do not export variable.
(rust-1.35): Likewise.
(rust-1.36): Likewise.
[arguments]: Remove field.
(rust-1.37): Do not export variable.
(rust-1.38): Do not export variable.
[arguments]: Likewise.
(rust-1.39): Do not export variable.
(rust-1.40): Do not export variable.
[phases]: Do not alter the #:phases argument.
(rust-1.41, rust-1.42, rust-1.43): Do not export variables.
(rust-1.44): Likewise.
[arguments]: Remove field.
(rust-1.45): Do not export variable.
[phases]{skip-shebang-tests, skip-networking-test}: Remove phases.
(rust-1.46): Do not export variable.
(rust-1.47): Do not export variable.
[arguments]: Remove field.
(rust-1.48): Do not export variable.
[arguments]: Remove field.
(rust-1.49): Rename to...
(rust): ... this.
[outputs]: Add a "doc" output.
[phases]{enable-docs, add-gdb-to-config}
{relax-gdb-auto-load-safe-path, patch-cargo-env-shebang}
{disable-tests-requiring-git, disable-interrupt-tests}
{patch-command-exec-tests, patch-command-uid-gid-test}
{skip-shebang-tests, patch-process-tests}: New phases.
[native-inputs]{gdb-9.2, procps}: New inputs.
* gnu/packages/pdf.scm (qpdfview)[source]: Add patch to include a missing
header.
* gnu/packages/patches/qpdfview-qt515-compat.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: Leo Famulari <leo@famulari.name>
This reduced bootstrap reduces the complete Rust bootstrap chain build time by
approximately 30% compared to the original (about 11 hours instead of 16
hours, on a fast machine).
* gnu/packages/patches/rust-1.45-linker-locale.patch: Delete file.
* gnu/packages/patches/rust-1.48-linker-locale.patch: Likewise.
* gnu/local.mk (dist_patch_DATA): De-register deleted files.
* gnu/packages/rust.scm (%mrustc-source): New variable.
(rust-1.29): New variable. It is bootstrapped from mrust 0.9, which is used
in source form.
(rust-1.30): New variable.
(rust-1.31)[phases]{patch-command-exec-tests-phase}: Rewrite so that it
doesn't need to be redefined later when the file is moved.
{enable-docs}: New phase.
(rust-1.32): Disable tests.
[inputs]: Remove field.
[phases]{override-jemalloc}: Reorder after the configure phase.
(rust-1.33): Enable tests.
[phases]{disable-codegen-tests}: New phase.
(rust-1.34)[phases]{disable-codegen-tests}: Delete phase.
(rust-1.35)[arguments]: Remove field. The disable-tidy-bins-check phase is
now defined in rust-1.30.
(rust-1.38)[phases]{patch-command-exec-tests-phase}: Remove.
{patch-command-uid-gid-test}: Do not worry about the Tidy lint test, which is disabled.
(rust-1.40)[phases]: Move #:validate-runpath? inside the use of
'substitute-keyword-arguments'.
{neuter-tidy}: Delete.
{patch-command-uid-gid-test}: Make the regexp more precise. Remove the TODO
comment, which has been addressed.
(rust-1.44)[inputs]: Replace python2 by python-wrapper.
[phases]{use-python3}: New phase.
(rust-1.45)[source]: Remove field. The linker locale fix is now made via ...
[phases]{set-linker-locale-to-utf8}: ... this phase.
(rust-1.46)[phases]{build, check}: Allow parallel execution. Add comments.
{delete-install-logs}: Delete phase; it's now done in rust-1.30.
(rust-1.47)[phases]{patch-cargo-checksums}: Do not reorder phase. The
initial ordering of the phase has been fixed with in the rust-1.30 package.
(rust-1.48)[source]: Remove field.
This commit is not atomic and is not functional by itself; this is done so to
make the next set of changes more comprehensible.
* gnu/packages/patches/rust-1.19-mrustc.patch: Delete file.
* gnu/packages/patches/rust-1.30-gdb-llvm.patch: Likewise.
* gnu/packages/patches/rust-bootstrap-stage0-test.patch: Likewise.
* gnu/local.mk (dist_patch_DATA): Un-register files.
* gnu/packages/rust.scm (mrustc): Delete variable.
(rust-1.19, rust-1.20, rust-1.21 rust-1.22, rust-1.23, rust-1.24)
(rust-1.25, rust-1.26, rust-1.27, rust-1.28, rust-1.29)
(rust-1.30): Delete variables.
(rust-1.31 through rust-1.49): Fix indentation and do other cosmetic changes.
(rust): Define as rust-1.49.
* gnu/packages/patches/guile-ssh-fix-test-suite.patch: New file.
* gnu/local.mk: Register it.
* gnu/packages/ssh.scm (guile-ssh)[source]: Use it. Also provide a better
file name than 'git-checkout'.
* gnu/packages/music.scm (python-mediafile): New variable.
* gnu/packages/patches/python-mediafile-wavpack.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/video.scm (obs): Use it.
* gnu/packages/patches/obs-modules-location.patch: Patch it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
* gnu/packages/telegram.scm: New module.
(webrtc-for-telegram-desktop): New variable.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
Signed-off-by: Leo Prikler <leo.prikler@student.tugraz.at>
* gnu/packages/cpp.scm (c++-gsl): New variable.
* gnu/packages/patches/c++-gsl-find-system-gtest.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: Leo Prikler <leo.prikler@student.tugraz.at>
* gnu/packages/patches/gst-plugins-good-fix-test.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/gstreamer.scm (gst-plugins-good)[source]: Use it.
This package fails to build and has been superseded by avogadro2.
* gnu/packages/chemistry.scm (avogadro): Remove variable.
* gnu/packages/patches/avogadro-boost148.patch,
gnu/packages/patches/avogadro-eigen3-update.patch,
gnu/packages/patches/avogadro-python-eigen-lib.patch: Delete files.
* gnu/local.mk (dist_patch_DATA): Remove them.
* gnu/packages/python-xyz.scm (python-pep517): Inherit from
python-pep517-bootstrap. Remove the inherited common fields.
(python-poetry-core, python-wheel)
(python-toml): Move to ...
* gnu/packages/python-build.scm: ... here, a new module.
(python-pep517-bootstrap): New package.
* gnu/local.mk (GNU_SYSTEM_MODULES): Register the new module.
* gnu/packages/patches/boost-fix-transitive-linking.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/boost.scm (boost)[source]: Use it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
* gnu/packages/patches/idris-disable-test.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/idris.scm (idris): Update to 1.3.3.
[source]: Use the patch.
[native-inputs]: Add ghc-cheapskate.
[arguments]: Adjust cheapskate version bounds. Make auxiliary test script
executable.
* gnu/packages/python-xyz.scm (python-pep517): Inherit from
python-pep517-bootstrap. Remove the inherited common fields.
(python-poetry-core, python-wheel)
(python-toml): Move to ...
* gnu/packages/python-build.scm: ... here, a new module.
(python-pep517-bootstrap): New package.
* gnu/local.mk (GNU_SYSTEM_MODULES): Register the new module.
* gnu/packages/python.scm (python-3.8): Rename to...
(python-3.9): ... this. Update version to 3.9.1.
[arguments]{make-flags}: Restore test_socket test.
[phases]{unset-SOURCE_DATE_EPOCH, reset-SOURCE_DATE_EPOCH}: Remove phases.
{rebuild-bytecode}: Simplify code. Set the invalidation-mode argument of the
compileall module to "unchecked-hash", to ensure determinism.
(python-3): Adjust to refer to python-3.9.
* gnu/packages/patches/python-3-fix-tests.patch: Rebase and extend patch.
* gnu/packages/patches/python-3.8-fix-tests.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): De-register it.
The stack overflow test limits the virtual memory size using setrlimit with
RLIMIT_AS argument. This is ignored when using QEMU transparent emulation,
causing the test to crash.
* gnu/packages/patches/guile-2.2-skip-so-test.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/guile.scm (guile-3.0-latest): Add it.
The stack overflow test limits the virtual memory size using setrlimit with
RLIMIT_AS argument. This is ignored when using QEMU transparent emulation,
causing the test to crash.
* gnu/packages/patches/guile-2.2-skip-so-test.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register it.
* gnu/packages/guile.scm (guile-2.2): Add it.
* gnu/local.mk (dist_patch_DATA): Add Smalltalk patch.
* gnu/packages/patches/smalltalk-multiplication-overflow.patch: Patch
from upstream commit 72ada189aba0283c551ead16635c1983968080b8.
* gnu/packages/smalltalk.scm (smalltalk): Use patch and link with gmp
and lightning libraries instead of the included source.
* gnu/packages/patches/shakespeare-spl-fix-grammar.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it here.
* gnu/packages/esolangs.scm (shakespeare-spl): New variable.
Fixes <https://bugs.gnu.org/45252>.
* gnu/packages/patches/libffi-float128-powerpc64le.patch: Import patch file
from <https://github.com/libffi/libffi/pull/561.patch>.
* gnu/packages/libffi.scm (libffi)[arguments]: Apply patch conditionally for
powerpc64le-* systems in a phase.
[inputs]: Add patch as input conditionally for powerpc64le-* systems.
* gnu/local.mk (dist_patch_DATA): Add patch file to build system.
Signed-off-by: Chris Marusich <cmmarusich@gmail.com>
* gnu/packages/crates-io.scm (rust-ndarray-0.12): New variable.
* gnu/packages/patches/rust-ndarray-remove-blas-src-dep.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/patches/pciutils-hurd-fix.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/pciutils.scm (pciutils)[arguments]: Add
'apply-hurd-patch' phase when (hurd-target?) is true.
[inputs]: Add "hurd-patch" entry when (hurd-target?) is true.
This fixes a build failure from 79b31767d0.
* gnu/packages/patches/ghostscript-freetype-compat.patch: New file.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
* gnu/packages/ghostscript.scm (ghostscript)[source](patches): Add it.
* gnu/packages/dns.scm (knot-resolver): Update to 5.2.0.
[source]: Add patch from upstream commit to fix the internal map() function on
32-bit platforms.
[native-inputs]: Add texinfo to enable generating the manual in Info format.
[inputs]: Add nghttp2:lib to enable the new DNS-over-HTTPS implementation.
* gnu/packages/patches/knot-resolver-fix-map-command-on-32-bit.patch: New
file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: 宋文武 <iyzsong@member.fsf.org>
* gnu/packages/patches/cl-asdf-config-directories.patch: New file.
* gnu/local.mk (dist_PATCH_DATA): Add it.
* gnu/packages/lisp.scm (cl-asdf)[native-inputs]: Add it.
[arguments]: Apply the new patch.
Co-authored-by: Pierre Neidhardt <mail@ambrevar.xyz>
* gnu/packages/patches/glibc-dl-cache.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/base.scm (glibc)[source]: Remove 'snippet' and 'modules'.
[arguments]: In 'pre-configure' phase, substitute @STORE_DIRECTORY@ in
'elf/dl-cache.c'.
* gnu/packages/lisp-xyz.scm (cl-clml, sbcl-clml): New variables.
* gnu/packages/patches/sbcl-clml-fix-types.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/python-xyz.scm (python-cairocffi): Update to 1.2.0.
[source]: Fetch from Git.
[patches]: Remove field.
[inputs]: Remove pango.
[native-inputs]: Remove pkg-config and python-docutils. Add python-numpy and
python-sphinx-rtd-theme.
[phases]{patch-paths}: Adjust. Fix the patching of gdk-3.
{disable-linters}: New phase.
{install-doc}: Adjust. The license file is now installed by a build phase.
* gnu/packages/patches/python-cairocffi-dlopen-path.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): De-register it.
* gnu/packages/animation.scm (gnash): New variable.
* gnu/packages/patches/gnash-fix-giflib-version: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: Christopher Baines <mail@cbaines.net>
* gnu/packages/bittorrent.scm (transmission)[source]: Add patch to make
Transmission honor the "localedir" option to its configure script.
[arguments]<configure-flags>: Use "localedir" to set the "gui" output as the
location for (GTK-specific) localization data.
<phases>: Update "move-gui" to remove a now-superfluous call to "mkdir" and omit
"share/locale" from the list of directories needing to be moved between outputs.
* gnu/packages/patches/transmission-honor-localedir.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: Leo Famulari <leo@famulari.name>
* gnu/packages/patches/python-aiohttp-3.6.2-no-warning-fail.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
* gnu/packages/python-web.scm (python-aiohttp)[source](patches): Remove.
[arguments]: Use UTIME instead of calling out to 'touch'. Don't delete
now-working tests; but disable some new ones. Replace the 'check' phase.
[propagated-inputs]: Add PYTHON-TYPING-EXTENSIONS.
[native-inputs]: Remove PYTHON-PYTEST-RUNNER, PYTHON-PYTEST-XDIST,
PYTHON-PYTEST-TIMEOUT, and PYTHON-PYTEST-FORKED. Add PYTHON-PYTEST and
PYTHON-RE-ASSERT.
* gnu/packages/patches/openssh-fix-ssh-copy-id.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/ssh.scm (openssh)[source]: Use it.
Signed-off-by: Leo Famulari <leo@famulari.name>
* gnu/packages/pdf.scm (mupdf)[source]: Add patch.
[arguments]: Build and find the shared library.
(zathura-pdf-mupdf)[arguments]: Add a 'remove-libmupdfthird.a-requirement
phase to deal with the now-missing static one.
* gnu/packages/patches/mupdf-fix-linkage.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
This fixes the build of nanopolish, imp, and others.
Reported by apteryx in #guix.
* gnu/packages/algebra.scm (eigen)[source]: Add patch.
* gnu/packages/patches/eigen-remove-openmp-error-counting.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/lsof.scm (lsof)[source]: Add patch to make test suite
failures stop the build.
* gnu/packages/patches/lsof-fatal-test-failures.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
This allows Gajim to find plug-ins installed with Guix.
Reported at <http://issues.guix.gnu.org/44730>.
However, at the time of pushing both packaged plug-ins (gajim-omemo and
gajim-openpgp) require an unstable version of Gajim and will not load.
* gnu/packages/messaging.scm (gajim)[arguments]: Replace the
‘add-plugin-dirs’ substitution phase with a...
[source]: ...patch that won't silently break in the future.
* gnu/packages/patches/gajim-honour-GAJIM_PLUGIN_PATH.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/finance.scm (bitcoin-core): Update to 0.20.1.
[source]: Remove obsolete patch.
[native-inputs]: Add autoconf, automake and libtool.
[inputs]: Remove protobuf.
[arguments]: Add "set-no-git-flag" phase to indicate the build is not taking
place within a git repository.
* gnu/packages/patches/bitcoin-core-python-compat.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove it.
Signed-off-by: Christopher Baines <mail@cbaines.net>