PRESUBMIT: detect invalid #include statements

Detects the following:
- #include "foo.h" rather than "src/xxx/foo.h"
- #include "include/perfetto/foo.h" rather than "perfetto/foo.h"

Change-Id: I199119c5e37859b4faa63e39bbac9b49446aa976
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 5d92c14..124a502 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -72,6 +72,7 @@
                                 output)
   results += RunAndReportIfLong(CheckIncludeGuards, input, output)
   results += RunAndReportIfLong(CheckIncludeViolations, input, output)
+  results += RunAndReportIfLong(CheckIncludePaths, input, output)
   results += RunAndReportIfLong(CheckProtoComments, input, output)
   results += RunAndReportIfLong(CheckBuild, input, output)
   results += RunAndReportIfLong(CheckAndroidBlueprint, input, output)
@@ -251,6 +252,31 @@
   return []
 
 
+def CheckIncludePaths(input_api, output_api):
+
+  def file_filter(x):
+    return input_api.FilterSourceFile(x, files_to_check=[r'.*\.h$', r'.*\.cc$'])
+
+  error_lines = []
+  for f in input_api.AffectedSourceFiles(file_filter):
+    for line_num, line in f.ChangedContents():
+      m = input_api.re.search(r'^#include "(.*\.h)"', line)
+      if not m:
+        continue
+      inc_hdr = m.group(1)
+      if inc_hdr.startswith('include/perfetto'):
+        error_lines.append('  %s:%s: Redundant "include/" in #include path"' %
+                           (f.LocalPath(), line_num))
+      if '/' not in inc_hdr:
+        error_lines.append(
+            '  %s:%s: relative #include not allowed, use full path' %
+            (f.LocalPath(), line_num))
+  return [] if len(error_lines) == 0 else [
+      output_api.PresubmitError('Invalid #include paths detected:\n' +
+                                '\n'.join(error_lines))
+  ]
+
+
 def CheckBinaryDescriptors(input_api, output_api):
   # The script invocation doesn't work on Windows.
   if input_api.is_windows: