Index: sky/tools/missing_from_gn |
diff --git a/sky/tools/missing_from_gn b/sky/tools/missing_from_gn |
new file mode 100755 |
index 0000000000000000000000000000000000000000..262e20b08528688b26b2e216f2fed2c12bd69638 |
--- /dev/null |
+++ b/sky/tools/missing_from_gn |
@@ -0,0 +1,84 @@ |
+#!/usr/bin/env python |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import subprocess |
+import os |
+import argparse |
+import logging |
+ |
+ROOT_DIR = os.path.abspath(os.path.join(__file__, os.pardir, os.pardir, |
+ os.pardir)) |
+ |
+def dependencies(): |
+ args = [ |
+ 'gn', |
+ 'desc', |
+ os.path.join('out', 'Debug'), |
+ '//sky/engine/public:blink', |
+ 'deps', '--all' |
+ ] |
+ targets = subprocess.check_output(args).splitlines() |
+ return map(str.strip, targets) |
+ |
+ |
+def sources(target): |
+ print target |
+ args = [ |
+ 'gn', |
+ 'desc', |
+ os.path.join('out', 'Debug'), |
+ target, |
+ 'sources' |
+ ] |
+ sources = subprocess.check_output(args).splitlines() |
+ return map(lambda s: s[2:], map(str.strip, sources)) |
+ |
+ |
+def find_on_disk(path): |
+ # FIXME: Use os.walk and do fancier ignoring. |
+ find_output = subprocess.check_output(['find', path, '-type', 'f']) |
+ return map(str.strip, find_output.splitlines()) |
+ |
+ |
+def main(): |
+ logging.basicConfig() |
+ |
+ os.chdir(ROOT_DIR) |
+ if os.path.exists('in_gn.txt'): |
+ logging.info('Using cached GN list: %s' % os.path.abspath('in_gn.txt')) |
+ in_gn = set(map(str.strip, open('in_gn.txt').readlines())) |
+ else: |
+ logging.info('No gn cache found, rebuilding: %s' % os.abspath('in_gn.txt')) |
+ targets = filter(lambda s: '//sky' in s, dependencies()) |
+ in_gn = set(sum(map(sources, targets), [])) |
+ open('in_gn.txt', 'w+').write('\n'.join(in_gn)) |
+ |
+ on_disk = set(find_on_disk('sky/engine')) |
+ # Ignore web/tests and bindings/tests |
+ on_disk = set(filter(lambda p: '/tests/' not in p, on_disk)) |
+ |
+ missing_from_gn = sorted(on_disk - in_gn) |
+ |
+ IGNORED_EXTENSIONS = [ |
+ '.py', # Probably some to remove, probably some to teach gn about. |
+ # Python files not being known to gn can cause flaky builds too! |
+ '.pyc', |
+ '.gypi', |
+ '.gn', |
+ '.gni', |
+ '.h', # Ignore headers for the moment. |
+ ] |
+ for ext in IGNORED_EXTENSIONS: |
+ missing_from_gn = filter(lambda p: not p.endswith(ext), missing_from_gn) |
+ |
+ # All upper-case files like README, DEPS, etc. are fine. |
+ missing_from_gn = filter(lambda p: not os.path.basename(p).isupper(), |
+ missing_from_gn) |
+ |
+ print '\n'.join(missing_from_gn) |
+ |
+ |
+if __name__ == '__main__': |
+ main() |