Skip to content

Commit

Permalink
git-p4 fails when cloning a p4 depo.
Browse files Browse the repository at this point in the history
A perforce command with all the files in the repo is generated to get
all the file content.
Here is a patch to break it into multiple successive perforce command
who uses 4K of parameter max, and collect the output for later.

It works, but not for big depos, because the whole perforce depo
content is stored in memory in P4Sync.run(), and it looks like mine is
bigger than 2 Gigs, so I had to kill the process.

[Simon: I added the bit about using SC_ARG_MAX, as suggested by Han-Wen]

Signed-off-by: Benjamin Sergeant <bsergean@gmail.com>
Signed-off-by: Simon Hausmann <simon@lst.de>
  • Loading branch information
Benjamin Sergeant authored and Simon Hausmann committed Jun 16, 2007
1 parent 3c69964 commit da4a660
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions contrib/fast-import/git-p4
Original file line number Diff line number Diff line change
Expand Up @@ -711,9 +711,23 @@ class P4Sync(Command):
if not files:
return

filedata = p4CmdList('print %s' % ' '.join(['"%s#%s"' % (f['path'],
f['rev'])
for f in files]))
# We cannot put all the files on the command line
# OS have limitations on the max lenght of arguments
# POSIX says it's 4096 bytes, default for Linux seems to be 130 K.
# and all OS from the table below seems to be higher than POSIX.
# See http://www.in-ulm.de/~mascheck/various/argmax/
argmax = min(4000, os.sysconf('SC_ARG_MAX'))
chunk = ''
filedata = []
for i in xrange(len(files)):
f = files[i]
chunk += '"%s#%s" ' % (f['path'], f['rev'])
if len(chunk) > argmax or i == len(files)-1:
data = p4CmdList('print %s' % chunk)
if "p4ExitCode" in data[0]:
die("Problems executing p4. Error: [%d]." % (data[0]['p4ExitCode']));
filedata.extend(data)
chunk = ''

j = 0;
contents = {}
Expand Down

0 comments on commit da4a660

Please sign in to comment.