[PATCH] Check whether the commit matches the tree

Brian C. Lane bcl at redhat.com
Thu Sep 26 15:24:54 UTC 2013


On Thu, Sep 26, 2013 at 11:08:36AM -0400, David Shea wrote:
> Switched to use `git status --porcelain' to examine the commit in order
> to simplify that part of the hook and get information about the working
> tree. Also changed the pylint Module output so that it's more clear
> what file is being checked.
> ---
>  scripts/githooks/pre-commit | 23 +++++++++++++++--------
>  tests/pylint/runpylint.sh   |  3 +++
>  2 files changed, 18 insertions(+), 8 deletions(-)
> 
> diff --git a/scripts/githooks/pre-commit b/scripts/githooks/pre-commit
> index 1528793..ec143f3 100755
> --- a/scripts/githooks/pre-commit
> +++ b/scripts/githooks/pre-commit
> @@ -30,29 +30,36 @@ if "NOPYLINT" in os.environ:
>  
>  # run pylint on all the python files changed by this commit
>  try:
> -    git_files = check_output("git diff-index --cached HEAD", shell=True)
> +    git_files = check_output("git status --porcelain", shell=True)
>  except CalledProcessError:
>      sys.exit(1)
>  
>  pylint_files = []
> -# Lines look like: :100755 100755 2cf57974e13a2aae778e28f942a4d44bf6567409 6fe1b6caf32d565b2cdb6d1aee250aaddc6d3a04 M      tests/pylint/runpylint.sh
> +# Lines look like: MM tests/pylint/runpylint.sh
> +# The first character is the status in the index (or our side of a merge),
> +# the second character is the status in the tree (or their side of a merge).
>  for gf in git_files.splitlines():
> -    path = gf.split()[-1]
> -    if is_python(path):
> -        pylint_files.append(path)
> +    # If the file is being removed or is not in git, ignore it
> +    if gf[0] in ('D', '?'):
> +        continue
> +    elif is_python(gf[3:]):
> +        # If the file is unmerged or changed locally, raise an error
> +        if gf[0] == 'U' or gf[1] in ('U', 'M'):
> +            print("ERROR: %s in commit does not match tree" % gf[3:])
> +            sys.exit(1)
> +        pylint_files.append(gf[3:])
>  
>  if not pylint_files:
>      sys.exit(0)
> -pylint_files = " ".join(pylint_files)
>  
>  # Make sure pykickstart and blivet can be found
>  # Note that if the checked out versions are too far off pylint may fail
>  env = os.environ.copy()
>  env["PYTHONPATH"] = OTHER_MODULES_PATH
>  
> -print "Running pylint on %s" % pylint_files
> +print "Running pylint on %s" % " ".join(pylint_files)
>  try:
> -    check_output("./tests/pylint/runpylint.sh %s" % pylint_files, shell=True, env=env)
> +    check_output(["./tests/pylint/runpylint.sh"] + pylint_files, env=env)
>  except CalledProcessError as e:
>      print e.output
>      sys.exit(1)
> diff --git a/tests/pylint/runpylint.sh b/tests/pylint/runpylint.sh
> index 4106a89..0ca8708 100755
> --- a/tests/pylint/runpylint.sh
> +++ b/tests/pylint/runpylint.sh
> @@ -103,6 +103,9 @@ for i in $FILES; do
>    # I0011 is the informational "Locally disabling ...." message
>    if [ -n "$(echo "$pylint_output" | fgrep -v '************* Module ' |\
>            grep -v '^I0011:')" ]; then
> +      # Replace the Module line with the actual filename
> +      pylint_output="$(echo "$pylint_output" | sed "s|\* Module .*|* Module $i|")"
> +
>        if [ "$pylint_log" -ne 0 ]; then
>            echo "$pylint_output" >> pylint-log
>        else
> -- 
> 1.8.3.1

That looks good, thanks!

-- 
Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 482 bytes
Desc: not available
URL: <https://lists.fedorahosted.org/pipermail/anaconda-patches/attachments/20130926/e440681a/attachment.sig>


More information about the anaconda-patches mailing list