forked from php/php-src
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshared.php
72 lines (58 loc) · 1.84 KB
/
shared.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
class ProcessResult {
public $stdout;
public $stderr;
}
function runCommand(array $args, ?string $cwd = null): ProcessResult {
$cmd = implode(' ', array_map('escapeshellarg', $args));
$pipes = null;
$result = new ProcessResult();
$descriptorSpec = [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w']];
fwrite(STDOUT, "> $cmd\n");
$processHandle = proc_open($cmd, $descriptorSpec, $pipes, $cwd ?? getcwd(), null);
$stdin = $pipes[0];
$stdout = $pipes[1];
$stderr = $pipes[2];
fclose($stdin);
stream_set_blocking($stdout, false);
stream_set_blocking($stderr, false);
$stdoutEof = false;
$stderrEof = false;
do {
$read = [$stdout, $stderr];
$write = null;
$except = null;
stream_select($read, $write, $except, 1, 0);
foreach ($read as $stream) {
$chunk = fgets($stream);
if ($stream === $stdout) {
$result->stdout .= $chunk;
} elseif ($stream === $stderr) {
$result->stderr .= $chunk;
}
}
$stdoutEof = $stdoutEof || feof($stdout);
$stderrEof = $stderrEof || feof($stderr);
} while(!$stdoutEof || !$stderrEof);
fclose($stdout);
fclose($stderr);
$statusCode = proc_close($processHandle);
if ($statusCode !== 0) {
fwrite(STDOUT, $result->stdout);
fwrite(STDERR, $result->stderr);
fwrite(STDERR, 'Exited with status code ' . $statusCode . "\n");
exit($statusCode);
}
return $result;
}
function cloneRepo(string $path, string $url) {
if (is_dir($path)) {
return;
}
$dir = dirname($path);
$repo = basename($path);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
runCommand(['git', 'clone', '-q', '--end-of-options', $url, $repo], dirname($path));
}