diff --git a/tools/pretty-diff b/tools/pretty-diff new file mode 100755 index 0000000000000000000000000000000000000000..5ddeab0ac66030e6f0e1725329d35bcd6a92e24e --- /dev/null +++ b/tools/pretty-diff @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# Copyright (c) 2011 Code Aurora Forum. All rights reserved. +# Copyright (c) 2010 Google Inc. All rights reserved. +# Copyright (c) 2009 Apple Inc. All rights reserved. +# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org) +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# A tool for automating dealing with bugzilla, posting patches, committing patches, etc. + +import time +import urllib +import webbrowser + +from webkitpy.common.prettypatch import PrettyPatch +from webkitpy.common.system import logutils +from webkitpy.common.system.executive import Executive +from webkitpy.common.system.executive import ScriptError +from webkitpy.common.system.filesystem import FileSystem +from webkitpy.common.checkout.scm.detection import detect_scm_system + + +_log = logutils.get_logger(__file__) + + +def can_open_url(): + try: + webbrowser.get() + return True + except webbrowser.Error, e: + return False + +def open_url(url): + if not can_open_url(): + _log.warn("Failed to open %s" % url) + webbrowser.open(url) + +def show_pretty_diff(): + if not can_open_url(): + return None + + try: + pretty_patch = PrettyPatch(Executive()) + pretty_diff_file = pretty_patch.pretty_diff_file(diff()) + url = "file://%s" % urllib.quote(pretty_diff_file.name) + open_url(url) + # We return the pretty_diff_file here because we need to keep the + # file alive until the user has had a chance to confirm the diff. + return pretty_diff_file + except ScriptError, e: + _log.warning("PrettyPatch failed. :(") + except OSError, e: + _log.warning("PrettyPatch unavailable.") + +def diff(): + scm = detect_scm_system(FileSystem().getcwd()) + changed_files = scm.changed_files() + return scm.create_patch(None, changed_files=changed_files) + +def main(): + pretty_diff_file = show_pretty_diff() + # This is a terrible hack. Try to give enough time for the + # browser to actually load the file. + time.sleep(1) + if pretty_diff_file: + pretty_diff_file.close() + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + sys.exit(signal.SIGINT + 128) diff --git a/tools/webkitpy/common/checkout/scm/git.py b/tools/webkitpy/common/checkout/scm/git.py index 909bd8ccd1141df0c6b11d7e7a74f8ab3c85ffda..81971531f0a70152325fa2b97d211e0559408fc4 100644 --- a/tools/webkitpy/common/checkout/scm/git.py +++ b/tools/webkitpy/common/checkout/scm/git.py @@ -32,6 +32,10 @@ import logging import os import re +# This import isn't used, but it's needed for the +# path_to_module('webkitpy.common.config') call in create_patch. +import webkitpy.common.config + from webkitpy.common.checkout.scm.scm import SCM from webkitpy.common.memoized import memoized from webkitpy.common.system.executive import Executive, ScriptError