2
0
mirror of https://github.com/boostorg/website.git synced 2026-01-29 20:12:14 +00:00

Update library list from boost repo.

This commit is contained in:
Daniel James
2014-01-15 00:22:11 +00:00
parent bba85ee089
commit d6a2018f9f

View File

@@ -1,13 +1,114 @@
<?php
echo "Serializing library info\n";
require_once(dirname(__FILE__) . '/../common/code/boost_libraries.php');
function main() {
$args = $_SERVER['argv'];
$git_mirror = null;
switch (count($args)) {
case 1: break;
case 2: $git_mirror = $args[1]; break;
default:
echo "Usage: update-doc-list.php [mirror_root]";
exit(1);
}
$libs = boost_libraries::from_file(dirname(__FILE__) . '/../doc/libraries.xml');
if ($git_mirror) {
update_from_git($libs, $git_mirror, 'master');
update_from_git($libs, $git_mirror, 'develop');
}
echo "Writing to disk\n";
file_put_contents(dirname(__FILE__) . '/../doc/libraries.xml.new', $libs->to_xml());
file_put_contents(dirname(__FILE__) . '/../generated/libraries.txt', serialize($libs));
}
main();
function update_from_git($libs, $location, $branch) {
echo "Updating from {$branch}\n";
$git_command = "cd '${location}' && git";
$is_bare = get_bool_from_array(run_process("{$git_command} rev-parse --is-bare-repository"));
$modules = Array();
foreach(run_process("{$git_command} config -l --blob ".
"\$({$git_command} ls-tree {$branch} .gitmodules | cut -f 1 | cut -f 3 -d ' ')")
as $line_number => $line)
{
if (!$line) continue;
if (preg_match('@^submodule\.(\w+)\.(\w+)=(.*)$@', trim($line), $matches)) {
$modules[$matches[1]][$matches[2]] = $matches[3];
}
else {
throw new RuntimeException("Unsupported config line: {$line}");
}
}
$modules_by_path = Array();
foreach($modules as $name => $details) {
$modules_by_path[$details['path']] = $name;
}
foreach(run_process("{$git_command} ls-tree {$branch} ".implode(' ', array_keys($modules_by_path)))
as $line_number => $line)
{
if (!$line) continue;
if (preg_match("@^160000 commit ([a-zA-Z0-9]+)\t(.*)$@", $line, $matches)) {
$modules[$modules_by_path[$matches[2]]]['hash'] = $matches[1];
}
else {
throw new RuntimeException("Unmatched submodule line: {$line}");
}
}
foreach($modules as $name => $module) {
$module_location = $is_bare ? "{$location}/{$module['url']}" :
"{$location}/{$module['path']}";
$module_command = "cd '{$module_location}' && git";
foreach(run_process("{$module_command} ls-tree {$module['hash']} metadata.xml") as $entry) {
$entry = trim($entry);
if (preg_match("@^100644 blob ([a-zA-Z0-9]+)\t(.*)$@", $entry, $matches)) {
$libs->update(
implode("\n", (run_process("{$module_command} show {$matches[1]}"))),
$branch);
}
}
}
}
function get_bool_from_array($array) {
if (count($array) != 1) throw new RuntimeException("get_bool_from_array: invalid array");
switch ($array[0]) {
case 'true': return true;
case 'false': return false;
default: throw new RuntimeException("invalid bool: ${array[0]}");
}
}
class ProcessError extends RuntimeException {
public $error_code;
function __construct($error_code) {
$this->error_code = $error_code;
parent::__construct("Process failed with status: {$error_code}");
}
}
function run_process($command) {
exec($command, $output, $return_var);
if ($return_var != 0) {
throw new ProcessError($return_var);
}
return $output;
}
main();