dotcloud/docker

View on GitHub
hack/validate/dco

Summary

Maintainability
Test Coverage
#!/usr/bin/env bash

SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPTDIR}/.validate"

adds=$(validate_diff --numstat | awk '{ s += $1 } END { print s }')
dels=$(validate_diff --numstat | awk '{ s += $2 } END { print s }')
#notDocs="$(validate_diff --numstat | awk '$3 !~ /^docs\// { print $3 }')"

: ${adds:=0}
: ${dels:=0}

# "Username may only contain alphanumeric characters or dashes and cannot begin with a dash"
githubUsernameRegex='[a-zA-Z0-9][a-zA-Z0-9-]+'

# https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work
dcoPrefix='Signed-off-by:'
dcoRegex="^(Docker-DCO-1.1-)?$dcoPrefix ([^<]+) <([^<>@]+@[^<>]+)>( \\(github: ($githubUsernameRegex)\\))?$"

check_dco() {
    grep -qE "$dcoRegex"
}

if [ ${adds} -eq 0 -a ${dels} -eq 0 ]; then
    echo '0 adds, 0 deletions; nothing to validate! :)'
else
    commits=($(validate_log --format='format:%H%n'))
    badCommits=()
    for commit in "${commits[@]}"; do
        if [ -z "$(git log -1 --format='format:' --name-status "$commit")" ]; then
            # no content (ie, Merge commit, etc)
            continue
        fi
        if ! git log -1 --format='format:%B' "$commit" | check_dco; then
            badCommits+=("$commit")
        fi
    done
    if [ ${#badCommits[@]} -eq 0 ]; then
        echo "Congratulations!  All commits are properly signed with the DCO!"
    else
        {
            echo "These commits do not have a proper '$dcoPrefix' marker:"
            for commit in "${badCommits[@]}"; do
                echo " - $commit"
            done
            echo
            echo 'Please amend each commit to include a properly formatted DCO marker.'
            echo
            echo 'Visit the following URL for information about the Docker DCO:'
            echo ' https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work'
            echo
        } >&2
        false
    fi
fi