static function cat_file($ids)
{
$id_to_data = array();
if (is_string($ids)) {
$ids = array($ids);
$id_to_data = false;
}
# load
$out = git::exec("cat-file --batch", implode("\n", $ids));
$p = 0;
$numobjects = count($ids);
# parse
for ($i = 0; $i < $numobjects; $i++) {
# <id> SP <type> SP <size> LF
# <contents> LF
$hend = strpos($out, "\n", $p);
$hs = substr($out, $p, $hend - $p);
$h = explode(' ', $hs);
if ($h[1] === 'missing') {
throw new UnexpectedValueException('missing blob ' . $hs);
}
$dstart = $hend + 1;
$size = intval($h[2]);
$data = substr($out, $dstart, $size);
if ($id_to_data === false) {
# a single object was requested (string input)
return $data;
}
$id_to_data[$h[0]] = $data;
$p = $dstart + $size + 1;
}
return $id_to_data;
}