mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[utils] locked_file: Do not truncate files before locking (#2994)
Authored by: jakeogh, pukkandan
This commit is contained in:
		| @@ -2222,10 +2222,23 @@ class locked_file(object): | ||||
|     locked = False | ||||
|  | ||||
|     def __init__(self, filename, mode, block=True, encoding=None): | ||||
|         assert mode in {'r', 'rb', 'a', 'ab', 'w', 'wb'} | ||||
|         self.f = open(filename, mode, encoding=encoding) | ||||
|         self.mode = mode | ||||
|         self.block = block | ||||
|         if mode not in {'r', 'rb', 'a', 'ab', 'w', 'wb'}: | ||||
|             raise NotImplementedError(mode) | ||||
|         self.mode, self.block = mode, block | ||||
|  | ||||
|         writable = any(f in mode for f in 'wax+') | ||||
|         readable = any(f in mode for f in 'r+') | ||||
|         flags = functools.reduce(operator.ior, ( | ||||
|             getattr(os, 'O_CLOEXEC', 0),  # UNIX only | ||||
|             getattr(os, 'O_BINARY', 0),  # Windows only | ||||
|             getattr(os, 'O_NOINHERIT', 0),  # Windows only | ||||
|             os.O_CREAT if writable else 0,  # O_TRUNC only after locking | ||||
|             os.O_APPEND if 'a' in mode else 0, | ||||
|             os.O_EXCL if 'x' in mode else 0, | ||||
|             os.O_RDONLY if not writable else os.O_RDWR if readable else os.O_WRONLY, | ||||
|         )) | ||||
|  | ||||
|         self.f = os.fdopen(os.open(filename, flags), mode, encoding=encoding) | ||||
|  | ||||
|     def __enter__(self): | ||||
|         exclusive = 'r' not in self.mode | ||||
| @@ -2235,6 +2248,8 @@ class locked_file(object): | ||||
|         except IOError: | ||||
|             self.f.close() | ||||
|             raise | ||||
|         if 'w' in self.mode: | ||||
|             self.f.truncate() | ||||
|         return self | ||||
|  | ||||
|     def unlock(self): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Justin Keogh
					Justin Keogh