Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(639)

Side by Side Diff: tools_webrtc/presubmit_checks_lib/check_orphan_headers.py

Issue 2872493002: Adding PRESUBMIT check on orphan headers files. (Closed)
Patch Set: moving presubmit_checks_lib to tools_webrtc Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « PRESUBMIT.py ('k') | tools_webrtc/presubmit_checks_lib/check_orphan_headers_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
kjellander_webrtc 2017/05/09 09:17:35 You're missing the Python shebang here: https://go
mbonadei 2017/05/09 11:16:40 It does. Thanks a lot!
2 #
3 # Use of this source code is governed by a BSD-style license
4 # that can be found in the LICENSE file in the root of the source
5 # tree. An additional intellectual property rights grant can be found
6 # in the file PATENTS. All contributing project authors may
7 # be found in the AUTHORS file in the root of the source tree.
8
9 import os
10 import re
11
12
13 # TARGET_RE matches a GN target, and extracts the target name and the contents.
14 TARGET_RE = re.compile(r'(?P<indent>\s*)\w+\("(?P<target_name>\w+)"\) {'
15 r'(?P<target_contents>.*?)'
16 r'(?P=indent)}',
17 re.MULTILINE | re.DOTALL)
18
19 # SOURCES_RE matches a block of sources inside a GN target.
20 SOURCES_RE = re.compile(r'sources \+?= \[(?P<sources>.*?)\]',
21 re.MULTILINE | re.DOTALL)
22
23 SOURCE_FILE_RE = re.compile(r'.*\"(?P<source_file>.*)\"')
24
25
26 class NoBuildGnFoundError(Exception):
27 pass
28
29
30 class WrongFileTypeError(Exception):
31 pass
32
33
34 def _ReadFile(file_path):
35 """Returns the content of file_path in a string.
36
37 Args:
38 file_path: the path of the file to read.
39 Returns:
40 A string with the content of the file.
41 """
42 with open(file_path) as f:
43 return f.read()
44
45
46 def GetBuildGnPathFromFilePath(file_path, file_exists_check, root_dir_path):
47 """Returns the BUILD.gn file responsible for file_path.
48
49 Args:
50 file_path: the absolute path to the .h file to check.
51 file_exists_check: a function that defines how to check if a file exists
52 on the file system.
53 root_dir_path: the absolute path of the root of project.
54
55 Returns:
56 A string with the absolute path to the BUILD.gn file responsible to include
57 file_path in a target.
58 """
59 if not file_path.endswith('.h'):
60 raise WrongFileTypeError(
61 'File {} is not an header file (.h)'.format(file_path))
62 candidate_dir = os.path.dirname(file_path)
63 while candidate_dir.startswith(root_dir_path):
64 candidate_build_gn_path = os.path.join(candidate_dir, 'BUILD.gn')
65 if file_exists_check(candidate_build_gn_path):
66 return candidate_build_gn_path
67 else:
68 candidate_dir = os.path.abspath(os.path.join(candidate_dir,
69 os.pardir))
70 raise NoBuildGnFoundError(
71 'No BUILD.gn file found for file: `{}`'.format(file_path))
72
73
74 def IsHeaderInBuildGn(header_path, build_gn_path):
75 """Returns True if the header is listed in the BUILD.gn file.
76
77 Args:
78 header_path: the absolute path to the header to check.
79 build_gn_path: the absolute path to the header to check.
80
81 Returns:
82 bool: True if the header_path is an header that is listed in
83 at least one GN target in the BUILD.gn file specified by
84 the argument build_gn_path.
85 """
86 target_abs_path = os.path.dirname(build_gn_path)
87 build_gn_content = _ReadFile(build_gn_path)
88 headers_in_build_gn = GetHeadersInBuildGnFileSources(build_gn_content,
89 target_abs_path)
90 return header_path in headers_in_build_gn
91
92
93 def GetHeadersInBuildGnFileSources(file_content, target_abs_path):
94 """Returns a set with all the .h files in the file_content.
95
96 Args:
97 file_content: a string with the content of the BUILD.gn file.
98 target_abs_path: the absolute path to the directory where the
99 BUILD.gn file lives.
100
101 Returns:
102 A set with all the headers (.h file) in the file_content.
103 The set contains absolute paths.
104 """
105 headers_in_sources = set([])
106 for target_match in TARGET_RE.finditer(file_content):
107 target_contents = target_match.group('target_contents')
108 for sources_match in SOURCES_RE.finditer(target_contents):
109 sources = sources_match.group('sources')
110 for source_file_match in SOURCE_FILE_RE.finditer(sources):
111 source_file = source_file_match.group('source_file')
112 if source_file.endswith('.h'):
113 headers_in_sources.add(os.path.join(target_abs_path, source_file))
114 return headers_in_sources
OLDNEW
« no previous file with comments | « PRESUBMIT.py ('k') | tools_webrtc/presubmit_checks_lib/check_orphan_headers_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698