Rework the way IDF's SCM interface provides downloadable snapshots.

Instead of returning a command which gets executed and which should
pass through / stream its output data to the client, we're just
returning an instance of Pluf_HTTP_Response. This is needed, because
some SCMs, most noticable monotone, have no locally executable command
to provide a snapshot archive (and probably never will for our kind
of setup).

We therefor added a little BSD-licensed class "ZipArchive" which allows
the creation of pkzip-compatible archives on the fly by letting it eat
the file contents directly feed from the (remote) stdio instance.
Download performance is ok and lies between 15K/s and 110K/s, but at
least we do no longer block the browser while we pre-generate the zip
file server-side.

Thanks to Patrick Georgi for all his work!
This commit is contained in:
Thomas Keller
2010-10-30 21:52:40 +00:00
parent 8a55952204
commit fe001abd26
13 changed files with 3875 additions and 15 deletions

View File

@@ -547,13 +547,14 @@ class IDF_Scm_Git extends IDF_Scm
return $res;
}
public function getArchiveCommand($commit, $prefix='repository/')
public function getArchiveStream($commit, $prefix='repository/')
{
return sprintf(Pluf::f('idf_exec_cmd_prefix', '').
$cmd = sprintf(Pluf::f('idf_exec_cmd_prefix', '').
'GIT_DIR=%s '.Pluf::f('git_path', 'git').' archive --format=zip --prefix=%s %s',
escapeshellarg($this->repo),
escapeshellarg($prefix),
escapeshellarg($commit));
return new Pluf_HTTP_Response_CommandPassThru($cmd, 'application/x-zip');
}
/*
@@ -806,4 +807,4 @@ class IDF_Scm_Git extends IDF_Scm
}
return false;
}
}
}