68c2fb7f504de3e27d068ebb13ced5ad3580dd52
[WebKit-https.git] / Tools / Scripts / webkitpy / to_be_moved / update_webgl_conformance_tests.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2010 Google Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26 import glob
27 import logging
28 import optparse
29 import os
30 import re
31 import sys
32 from webkitpy.common.checkout import scm
33 from webkitpy.common.system.filesystem import FileSystem
34 from webkitpy.common.system.executive import Executive
35
36
37 _log = logging.getLogger(__name__)
38
39
40 def remove_first_line_comment(text):
41     return re.compile(r'^<!--.*?-->\s*', re.DOTALL).sub('', text)
42
43
44 def translate_includes(text):
45     # Mapping of single filename to relative path under WebKit root.
46     # Assumption: these filenames are globally unique.
47     include_mapping = {
48         "js-test-style.css": "../../js/resources",
49         "js-test-pre.js": "../../js/resources",
50         "js-test-post.js": "../../js/resources",
51         "desktop-gl-constants.js": "resources",
52     }
53
54     for filename, path in include_mapping.items():
55         search = r'(?:[^"\'= ]*/)?' + re.escape(filename)
56         # We use '/' instead of os.path.join in order to produce consistent
57         # output cross-platform.
58         replace = path + '/' + filename
59         text = re.sub(search, replace, text)
60
61     return text
62
63
64 def translate_khronos_test(text):
65     """
66     This method translates the contents of a Khronos test to a WebKit test.
67     """
68
69     translateFuncs = [
70         remove_first_line_comment,
71         translate_includes,
72     ]
73
74     for f in translateFuncs:
75         text = f(text)
76
77     return text
78
79
80 def update_file(in_filename, out_dir):
81     # check in_filename exists
82     # check out_dir exists
83     out_filename = os.path.join(out_dir, os.path.basename(in_filename))
84
85     _log.debug("Processing " + in_filename)
86     with open(in_filename, 'r') as in_file:
87         with open(out_filename, 'w') as out_file:
88             out_file.write(translate_khronos_test(in_file.read()))
89
90
91 def update_directory(in_dir, out_dir):
92     for filename in glob.glob(os.path.join(in_dir, '*.html')):
93         update_file(os.path.join(in_dir, filename), out_dir)
94
95
96 def default_out_dir():
97     detector = scm.SCMDetector(FileSystem(), Executive())
98     current_scm = detector.detect_scm_system(os.path.dirname(sys.argv[0]))
99     if not current_scm:
100         return os.getcwd()
101     root_dir = current_scm.checkout_root
102     if not root_dir:
103         return os.getcwd()
104     out_dir = os.path.join(root_dir, "LayoutTests/fast/canvas/webgl")
105     if os.path.isdir(out_dir):
106         return out_dir
107     return os.getcwd()
108
109
110 def configure_logging(options):
111     """Configures the logging system."""
112     log_fmt = '%(levelname)s: %(message)s'
113     log_datefmt = '%y%m%d %H:%M:%S'
114     log_level = logging.INFO
115     if options.verbose:
116         log_fmt = ('%(asctime)s %(filename)s:%(lineno)-4d %(levelname)s '
117                    '%(message)s')
118         log_level = logging.DEBUG
119     logging.basicConfig(level=log_level, format=log_fmt,
120                         datefmt=log_datefmt)
121
122
123 def option_parser():
124     usage = "usage: %prog [options] (input file or directory)"
125     parser = optparse.OptionParser(usage=usage)
126     parser.add_option('-v', '--verbose',
127                              action='store_true',
128                              default=False,
129                              help='include debug-level logging')
130     parser.add_option('-o', '--output',
131                              action='store',
132                              type='string',
133                              default=default_out_dir(),
134                              metavar='DIR',
135                              help='specify an output directory to place files '
136                                   'in [default: %default]')
137     return parser
138
139
140 def main():
141     parser = option_parser()
142     (options, args) = parser.parse_args()
143     configure_logging(options)
144
145     if len(args) == 0:
146         _log.error("Must specify an input directory or filename.")
147         parser.print_help()
148         return 1
149
150     in_name = args[0]
151     if os.path.isfile(in_name):
152         update_file(in_name, options.output)
153     elif os.path.isdir(in_name):
154         update_directory(in_name, options.output)
155     else:
156         _log.error("'%s' is not a directory or a file.", in_name)
157         return 2
158
159     return 0
160
161
162 if __name__ == "__main__":
163     sys.exit(main())