[PATCH v6 5/7] git-p4: check free space during streaming
- From
larsxschneider@gmail.com <larsxschneider@gmail.com>
- Date
- Sep 20, 2015, 20:26 UTC
- Message-ID
- <1442780787-65166-6-git-send-email-larsxschneider@gmail.com>
- In-Reply-To
- <1442780787-65166-1-git-send-email-larsxschneider@gmail.com>
From: Lars Schneider <larsxschneider@gmail.com>
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> --- git-p4.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/git-p4.py b/git-p4.py index e7a7ea4..b465356 100755 --- a/git-p4.py +++ b/git-p4.py @@ -104,6 +104,16 @@ def chdir(path, is_client_path=False): path = os.getcwd() os.environ['PWD'] = path +def calcDiskFree(dirname): + """Return free space in bytes on the disk of the given dirname.""" + if platform.system() == 'Windows': + free_bytes = ctypes.c_ulonglong(0) + ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes)) + return free_bytes.value + else: + st = os.statvfs(dirname) + return st.f_bavail * st.f_frsize + def die(msg): if verbose: raise Exception(msg) @@ -2038,6 +2048,14 @@ class P4Sync(Command, P4UserMap): self.clientSpecDirs = None self.tempBranches = [] self.tempBranchLocation = "git-p4-tmp" + self.largeFileSystem = None + self.cloneDestination = None + + if gitConfig('git-p4.largeFileSystem'): + largeFileSystemConstructor = globals()[gitConfig('git-p4.largeFileSystem')] + self.largeFileSystem = largeFileSystemConstructor( + lambda git_mode, relPath, contents: self.writeToGitStream(git_mode, relPath, contents) + ) if gitConfig("git-p4.syncFromOrigin") == "false": self.syncWithOrigin = False @@ -2256,6 +2274,14 @@ class P4Sync(Command, P4UserMap): if marshalled["code"] == "error": if "data" in marshalled: err = marshalled["data"].rstrip() + + if not err and self.cloneDestination and 'fileSize' in self.stream_file: + required_bytes = int((4 * int(self.stream_file["fileSize"])) - calcDiskFree(self.cloneDestination)) + if required_bytes > 0: + err = 'Not enough space left on %s! Free at least %i MB.' % ( + os.path.abspath(self.cloneDestination), required_bytes/1024/1024 + ) + if err: f = None if self.stream_have_file_info: @@ -3218,7 +3244,6 @@ class P4Clone(P4Sync): optparse.make_option("--bare", dest="cloneBare", action="store_true", default=False), ] - self.cloneDestination = None self.needsGit = False self.cloneBare = False
-- 2.5.1