| #!/usr/bin/env python |
| # |
| # Copyright (c) 2015 Apple Inc. All rights reserved. |
| # Copyright (c) 2009 Google Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. 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. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 writer that only updates file if it actually changed. |
| |
| import os |
| |
| class LazyFileWriter: |
| def __init__(self, filepath, force_output): |
| self._filepath = filepath |
| self._output = "" |
| self.force_output = force_output |
| |
| def write(self, text): |
| self._output += text |
| |
| def close(self): |
| text_changed = True |
| self._output = self._output.rstrip() + "\n" |
| |
| try: |
| if self.force_output: |
| raise |
| |
| read_file = open(self._filepath, "r") |
| old_text = read_file.read() |
| read_file.close() |
| text_changed = old_text != self._output |
| except: |
| # Ignore, just overwrite by default |
| pass |
| |
| if text_changed or self.force_output: |
| dirname = os.path.dirname(self._filepath) |
| if not os.path.isdir(dirname): |
| os.makedirs(dirname) |
| out_file = open(self._filepath, "w") |
| out_file.write(self._output) |
| out_file.close() |