diff --git a/src/IDF/Scm/Monotone.php b/src/IDF/Scm/Monotone.php index dd3679f..d414730 100644 --- a/src/IDF/Scm/Monotone.php +++ b/src/IDF/Scm/Monotone.php @@ -22,6 +22,7 @@ # ***** END LICENSE BLOCK ***** */ require_once(dirname(__FILE__) . "/Monotone/Stdio.php"); +require_once(dirname(__FILE__) . "/Monotone/BasicIO.php"); /** * Monotone scm class @@ -143,75 +144,6 @@ class IDF_Scm_Monotone extends IDF_Scm return preg_split("/\n/", $out, -1, PREG_SPLIT_NO_EMPTY); } - /** - * 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", ...), ...) @@ -226,7 +158,7 @@ class IDF_Scm_Monotone extends IDF_Scm 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; @@ -290,7 +222,7 @@ class IDF_Scm_Monotone extends IDF_Scm '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 @@ -326,7 +258,7 @@ class IDF_Scm_Monotone extends IDF_Scm $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) { @@ -375,7 +307,7 @@ class IDF_Scm_Monotone extends IDF_Scm )); $files = array(); - $stanzas = self::_parseBasicIO($out); + $stanzas = IDF_Scm_Monotone_BasicIO::parse($out); $folder = $folder == '/' || empty($folder) ? '' : $folder.'/'; foreach ($stanzas as $stanza) { @@ -525,7 +457,7 @@ class IDF_Scm_Monotone extends IDF_Scm )); $files = array(); - $stanzas = self::_parseBasicIO($out); + $stanzas = IDF_Scm_Monotone_BasicIO::parse($out); foreach ($stanzas as $stanza) { if ($stanza[0]['key'] == 'format_version') @@ -666,7 +598,7 @@ class IDF_Scm_Monotone extends IDF_Scm )); $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') diff --git a/src/IDF/Scm/Monotone/BasicIO.php b/src/IDF/Scm/Monotone/BasicIO.php new file mode 100644 index 0000000..a0a5fd7 --- /dev/null +++ b/src/IDF/Scm/Monotone/BasicIO.php @@ -0,0 +1,111 @@ + + */ +class IDF_Scm_Monotone_BasicIO extends IDF_Scm +{ + /** + * Parses monotone's basic_io format + * + * @param string $in + * @return array of arrays + */ + public static function parse($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; + } + + /** + * Compiles monotone's basicio format + * + * @param array $in Array of arrays + * @return string + */ + public static function compile($in) + { + throw new IDF_Scm_Exception("not yet implemented"); + } +} +