90 lines
2.2 KiB
Python
90 lines
2.2 KiB
Python
# Copyright 2013 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 os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) != 2:
|
|
print 'usage: %s <output.html>' % sys.argv[0]
|
|
return 1
|
|
env = os.environ.copy()
|
|
env['GYP_GENERATORS'] = 'dump_dependency_json'
|
|
print 'Dumping dependencies...'
|
|
popen = subprocess.Popen(
|
|
['python', 'build/gyp_chromium'],
|
|
shell=True, env=env)
|
|
popen.communicate()
|
|
if popen.returncode != 0:
|
|
return popen.returncode
|
|
print 'Finding problems...'
|
|
popen = subprocess.Popen(
|
|
['python', 'tools/gyp-explain.py', '--dot',
|
|
'chrome.gyp:browser#', 'core.gyp:webcore#'],
|
|
stdout=subprocess.PIPE,
|
|
shell=True)
|
|
out, _ = popen.communicate()
|
|
if popen.returncode != 0:
|
|
return popen.returncode
|
|
|
|
# Break into pairs to uniq to make graph less of a mess.
|
|
print 'Simplifying...'
|
|
deduplicated = set()
|
|
lines = out.splitlines()[2:-1]
|
|
for line in lines:
|
|
line = line.strip('\r\n ;')
|
|
pairs = line.split(' -> ')
|
|
for i in range(len(pairs) - 1):
|
|
deduplicated.add('%s -> %s;' % (pairs[i], pairs[i + 1]))
|
|
graph = 'strict digraph {\n' + '\n'.join(sorted(deduplicated)) + '\n}'
|
|
|
|
print 'Writing report to %s...' % sys.argv[1]
|
|
path_count = len(out.splitlines())
|
|
with open(os.path.join(BASE_DIR, 'viz.js', 'viz.js')) as f:
|
|
viz_js = f.read()
|
|
with open(sys.argv[1], 'w') as f:
|
|
f.write(PREFIX % path_count)
|
|
f.write(graph)
|
|
f.write(SUFFIX % viz_js)
|
|
print 'Done.'
|
|
|
|
|
|
PREFIX = r'''<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Undesirable Dependencies</title>
|
|
</head>
|
|
<body>
|
|
<h1>Undesirable Dependencies</h1>
|
|
<h2>browser → webcore</h2>
|
|
<h3>%d paths</h3>
|
|
<script type="text/vnd.graphviz" id="graph">
|
|
'''
|
|
|
|
|
|
SUFFIX = r'''
|
|
</script>
|
|
<script>%s</script>
|
|
<div id="output">Rendering...</div>
|
|
<script>
|
|
setTimeout(function() {
|
|
document.getElementById("output").innerHTML =
|
|
Viz(document.getElementById("graph").innerHTML, "svg");
|
|
}, 1);
|
|
</script>
|
|
</body>
|
|
</html>
|
|
'''
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|