Skip to content

Commit

Permalink
git-p4: input to "p4 files" by stdin instead of arguments
Browse files Browse the repository at this point in the history
This approach, suggested by Alex Riesen, bypasses the need for xargs-style
argument list handling. The handling in question looks broken in a corner
case with SC_ARG_MAX=4096 and final argument over 96 characters.

Signed-off-by: Scott Lamb <slamb@slamb.org>
Signed-off-by: Simon Hausmann <simon@lst.de>
  • Loading branch information
Scott Lamb authored and Simon Hausmann committed Jul 17, 2007
1 parent 9f90c73 commit 7880019
Showing 1 changed file with 7 additions and 21 deletions.
28 changes: 7 additions & 21 deletions contrib/fast-import/git-p4
Original file line number Diff line number Diff line change
Expand Up @@ -725,27 +725,13 @@ class P4Sync(Command):
if not files:
return

# 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/
if (self.isWindows):
argmax = 2000
else:
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 = ''
filedata = p4CmdList('-x - print',
stdin='\n'.join(['%s#%s' % (f['path'], f['rev'])
for f in files]),
stdin_mode='w+')
if "p4ExitCode" in filedata[0]:
die("Problems executing p4. Error: [%d]."
% (filedata[0]['p4ExitCode']));

j = 0;
contents = {}
Expand Down

0 comments on commit 7880019

Please sign in to comment.