Skip to content

Commit

Permalink
Contrib: Hook to verify modules match assembled fragments
Browse files Browse the repository at this point in the history
  • Loading branch information
tbielawa committed Apr 28, 2017
1 parent 4a55343 commit 7de281c
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 0 deletions.
7 changes: 7 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ tox -re py35-pylint

### Tricks

#### Git Hooks

Git hooks are included in this repository to aid in development. Check
out the README in the
[hack/hooks](http://github.com/openshift/openshift-ansible/blob/master/hack/hooks/README.md)
directory for more information.

#### Activating a virtualenv managed by tox

If you want to enter a virtualenv created by tox to do additional
Expand Down
37 changes: 37 additions & 0 deletions hack/hooks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# OpenShift-Ansible Git Hooks

## Introduction

This `hack` sub-directory holds
[git commit hooks](https://www.atlassian.com/git/tutorials/git-hooks#conceptual-overview)
you may use when working on openshift-ansible contributions. See the
README in each sub-directory for an overview of what each hook does
and if the hook has any specific usage or setup instructions.

## Usage

Basic git hook usage is simple:

1) Copy (or symbolic link) the hook to the `$REPO_ROOT/.git/hooks/` directory
2) Make the hook executable (`chmod +x $PATH_TO_HOOK`)

## Multiple Hooks of the Same Type

If you want to install multiple hooks of the same type, for example:
multiple `pre-commit` hooks, you will need some kind of *hook
dispatcher*. For an example of an easy to use hook dispatcher check
out this gist by carlos-jenkins:

* [multihooks.py](https://gist.github.com/carlos-jenkins/89da9dcf9e0d528ac978311938aade43)

## Contributing Hooks

If you want to contribute a new hook there are only a few criteria
that must be met:

* The hook **MUST** include a README describing the purpose of the hook
* The README **MUST** describe special setup instructions if they are required
* The hook **MUST** be in a sub-directory of this directory
* The hook file **MUST** be named following the standard git hook
naming pattern (i.e., pre-commit hooks **MUST** be called
`pre-commit`)
19 changes: 19 additions & 0 deletions hack/hooks/verify_generated_modules/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Verify Generated Modules

Pre-commit hook for verifying that generated library modules match
their EXPECTED content. Library modules are generated from fragments
under the `roles/lib_(openshift|utils)/src/` directories.

If the attempted commit modified files under the
`roles/lib_(openshift|utils)/` directories this script will run the
`generate.py --verify` command.

This script will **NOT RUN** if module source fragments are modified
but *not part of the commit*. I.e., you can still make commits if you
modified module fragments AND other files but are *not comitting the
the module fragments*.

# Setup Instructions

Standard installation procedure. Copy the hook to the `.git/hooks/`
directory and ensure it is executable.
55 changes: 55 additions & 0 deletions hack/hooks/verify_generated_modules/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/bin/sh

######################################################################
# Pre-commit hook for verifying that generated library modules match
# their EXPECTED content. Library modules are generated from fragments
# under the 'roles/lib_(openshift|utils)/src/' directories.
#
# If the attempted commit modified files under the
# 'roles/lib_(openshift|utils)/' directories this script will run the
# 'generate.py --verify' command.
#
# This script will NOT RUN if module source fragments are modified but
# not part of the commit. I.e., you can still make commits if you
# modified module fragments AND other files but are not comitting the
# the module fragments.

# Did the commit modify any source module files?
CHANGES=`git diff-index --stat --cached HEAD | grep -E '^ roles/lib_(openshift|utils)/src/(class|doc|ansible|lib)/'`
RET_CODE=$?
ABORT=0

if [ "${RET_CODE}" -eq "0" ]; then
# Modifications detected. Run the verification scripts.

# Which was it?
if $(echo $CHANGES | grep -q 'roles/lib_openshift/'); then
echo "Validating lib_openshift..."
./roles/lib_openshift/src/generate.py --verify
if [ "${?}" -ne "0" ]; then
ABORT=1
fi
fi

if $(echo $CHANGES | grep -q 'roles/lib_utils/'); then
echo "Validating lib_utils..."
./roles/lib_utils/src/generate.py --verify
if [ "${?}" -ne "0" ]; then
ABORT=1
fi
fi

if [ "${ABORT}" -eq "1" ]; then
cat <<EOF
ERROR: Module verification failed. Generated files do not match fragments.
Choices to continue:
1) Run './roles/lib_(openshift|utils)/src/generate.py' from the root of
the repo to regenerate the files
2) Skip verification with '--no-verify' option to 'git commit'
EOF
fi
fi

exit $ABORT

0 comments on commit 7de281c

Please sign in to comment.