Question : SVN: Hook Script to Avoid Filenames with spaces and special chars

Hello,

Is there any SVN Hook script for Linux to avoid users committing filenames with spaces and special chars?

Thanks!

 

Answer : SVN: Hook Script to Avoid Filenames with spaces and special chars

Here a quick rough edit to the code in the above link. This should work for you. I haven't tested it though (I don't have SVN repo to test it now).

#!/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 check_filesname(look_cmd):
  " Check for invalid filenames. \
  It allows Alphabets, Numbers, dashes(-), Underscores(_) and dots(.) "
  allowedRegex=re.compile("^[a-zA-Z0-9\-_\.]*$")
  invalid_files = [
      ff for ff in files_changed(look_cmd)
      if not allowedRegex.match(ff)]
  if len(invalid_files) > 0:
      sys.stderr.write("The following files have invalid filename:\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_filesname(look_cmd)
  except:
      parser.print_help()
      errors += 1
  return errors

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