git-p4: check free space during streaming

git-p4 will just halt if there is not enough disk space while streaming content from P4 to Git. Add a check to ensure at least 4 times (arbitrarily chosen) the size of a streamed file is available. Signed-off-by: Lars Schneider <larsxschneider@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Lars Schneider committed Sep 26, 2015 at 09:55 UTC 4d25dc4475639395b4c567d947218613de359f09
1 file changed +18
git-p4.py
+18
@@ -104,6 +104,16 @@ def chdir(path, is_client_path=False):
104 path = os.getcwd()
105 os.environ['PWD'] = path
106
107 +def calcDiskFree():
108 + """Return free space in bytes on the disk of the given dirname."""
109 + if platform.system() == 'Windows':
110 + free_bytes = ctypes.c_ulonglong(0)
111 + ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(os.getcwd()), None, None, ctypes.pointer(free_bytes))
112 + return free_bytes.value
113 + else:
114 + st = os.statvfs(os.getcwd())
115 + return st.f_bavail * st.f_frsize
116 +
117 def die(msg):
118 if verbose:
119 raise Exception(msg)
@@ -2263,6 +2273,14 @@ class P4Sync(Command, P4UserMap):
2273 if marshalled["code"] == "error":
2274 if "data" in marshalled:
2275 err = marshalled["data"].rstrip()
2276 +
2277 + if not err and 'fileSize' in self.stream_file:
2278 + required_bytes = int((4 * int(self.stream_file["fileSize"])) - calcDiskFree())
2279 + if required_bytes > 0:
2280 + err = 'Not enough space left on %s! Free at least %i MB.' % (
2281 + os.getcwd(), required_bytes/1024/1024
2282 + )
2283 +
2284 if err:
2285 f = None
2286 if self.stream_have_file_info: