1cf4a2f29adb6bdae0b18e983250d7c48d486c9d6Serhiy Storchakafrom builtins import open as _orig_open
2baf0603493f6f1eee073a479497291785b067f61Guido van Rossum
353c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchakadef open(file, mode='r', bufsize=-1):
4182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    if 'w' not in mode:
5182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return _orig_open(file, mode, bufsize)
653c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    import os
753c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    backup = file + '~'
853c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    try:
953c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        os.unlink(backup)
1053c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    except OSError:
1153c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        pass
1253c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    try:
1353c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        os.rename(file, backup)
1453c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    except OSError:
1553c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        return _orig_open(file, mode, bufsize)
1653c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    f = _orig_open(file, mode, bufsize)
1753c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    _orig_close = f.close
1853c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    def close():
1953c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        _orig_close()
2053c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        import filecmp
2153c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka        if filecmp.cmp(backup, file, shallow=False):
2253c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka            import os
2353c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka            os.unlink(file)
2453c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka            os.rename(backup, file)
2553c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    f.close = close
2653c3fb186a587e01f88ec9c6b365fd614668d214Serhiy Storchaka    return f
27