All pastes #370953 Raw Edit

Mine

public text v1 · immutable
#370953 ·published 2007-02-25 00:40 UTC
rendered paste body
#!/bin/env python
" Example Subversion pre-commit hook. "

def command_output(cmd):
  " Capture a command's standard output. "
  import subprocess
  return subprocess.Popen(
      cmd.split(), stdout=subprocess.PIPE).communicate()[0]

def files_changed(look_cmd):
  """ List the files added or updated by this transaction.

  "svnlook changed" gives output like:
  U   trunk/file1.cpp
  A   trunk/file2.cpp
  """
  def filename(line):
      return line[4:]
  def added_or_updated(line):
      return line and line[0] in ("A", "U")
  return [
      filename(line)
      for line in command_output(look_cmd % "changed").split("\n")
      if added_or_updated(line)]

def file_contents(filename, look_cmd):
  " Return a file's contents for this transaction. "
  return command_output(
     "%s %s" % (look_cmd % "cat", filename))
  
def contains_tabs(filename, look_cmd):
  " Return True if this version of the file contains tabs. "
  return "\t" in file_contents(filename, look_cmd)

def check_py_files_for_tabs(look_cmd):
  " Check Python files in this transaction are tab-free. "
  def is_py_file(fname):
      import os
      return os.path.splitext(fname)[1] in ".py".split()
  files_with_tabs = [
      ff for ff in files_changed(look_cmd)
      if is_py_file(ff) and contains_tabs(ff, look_cmd)]
  if len(files_with_tabs) > 0:
      sys.stderr.write("The following files contain tabs:\n  %s\n"
                       % "\n  ".join(files_with_tabs))
  return len(files_with_tabs)

def check_for_invalid_fileexts(look_cmd):
  " Check for .pyc, .pyo, .swp, etc. files getting checked in "
  def is_invalid_fileext(fname):
      import os
      return os.path.splitext(fname)[1] in ".pyc .pyo .swp".split()
  invalid_files = [
      ff for ff in files_changed(look_cmd)
      if is_invalid_fileext(ff)]
  if len(invalid_files) > 0:
      sys.stderr.write("The following files have invalid extensions:\n  %s\n"
                       % "\n  ".join(invalid_files))
  return len(invalid_files)

def main():
  usage = """usage: %prog REPOS TXN
  Run pre-commit options on a repository transaction."""
  from optparse import OptionParser
  parser = OptionParser(usage=usage)
  parser.add_option("-r", "--revision",
                    help="Test mode. TXN actually refers to a revision.",
                    action="store_true", default=False)
  errors = 0
  try:
      (opts, (repos, txn_or_rvn)) = parser.parse_args()
      look_opt = ("--transaction", "--revision")[opts.revision]
      look_cmd = "svnlook %s %s %s %s" % (
          "%s", repos, look_opt, txn_or_rvn)
      #errors += check_py_files_for_tabs(look_cmd)
      errors += check_for_invalid_fileexts(look_cmd)
  except:
      parser.print_help()
      errors += 1
  return errors

if __name__ == "__main__":
  import sys
  sys.exit(main())