15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/env python
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2011 Google Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#         * Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#         * Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#         * Neither the name of Google Inc. nor the names of its
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# contributors may be used to endorse or promote products derived from
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"""Creates a grd file for packaging the inspector files."""
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from __future__ import with_statement
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import errno
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import os
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import shutil
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import sys
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from xml.dom import minidom
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)kDevToolsResourcePrefix = 'IDR_DEVTOOLS_'
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)kGrdTemplate = '''<?xml version="1.0" encoding="UTF-8"?>
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)<grit latest_public_release="0" current_release="1">
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  <outputs>
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    <output filename="grit/devtools_resources.h" type="rc_header">
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      <emit emit_type='prepend'></emit>
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    </output>
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    <output filename="grit/devtools_resources_map.cc" type="resource_file_map_source" />
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    <output filename="grit/devtools_resources_map.h" type="resource_map_header" />
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    <output filename="devtools_resources.pak" type="data_package" />
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  </outputs>
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  <release seq="1">
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    <includes></includes>
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  </release>
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)</grit>
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)'''
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ParsedArgs:
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def __init__(self, source_files, image_dirs, output_filename):
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.source_files = source_files
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.image_dirs = image_dirs
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.output_filename = output_filename
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def parse_args(argv):
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    images_position = argv.index('--images')
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    output_position = argv.index('--output')
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    source_files = argv[:images_position]
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    image_dirs = argv[images_position + 1:output_position]
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ParsedArgs(source_files, image_dirs, argv[output_position + 1])
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def make_name_from_filename(filename):
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (filename.replace('/', '_')
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    .replace('\\', '_')
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    .replace('.', '_')).upper()
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def add_file_to_grd(grd_doc, filename):
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    includes_node = grd_doc.getElementsByTagName('includes')[0]
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    includes_node.appendChild(grd_doc.createTextNode('\n      '))
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new_include_node = grd_doc.createElement('include')
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new_include_node.setAttribute('name', make_name_from_filename(filename))
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new_include_node.setAttribute('file', filename)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    new_include_node.setAttribute('type', 'BINDATA')
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    includes_node.appendChild(new_include_node)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def main(argv):
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parsed_args = parse_args(argv[1:])
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    doc = minidom.parseString(kGrdTemplate)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    output_directory = os.path.dirname(parsed_args.output_filename)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try:
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.makedirs(os.path.join(output_directory, 'Images'))
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    except OSError, e:
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if e.errno != errno.EEXIST:
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            raise e
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for filename in parsed_args.source_files:
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        shutil.copy(filename, output_directory)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        add_file_to_grd(doc, os.path.basename(filename))
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for dirname in parsed_args.image_dirs:
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for filename in os.listdir(dirname):
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if not filename.endswith('.png') and not filename.endswith('.gif'):
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            shutil.copy(os.path.join(dirname, filename),
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        os.path.join(output_directory, 'Images'))
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            add_file_to_grd(doc, os.path.join('Images', filename))
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    with open(parsed_args.output_filename, 'w') as output_file:
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        output_file.write(doc.toxml(encoding='UTF-8'))
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if __name__ == '__main__':
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sys.exit(main(sys.argv))
122