File: shared.php

package info (click to toggle)
php8.4 8.4.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 208,108 kB
  • sloc: ansic: 1,060,628; php: 35,345; sh: 11,866; cpp: 7,201; pascal: 4,913; javascript: 3,091; asm: 2,810; yacc: 2,411; makefile: 689; xml: 446; python: 301; awk: 148
file content (74 lines) | stat: -rw-r--r-- 1,946 bytes parent folder | download
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
73
74
<?php

class ProcessResult {
    public $stdout;
    public $stderr;
}

function runCommand(array $args, ?string $cwd = null, bool $printCommand = true): ProcessResult {
    $cmd = implode(' ', array_map('escapeshellarg', $args));
    $pipes = null;
    $result = new ProcessResult();
    $descriptorSpec = [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w']];
    if ($printCommand) {
        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));
}