Skip to content

Instantly share code, notes, and snippets.

@beberlei
Created December 9, 2011 21:09
Show Gist options
  • Save beberlei/1453306 to your computer and use it in GitHub Desktop.
Save beberlei/1453306 to your computer and use it in GitHub Desktop.
Composer/Packagist Proxy
<?php
$baseUrl = "http://localhost/packagist";
$baseDir = "/var/www/packagist";
if (!file_exists($baseDir)) {
echo "Base dir $baseDir for local packagist proxy does not exist\n";
exit(1);
}
$packagesJson = $baseDir . "/packages.json";
$packagistJson = json_decode(file_get_contents("http://www.packagist.org/packages.json"), true);
if (file_exists($packagesJson)) {
$localJson = json_decode(file_get_contents($packagesJson), true);
} else {
$localJson = array();
}
$packageCount = count($packagistJson);
$i = 0;
foreach ($packagistJson as $name => $package) {
$i++;
$localPackage = $package;
$localPackage['versions'] = array();
foreach ($package['versions'] as $version => $data) {
if (isset($localJson[$name]['versions'][$version]) &&
$localJson[$name]['versions'][$version]['dist']['reference'] == $data['dist']['reference']) {
continue;
}
if ($data['dist']['type'] != 'zip') {
continue;
}
$url = $data['dist']['url'];
$relativeFile = '/' . $name . '/' . $version . '.zip';
$path = $baseDir . $relativeFile;
echo "Downloading $name @ $version";
downloadInto($path, $url);
echo ". [$i/$packageCount]\n";
if (!isset($localJson[$name])) {
$localJson[$name] = $localPackage;
}
$data['dist']['url'] = $baseUrl . $relativeFile;
$localJson[$name] = $data;
}
file_put_contents($packagesJson, json_encode($localJson));
}
function downloadInto($path, $url)
{
if (!file_exists(dirname($path))) {
mkdir(dirname($path), 0777, true);
}
$fp = fopen($path, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment