FMCorz / mdk

Moodle Development Kit. A collection of tools meant to make developers' lives easier.
GNU General Public License v3.0
86 stars 47 forks source link

Add codechecker/phpdocs checker support #73

Open danpoltawski opened 10 years ago

danpoltawski commented 10 years ago

Steps for implementation:

1.First step would be to get it to report all issues on any file touched (could use phpcs for code checker at least)

  1. More magic, to talk only about the lines modified. Damyon had a crack at this:

https://github.com/moodlehq/moodle-local_codechecker/pull/10

danpoltawski commented 10 years ago

Related issue: https://tracker.moodle.org/browse/MDLSITE-2715

danpoltawski commented 10 years ago

Eloy says this could be wrapped also https://github.com/stronk7/moodle-local_ci/tree/master/remote_branch_checker

damyon commented 10 years ago

I have a cli for this. I think there were mac issues with it but Linux was fine.

Details:

in ~/bin/ I have this git-cs script:

START OF SCRIPT <<<


#!/bin/bash

# Bash script for running phpcs with our custom moodle rules only on the affected lines from git-diff.
# To install this script - checkout the codechecker project and symlink this script into your path.
# E.g. ln -s <installdir>/git-compare.sh ~/bin/git-cs
# Then run
# > git-cs
# to see the introduced errors since HEAD or
# > git-cs origin/master
# to see the introduced errors since the upstream master (or any valid git-revision).
#
# You can also set this up as a git alias with branch completion.
# Example:
# First create symlink (I call mine git-cs) of this script into PATH (~/bin)
# Add to .gitconfig [alias] section:
#
# cs = !git-cs $1
#
# Now to get branch completion add this to .bashrc:
#
# _git_cs () {
#    _git_branch
# }
#
# Now (in a new shell) type: git cs [TAB][TAB]
# Profit!

# Start of script...
set -e

if [ ! -z "$SERVER_NAME" ]; then
    # This script must be run from the command line.
    exit 0;
fi

# Quick check for --help as last arg.
LASTARG="${@: -1}"

# Print help if requested.
if [ "$LASTARG" = "--help" ]; then
    echo "$0"
    echo ""
    echo "Run codechecker only of the diff between the current working tree and a specified revision."
    echo ""
    echo "Usage: $0 [git-revision]"
    echo "          Where git-revision represents a git revision or branch to compare the working"
    echo "          tree against. Will default to HEAD if not specified."
    exit 0
fi

# Windows users get no warranty anyway.

# Resolve if this script is a symlink so we can get the path to the phpcs binary.
LINKSOURCE=`readlink $0`
if [ -z "$LINKSOURCE" ]; then
    ME=$0
else
    ME=$LINKSOURCE
fi

# Get the install location (where codechecker is checked out).
INSTALLDIR=`dirname $ME`

# Report style - untested with other formats.
REPORT=full

# Phpcs binary.
SCRIPT=$INSTALLDIR/pear/PHP/scripts/phpcs

# Our custom ruleset.
STANDARD=$INSTALLDIR/moodle/ruleset.xml

# The git revision to compare to. HEAD is default.
COMPARISON=$1

if [ -z "$COMPARISON" ]; then
    COMPARISON=HEAD
fi

# What files have changed in this diff?
RELATIVEFILES=`git diff $COMPARISON --name-only|grep .php || true`

# Where is the root of the current git repo?
TOPDIR=`git rev-parse --show-toplevel`

FILESCHANGED=`echo $RELATIVEFILES|wc -w`
echo "$FILESCHANGED php file(s) changed."

# We run phpcs for each changed file separately.
FILES=''
for RELATIVEFILE in $RELATIVEFILES; do

    # Phpcs needs the absolute path.
    ABSOLUTEFILE=$TOPDIR/$RELATIVEFILE

    # Generate some tmp file names - will be cleaned up later.
    TMPFILE=`mktemp /tmp/git-cs-XXXXXX`
    REPORT1=`mktemp /tmp/git-cs-report1-XXXXXX`
    REPORT1NOLINES=`mktemp /tmp/git-cs-report1-nolines-XXXXXX`
    REPORT2=`mktemp /tmp/git-cs-report2-XXXXXX`
    REPORT2NOLINES=`mktemp /tmp/git-cs-report2-nolines-XXXXXX`

    echo "Checkout file $RELATIVEFILE"
    # Checkout a copy of the file from the comparison git revision.
    git show $COMPARISON:$RELATIVEFILE > $TMPFILE

    echo "Run code sniffer on original file $RELATIVEFILE"
    # Checkout a copy of the file from the comparison git revision.
    # Generate phpcs report for the unmodified file.
    $SCRIPT --report=$REPORT --standard=$STANDARD --tab-width=4 $TMPFILE > $REPORT1 || true

    # Generate a nolines version of the report.
    cat $REPORT1 | sed -e 's/[0-9 ]\+|/ /g' |egrep -v "FILE|FOUND" > $REPORT1NOLINES || true

    echo "Run code sniffer on modified file $RELATIVEFILE"
    # Generate phpcs report for the file with our local changes.
    $SCRIPT --report=$REPORT --standard=$STANDARD --tab-width=4 $ABSOLUTEFILE > $REPORT2 || true

    # Generate a nolines version of the report.
    cat $REPORT2 | sed -e 's/[0-9 ]\+|/ /g' |egrep -v "FILE|FOUND"> $REPORT2NOLINES || true

    # Get the lines added/removed from the two sniffer reports in a format we can parse.
    LINESADDED=`diff -n $REPORT1NOLINES $REPORT2NOLINES | egrep "^a|^d" | sed -e 's/ /,/g'`

    # For each line group added/removed...
    OFFSET=0
    for RANGE in $LINESADDED; do
        # Used to check if the lines were added or removed.
        ADDED=`echo -n $RANGE|grep "a" || true`

        # Strip the leading a/d from the line.
        RANGE=`echo -n $RANGE|sed -e 's/[ad]//g'`

        # Get the first number.
        FIRST=`echo -n $RANGE|sed -e 's/,.*//g'`
        # Get the second number.
        SECOND=`echo -n $RANGE|sed -e 's/.*,//g'`
       # If no lines added...
        if [ -z "$ADDED" ]; then
            #echo "DELETED LINES"
            #FIRSTADJUSTED=`dc -e "$FIRST $SECOND + 1 - p"`
            #SECONDADJUSTED=`dc -e "$SECOND p"`

            # Only print the relevant lines from the "lines" report.
            #cat $REPORT1 | head -n $FIRSTADJUSTED | tail -n $SECONDADJUSTED
            # Lines Deleted
            OFFSET=`dc -e "$OFFSET $SECOND -p"`
        else
            # We only print the lines added in the report (introduced errors).

            # We keep track of the total lines added/removed up to this point
            # so we can correctly calculate the starting line in the "lines" report.
            echo "NEW LINES"
            FIRSTADJUSTED=`dc -e "$FIRST $SECOND + 1 - p"`
            SECONDADJUSTED=`dc -e "$SECOND p"`

            # Only print the relevant lines from the "lines" report.
            cat $REPORT2 | head -n $FIRSTADJUSTED | tail -n $SECONDADJUSTED

            # Lines added
            OFFSET=`dc -e "$OFFSET $SECOND +p"`
        fi

        # Translate negative numbers to use _ instead of - (this is required by dc).
        OFFSET=`echo $OFFSET | sed -e 's/-/_/g'`

    done;

    # Remove temporary files used.
    rm -f $TMPFILE $REPORT1 $REPORT2 $REPORT1NOLINES $REPORT2NOLINES
done;

END OF SCRIPT <<<

FMCorz commented 9 years ago

This is sort of supported using mdk precheck though it is not a local pre-check.