2
0
mirror of https://github.com/boostorg/website.git synced 2026-01-19 16:52:15 +00:00
Files
website/common/code/boost_super_project.php
Daniel James 047fed2c70 Make the submodule config parser a tad more liberal
Can still go wrong if the submodule name contains an equal sign or a
period, or the value contains a newline. But since this isn't dealing
with arbitrary data, that seems unlikely.
2016-11-30 05:29:47 +00:00

99 lines
2.8 KiB
PHP

<?php
class BoostSuperProject {
/** Directory containing the super project */
var $location;
/** The git branch to use. False to use filesystem. */
var $git_branch;
function __construct($location, $git_branch = false) {
$this->location = $location;
$this->git_branch = $git_branch;
}
public function parse_config_file($path) {
if ($this->git_branch) {
$blob = $this->run_git("ls-tree {$this->git_branch} \"{$path}\"");
if (!$blob || !$blob[0]) {
return array();
}
$blob = preg_split("@[\t ]@", $blob[0]);
$blob = $blob[2];
if (self::git_version() >= array(1,8,4,0)) {
return $this->run_git("config -l --blob {$blob}");
}
else {
$temp_file = tempnam(sys_get_temp_dir(), 'boost-git-');
file_put_contents($temp_file, implode("\n",
$this->run_git("show {$blob}")));
$result = $this->run_git("config -l -f \"{$temp_file}\"");
unlink($temp_file);
return $result;
}
}
else {
return is_file($path) ? $this->run_git("config -l -f \"{$path}\"") : array();
}
}
public function get_modules() {
$modules = Array();
foreach($this->parse_config_file(".gitmodules") as $line_number => $line)
{
if (!$line) continue;
if (preg_match('@^submodule\.([^.=]+)\.([^.=]+)=(.*)$@i', trim($line), $matches)) {
$modules[$matches[1]][strtolower($matches[2])] = $matches[3];
}
else {
throw new BoostException("Unsupported config line: {$line}");
}
}
return $modules;
}
public function run_git($command) {
return self::run_process("cd \"{$this->location}\" && git {$command}");
}
// A couple of utility functions that don't really fit, so might move
// later.
static function git_version() {
$output = self::run_process("git --version");
$match = null;
if (count($output) == 1
&& preg_match('@^git version ([0-9.]+)$@', $output[0], $match))
{
return array_pad(explode('.', $match[1]), 4, 0);
}
else {
return array(0,0,0,0);
}
}
static function run_process($command) {
exec($command, $output, $return_var);
if ($return_var != 0) {
throw new ProcessError($return_var);
}
return $output;
}
}
class ProcessError extends BoostException {
public $error_code;
function __construct($error_code) {
$this->error_code = $error_code;
parent::__construct("Process failed with status: {$error_code}");
}
}