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