| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -450,6 +450,34 @@ def RunPythonUnitTests(input_api, output_api, unit_tests):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  return []
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				def _FetchAllFiles(input_api, white_list, black_list):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  """Hack to fetch all files."""
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # We cannot use AffectedFiles here because we want to test every python
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # file on each single python change. It's because a change in a python file
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # can break another unmodified file.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  # Use code similar to InputApi.FilterSourceFile()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  def Find(filepath, filters):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    for item in filters:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if input_api.re.match(item, filepath):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return True
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return False
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  import os
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  files = []
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  path_len = len(input_api.PresubmitLocalPath())
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  for dirpath, dirnames, filenames in os.walk(input_api.PresubmitLocalPath()):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # Passes dirnames in black list to speed up search.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    for item in dirnames[:]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      filepath = input_api.os_path.join(dirpath, item)[path_len + 1:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if Find(filepath, black_list):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        dirnames.remove(item)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    for item in filenames:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      filepath = input_api.os_path.join(dirpath, item)[path_len + 1:]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if Find(filepath, white_list) and not Find(filepath, black_list):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        files.append(filepath)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  return files
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				def RunPylint(input_api, output_api, white_list=None, black_list=None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  """Run pylint on python files.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -468,28 +496,9 @@ def RunPylint(input_api, output_api, white_list=None, black_list=None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  import warnings
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  warnings.filterwarnings('ignore', category=DeprecationWarning)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  try:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # We cannot use AffectedFiles here because we want to test every python
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # file on each single python change. It's because a change in a python file
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # can break another unmodified file.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # Use code similar to InputApi.FilterSourceFile()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    def Find(filepath, filters):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      for item in filters:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if input_api.re.match(item, filepath):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          return True
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return False
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    import os
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    files = []
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    for dirpath, dirnames, filenames in os.walk(input_api.PresubmitLocalPath()):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      # Passes dirnames in black list to speed up search.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      for item in dirnames[:]:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if Find(input_api.os_path.join(dirpath, item), black_list):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          dirnames.remove(item)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      for item in filenames:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        filepath = input_api.os_path.join(dirpath, item)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if Find(filepath, white_list) and not Find(filepath, black_list):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          files.append(filepath)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    files = _FetchAllFiles(input_api, white_list, black_list)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if not files:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return []
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # Now that at least one python file was modified and all the python files
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    # were listed, try to run pylint.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    try:
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -509,7 +518,11 @@ def RunPylint(input_api, output_api, white_list=None, black_list=None):
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          'sudo easy_install pylint"\n'
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          'Cannot do static analysis of python files.')]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if result:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return [output_api.PresubmitPromptWarning('Fix pylint errors first.')]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      if input_api.is_committing:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        error_type = output_api.PresubmitError
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      else:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        error_type = output_api.PresubmitPromptWarning
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return [error_type('Fix pylint errors first.')]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    return []
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  finally:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    warnings.filterwarnings('default', category=DeprecationWarning)
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |