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

Unified Diff: chrome/browser/resources/vulcanize_gn.py

Issue 2674553002: MD WebUI: attempt to clean up file paths on vulcanize+Windows (Closed)
Patch Set: depfile, +x Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/vulcanize_gn.py
diff --git a/chrome/browser/resources/vulcanize_gn.py b/chrome/browser/resources/vulcanize_gn.py
index 9189330863c0d3d6734c2da8ac7b9669d6c06cea..d492678b17a239e90c8cebfba857fc0e1755704a 100755
--- a/chrome/browser/resources/vulcanize_gn.py
+++ b/chrome/browser/resources/vulcanize_gn.py
@@ -15,7 +15,7 @@ import tempfile
_HERE_PATH = os.path.dirname(__file__)
_SRC_PATH = os.path.normpath(os.path.join(_HERE_PATH, '..', '..', '..'))
-_CWD = os.getcwd()
+_CWD = os.getcwd() # NOTE(dbeam): this is typically out/<gn_name>/.
sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'node'))
import node
@@ -96,6 +96,7 @@ def _undo_mapping(mappings, url):
for (redirect_url, file_path) in mappings:
if url.startswith(redirect_url):
return url.replace(redirect_url, file_path + os.sep)
+ # TODO(dbeam): can we make this stricter?
return url
@@ -106,8 +107,22 @@ def _update_dep_file(in_folder, args):
out_path = os.path.join(_CWD, args.out_folder)
# Prior call to vulcanize already generated the deps list, grab it from there.
- request_list = open(os.path.join(
- out_path, _REQUEST_LIST_FILE), 'r').read().splitlines()
+ request_list_path = os.path.join(out_path, _REQUEST_LIST_FILE)
+ request_list = open(request_list_path, 'r').read().splitlines()
+
+ if platform.system() == 'Windows':
+ # TODO(dbeam): UGH. For some reason Vulcanize is interpreting the target
+ # file path as a URL and using the drive letter (e.g. D:\) as a protocol.
+ # This is a little insane, but we're fixing here by normalizing case (which
+ # really shouldn't matter, these are all file paths and generally are all
+ # lower case) and writing from / to \ (file path) and then back again. This
+ # is compounded by NodeJS having a bug in url.resolve() that handles
+ # chrome:// protocol URLs poorly as well as us using startswith() to strip
+ # file paths (which isn't crazy awesome either). Don't remove unless you
+ # really really know what you're doing.
+ norm = lambda u: u.lower().replace('/', '\\')
+ request_list = [norm(u).replace(norm(in_path), '').replace('\\', '/')
+ for u in request_list]
# Undo the URL mappings applied by vulcanize to get file paths relative to
# current working directory.
@@ -116,21 +131,18 @@ def _update_dep_file(in_folder, args):
('chrome://%s/' % args.host, os.path.relpath(in_path, _CWD)),
]
- dependencies = map(
- lambda url: _undo_mapping(url_mappings, url), request_list)
+ deps = [_undo_mapping(url_mappings, u) for u in request_list]
+ deps = map(os.path.normpath, deps)
# If the input was a .pak file, the generated depfile should not list files
# already in the .pak file.
- filtered_dependencies = dependencies
- if (args.input_type == 'PAK_FILE'):
+ if args.input.endswith('.pak'):
filter_url = os.path.join(args.out_folder, _PAK_UNPACK_FOLDER)
- filtered_dependencies = filter(
- lambda url: not url.startswith(filter_url), dependencies)
+ deps = [d for d in deps if not d.startswith(filter_url)]
with open(os.path.join(_CWD, args.depfile), 'w') as f:
- f.write(os.path.join(
- args.out_folder, args.html_out_file) + ': ' + ' '.join(
- filtered_dependencies))
+ deps_file_header = os.path.join(args.out_folder, args.html_out_file)
+ f.write(deps_file_header + ': ' + ' '.join(deps))
def _vulcanize(in_folder, args):
@@ -157,6 +169,8 @@ def _vulcanize(in_folder, args):
if args.insert_in_head:
assert '<head>' in output
+ # NOTE(dbeam): Vulcanize eats <base> tags after processing. This undoes
+ # that by adding a <base> tag to the (post-processed) generated output.
output = output.replace('<head>', '<head>' + args.insert_in_head)
with tempfile.NamedTemporaryFile(mode='wt+', delete=False) as tmp:
@@ -180,30 +194,35 @@ def _vulcanize(in_folder, args):
def _css_build(out_folder, files):
out_path = os.path.join(_CWD, out_folder)
- paths = map(lambda f: os.path.join(out_path, f), files)
+ paths = [os.path.join(out_path, f) for f in files]
_run_node([node_modules.PathToPolymerCssBuild()] + paths)
-def main():
+def main(argv):
parser = argparse.ArgumentParser()
- parser.add_argument('--depfile')
- parser.add_argument('--host')
- parser.add_argument('--html_in_file')
- parser.add_argument('--html_out_file')
- parser.add_argument('--input')
- parser.add_argument('--input_type')
+ parser.add_argument('--depfile', required=True)
+ parser.add_argument('--host', required=True)
+ parser.add_argument('--html_in_file', required=True)
+ parser.add_argument('--html_out_file', required=True)
+ parser.add_argument('--input', required=True)
parser.add_argument('--insert_in_head')
- parser.add_argument('--js_out_file')
- parser.add_argument('--out_folder')
- args = parser.parse_args()
+ parser.add_argument('--js_out_file', required=True)
+ parser.add_argument('--out_folder', required=True)
+ args = parser.parse_args(argv)
+
+ # NOTE(dbeam): on Windows, GN can send dirs/like/this. When joined, you might
+ # get dirs/like/this\file.txt. This looks odd to windows. Normalize to right
+ # the slashes.
+ args.depfile = os.path.normpath(args.depfile)
args.input = os.path.normpath(args.input)
+ args.out_folder = os.path.normpath(args.out_folder)
vulcanize_input_folder = args.input
# If a .pak file was specified, unpack that file first and pass the output to
# vulcanize.
- if (args.input_type == 'PAK_FILE'):
+ if args.input.endswith('.pak'):
import unpack_pak
input_folder = os.path.join(_CWD, args.input)
output_folder = os.path.join(args.out_folder, _PAK_UNPACK_FOLDER)
@@ -217,4 +236,4 @@ def main():
if __name__ == '__main__':
- main()
+ main(sys.argv[1:])

Powered by Google App Engine
This is Rietveld 408576698