diff options
author | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2019-01-21 19:24:49 +0000 |
---|---|---|
committer | Mohammad Akhlaghi <mohammad@akhlaghi.org> | 2019-01-21 19:48:06 +0000 |
commit | 15d32a7df7b2d4420bebd18b855f83606d872f30 (patch) | |
tree | f0d54987b542493c7e073a34a4ce2bb78ab745fa /reproduce/src/bash/git-pre-commit | |
parent | 2c5d48c6bd557e78438682690bf007039fee375f (diff) |
Metastore package now installed to allow keeping file meta-data
The pipeline heavily depends on file meta data (and in particular the
modification dates), for example the configuration-Makefiles within the
pipeline are set as prerequisites to the rules of the pipeline.
However, when Git checks out a branch, it doesn't preserve the meta-data of
the files unique to that branch (for example program source files or
configuration-Makefiles). As a result, the rules that depend on them will
be re-done.
This is especially troublesome in the scenario of this reproducible paper
project because we commonly need to switch between branches (for example to
import recent work in the pipeline into the projects). After some
searching, I think the Metastore program is the best solution. Metastore is
now built as part of the pipeline and through two Git hooks, it is called
by Git to store the original meta-data of files into a binary file that is
version controlled (and managed by Metastore).
Diffstat (limited to 'reproduce/src/bash/git-pre-commit')
-rw-r--r-- | reproduce/src/bash/git-pre-commit | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/reproduce/src/bash/git-pre-commit b/reproduce/src/bash/git-pre-commit new file mode 100644 index 0000000..295c033 --- /dev/null +++ b/reproduce/src/bash/git-pre-commit @@ -0,0 +1,50 @@ +#!.local/bin/bash +# +# The example hook script to store the metadata information of version +# controlled files (with each commit) using the `metastore' program. +# +# This script is taken from the `examples/hooks/pre-commit' file of the +# `metastore' package (installed within the pipeline, with an MIT +# license). We have just changed the name of the `MSFILE' and also set +# special characters for the installation location of meta-store so our own +# installation is found by Git. +# +# WARNING: +# +# If the commit is aborted (e.g. by not entering any synopsis), +# then updated metastore file (.metadata by default) is not reverted, +# so its new version remains in the index. +# To undo any changes in metastore file written since HEAD commit, +# you may want to reset and checkout HEAD version of the file: +# +# git reset HEAD -- .metadata +# git checkout HEAD -- .metadata + +MSFILE=".file-metadata" + +exit_on_fail() { + "$@" + if [ $? -ne 0 ]; then + echo "Failed to execute: $@" >&2 + exit 1 + fi +} + +exit_on_fail \ + @BINDIR@/metastore -s -f "$MSFILE" + +# If it's first metastore commit, store again to include $MSFILE in $MSFILE. +if ! git-ls-tree --name-only HEAD 2>/dev/null | grep -Fqx "$MSFILE"; then + exit_on_fail \ + @BINDIR@/metastore -s -f "$MSFILE" +fi + +if [ ! -e "$MSFILE" ]; then + echo "\"$MSFILE\" missing" >&2 + exit 1 +fi + +exit_on_fail \ + git-add "$MSFILE" + +exit 0 |