| # ***** END LICENSE BLOCK ***** */␊ |
| ␊ |
| require_once(dirname(__FILE__) . "/Monotone/Stdio.php");␊ |
| require_once(dirname(__FILE__) . "/Monotone/BasicIO.php");␊ |
| ␊ |
| /**␊ |
| * Monotone scm class␊ |
|
| }␊ |
| ␊ |
| /**␊ |
| * Parses monotone's basic_io format␊ |
| *␊ |
| * @param string $in␊ |
| * @return array of arrays␊ |
| */␊ |
| private static function _parseBasicIO($in)␊ |
| {␊ |
| $pos = 0;␊ |
| $stanzas = array();␊ |
| ␊ |
| while ($pos < strlen($in)) {␊ |
| $stanza = array();␊ |
| while ($pos < strlen($in)) {␊ |
| if ($in[$pos] == "\n") break;␊ |
| ␊ |
| $stanzaLine = array('key' => '', 'values' => array(), 'hash' => null);␊ |
| while ($pos < strlen($in)) {␊ |
| $ch = $in[$pos];␊ |
| if ($ch == '"' || $ch == '[') break;␊ |
| ++$pos;␊ |
| if ($ch == ' ') continue;␊ |
| $stanzaLine['key'] .= $ch;␊ |
| }␊ |
| ␊ |
| if ($in[$pos] == '[') {␊ |
| ++$pos; // opening square bracket␊ |
| $stanzaLine['hash'] = substr($in, $pos, 40);␊ |
| $pos += 40;␊ |
| ++$pos; // closing square bracket␊ |
| }␊ |
| else␊ |
| {␊ |
| $valCount = 0;␊ |
| while ($in[$pos] == '"') {␊ |
| ++$pos; // opening quote␊ |
| $stanzaLine['values'][$valCount] = '';␊ |
| while ($pos < strlen($in)) {␊ |
| $ch = $in[$pos]; $pr = $in[$pos-1];␊ |
| if ($ch == '"' && $pr != '\\') break;␊ |
| ++$pos;␊ |
| $stanzaLine['values'][$valCount] .= $ch;␊ |
| }␊ |
| ++$pos; // closing quote␊ |
| ␊ |
| if ($in[$pos] == ' ') {␊ |
| ++$pos; // space␊ |
| ++$valCount;␊ |
| }␊ |
| }␊ |
| ␊ |
| for ($i = 0; $i <= $valCount; $i++) {␊ |
| $stanzaLine['values'][$i] = str_replace(␊ |
| array("\\\\", "\\\""),␊ |
| array("\\", "\""),␊ |
| $stanzaLine['values'][$i]␊ |
| );␊ |
| }␊ |
| }␊ |
| ␊ |
| $stanza[] = $stanzaLine;␊ |
| ++$pos; // newline␊ |
| }␊ |
| $stanzas[] = $stanza;␊ |
| ++$pos; // newline␊ |
| }␊ |
| return $stanzas;␊ |
| }␊ |
| ␊ |
| /**␊ |
| * Queries the certs for a given revision and returns them in an␊ |
| * associative array array("branch" => array("branch1", ...), ...)␊ |
| *␊ |
|
| if (!array_key_exists($rev, $certCache)) {␊ |
| $out = $this->stdio->exec(array('certs', $rev));␊ |
| ␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| $certs = array();␊ |
| foreach ($stanzas as $stanza) {␊ |
| $certname = null;␊ |
|
| 'get_content_changed', $startrev, $file␊ |
| ));␊ |
| ␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| ␊ |
| // FIXME: we only care about the first returned content mark␊ |
| // everything else seem to be very, very rare cases␊ |
|
| $out = $this->stdio->exec(array('tags'));␊ |
| ␊ |
| $tags = array();␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| foreach ($stanzas as $stanza) {␊ |
| $tagname = null;␊ |
| foreach ($stanza as $stanzaline) {␊ |
|
| ));␊ |
| ␊ |
| $files = array();␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| $folder = $folder == '/' || empty($folder) ? '' : $folder.'/';␊ |
| ␊ |
| foreach ($stanzas as $stanza) {␊ |
|
| ));␊ |
| ␊ |
| $files = array();␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| ␊ |
| foreach ($stanzas as $stanza) {␊ |
| if ($stanza[0]['key'] == 'format_version')␊ |
|
| ));␊ |
| ␊ |
| $newAndPatchedFiles = 0;␊ |
| $stanzas = self::_parseBasicIO($out);␊ |
| $stanzas = IDF_Scm_Monotone_BasicIO::parse($out);␊ |
| ␊ |
| foreach ($stanzas as $stanza) {␊ |
| if ($stanza[0]['key'] == 'patch' || $stanza[0]['key'] == 'add_file')␊ |