* Monotone.php (IDF_Scm_Monotone): basic_io values need to be unescaped; implement getChangeLog()

* Monotone.php (IDF_Scm_Monotone_Stdio): add support for multiple, equally named options
* Source.php, commit.html: split-off the global commit template (which had some separate code already for SVN) and adapt the left blocks for mtn to shorten branch and tag names just like we do everywhere else
This commit is contained in:
Thomas Keller 2010-05-01 01:05:54 +02:00
parent 15a2bd90b3
commit 3b53ceedcd
7 changed files with 142 additions and 33 deletions

View File

@ -109,11 +109,17 @@ class IDF_Scm_Monotone_Stdio
if (count($options) > 0) if (count($options) > 0)
{ {
$cmd = "o"; $cmd = "o";
foreach ($options as $k => $v) foreach ($options as $k => $vals)
{
if (!is_array($vals))
$vals = array($vals);
foreach ($vals as $v)
{ {
$cmd .= strlen((string)$k) . ":" . (string)$k; $cmd .= strlen((string)$k) . ":" . (string)$k;
$cmd .= strlen((string)$v) . ":" . (string)$v; $cmd .= strlen((string)$v) . ":" . (string)$v;
} }
}
$cmd .= "e "; $cmd .= "e ";
} }
@ -409,6 +415,15 @@ class IDF_Scm_Monotone extends IDF_Scm
++$valCount; ++$valCount;
} }
} }
for ($i = 0; $i <= $valCount; $i++)
{
$stanzaLine['values'][$i] = str_replace(
array("\\\\", "\\\""),
array("\\", "\""),
$stanzaLine['values'][$i]
);
}
} }
$stanza[] = $stanzaLine; $stanza[] = $stanzaLine;
@ -795,7 +810,7 @@ class IDF_Scm_Monotone extends IDF_Scm
return $this->stdio->exec( return $this->stdio->exec(
array("content_diff"), array("content_diff"),
array("r" => $sources[0], "r" => $targets[0]) array("r" => array($sources[0], $targets[0]))
); );
} }
@ -873,6 +888,54 @@ class IDF_Scm_Monotone extends IDF_Scm
*/ */
public function getChangeLog($commit=null, $n=10) public function getChangeLog($commit=null, $n=10)
{ {
throw new Pluf_Exception_NotImplemented(); $horizont = $this->_resolveSelector($commit);
$initialBranches = array();
$logs = array();
while (!empty($horizont) && $n > 0)
{
if (count($horizont) > 1)
{
$out = $this->stdio->exec(array("toposort") + $horizont);
$horizont = preg_split("/\n/", $out, -1, PREG_SPLIT_NO_EMPTY);
}
$rev = array_shift($horizont);
$certs = $this->_getCerts($rev);
// read in the initial branches we should follow
if (count($initialBranches) == 0)
{
$initialBranches = $certs['branch'];
}
// only add it to our log if it is on one of the initial branches
if (count(array_intersect($initialBranches, $certs['branch'])) > 0)
{
--$n;
$log = array();
$log['author'] = implode(", ", $certs['author']);
$dates = array();
foreach ($certs['date'] as $date)
$dates[] = gmdate('Y-m-d H:i:s', strtotime($date));
$log['date'] = implode(', ', $dates);
$combinedChangelog = implode("\n---\n", $certs['changelog']);
$split = preg_split("/[\n\r]/", $combinedChangelog, 2);
$log['title'] = $split[0];
$log['full_message'] = (isset($split[1])) ? trim($split[1]) : '';
$log['commit'] = $rev;
$logs[] = (object)$log;
}
$out = $this->stdio->exec(array("parents", $rev));
$horizont += preg_split("/\n/", $out, -1, PREG_SPLIT_NO_EMPTY);
}
return $logs;
} }
} }

View File

@ -308,7 +308,7 @@ class IDF_Views_Source
$in_branches = $scm->inBranches($cobject->commit, ''); $in_branches = $scm->inBranches($cobject->commit, '');
$tags = $scm->getTags(); $tags = $scm->getTags();
$in_tags = $scm->inTags($cobject->commit, ''); $in_tags = $scm->inTags($cobject->commit, '');
return Pluf_Shortcuts_RenderToResponse('idf/source/commit.html', return Pluf_Shortcuts_RenderToResponse('idf/source/'.$scmConf.'/commit.html',
array( array(
'page_title' => $page_title, 'page_title' => $page_title,
'title' => $title, 'title' => $title,

View File

@ -37,33 +37,6 @@
{/if} {/if}
{/block} {/block}
{block context}
{if $scm != 'svn'}
<p><strong>{trans 'Branches:'}</strong><br/>
{foreach $branches as $branch => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $branch)}
<span class="label{if in_array($branch, $tree_in)} active{/if}"><a href="{$url}" class="label">{$branch}</a></span><br/>
{/foreach}
</p>
{if $tags}
<p><strong>{trans 'Tags:'}</strong><br/>
{foreach $tags as $tag => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $tag)}
<span class="label{if in_array($tag, $tags_in)} active{/if}"><a href="{$url}" class="label">{if $path}{$path}{else}{$tag}{/if}</a></span><br/>
{/foreach}
</p>
{/if}
{else}
<form class="star" action="{url 'IDF_Views_Source_Svn::changelogRev', array($project.shortname)}" method="get">
<p><strong>{trans 'Revision:'}</strong> {$commit}</p>
<p>
<input accesskey="4" type="text" value="{$commit}" name="rev" size="5"/>
<input type="submit" name="s" value="{trans 'Go to revision'}"/>
</p>
</form>
{/if}
{/block}
{block javascript} {block javascript}
<script type="text/javascript" src="{media '/idf/js/prettify.js'}"></script> <script type="text/javascript" src="{media '/idf/js/prettify.js'}"></script>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -0,0 +1,18 @@
{extends "idf/source/commit.html"}
{block context}
<p><strong>{trans 'Branches:'}</strong><br/>
{foreach $branches as $branch => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $branch)}
<span class="label{if in_array($branch, $tree_in)} active{/if}"><a href="{$url}" class="label">{$branch}</a></span><br/>
{/foreach}
</p>
{if $tags}
<p><strong>{trans 'Tags:'}</strong><br/>
{foreach $tags as $tag => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $tag)}
<span class="label{if in_array($tag, $tags_in)} active{/if}"><a href="{$url}" class="label">{if $path}{$path}{else}{$tag}{/if}</a></span><br/>
{/foreach}
</p>
{/if}
{/block}

View File

@ -0,0 +1,18 @@
{extends "idf/source/commit.html"}
{block context}
<p><strong>{trans 'Branches:'}</strong><br/>
{foreach $branches as $branch => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $branch)}
<span class="label{if in_array($branch, $tree_in)} active{/if}"><a href="{$url}" class="label">{$branch}</a></span><br/>
{/foreach}
</p>
{if $tags}
<p><strong>{trans 'Tags:'}</strong><br/>
{foreach $tags as $tag => $path}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $tag)}
<span class="label{if in_array($tag, $tags_in)} active{/if}"><a href="{$url}" class="label">{if $path}{$path}{else}{$tag}{/if}</a></span><br/>
{/foreach}
</p>
{/if}
{/block}

View File

@ -0,0 +1,26 @@
{extends "idf/source/commit.html"}
{block context}
<p><strong>{trans 'Branches:'}</strong><br/>
{foreach $branches as $selector => $branch}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $selector)}
<span class="label{if in_array($branch, $tree_in)} active{/if}">
<a href="{$url}" class="label" title="{$branch}">
{$branch|shorten:25}
</a>
</span><br/>
{/foreach}
</p>
{if $tags}
<p><strong>{trans 'Tags:'}</strong><br/>
{foreach $tags as $selector => $tag}
{aurl 'url', 'IDF_Views_Source::treeBase', array($project.shortname, $selector)}
<span class="label{if in_array($tag, $tags_in)} active{/if}">
<a href="{$url}" class="label" title="{$tag}">
{$tag|shorten:25}
</a>
</span><br/>
{/foreach}
</p>
{/if}
{/block}

View File

@ -0,0 +1,11 @@
{extends "idf/source/commit.html"}
{block context}
<form class="star" action="{url 'IDF_Views_Source_Svn::changelogRev', array($project.shortname)}" method="get">
<p><strong>{trans 'Revision:'}</strong> {$commit}</p>
<p>
<input accesskey="4" type="text" value="{$commit}" name="rev" size="5"/>
<input type="submit" name="s" value="{trans 'Go to revision'}"/>
</p>
</form>
{/block}