From fdfd7c60f9e523a9cffc3c3bed5bb2d1425b4e7d Mon Sep 17 00:00:00 2001 From: Ojan Vafai Date: Fri, 20 Feb 2015 21:01:04 -0800 Subject: [PATCH] Add a dedicated pretty-diff command. This will let us delete webkit-patch and a bunch of python code and it will save me some annoyance at needing to type "webkit-patch pretty-diff" all the time. R=abarth@chromium.org Review URL: https://codereview.chromium.org/944193003 --- engine/src/flutter/tools/pretty-diff | 96 ++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 engine/src/flutter/tools/pretty-diff diff --git a/engine/src/flutter/tools/pretty-diff b/engine/src/flutter/tools/pretty-diff new file mode 100755 index 0000000000..5ddeab0ac6 --- /dev/null +++ b/engine/src/flutter/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)