| Index: PRESUBMIT.py
 | 
| diff --git a/PRESUBMIT.py b/PRESUBMIT.py
 | 
| index 6751f06d18b4676e92e14bba1c44d6b3379c4ed3..444f5bb7212946a52549e20d2aa00093f78686b9 100644
 | 
| --- a/PRESUBMIT.py
 | 
| +++ b/PRESUBMIT.py
 | 
| @@ -9,10 +9,6 @@ for more details about the presubmit API built into gcl.
 | 
|  """
 | 
|  
 | 
|  
 | 
| -import re
 | 
| -import sys
 | 
| -
 | 
| -
 | 
|  _EXCLUDED_PATHS = (
 | 
|      r"^breakpad[\\\/].*",
 | 
|      r"^native_client_sdk[\\\/]src[\\\/]build_tools[\\\/]make_rules.py",
 | 
| @@ -517,6 +513,7 @@ def _CheckUnwantedDependencies(input_api, output_api):
 | 
|    change. Breaking - rules is an error, breaking ! rules is a
 | 
|    warning.
 | 
|    """
 | 
| +  import sys
 | 
|    # We need to wait until we have an input_api object and use this
 | 
|    # roundabout construct to import checkdeps because this file is
 | 
|    # eval-ed and thus doesn't have __file__.
 | 
| @@ -569,8 +566,8 @@ def _CheckFilePermissions(input_api, output_api):
 | 
|    """Check that all files have their permissions properly set."""
 | 
|    if input_api.platform == 'win32':
 | 
|      return []
 | 
| -  args = [sys.executable, 'tools/checkperms/checkperms.py', '--root',
 | 
| -          input_api.change.RepositoryRoot()]
 | 
| +  args = [input_api.python_executable, 'tools/checkperms/checkperms.py',
 | 
| +          '--root', input_api.change.RepositoryRoot()]
 | 
|    for f in input_api.AffectedFiles():
 | 
|      args += ['--file', f.LocalPath()]
 | 
|    checkperms = input_api.subprocess.Popen(args,
 | 
| @@ -969,14 +966,14 @@ def _CheckSpamLogging(input_api, output_api):
 | 
|  
 | 
|    for f in input_api.AffectedSourceFiles(source_file_filter):
 | 
|      contents = input_api.ReadFile(f, 'rb')
 | 
| -    if re.search(r"\bD?LOG\s*\(\s*INFO\s*\)", contents):
 | 
| +    if input_api.re.search(r"\bD?LOG\s*\(\s*INFO\s*\)", contents):
 | 
|        log_info.append(f.LocalPath())
 | 
| -    elif re.search(r"\bD?LOG_IF\s*\(\s*INFO\s*,", contents):
 | 
| +    elif input_api.re.search(r"\bD?LOG_IF\s*\(\s*INFO\s*,", contents):
 | 
|        log_info.append(f.LocalPath())
 | 
|  
 | 
| -    if re.search(r"\bprintf\(", contents):
 | 
| +    if input_api.re.search(r"\bprintf\(", contents):
 | 
|        printf.append(f.LocalPath())
 | 
| -    elif re.search(r"\bfprintf\((stdout|stderr)", contents):
 | 
| +    elif input_api.re.search(r"\bfprintf\((stdout|stderr)", contents):
 | 
|        printf.append(f.LocalPath())
 | 
|  
 | 
|    if log_info:
 | 
| @@ -1198,6 +1195,7 @@ def _CheckParseErrors(input_api, output_api):
 | 
|  
 | 
|  def _CheckJavaStyle(input_api, output_api):
 | 
|    """Runs checkstyle on changed java files and returns errors if any exist."""
 | 
| +  import sys
 | 
|    original_sys_path = sys.path
 | 
|    try:
 | 
|      sys.path = sys.path + [input_api.os_path.join(
 | 
| @@ -1259,6 +1257,23 @@ def _CheckNoDeprecatedCSS(input_api, output_api):
 | 
|                (fpath.LocalPath(), line_num, deprecated_value, value)))
 | 
|    return results
 | 
|  
 | 
| +
 | 
| +def _CheckForOverrideAndFinalRules(input_api, output_api):
 | 
| +  """Checks for final and override used as per C++11"""
 | 
| +  problems = []
 | 
| +  for f in input_api.AffectedFiles():
 | 
| +    if (f.LocalPath().endswith(('.cc', '.cpp', '.h', '.mm'))):
 | 
| +      for line_num, line in f.ChangedContents():
 | 
| +        if (input_api.re.search(r'\b(FINAL|OVERRIDE)\b', line)):
 | 
| +          problems.append('    %s:%d' % (f.LocalPath(), line_num))
 | 
| +
 | 
| +  if not problems:
 | 
| +    return []
 | 
| +  return [output_api.PresubmitError('Use C++11\'s |final| and |override| '
 | 
| +                                    'rather than FINAL and OVERRIDE.',
 | 
| +                                    problems)]
 | 
| +
 | 
| +
 | 
|  def _CommonChecks(input_api, output_api):
 | 
|    """Checks common to both upload and commit."""
 | 
|    results = []
 | 
| @@ -1300,6 +1315,7 @@ def _CommonChecks(input_api, output_api):
 | 
|    results.extend(_CheckNoDeprecatedCSS(input_api, output_api))
 | 
|    results.extend(_CheckParseErrors(input_api, output_api))
 | 
|    results.extend(_CheckForIPCRules(input_api, output_api))
 | 
| +  results.extend(_CheckForOverrideAndFinalRules(input_api, output_api))
 | 
|  
 | 
|    if any('PRESUBMIT.py' == f.LocalPath() for f in input_api.AffectedFiles()):
 | 
|      results.extend(input_api.canned_checks.RunUnitTestsInDirectory(
 | 
| @@ -1453,7 +1469,7 @@ def _CheckForUsingSideEffectsOfPass(input_api, output_api):
 | 
|      if f.LocalPath().endswith(('.h', '.c', '.cc', '.m', '.mm')):
 | 
|        for lnum, line in f.ChangedContents():
 | 
|          # Disallow Foo(*my_scoped_thing.Pass()); See crbug.com/418297.
 | 
| -        if re.search(r'\*[a-zA-Z0-9_]+\.Pass\(\)', line):
 | 
| +        if input_api.re.search(r'\*[a-zA-Z0-9_]+\.Pass\(\)', line):
 | 
|            errors.append(output_api.PresubmitError(
 | 
|              ('%s:%d uses *foo.Pass() to delete the contents of scoped_ptr. ' +
 | 
|               'See crbug.com/418297.') % (f.LocalPath(), lnum)))
 | 
| @@ -1647,6 +1663,7 @@ def CheckChangeOnCommit(input_api, output_api):
 | 
|  
 | 
|  
 | 
|  def GetPreferredTryMasters(project, change):
 | 
| +  import re
 | 
|    files = change.LocalPaths()
 | 
|  
 | 
|    if not files or all(re.search(r'[\\\/]OWNERS$', f) for f in files):
 | 
| 
 |