3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
7 ''' Generates a deps.js file based on an input list of javascript files using
8 Closure style provide/require calls.
15 from jsbundler
import PathRewriter
17 _SCRIPT_DIR
= os
.path
.realpath(os
.path
.dirname(__file__
))
18 _CHROME_SOURCE
= os
.path
.realpath(
19 os
.path
.join(_SCRIPT_DIR
, *[os
.path
.pardir
] * 6))
20 sys
.path
.insert(0, os
.path
.join(
21 _CHROME_SOURCE
, ('chrome/third_party/chromevox/third_party/' +
22 'closure-library/closure/bin/build')))
26 def _HasSameContent(filename
, content
):
27 '''Returns true if the given file is readable and has the given content.'''
29 with
open(filename
) as file:
30 return file.read() == content
32 # Ignore all errors and fall back on a safe bet.
37 parser
= optparse
.OptionParser(description
=__doc__
)
38 parser
.add_option('-w', '--rewrite_prefix', action
='append', default
=[],
39 dest
='prefix_map', metavar
='SPEC',
40 help=('Two path prefixes, separated by colons ' +
41 'specifying that a file whose (relative) path ' +
42 'name starts with the first prefix should have ' +
43 'that prefix replaced by the second prefix to ' +
44 'form a path relative to the output directory. ' +
45 'The resulting path is used in the deps mapping ' +
46 'file path to a list of provided and required ' +
48 parser
.add_option('-o', '--output_file', action
='store', default
=[],
50 help=('Where to output the generated deps file.'))
51 options
, args
= parser
.parse_args()
53 path_rewriter
= PathRewriter(options
.prefix_map
)
57 js_deps
= source
.Source(source
.GetFileContents(path
))
58 path
= path_rewriter
.RewritePath(path
)
59 content
+= 'goog.addDependency(\'%s\', %s, %s);\n' % (
60 path
, sorted(js_deps
.provides
), sorted(js_deps
.requires
))
61 if _HasSameContent(options
.output_file
, content
):
63 # Write the generated deps file.
64 with
open(options
.output_file
, 'w') as output
:
67 if __name__
== '__main__':