#!/usr/bin/env python # Copyright (C) 2013 Igalia S.L. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA import difflib import optparse import shutil import sys def check_api(options, from_file, to_file): from_lines = open(from_file, 'r').readlines() from_lines.sort() to_lines = open(to_file, 'r').readlines() to_lines.sort() diff = difflib.unified_diff(from_lines, to_lines) diff_out = "" failed = False for line in diff: # Ignore initial lines since we don't use from/file filenames. if line.startswith('+++') or line.startswith('---'): continue diff_out += line if line[0] == '-': failed = True if diff_out: if failed: sys.stderr.write("API incompatibility detected in GObject DOM bindings\n") sys.stderr.write(diff_out) # This test can give false positives because the GObject # DOM bindings API varies depending on the compilation options. # So this shouldn't be made fatal until we figure out a way to handle it. # See https://bugs.webkit.org/show_bug.cgi?id=121481 return 0 if options.reset_results: sys.stdout.write("Reset results: %s\n" % from_file) shutil.copyfile(to_file, from_file) else: sys.stdout.write("API compatible changes found in GObject DOM bindings\n") sys.stdout.write("To update the symbols file, execute %s --reset-results %s DerivedSources/webkitdom/webkitdom.symbols\n" % (sys.argv[0], from_file)) sys.stdout.write(diff_out) return 0 option_parser = optparse.OptionParser(usage='usage: %prog [options] FROM_FILE TO_FILE') option_parser.add_option('--reset-results', action='store_true', dest='reset_results') options, args = option_parser.parse_args() sys.exit(check_api(options, args[0], args[1]))