diff options
author | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-07-31 14:16:12 +0000 |
---|---|---|
committer | Lars Wirzenius <lars.wirzenius@codethink.co.uk> | 2013-07-31 14:16:12 +0000 |
commit | d15bbb2544d52ed53c344fa29c25e6928da3c55b (patch) | |
tree | f4430c41706495bb794a1e417e745bbac7e3fefc /yarns/morph.shell-lib | |
parent | 2943883c8ec298a73b43f0c3eb352003f53a9786 (diff) | |
parent | 8b1c848df48f3f10c3af0506f1552e4fda36f21d (diff) | |
download | morph-d15bbb2544d52ed53c344fa29c25e6928da3c55b.tar.gz |
Merge branch 'liw/b-and-m-yarns'
Briefly reviewed by Jonathan Maw and Tiago Gomes, but all responsibility
is mine.
Diffstat (limited to 'yarns/morph.shell-lib')
-rw-r--r-- | yarns/morph.shell-lib | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/yarns/morph.shell-lib b/yarns/morph.shell-lib new file mode 100644 index 00000000..4fb1eb10 --- /dev/null +++ b/yarns/morph.shell-lib @@ -0,0 +1,153 @@ +# Shell library for Morph yarns. +# +# The shell functions in this library are meant to make writing IMPLEMENTS +# sections for yarn scenario tests easier. + +# Copyright (C) 2013 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +# Run Morph from the source tree, ignoring any configuration files. +# This way the test suite is not affected by any configuration the user +# or system may have. Instead, we'll use the `$DATADIR/morph.conf` file, +# which tests can create, if they want to. Unfortunately, currently yarn +# does not set a $SRCDIR that points at the source tree, so if the test +# needs to cd away from there, things can break. We work around this +# by allowing the caller to set $SRCDIR if they want to, and if it isn't +# set, we default to . (current working directory). + +run_morph() +{ + "${SRCDIR:-.}"/morph \ + --no-default-config --config "$DATADIR/morph.conf" "$@" +} + + +# Sometimes we want to try running morph, but are OK if it fails, we just +# need to remember that it did. + +attempt_morph() +{ + if run_morph "$@" + then + echo 0 > "$DATADIR/morph-exit" + else + echo "$?" > "$DATADIR/morph-exit" + fi +} + + +# Perl's die() function is often very useful: it prints an error message +# and terminates the process with a non-zero exit code. Let's have a +# shell function to do that. + +die() +{ + echo "ERROR: $@" 1>&2 + exit 1 +} + + +# Tests often need to check that specific files or directories exist +# and have the right ownerships etc. Here's some shell functions to +# test that kind of thing. + +is_dir() +{ + if [ ! -d "$1" ] + then + die "Expected $1 to be a directory" + fi +} + +is_file() +{ + if [ ! -f "$1" ] + then + die "Expected $1 to be a regular file" + fi +} + + +# General assertions. + +assert_equal() +{ + if [ "$1" != "$2" ] + then + die "Expected '$1' and '$2' to be equal" + fi +} + + +# Sometimes it's nice to run a command in a different directory, without +# having to bother changing the directory before and after the command, +# or spawning subshells. This function helps with that. + +run_in() +{ + (cd "$1" && shift && exec "$@") +} + + +# Extract all refs in all given morphologies. Each ref is reported +# as filename:ref. The referred-to repository is not listed. + +list_refs() +{ + awk '/ ref: / { printf "%s %s\n", FILENAME, $NF }' "$@" +} + + +# Is a ref petrified? Or a specific branch? + +is_petrified_or_branch() +{ + if echo "$1" | + awk -v "branch=$2" '$NF ~ /[0-9a-fA-F]{40}/ || $NF == branch' | + grep . + then + return 0 + else + return 1 + fi +} + + +# Are named morphologies petrified? Die if not. First arg is the +# branch that is allowed in addition to SHA1s. + +assert_morphologies_are_petrified() +{ + local branch="$1" + shift + list_refs "$@" | + while read filename ref + do + if ! is_petrified_or_branch "$ref" "$branch" + then + die "Found non-SHA1 ref in $filename: $ref" + fi + done +} + + +# Currently, yarn isn't setting $SRCDIR to point at the project source +# directory. We simulate this here. + +if ! env | grep '^SRCDIR=' > /dev/null +then + export SRCDIR="$(pwd)" +fi |