1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*- 2e5c31af7Sopenharmony_ci 3e5c31af7Sopenharmony_ci#------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities 5e5c31af7Sopenharmony_ci# -------------------------------------- 6e5c31af7Sopenharmony_ci# 7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project 8e5c31af7Sopenharmony_ci# 9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci# 13e5c31af7Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci# 15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci# limitations under the License. 20e5c31af7Sopenharmony_ci# 21e5c31af7Sopenharmony_ci#------------------------------------------------------------------------- 22e5c31af7Sopenharmony_ci 23e5c31af7Sopenharmony_ciimport os 24e5c31af7Sopenharmony_ciimport subprocess 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ciTEXT_FILE_EXTENSION = [ 27e5c31af7Sopenharmony_ci ".bat", 28e5c31af7Sopenharmony_ci ".c", 29e5c31af7Sopenharmony_ci ".cfg", 30e5c31af7Sopenharmony_ci ".cmake", 31e5c31af7Sopenharmony_ci ".cpp", 32e5c31af7Sopenharmony_ci ".css", 33e5c31af7Sopenharmony_ci ".h", 34e5c31af7Sopenharmony_ci ".hh", 35e5c31af7Sopenharmony_ci ".hpp", 36e5c31af7Sopenharmony_ci ".html", 37e5c31af7Sopenharmony_ci ".inl", 38e5c31af7Sopenharmony_ci ".java", 39e5c31af7Sopenharmony_ci ".js", 40e5c31af7Sopenharmony_ci ".m", 41e5c31af7Sopenharmony_ci ".mk", 42e5c31af7Sopenharmony_ci ".mm", 43e5c31af7Sopenharmony_ci ".py", 44e5c31af7Sopenharmony_ci ".rule", 45e5c31af7Sopenharmony_ci ".sh", 46e5c31af7Sopenharmony_ci ".test", 47e5c31af7Sopenharmony_ci ".txt", 48e5c31af7Sopenharmony_ci ".xml", 49e5c31af7Sopenharmony_ci ".xsl", 50e5c31af7Sopenharmony_ci ] 51e5c31af7Sopenharmony_ci 52e5c31af7Sopenharmony_ciBINARY_FILE_EXTENSION = [ 53e5c31af7Sopenharmony_ci ".bin", 54e5c31af7Sopenharmony_ci ".png", 55e5c31af7Sopenharmony_ci ".pkm", 56e5c31af7Sopenharmony_ci ".xcf", 57e5c31af7Sopenharmony_ci ".nspv", 58e5c31af7Sopenharmony_ci ".h264", 59e5c31af7Sopenharmony_ci ".h265", 60e5c31af7Sopenharmony_ci ".mp4", 61e5c31af7Sopenharmony_ci ".diff" 62e5c31af7Sopenharmony_ci ] 63e5c31af7Sopenharmony_ci 64e5c31af7Sopenharmony_cidef isTextFile (filePath): 65e5c31af7Sopenharmony_ci # Special case for a preprocessor test file that uses a non-ascii/utf8 encoding 66e5c31af7Sopenharmony_ci if filePath.endswith("preprocessor.test"): 67e5c31af7Sopenharmony_ci return False 68e5c31af7Sopenharmony_ci 69e5c31af7Sopenharmony_ci ext = os.path.splitext(filePath)[1] 70e5c31af7Sopenharmony_ci if ext in TEXT_FILE_EXTENSION: 71e5c31af7Sopenharmony_ci return True 72e5c31af7Sopenharmony_ci if ext in BINARY_FILE_EXTENSION: 73e5c31af7Sopenharmony_ci return False 74e5c31af7Sopenharmony_ci 75e5c31af7Sopenharmony_ci # Analyze file contents, zero byte is the marker for a binary file 76e5c31af7Sopenharmony_ci f = open(filePath, "rb") 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci TEST_LIMIT = 1024 79e5c31af7Sopenharmony_ci nullFound = False 80e5c31af7Sopenharmony_ci numBytesTested = 0 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci byte = f.read(1) 83e5c31af7Sopenharmony_ci while byte and numBytesTested < TEST_LIMIT: 84e5c31af7Sopenharmony_ci if byte == "\0": 85e5c31af7Sopenharmony_ci nullFound = True 86e5c31af7Sopenharmony_ci break 87e5c31af7Sopenharmony_ci 88e5c31af7Sopenharmony_ci byte = f.read(1) 89e5c31af7Sopenharmony_ci numBytesTested += 1 90e5c31af7Sopenharmony_ci 91e5c31af7Sopenharmony_ci f.close() 92e5c31af7Sopenharmony_ci return not nullFound 93e5c31af7Sopenharmony_ci 94e5c31af7Sopenharmony_cidef getProjectPath (): 95e5c31af7Sopenharmony_ci # File system hierarchy is fixed 96e5c31af7Sopenharmony_ci scriptDir = os.path.dirname(os.path.abspath(__file__)) 97e5c31af7Sopenharmony_ci projectDir = os.path.normpath(os.path.join(scriptDir, "../..")) 98e5c31af7Sopenharmony_ci return projectDir 99e5c31af7Sopenharmony_ci 100e5c31af7Sopenharmony_cidef git (*args): 101e5c31af7Sopenharmony_ci process = subprocess.Popen(['git'] + list(args), cwd=getProjectPath(), stdout=subprocess.PIPE) 102e5c31af7Sopenharmony_ci output = process.communicate()[0] 103e5c31af7Sopenharmony_ci if process.returncode != 0: 104e5c31af7Sopenharmony_ci raise Exception("Failed to execute '%s', got %d" % (str(args), process.returncode)) 105e5c31af7Sopenharmony_ci return output 106e5c31af7Sopenharmony_ci 107e5c31af7Sopenharmony_cidef getAbsolutePathPathFromProjectRelativePath (projectRelativePath): 108e5c31af7Sopenharmony_ci return os.path.normpath(os.path.join(getProjectPath(), projectRelativePath)) 109e5c31af7Sopenharmony_ci 110e5c31af7Sopenharmony_cidef getChangedFiles (): 111e5c31af7Sopenharmony_ci # Added, Copied, Moved, Renamed 112e5c31af7Sopenharmony_ci output = git('diff', '--cached', '--name-only', '-z', '--diff-filter=ACMR') 113e5c31af7Sopenharmony_ci relativePaths = output.split('\0')[:-1] # remove trailing '' 114e5c31af7Sopenharmony_ci return [getAbsolutePathPathFromProjectRelativePath(path) for path in relativePaths] 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_cidef getAllProjectFiles (): 117e5c31af7Sopenharmony_ci output = git('ls-files', '--cached', '-z').decode() 118e5c31af7Sopenharmony_ci relativePaths = output.split('\0')[:-1] # remove trailing '' 119e5c31af7Sopenharmony_ci return [getAbsolutePathPathFromProjectRelativePath(path) for path in relativePaths] 120