- _getLastChangeFor(): drop that, no longer needed
- getTree(), getPathInfo(): use the new extended manifest format and save the calls to query file sizes from contents as well as the calls to determine the revision in which a file changed at last
This commit is contained in:
parent
90edbf0d8b
commit
d539eaf64b
@ -212,34 +212,6 @@ class IDF_Scm_Monotone extends IDF_Scm
|
|||||||
return array_unique($certValues);
|
return array_unique($certValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the revision in which the file has been last changed,
|
|
||||||
* starting from the start rev
|
|
||||||
*
|
|
||||||
* @param string
|
|
||||||
* @param string
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private function _getLastChangeFor($file, $startrev)
|
|
||||||
{
|
|
||||||
$out = $this->stdio->exec(array(
|
|
||||||
'get_content_changed', $startrev, $file
|
|
||||||
));
|
|
||||||
|
|
||||||
$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
|
|
||||||
foreach ($stanzas as $stanza) {
|
|
||||||
foreach ($stanza as $stanzaline) {
|
|
||||||
if ($stanzaline['key'] == 'content_mark') {
|
|
||||||
return $stanzaline['hash'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IDF_Scm::inBranches()
|
* @see IDF_Scm::inBranches()
|
||||||
*/
|
*/
|
||||||
@ -296,6 +268,84 @@ class IDF_Scm_Monotone extends IDF_Scm
|
|||||||
return $this->_getUniqueCertValuesFor($revs, 'tag', 't:');
|
return $this->_getUniqueCertValuesFor($revs, 'tag', 't:');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Takes a single stanza coming from an extended manifest output
|
||||||
|
* and converts it into a file structure used by IDF
|
||||||
|
*
|
||||||
|
* @param string $forceBasedir If given then the element's path is checked
|
||||||
|
* to be directly beneath the given directory.
|
||||||
|
* If not, null is returned and the parsing is
|
||||||
|
* aborted.
|
||||||
|
* @return array | null
|
||||||
|
*/
|
||||||
|
private function _fillFileEntry(array $manifestEntry, $forceBasedir = null)
|
||||||
|
{
|
||||||
|
$fullpath = $manifestEntry[0]['values'][0];
|
||||||
|
$filename = basename($fullpath);
|
||||||
|
$dirname = dirname($fullpath);
|
||||||
|
$dirname = $dirname == '.' ? '' : $dirname;
|
||||||
|
|
||||||
|
if ($forceBasedir !== null && $forceBasedir != $dirname) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = array();
|
||||||
|
$file['file'] = $filename;
|
||||||
|
$file['fullpath'] = $fullpath;
|
||||||
|
$file['efullpath'] = self::smartEncode($fullpath);
|
||||||
|
|
||||||
|
$wanted_mark = '';
|
||||||
|
if ($manifestEntry[0]['key'] == 'dir') {
|
||||||
|
$file['type'] = 'tree';
|
||||||
|
$file['size'] = 0;
|
||||||
|
$wanted_mark = 'path_mark';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$file['type'] = 'blob';
|
||||||
|
$file['hash'] = $manifestEntry[1]['hash'];
|
||||||
|
$size = 0;
|
||||||
|
foreach ($manifestEntry as $line) {
|
||||||
|
if ($line['key'] == 'size') {
|
||||||
|
$size = $line['values'][0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$file['size'] = $size;
|
||||||
|
$wanted_mark = 'content_mark';
|
||||||
|
}
|
||||||
|
|
||||||
|
$rev_mark = null;
|
||||||
|
foreach ($manifestEntry as $line) {
|
||||||
|
if ($line['key'] == $wanted_mark) {
|
||||||
|
$rev_mark = $line['hash'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rev_mark !== null) {
|
||||||
|
$file['rev'] = $rev_mark;
|
||||||
|
$certs = $this->_getCerts($rev_mark);
|
||||||
|
|
||||||
|
// FIXME: this assumes that author, date and changelog are always given
|
||||||
|
$file['author'] = implode(", ", $certs['author']);
|
||||||
|
|
||||||
|
$dates = array();
|
||||||
|
foreach ($certs['date'] as $date)
|
||||||
|
$dates[] = date('Y-m-d H:i:s', strtotime($date));
|
||||||
|
$file['date'] = implode(', ', $dates);
|
||||||
|
$combinedChangelog = implode("\n---\n", $certs['changelog']);
|
||||||
|
$split = preg_split("/[\n\r]/", $combinedChangelog, 2);
|
||||||
|
// FIXME: the complete log message is currently not used in the
|
||||||
|
// tree view (the same is true for the other SCM implementations)
|
||||||
|
// but we _should_ really use or at least return that here
|
||||||
|
// in case we want to do fancy stuff like described in
|
||||||
|
// issue 492
|
||||||
|
$file['log'] = $split[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see IDF_Scm::getTree()
|
* @see IDF_Scm::getTree()
|
||||||
*/
|
*/
|
||||||
@ -307,59 +357,21 @@ class IDF_Scm_Monotone extends IDF_Scm
|
|||||||
}
|
}
|
||||||
|
|
||||||
$out = $this->stdio->exec(array(
|
$out = $this->stdio->exec(array(
|
||||||
'get_manifest_of', $revs[0]
|
'get_extended_manifest_of', $revs[0]
|
||||||
));
|
));
|
||||||
|
|
||||||
$files = array();
|
$files = array();
|
||||||
$stanzas = IDF_Scm_Monotone_BasicIO::parse($out);
|
$stanzas = IDF_Scm_Monotone_BasicIO::parse($out);
|
||||||
$folder = $folder == '/' || empty($folder) ? '' : $folder.'/';
|
$folder = $folder == '/' || empty($folder) ? '' : $folder;
|
||||||
|
|
||||||
foreach ($stanzas as $stanza) {
|
foreach ($stanzas as $stanza) {
|
||||||
if ($stanza[0]['key'] == 'format_version')
|
if ($stanza[0]['key'] == 'format_version')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$path = $stanza[0]['values'][0];
|
$file = $this->_fillFileEntry($stanza, $folder);
|
||||||
if (!preg_match('#^'.$folder.'([^/]+)$#', $path, $m))
|
if ($file === null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$file = array();
|
|
||||||
$file['file'] = $m[1];
|
|
||||||
$file['fullpath'] = $path;
|
|
||||||
$file['efullpath'] = self::smartEncode($path);
|
|
||||||
|
|
||||||
if ($stanza[0]['key'] == 'dir') {
|
|
||||||
$file['type'] = 'tree';
|
|
||||||
$file['size'] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$file['type'] = 'blob';
|
|
||||||
$file['hash'] = $stanza[1]['hash'];
|
|
||||||
$file['size'] = strlen($this->getFile((object)$file));
|
|
||||||
}
|
|
||||||
|
|
||||||
$rev = $this->_getLastChangeFor($file['fullpath'], $revs[0]);
|
|
||||||
if ($rev !== null) {
|
|
||||||
$file['rev'] = $rev;
|
|
||||||
$certs = $this->_getCerts($rev);
|
|
||||||
|
|
||||||
// FIXME: this assumes that author, date and changelog are always given
|
|
||||||
$file['author'] = implode(", ", $certs['author']);
|
|
||||||
|
|
||||||
$dates = array();
|
|
||||||
foreach ($certs['date'] as $date)
|
|
||||||
$dates[] = date('Y-m-d H:i:s', strtotime($date));
|
|
||||||
$file['date'] = implode(', ', $dates);
|
|
||||||
$combinedChangelog = implode("\n---\n", $certs['changelog']);
|
|
||||||
$split = preg_split("/[\n\r]/", $combinedChangelog, 2);
|
|
||||||
// FIXME: the complete log message is currently not used in the
|
|
||||||
// tree view (the same is true for the other SCM implementations)
|
|
||||||
// but we _should_ really use or at least return that here
|
|
||||||
// in case we want to do fancy stuff like described in
|
|
||||||
// issue 492
|
|
||||||
$file['log'] = $split[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
$files[] = (object) $file;
|
$files[] = (object) $file;
|
||||||
}
|
}
|
||||||
return $files;
|
return $files;
|
||||||
@ -505,7 +517,7 @@ class IDF_Scm_Monotone extends IDF_Scm
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
$out = $this->stdio->exec(array(
|
$out = $this->stdio->exec(array(
|
||||||
'get_manifest_of', $revs[0]
|
'get_extended_manifest_of', $revs[0]
|
||||||
));
|
));
|
||||||
|
|
||||||
$files = array();
|
$files = array();
|
||||||
@ -515,43 +527,10 @@ class IDF_Scm_Monotone extends IDF_Scm
|
|||||||
if ($stanza[0]['key'] == 'format_version')
|
if ($stanza[0]['key'] == 'format_version')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$path = $stanza[0]['values'][0];
|
if ($stanza[0]['values'][0] != $file)
|
||||||
if (!preg_match('#^'.$file.'$#', $path, $m))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
$file = array();
|
$file = $this->_fillFileEntry($stanza);
|
||||||
$file['fullpath'] = $path;
|
|
||||||
|
|
||||||
if ($stanza[0]['key'] == "dir") {
|
|
||||||
$file['type'] = "tree";
|
|
||||||
$file['hash'] = null;
|
|
||||||
$file['size'] = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$file['type'] = 'blob';
|
|
||||||
$file['hash'] = $stanza[1]['hash'];
|
|
||||||
$file['size'] = strlen($this->getFile((object)$file));
|
|
||||||
}
|
|
||||||
|
|
||||||
$pathinfo = pathinfo($file['fullpath']);
|
|
||||||
$file['file'] = $pathinfo['basename'];
|
|
||||||
|
|
||||||
$rev = $this->_getLastChangeFor($file['fullpath'], $revs[0]);
|
|
||||||
if ($rev !== null) {
|
|
||||||
$file['rev'] = $rev;
|
|
||||||
$certs = $this->_getCerts($rev);
|
|
||||||
|
|
||||||
// FIXME: this assumes that author, date and changelog are always given
|
|
||||||
$file['author'] = implode(", ", $certs['author']);
|
|
||||||
|
|
||||||
$dates = array();
|
|
||||||
foreach ($certs['date'] as $date)
|
|
||||||
$dates[] = date('Y-m-d H:i:s', strtotime($date));
|
|
||||||
$file['date'] = implode(', ', $dates);
|
|
||||||
$file['log'] = implode("\n---\n", $certs['changelog']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (object) $file;
|
return (object) $file;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user