git-p4: Support purged files and optimize memory usage

Purged files are handled as if they are merely deleted, which is not
entirely optimal, but I don't know of any other way to handle them.
File data is deleted from memory as early as they can, and they are more
efficiently handled, at (significant) cost to CPU usage.

Still need to handle p4 branches with spaces in their names.
Still need to make git-p4 clone more reliable.
 - Perhaps with a --continue option. (Sometimes the p4 server kills
 the connection)

Signed-off-by: John Chapman <thestar@fussycoder.id.au>
Acked-by: Simon Hausmann <simon@lst.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
John Chapman 2008-11-08 14:22:48 +11:00 committed by Junio C Hamano
parent 42fc1139a0
commit 7f96e2e25a

View File

@ -946,7 +946,7 @@ class P4Sync(Command):
if includeFile: if includeFile:
filesForCommit.append(f) filesForCommit.append(f)
if f['action'] != 'delete': if f['action'] not in ('delete', 'purge'):
filesToRead.append(f) filesToRead.append(f)
filedata = [] filedata = []
@ -965,11 +965,11 @@ class P4Sync(Command):
while j < len(filedata): while j < len(filedata):
stat = filedata[j] stat = filedata[j]
j += 1 j += 1
text = []; text = ''
while j < len(filedata) and filedata[j]['code'] in ('text', 'unicode', 'binary'): while j < len(filedata) and filedata[j]['code'] in ('text', 'unicode', 'binary'):
text.append(filedata[j]['data']) text += filedata[j]['data']
del filedata[j]['data']
j += 1 j += 1
text = ''.join(text)
if not stat.has_key('depotFile'): if not stat.has_key('depotFile'):
sys.stderr.write("p4 print fails with: %s\n" % repr(stat)) sys.stderr.write("p4 print fails with: %s\n" % repr(stat))
@ -1038,7 +1038,7 @@ class P4Sync(Command):
continue continue
relPath = self.stripRepoPath(file['path'], branchPrefixes) relPath = self.stripRepoPath(file['path'], branchPrefixes)
if file["action"] == "delete": if file["action"] in ("delete", "purge"):
self.gitStream.write("D %s\n" % relPath) self.gitStream.write("D %s\n" % relPath)
else: else:
data = file['data'] data = file['data']
@ -1077,7 +1077,7 @@ class P4Sync(Command):
cleanedFiles = {} cleanedFiles = {}
for info in files: for info in files:
if info["action"] == "delete": if info["action"] in ("delete", "purge"):
continue continue
cleanedFiles[info["depotFile"]] = info["rev"] cleanedFiles[info["depotFile"]] = info["rev"]
@ -1400,7 +1400,7 @@ class P4Sync(Command):
if change > newestRevision: if change > newestRevision:
newestRevision = change newestRevision = change
if info["action"] == "delete": if info["action"] in ("delete", "purge"):
# don't increase the file cnt, otherwise details["depotFile123"] will have gaps! # don't increase the file cnt, otherwise details["depotFile123"] will have gaps!
#fileCnt = fileCnt + 1 #fileCnt = fileCnt + 1
continue continue