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