mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-20 13:52:40 +01:00
Fix --depth N
clones in Git
Summary: Ref T2230. Fixes T4079. As it turns out, this is Git being weird. See comments for some detials about what's going on here. Test Plan: Created shallow and deep Git clones. Reviewers: hach-que, btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4079, T2230 Differential Revision: https://secure.phabricator.com/D7554
This commit is contained in:
parent
dc7f716156
commit
ac7c739226
1 changed files with 30 additions and 0 deletions
|
@ -328,6 +328,14 @@ final class DiffusionServeController extends DiffusionController {
|
||||||
->write($input)
|
->write($input)
|
||||||
->resolve();
|
->resolve();
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
if ($this->isValidGitShallowCloneResponse($stdout, $stderr)) {
|
||||||
|
// Ignore the error if the response passes this special check for
|
||||||
|
// validity.
|
||||||
|
$err = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($err) {
|
if ($err) {
|
||||||
return new PhabricatorVCSResponse(
|
return new PhabricatorVCSResponse(
|
||||||
500,
|
500,
|
||||||
|
@ -512,5 +520,27 @@ final class DiffusionServeController extends DiffusionController {
|
||||||
return implode('', $out);
|
return implode('', $out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function isValidGitShallowCloneResponse($stdout, $stderr) {
|
||||||
|
// If you execute `git clone --depth N ...`, git sends a request which
|
||||||
|
// `git-http-backend` responds to by emitting valid output and then exiting
|
||||||
|
// with a failure code and an error message. If we ignore this error,
|
||||||
|
// everything works.
|
||||||
|
|
||||||
|
// This is a pretty funky fix: it would be nice to more precisely detect
|
||||||
|
// that a request is a `--depth N` clone request, but we don't have any code
|
||||||
|
// to decode protocol frames yet. Instead, look for reasonable evidence
|
||||||
|
// in the error and output that we're looking at a `--depth` clone.
|
||||||
|
|
||||||
|
// For evidence this isn't completely crazy, see:
|
||||||
|
// https://github.com/schacon/grack/pull/7
|
||||||
|
|
||||||
|
$stdout_regexp = '(^Content-Type: application/x-git-upload-pack-result)m';
|
||||||
|
$stderr_regexp = '(The remote end hung up unexpectedly)';
|
||||||
|
|
||||||
|
$has_pack = preg_match($stdout_regexp, $stdout);
|
||||||
|
$is_hangup = preg_match($stderr_regexp, $stderr);
|
||||||
|
|
||||||
|
return $has_pack && $is_hangup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue