function retryUpload()

in build/gh-release.php [104:164]


function retryUpload($client, $uploadClient, $owner, $repo, $releaseBody, $uploadUrl, $filename)
{
    $isSuccessful = false;
    $attempts = 0;
    $filetype = substr($filename, strpos($filename, '.') + 1);

    while (!$isSuccessful && $attempts < MAX_ATTEMPTS) {
        try {
            $attempts++;
            $response = $uploadClient->post("{$uploadUrl}/assets?name={$filename}", [
                'headers' => ['Content-Type' => "application/{$filetype}"],
                'body'    => Psr7\Utils::tryFopen(__DIR__ . "/artifacts/{$filename}", 'r')
            ]);
            echo "{$filename} uploaded to: " . json_decode($response->getBody(), true)['browser_download_url'] . "\n";
            $isSuccessful = true;
        } catch (\GuzzleHttp\Exception\ServerException $e) {
            echo "{$filename} failed to upload:\n";
            var_dump($e->getMessage());

            // Fetch and inspect assets for failed downloads
            $response = $client->get("/repos/{$owner}/{$repo}/releases/{$releaseBody['id']}/assets", []);
            $assets = json_decode($response->getBody(), true);

            foreach ($assets as $asset) {

                // Only successful uploads have a state of 'uploaded'
                if ($asset['state'] !== 'uploaded') {
                    try {

                        // Failed uploads leave behind a corrupted artifact that must be deleted
                        $response = $uploadClient->delete("/repos/{$owner}/{$repo}/releases/assets/{$asset['id']}", []);

                        // Currently the successful 204 will trigger an exception due to response formatting,
                        // but keeping this in case Github changes their API response
                        if ($response->getStatusCode() == 204) {
                            echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} has successfully been deleted.\n";
                        } else {
                            echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} was unable to be deleted.\n";
                        }
                    } catch (\GuzzleHttp\Exception\ClientException $e) {

                        // Currently expected to generate an exception every time, even for success
                        $response = $e->getResponse();
                        if ($response->getStatusCode() == 204) {
                            echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} has successfully been deleted.\n";
                        } else {
                            echo "Failed upload of {$asset['name']} at {$asset['browser_download_url']} was unable to be deleted.\n";
                            var_dump($e);
                        }
                    }
                }
            }
        }
    }

    if ($isSuccessful) {
        return $attempts;
    }

    return false;
}