[PATCH 02/10] Run the pre-commit hook on content staged for commit
Vratislav Podzimek
vpodzime at redhat.com
Wed Sep 25 19:04:27 UTC 2013
On Wed, 2013-09-25 at 15:02 -0400, David Shea wrote:
> On 09/25/2013 02:42 PM, Vratislav Podzimek wrote:
> > On Wed, 2013-09-25 at 14:21 -0400, David Shea wrote:
> >> Changed the pylint Module output so that it's more clear what file is
> >> being checked. Added an option to runpylint.sh to manually set the
> >> filename to display.
> >> ---
> >> scripts/githooks/pre-commit | 47 ++++++++++++++++++++++++++++++++-------------
> >> tests/pylint/runpylint.sh | 16 ++++++++++++++-
> >> 2 files changed, 49 insertions(+), 14 deletions(-)
> >>
> >> diff --git a/scripts/githooks/pre-commit b/scripts/githooks/pre-commit
> >> index 1528793..a3307b9 100755
> >> --- a/scripts/githooks/pre-commit
> >> +++ b/scripts/githooks/pre-commit
> >> @@ -7,6 +7,7 @@
> >> """
> >> import os
> >> import sys
> >> +import tempfile
> >> from subprocess import check_output, CalledProcessError
> >>
> >> def is_python(filename):
> >> @@ -14,11 +15,11 @@ def is_python(filename):
> >> return True
> >>
> >> try:
> >> - with open(filename) as testfile:
> >> - if testfile.readline().startswith("#!/usr/bin/python"):
> >> - return True
> >> - except IOError:
> >> - pass
> >> + s = check_output(["git", "show", (":%s" % filename)]).splitlines()
> >> + if s and s[0].startswith("#!/usr/bin/python"):
> >> + return True
> >> + except CalledProcessError:
> >> + sys.exit(1)
> >>
> >> return False
> >>
> >> @@ -37,24 +38,44 @@ except CalledProcessError:
> >> pylint_files = []
> >> # Lines look like: :100755 100755 2cf57974e13a2aae778e28f942a4d44bf6567409 6fe1b6caf32d565b2cdb6d1aee250aaddc6d3a04 M tests/pylint/runpylint.sh
> >> for gf in git_files.splitlines():
> >> - path = gf.split()[-1]
> >> - if is_python(path):
> >> - pylint_files.append(path)
> >> + fields = gf.split()
> >> +
> >> + # If the file is being removed, ignore it
> >> + if fields[4] == 'D':
> >> + continue
> >> + elif is_python(fields[-1]):
> >> + pylint_files.append(fields[-1])
> >>
> >> 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
> >>
> >> +# Make a list of tuples of (filename, tempfile) where the tempfile
> >> +# contains the file as staged for commit.
> >> +pylint_commits = []
> >> +for pylint_file in pylint_files:
> >> + commit = tempfile.NamedTemporaryFile()
> > Those files are gonna end up under /tmp, right? Won't it cause some
> > troubles with PYTHONPATH and stuff like that?
> >
> Erk, yeah. This'll cause trouble with modules that use relative imports.
> The use case I was aiming for was you get ready to commit a module, it
> fails pylint, you fix the problems, and then you forget to git-add
> before running the commit again. I figured it's probably good enough to
> check the staged module using imports that are on the filesystem and not
> necessarily staged. For the problem of relative imports, I'm tempted to
> un-disable W0403 ("Relative import %r...") and just make everything
> absolute, which will let PYTHONPATH work.
+1 to that. AFAICT, relative imports also don't work with updates.img.
--
Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic
More information about the anaconda-patches
mailing list