Serhiy Storchaka | cf4a2f2 | 2015-03-11 17:18:03 +0200 | [diff] [blame] | 1 | from builtins import open as _orig_open |
Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 2 | |
Serhiy Storchaka | 53c3fb1 | 2015-03-20 09:21:59 +0200 | [diff] [blame^] | 3 | def open(file, mode='r', bufsize=-1): |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 4 | if 'w' not in mode: |
| 5 | return _orig_open(file, mode, bufsize) |
Serhiy Storchaka | 53c3fb1 | 2015-03-20 09:21:59 +0200 | [diff] [blame^] | 6 | import os |
| 7 | backup = file + '~' |
| 8 | try: |
| 9 | os.unlink(backup) |
| 10 | except OSError: |
| 11 | pass |
| 12 | try: |
| 13 | os.rename(file, backup) |
| 14 | except OSError: |
| 15 | return _orig_open(file, mode, bufsize) |
| 16 | f = _orig_open(file, mode, bufsize) |
| 17 | _orig_close = f.close |
| 18 | def close(): |
| 19 | _orig_close() |
| 20 | import filecmp |
| 21 | if filecmp.cmp(backup, file, shallow=False): |
| 22 | import os |
| 23 | os.unlink(file) |
| 24 | os.rename(backup, file) |
| 25 | f.close = close |
| 26 | return f |