Compare commits
39 Commits
feature.we
...
feature.di
Author | SHA1 | Date | |
---|---|---|---|
|
464c1a8ef5 | ||
|
e5b10a8494 | ||
|
ffc49b9ea6 | ||
|
0efc14dd6f | ||
|
4fb15ccb7d | ||
|
234b70845c | ||
|
6abd0b6faa | ||
|
fef2bd15bf | ||
|
74d07d8fb8 | ||
|
473e9153ed | ||
|
efa10c9afd | ||
|
7438a2bf19 | ||
|
2e0995abac | ||
|
c84afd0f78 | ||
|
b1276dff6c | ||
|
b413b7ee89 | ||
|
f19f07ec59 | ||
|
83761c66c5 | ||
|
d0e2977746 | ||
|
1be91e5a2a | ||
|
15d4d1aa7d | ||
|
708b90fccd | ||
|
ac7a4c4aa5 | ||
|
b90246a239 | ||
|
a9d327d54f | ||
|
eb8fd0aa55 | ||
|
813184f06c | ||
|
ef2d3a9af9 | ||
|
9a8bd464a3 | ||
|
9e2ea7404b | ||
|
160d11b89b | ||
|
d860f299fd | ||
|
33882d4fa7 | ||
|
85978a4d18 | ||
|
e1e7696d53 | ||
|
695428075b | ||
|
e7c2e721b4 | ||
|
13fad756ab | ||
|
1f0791df0e |
19
.gitignore
vendored
19
.gitignore
vendored
@@ -1,14 +1,19 @@
|
|||||||
*~
|
*~
|
||||||
tmp
|
.buildpath
|
||||||
|
.externalToolBuilders
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.tx/config
|
||||||
|
attachments
|
||||||
|
indefero-*.zip
|
||||||
src/IDF/conf/idf.php
|
src/IDF/conf/idf.php
|
||||||
src/IDF/conf/idf.test.php
|
src/IDF/conf/idf.test.php
|
||||||
www/test.php
|
|
||||||
www/media/upload
|
|
||||||
src/IDF/gettexttemplates
|
|
||||||
indefero-*.zip
|
|
||||||
src/IDF/conf/path.php
|
src/IDF/conf/path.php
|
||||||
.tx/config
|
src/IDF/gettexttemplates
|
||||||
src/IDF/locale/idf.pot.bak
|
src/IDF/locale/idf.pot.bak
|
||||||
|
test/config.php
|
||||||
test/test.db
|
test/test.db
|
||||||
test/tmp
|
test/tmp
|
||||||
test/config.php
|
tmp
|
||||||
|
www/media/upload
|
||||||
|
www/test.php
|
||||||
|
1
AUTHORS
1
AUTHORS
@@ -33,6 +33,7 @@ Much appreciated contributors (in alphabetical order):
|
|||||||
Samuel Suther <info@suther.de> - German translation
|
Samuel Suther <info@suther.de> - German translation
|
||||||
Sindre R. Myren <sindrero@stud.ntnu.no>
|
Sindre R. Myren <sindrero@stud.ntnu.no>
|
||||||
Stewart Platt <stew@futurete.ch>
|
Stewart Platt <stew@futurete.ch>
|
||||||
|
Stéphane Baron <sbaron>
|
||||||
Thomas Keller <me@thomaskeller.biz> - Monotone support
|
Thomas Keller <me@thomaskeller.biz> - Monotone support
|
||||||
Vladimir Solomatin <slash>
|
Vladimir Solomatin <slash>
|
||||||
William Martin <william.martin@lcpc.fr>
|
William Martin <william.martin@lcpc.fr>
|
||||||
|
11
NEWS.mdtext
11
NEWS.mdtext
@@ -7,12 +7,19 @@ or newer to properly run this version of Indefero!
|
|||||||
|
|
||||||
- Indefero's issue tracker can now bi-directionally link issues with variable, configurable
|
- Indefero's issue tracker can now bi-directionally link issues with variable, configurable
|
||||||
terms, such as "is related to", "is blocked by" or "is duplicated by" (issue 638)
|
terms, such as "is related to", "is blocked by" or "is duplicated by" (issue 638)
|
||||||
|
- When you search for issues, the results can further be refined by issue state (open or closed)
|
||||||
|
and label (partially implements issue 548)
|
||||||
- Mercurial source views now show parent revisions (if any) and detailed change information
|
- Mercurial source views now show parent revisions (if any) and detailed change information
|
||||||
- Subversion source views now show detailed change information (issue 622)
|
- Subversion source views now show detailed change information (issue 622)
|
||||||
- File download URLs now contain the file name rather than the upload id; old links still work though (issues 559 and 686)
|
- File download URLs now contain the file name rather than the upload id; old links still work though (issues 559 and 686)
|
||||||
- Display monotone file and directory attributes in the tree and file view
|
- Display monotone file and directory attributes in the tree and file view
|
||||||
(needs a monotone with an interface version of 13.1 or newer)
|
(needs a monotone with an interface version of 13.1 or newer)
|
||||||
- The context area is now kept in view when a page scrolls down several pages
|
- The context area is now kept in view when a page scrolls down several pages
|
||||||
|
- Add a summary section to the issue tracker with statistics about open/close issues,
|
||||||
|
tags of open issue, and count of open tickets for each owner.
|
||||||
|
- Improved home page with an customizable icon for each project.
|
||||||
|
- The download section provide MD5 for each files.
|
||||||
|
- Wiki page have now a css for printer output (issue 713)
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
||||||
@@ -31,6 +38,7 @@ or newer to properly run this version of Indefero!
|
|||||||
a new project or monotone key, in case an error popped up in the middle (issue 697)
|
a new project or monotone key, in case an error popped up in the middle (issue 697)
|
||||||
- Indefero now sends the MD5 checksum as HTTP header when downloading a file from the
|
- Indefero now sends the MD5 checksum as HTTP header when downloading a file from the
|
||||||
download area. Additionally, a unneeded redirect has been removed. (issue 716)
|
download area. Additionally, a unneeded redirect has been removed. (issue 716)
|
||||||
|
- Source links without a specific revision did not work due to a wrong regex (issue 730)
|
||||||
- Better error detection and reporting in the SyncMonotone plugin
|
- Better error detection and reporting in the SyncMonotone plugin
|
||||||
ATTENTION: This needs Pluf 46b7f251 or newer!
|
ATTENTION: This needs Pluf 46b7f251 or newer!
|
||||||
- Fix the branch links users of the Subversion frontend get when they enter a wrong revision
|
- Fix the branch links users of the Subversion frontend get when they enter a wrong revision
|
||||||
@@ -39,6 +47,9 @@ or newer to properly run this version of Indefero!
|
|||||||
as we have no information what the author string is actually encoded in
|
as we have no information what the author string is actually encoded in
|
||||||
- Indefero no longer displays an empty parents paragraph in the commit view for root revisions of
|
- Indefero no longer displays an empty parents paragraph in the commit view for root revisions of
|
||||||
a git repository
|
a git repository
|
||||||
|
- Indefero now only shows the tags of the closed and not the open issues in the closed issues list
|
||||||
|
- Avatar URL generation use correctly the configuration (issue 732)
|
||||||
|
- Git cron job doesn't erase anymore manually added keys (issue 247)
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
219
src/IDF/Diff.php
219
src/IDF/Diff.php
@@ -35,9 +35,7 @@ class IDF_Diff
|
|||||||
public function __construct($diff, $path_strip_level = 0)
|
public function __construct($diff, $path_strip_level = 0)
|
||||||
{
|
{
|
||||||
$this->path_strip_level = $path_strip_level;
|
$this->path_strip_level = $path_strip_level;
|
||||||
// this works because in unified diff format even empty lines are
|
$this->lines = IDF_FileUtil::splitIntoLines($diff, true);
|
||||||
// either prefixed with a '+', '-' or ' '
|
|
||||||
$this->lines = preg_split("/\015\012|\015|\012/", $diff, -1, PREG_SPLIT_NO_EMPTY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function parse()
|
public function parse()
|
||||||
@@ -66,12 +64,12 @@ class IDF_Diff
|
|||||||
}
|
}
|
||||||
|
|
||||||
// use new file name by default
|
// use new file name by default
|
||||||
preg_match("/^\+\+\+ ([^\t]+)/", $newfileline, $m);
|
preg_match("/^\+\+\+ ([^\t\n\r]+)/", $newfileline, $m);
|
||||||
$current_file = $m[1];
|
$current_file = $m[1];
|
||||||
if ($current_file === '/dev/null') {
|
if ($current_file === '/dev/null') {
|
||||||
// except if it's /dev/null, use the old one instead
|
// except if it's /dev/null, use the old one instead
|
||||||
// eg. mtn 0.48 and newer
|
// eg. mtn 0.48 and newer
|
||||||
preg_match("/^--- ([^\t]+)/", $oldfileline, $m);
|
preg_match("/^--- ([^\t\r\n]+)/", $oldfileline, $m);
|
||||||
$current_file = $m[1];
|
$current_file = $m[1];
|
||||||
}
|
}
|
||||||
if ($this->path_strip_level > 0) {
|
if ($this->path_strip_level > 0) {
|
||||||
@@ -102,10 +100,11 @@ class IDF_Diff
|
|||||||
|
|
||||||
while ($i < $diffsize && ($addlines >= 0 || $dellines >= 0)) {
|
while ($i < $diffsize && ($addlines >= 0 || $dellines >= 0)) {
|
||||||
$linetype = $this->lines[$i] != '' ? $this->lines[$i][0] : false;
|
$linetype = $this->lines[$i] != '' ? $this->lines[$i][0] : false;
|
||||||
|
$content = substr($this->lines[$i], 1);
|
||||||
switch ($linetype) {
|
switch ($linetype) {
|
||||||
case ' ':
|
case ' ':
|
||||||
$files[$current_file]['chunks'][$current_chunk][] =
|
$files[$current_file]['chunks'][$current_chunk][] =
|
||||||
array($delstart, $addstart, substr($this->lines[$i++], 1));
|
array($delstart, $addstart, $content);
|
||||||
$dellines--;
|
$dellines--;
|
||||||
$addlines--;
|
$addlines--;
|
||||||
$delstart++;
|
$delstart++;
|
||||||
@@ -113,23 +112,26 @@ class IDF_Diff
|
|||||||
break;
|
break;
|
||||||
case '+':
|
case '+':
|
||||||
$files[$current_file]['chunks'][$current_chunk][] =
|
$files[$current_file]['chunks'][$current_chunk][] =
|
||||||
array('', $addstart, substr($this->lines[$i++], 1));
|
array('', $addstart, $content);
|
||||||
$addlines--;
|
$addlines--;
|
||||||
$addstart++;
|
$addstart++;
|
||||||
break;
|
break;
|
||||||
case '-':
|
case '-':
|
||||||
$files[$current_file]['chunks'][$current_chunk][] =
|
$files[$current_file]['chunks'][$current_chunk][] =
|
||||||
array($delstart, '', substr($this->lines[$i++], 1));
|
array($delstart, '', $content);
|
||||||
$dellines--;
|
$dellines--;
|
||||||
$delstart++;
|
$delstart++;
|
||||||
break;
|
break;
|
||||||
case '\\':
|
case '\\':
|
||||||
// ignore newline handling for now, see issue 636
|
// no new line at the end of this file; remove pseudo new line from last line
|
||||||
$i++;
|
$cur = count($files[$current_file]['chunks'][$current_chunk]) - 1;
|
||||||
|
$files[$current_file]['chunks'][$current_chunk][$cur][2] =
|
||||||
|
rtrim($files[$current_file]['chunks'][$current_chunk][$cur][2], "\r\n");
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
break 2;
|
break 2;
|
||||||
}
|
}
|
||||||
|
$i++;
|
||||||
}
|
}
|
||||||
$current_chunk++;
|
$current_chunk++;
|
||||||
}
|
}
|
||||||
@@ -144,46 +146,80 @@ class IDF_Diff
|
|||||||
public function as_html()
|
public function as_html()
|
||||||
{
|
{
|
||||||
$out = '';
|
$out = '';
|
||||||
foreach ($this->files as $filename=>$file) {
|
foreach ($this->files as $filename => $file) {
|
||||||
$pretty = '';
|
$pretty = '';
|
||||||
$fileinfo = IDF_FileUtil::getMimeType($filename);
|
$fileinfo = IDF_FileUtil::getMimeType($filename);
|
||||||
if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) {
|
if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) {
|
||||||
$pretty = ' prettyprint';
|
$pretty = ' prettyprint';
|
||||||
}
|
}
|
||||||
$out .= "\n".'<table class="diff" summary="">'."\n";
|
|
||||||
$out .= '<tr id="diff-'.md5($filename).'"><th colspan="3">'.Pluf_esc($filename).'</th></tr>'."\n";
|
|
||||||
$cc = 1;
|
$cc = 1;
|
||||||
|
$offsets = array();
|
||||||
|
$contents = array();
|
||||||
|
|
||||||
foreach ($file['chunks'] as $chunk) {
|
foreach ($file['chunks'] as $chunk) {
|
||||||
foreach ($chunk as $line) {
|
foreach ($chunk as $line) {
|
||||||
if ($line[0] and $line[1]) {
|
list($left, $right, $content) = $line;
|
||||||
$class = 'diff-c';
|
if ($left and $right) {
|
||||||
} elseif ($line[0]) {
|
$class = 'context';
|
||||||
$class = 'diff-r';
|
} elseif ($left) {
|
||||||
|
$class = 'removed';
|
||||||
} else {
|
} else {
|
||||||
$class = 'diff-a';
|
$class = 'added';
|
||||||
}
|
}
|
||||||
$line_content = self::padLine(Pluf_esc($line[2]));
|
|
||||||
$out .= sprintf('<tr class="diff-line"><td class="diff-lc">%s</td><td class="diff-lc">%s</td><td class="%s%s mono">%s</td></tr>'."\n", $line[0], $line[1], $class, $pretty, $line_content);
|
$offsets[] = sprintf('<td>%s</td><td>%s</td>', $left, $right);
|
||||||
|
$content = IDF_FileUtil::emphasizeControlCharacters(Pluf_esc($content));
|
||||||
|
$contents[] = sprintf('<td class="%s%s mono">%s</td>', $class, $pretty, $content);
|
||||||
|
}
|
||||||
|
if (count($file['chunks']) > $cc) {
|
||||||
|
$offsets[] = '<td class="next">...</td><td class="next">...</td>';
|
||||||
|
$contents[] = '<td class="next"></td>';
|
||||||
}
|
}
|
||||||
if (count($file['chunks']) > $cc)
|
|
||||||
$out .= '<tr class="diff-next"><td>...</td><td>...</td><td> </td></tr>'."\n";
|
|
||||||
$cc++;
|
$cc++;
|
||||||
}
|
}
|
||||||
$out .= '</table>';
|
|
||||||
}
|
|
||||||
return Pluf_Template::markSafe($out);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function padLine($line)
|
list($added, $removed) = end($file['chunks_def']);
|
||||||
{
|
|
||||||
$line = str_replace("\t", ' ', $line);
|
$added = $added[0] + $added[1];
|
||||||
$n = strlen($line);
|
$leftwidth = 1;
|
||||||
for ($i=0;$i<$n;$i++) {
|
if ($added > 0)
|
||||||
if (substr($line, $i, 1) != ' ') {
|
$leftwidth = ((ceil(log10($added)) + 1) * 8) + 12;
|
||||||
break;
|
|
||||||
}
|
$removed = $removed[0] + $removed[1];
|
||||||
|
$rightwidth = 1;
|
||||||
|
if ($removed > 0)
|
||||||
|
$rightwidth = ((ceil(log10($removed)) + 1) * 8) + 12;
|
||||||
|
|
||||||
|
$inner_linecounts =
|
||||||
|
'<table class="diff-linecounts">' ."\n".
|
||||||
|
'<colgroup><col width="'.$leftwidth.'" /><col width="'. $rightwidth.'" /></colgroup>' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $offsets).
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
|
||||||
|
$inner_contents =
|
||||||
|
'<table class="diff-contents">' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $contents) .
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
$out .= '<table class="diff unified">' ."\n".
|
||||||
|
'<colgroup><col width="'.($leftwidth + $rightwidth + 1).'" /><col width="*" /></colgroup>' ."\n".
|
||||||
|
'<tr id="diff-'.md5($filename).'">'.
|
||||||
|
'<th colspan="2">'.Pluf_esc($filename).'</th>'.
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'<tr>' .
|
||||||
|
'<td>'. $inner_linecounts .'</td>'. "\n".
|
||||||
|
'<td><div class="scroll">'. $inner_contents .'</div></td>'.
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
}
|
}
|
||||||
return str_repeat(' ', $i).substr($line, $i);
|
|
||||||
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -208,12 +244,12 @@ class IDF_Diff
|
|||||||
*/
|
*/
|
||||||
public function fileCompare($orig, $chunks, $filename, $context=10)
|
public function fileCompare($orig, $chunks, $filename, $context=10)
|
||||||
{
|
{
|
||||||
$orig_lines = preg_split("/\015\012|\015|\012/", $orig);
|
$orig_lines = IDF_FileUtil::splitIntoLines($orig);
|
||||||
$new_chunks = $this->mergeChunks($orig_lines, $chunks, $context);
|
$new_chunks = $this->mergeChunks($orig_lines, $chunks, $context);
|
||||||
return $this->renderCompared($new_chunks, $filename);
|
return $this->renderCompared($new_chunks, $filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mergeChunks($orig_lines, $chunks, $context=10)
|
private function mergeChunks($orig_lines, $chunks, $context=10)
|
||||||
{
|
{
|
||||||
$spans = array();
|
$spans = array();
|
||||||
$new_chunks = array();
|
$new_chunks = array();
|
||||||
@@ -310,38 +346,115 @@ class IDF_Diff
|
|||||||
return $nnew_chunks;
|
return $nnew_chunks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function renderCompared($chunks, $filename)
|
private function renderCompared($chunks, $filename)
|
||||||
{
|
{
|
||||||
$fileinfo = IDF_FileUtil::getMimeType($filename);
|
$fileinfo = IDF_FileUtil::getMimeType($filename);
|
||||||
$pretty = '';
|
$pretty = '';
|
||||||
if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) {
|
if (IDF_FileUtil::isSupportedExtension($fileinfo[2])) {
|
||||||
$pretty = ' prettyprint';
|
$pretty = ' prettyprint';
|
||||||
}
|
}
|
||||||
$out = '';
|
|
||||||
$cc = 1;
|
$cc = 1;
|
||||||
$i = 0;
|
$left_offsets = array();
|
||||||
|
$left_contents = array();
|
||||||
|
$right_offsets = array();
|
||||||
|
$right_contents = array();
|
||||||
|
|
||||||
|
$max_lineno_left = $max_lineno_right = 0;
|
||||||
|
|
||||||
foreach ($chunks as $chunk) {
|
foreach ($chunks as $chunk) {
|
||||||
foreach ($chunk as $line) {
|
foreach ($chunk as $line) {
|
||||||
$line1 = ' ';
|
$left = '';
|
||||||
$line2 = ' ';
|
$right = '';
|
||||||
$line[2] = (strlen($line[2])) ? self::padLine(Pluf_esc($line[2])) : ' ';
|
$content = IDF_FileUtil::emphasizeControlCharacters(Pluf_esc($line[2]));
|
||||||
|
|
||||||
if ($line[0] and $line[1]) {
|
if ($line[0] and $line[1]) {
|
||||||
$class = 'diff-c';
|
$class = 'context';
|
||||||
$line1 = $line2 = $line[2];
|
$left = $right = $content;
|
||||||
} elseif ($line[0]) {
|
} elseif ($line[0]) {
|
||||||
$class = 'diff-r';
|
$class = 'removed';
|
||||||
$line1 = $line[2];
|
$left = $content;
|
||||||
} else {
|
} else {
|
||||||
$class = 'diff-a';
|
$class = 'added';
|
||||||
$line2 = $line[2];
|
$right = $content;
|
||||||
}
|
}
|
||||||
$out .= sprintf('<tr class="diff-line"><td class="diff-lc">%s</td><td class="%s mono%s"><code>%s</code></td><td class="diff-lc">%s</td><td class="%s mono%s"><code>%s</code></td></tr>'."\n", $line[0], $class, $pretty, $line1, $line[1], $class, $pretty, $line2);
|
|
||||||
|
$left_offsets[] = sprintf('<td>%s</td>', $line[0]);
|
||||||
|
$right_offsets[] = sprintf('<td>%s</td>', $line[1]);
|
||||||
|
$left_contents[] = sprintf('<td class="%s%s mono">%s</td>', $class, $pretty, $left);
|
||||||
|
$right_contents[] = sprintf('<td class="%s%s mono">%s</td>', $class, $pretty, $right);
|
||||||
|
|
||||||
|
$max_lineno_left = max($max_lineno_left, $line[0]);
|
||||||
|
$max_lineno_right = max($max_lineno_right, $line[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($chunks) > $cc) {
|
||||||
|
$left_offsets[] = '<td class="next">...</td>';
|
||||||
|
$right_offsets[] = '<td class="next">...</td>';
|
||||||
|
$left_contents[] = '<td></td>';
|
||||||
|
$right_contents[] = '<td></td>';
|
||||||
}
|
}
|
||||||
if (count($chunks) > $cc)
|
|
||||||
$out .= '<tr class="diff-next"><td>...</td><td> </td><td>...</td><td> </td></tr>'."\n";
|
|
||||||
$cc++;
|
$cc++;
|
||||||
$i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$leftwidth = 1;
|
||||||
|
if ($max_lineno_left > 0)
|
||||||
|
$leftwidth = ((ceil(log10($max_lineno_left)) + 1) * 8) + 12;
|
||||||
|
|
||||||
|
$rightwidth = 1;
|
||||||
|
if ($max_lineno_right > 0)
|
||||||
|
$rightwidth = ((ceil(log10($max_lineno_right)) + 1) * 8) + 12;
|
||||||
|
|
||||||
|
$inner_linecounts_left =
|
||||||
|
'<table class="diff-linecounts">' ."\n".
|
||||||
|
'<colgroup><col width="'.$leftwidth.'" /></colgroup>' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $left_offsets).
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
$inner_linecounts_right =
|
||||||
|
'<table class="diff-linecounts">' ."\n".
|
||||||
|
'<colgroup><col width="'.$rightwidth.'" /></colgroup>' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $right_offsets).
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
$inner_contents_left =
|
||||||
|
'<table class="diff-contents">' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $left_contents) .
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
$inner_contents_right =
|
||||||
|
'<table class="diff-contents">' ."\n".
|
||||||
|
'<tr class="line">' .
|
||||||
|
implode('</tr>'."\n".'<tr class="line">', $right_contents) .
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
|
$out =
|
||||||
|
'<table class="diff context">' ."\n".
|
||||||
|
'<colgroup>' .
|
||||||
|
'<col width="'.($leftwidth + 1).'" /><col width="*" />' .
|
||||||
|
'<col width="'.($rightwidth + 1).'" /><col width="*" />' .
|
||||||
|
'</colgroup>' ."\n".
|
||||||
|
'<tr id="diff-'.md5($filename).'">'.
|
||||||
|
'<th colspan="4">'.Pluf_esc($filename).'</th>'.
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'<tr>' .
|
||||||
|
'<th colspan="2">'.__('Old').'</th><th colspan="2">'.__('New').'</th>' .
|
||||||
|
'</tr>'.
|
||||||
|
'<tr>' .
|
||||||
|
'<td>'. $inner_linecounts_left .'</td>'. "\n".
|
||||||
|
'<td><div class="scroll">'. $inner_contents_left .'</div></td>'. "\n".
|
||||||
|
'<td>'. $inner_linecounts_right .'</td>'. "\n".
|
||||||
|
'<td><div class="scroll">'. $inner_contents_right .'</div></td>'. "\n".
|
||||||
|
'</tr>' ."\n".
|
||||||
|
'</table>' ."\n";
|
||||||
|
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -65,9 +65,9 @@ class IDF_FileUtil
|
|||||||
}
|
}
|
||||||
$table = array();
|
$table = array();
|
||||||
$i = 1;
|
$i = 1;
|
||||||
foreach (preg_split("/\015\012|\015|\012/", $content) as $line) {
|
foreach (self::splitIntoLines($content) as $line) {
|
||||||
$table[] = '<tr class="c-line"><td class="code-lc" id="L'.$i.'"><a href="#L'.$i.'">'.$i.'</a></td>'
|
$table[] = '<tr class="c-line"><td class="code-lc" id="L'.$i.'"><a href="#L'.$i.'">'.$i.'</a></td>'
|
||||||
.'<td class="code mono'.$pretty.'">'.IDF_Diff::padLine(Pluf_esc($line)).'</td></tr>';
|
.'<td class="code mono'.$pretty.'">'.self::emphasizeControlCharacters(Pluf_esc($line)).'</td></tr>';
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
return Pluf_Template::markSafe(implode("\n", $table));
|
return Pluf_Template::markSafe(implode("\n", $table));
|
||||||
@@ -143,6 +143,56 @@ class IDF_FileUtil
|
|||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits a string into separate lines while retaining the individual
|
||||||
|
* line ending character for every line.
|
||||||
|
*
|
||||||
|
* OS9 line endings are not supported.
|
||||||
|
*
|
||||||
|
* @param string content
|
||||||
|
* @param boolean if true, skip completely empty lines
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function splitIntoLines($content, $skipEmpty = false)
|
||||||
|
{
|
||||||
|
$flags = PREG_SPLIT_OFFSET_CAPTURE;
|
||||||
|
if ($skipEmpty) $flags |= PREG_SPLIT_NO_EMPTY;
|
||||||
|
$splitted = preg_split("/\r\n|\n/", $content, -1, $flags);
|
||||||
|
|
||||||
|
$last_off = -1;
|
||||||
|
$lines = array();
|
||||||
|
while (($split = array_shift($splitted)) !== null) {
|
||||||
|
if ($last_off != -1) {
|
||||||
|
$lines[] .= substr($content, $last_off, $split[1] - $last_off);
|
||||||
|
}
|
||||||
|
$last_off = $split[1];
|
||||||
|
}
|
||||||
|
$lines[] = substr($content, $last_off);
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This translates most of the C0 ASCII control characters into
|
||||||
|
* their visual counterparts in the 0x24## unicode plane
|
||||||
|
* (http://en.wikipedia.org/wiki/C0_and_C1_control_codes).
|
||||||
|
*
|
||||||
|
* We could add DEL (0x7F) to this set, but unfortunately this
|
||||||
|
* is not nicely mapped to 0x247F in the control plane, but 0x2421
|
||||||
|
* and adding an if expression below just for this is a little bit
|
||||||
|
* of a hassle. And of course, the more esoteric ones from C1 are
|
||||||
|
* missing as well...
|
||||||
|
*
|
||||||
|
* @param string $content
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function emphasizeControlCharacters($content)
|
||||||
|
{
|
||||||
|
return preg_replace(
|
||||||
|
'/([\x00-\x1F])/ue',
|
||||||
|
'"<span class=\"ctrl-char\" title=\"0x".bin2hex("\\1")."\">$".bin2hex("\\1")."</span>"',
|
||||||
|
$content);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find if a given mime type is a text file.
|
* Find if a given mime type is a text file.
|
||||||
* This uses the output of the self::getMimeType function.
|
* This uses the output of the self::getMimeType function.
|
||||||
|
@@ -88,6 +88,7 @@ class IDF_Middleware
|
|||||||
'showuser' => 'IDF_Template_ShowUser',
|
'showuser' => 'IDF_Template_ShowUser',
|
||||||
'ashowuser' => 'IDF_Template_AssignShowUser',
|
'ashowuser' => 'IDF_Template_AssignShowUser',
|
||||||
'appversion' => 'IDF_Template_AppVersion',
|
'appversion' => 'IDF_Template_AppVersion',
|
||||||
|
'upload' => 'IDF_Template_Tag_UploadUrl',
|
||||||
));
|
));
|
||||||
$params['modifiers'] = array_merge($params['modifiers'],
|
$params['modifiers'] = array_merge($params['modifiers'],
|
||||||
array(
|
array(
|
||||||
|
@@ -132,7 +132,7 @@ class IDF_Project extends Pluf_Model
|
|||||||
}
|
}
|
||||||
return $projects[0];
|
return $projects[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of open/closed issues.
|
* Returns the number of open/closed issues.
|
||||||
*
|
*
|
||||||
@@ -167,7 +167,7 @@ GROUP BY uid";
|
|||||||
$key = ($v['id'] === '-1') ? null : $v['id'];
|
$key = ($v['id'] === '-1') ? null : $v['id'];
|
||||||
$ownerStatistics[$key] = (int)$v['nb'];
|
$ownerStatistics[$key] = (int)$v['nb'];
|
||||||
}
|
}
|
||||||
|
|
||||||
arsort($ownerStatistics);
|
arsort($ownerStatistics);
|
||||||
|
|
||||||
return $ownerStatistics;
|
return $ownerStatistics;
|
||||||
@@ -178,9 +178,10 @@ GROUP BY uid";
|
|||||||
*
|
*
|
||||||
* @param string Status ('open'), 'closed'
|
* @param string Status ('open'), 'closed'
|
||||||
* @param IDF_Tag Subfilter with a label (null)
|
* @param IDF_Tag Subfilter with a label (null)
|
||||||
|
* @param array Restrict further to a list of ids
|
||||||
* @return int Count
|
* @return int Count
|
||||||
*/
|
*/
|
||||||
public function getIssueCountByStatus($status='open', $label=null)
|
public function getIssueCountByStatus($status='open', $label=null, $ids=array())
|
||||||
{
|
{
|
||||||
switch ($status) {
|
switch ($status) {
|
||||||
case 'open':
|
case 'open':
|
||||||
@@ -203,12 +204,48 @@ GROUP BY uid";
|
|||||||
$sql2 = new Pluf_SQL('idf_tag_id=%s', array($label->id));
|
$sql2 = new Pluf_SQL('idf_tag_id=%s', array($label->id));
|
||||||
$sql->SAnd($sql2);
|
$sql->SAnd($sql2);
|
||||||
}
|
}
|
||||||
|
if (count($ids) > 0) {
|
||||||
|
$sql2 = new Pluf_SQL(sprintf('id IN (%s)', implode(', ', $ids)));
|
||||||
|
$sql->SAnd($sql2);
|
||||||
|
}
|
||||||
$params = array('filter' => $sql->gen());
|
$params = array('filter' => $sql->gen());
|
||||||
if (!is_null($label)) { $params['view'] = 'join_tags'; }
|
if (!is_null($label)) { $params['view'] = 'join_tags'; }
|
||||||
$gissue = new IDF_Issue();
|
$gissue = new IDF_Issue();
|
||||||
return $gissue->getCount($params);
|
return $gissue->getCount($params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the tags for a specific list of issues.
|
||||||
|
*
|
||||||
|
* @param string Status ('open') or 'closed'
|
||||||
|
* @param array A list of issue ids
|
||||||
|
* @return array An array of tag objects
|
||||||
|
*/
|
||||||
|
public function getTagsByIssues($issue_ids=array())
|
||||||
|
{
|
||||||
|
// make the below query always a valid one
|
||||||
|
if (count($issue_ids) == 0) $issue_ids[] = 0;
|
||||||
|
|
||||||
|
$assocTable = $this->_con->pfx.'idf_issue_idf_tag_assoc';
|
||||||
|
$query = sprintf(
|
||||||
|
'SELECT DISTINCT idf_tag_id FROM %s '.
|
||||||
|
'WHERE idf_issue_id IN (%s) '.
|
||||||
|
'GROUP BY idf_tag_id',
|
||||||
|
$assocTable, implode(',', $issue_ids)
|
||||||
|
);
|
||||||
|
|
||||||
|
$db = Pluf::db();
|
||||||
|
$dbData = $db->select($query);
|
||||||
|
$ids = array(0);
|
||||||
|
foreach ($dbData as $data) {
|
||||||
|
$ids[] = $data['idf_tag_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = new Pluf_SQL(sprintf('id IN (%s)', implode(', ', $ids)));
|
||||||
|
$model = new IDF_Tag();
|
||||||
|
return $model->getList(array('filter' => $sql->gen()));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the open/closed tag ids as they are often used when doing
|
* Get the open/closed tag ids as they are often used when doing
|
||||||
* listings.
|
* listings.
|
||||||
@@ -415,7 +452,11 @@ GROUP BY uid";
|
|||||||
foreach ($this->_con->select($sql) as $idc) {
|
foreach ($this->_con->select($sql) as $idc) {
|
||||||
$tag = new IDF_Tag($idc['id']);
|
$tag = new IDF_Tag($idc['id']);
|
||||||
$tag->nb_use = $idc['nb_use'];
|
$tag->nb_use = $idc['nb_use'];
|
||||||
$tags[] = $tag;
|
// group by class
|
||||||
|
if (!array_key_exists($tag->class, $tags)) {
|
||||||
|
$tags[$tag->class] = array();
|
||||||
|
}
|
||||||
|
$tags[$tag->class][] = $tag;
|
||||||
}
|
}
|
||||||
return new Pluf_Template_ContextVars($tags);
|
return new Pluf_Template_ContextVars($tags);
|
||||||
}
|
}
|
||||||
|
@@ -507,33 +507,27 @@ class IDF_Scm_Git extends IDF_Scm
|
|||||||
"'".$this->mediumtree_fmt."'",
|
"'".$this->mediumtree_fmt."'",
|
||||||
escapeshellarg($commit));
|
escapeshellarg($commit));
|
||||||
}
|
}
|
||||||
$out = array();
|
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
self::exec('IDF_Scm_Git::getCommit', $cmd, $out, $ret);
|
$out = self::shell_exec('IDF_Scm_Git::getCommit', $cmd);
|
||||||
if ($ret != 0 or count($out) == 0) {
|
if (strlen($out) == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ($getdiff) {
|
|
||||||
$log = array();
|
$diffStart = false;
|
||||||
$change = array();
|
if (preg_match('/^diff (?:--git a|--cc)/m', $out, $m, PREG_OFFSET_CAPTURE)) {
|
||||||
$inchange = false;
|
$diffStart = $m[0][1];
|
||||||
foreach ($out as $line) {
|
|
||||||
if (!$inchange and 0 === strpos($line, 'diff --git a')) {
|
|
||||||
$inchange = true;
|
|
||||||
}
|
|
||||||
if ($inchange) {
|
|
||||||
$change[] = $line;
|
|
||||||
} else {
|
|
||||||
$log[] = $line;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$out = self::parseLog($log);
|
|
||||||
$out[0]->diff = implode("\n", $change);
|
|
||||||
} else {
|
|
||||||
$out = self::parseLog($out);
|
|
||||||
$out[0]->diff = '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$diff = '';
|
||||||
|
if ($diffStart !== false) {
|
||||||
|
$log = substr($out, 0, $diffStart);
|
||||||
|
$diff = substr($out, $diffStart);
|
||||||
|
} else {
|
||||||
|
$log = $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = self::parseLog(preg_split('/\r\n|\n/', $log));
|
||||||
|
$out[0]->diff = $diff;
|
||||||
$out[0]->branch = implode(', ', $this->inBranches($out[0]->commit, null));
|
$out[0]->branch = implode(', ', $this->inBranches($out[0]->commit, null));
|
||||||
return $out[0];
|
return $out[0];
|
||||||
}
|
}
|
||||||
|
@@ -408,24 +408,23 @@ class IDF_Scm_Mercurial extends IDF_Scm
|
|||||||
escapeshellarg($commit),
|
escapeshellarg($commit),
|
||||||
escapeshellarg($this->repo),
|
escapeshellarg($this->repo),
|
||||||
escapeshellarg($logStyle->get()));
|
escapeshellarg($logStyle->get()));
|
||||||
$out = array();
|
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
self::exec('IDF_Scm_Mercurial::getCommit', $cmd, $out);
|
$out = self::shell_exec('IDF_Scm_Mercurial::getCommit', $cmd);
|
||||||
$log = array();
|
if (strlen($out) == 0) {
|
||||||
$change = array();
|
return false;
|
||||||
$inchange = false;
|
|
||||||
foreach ($out as $line) {
|
|
||||||
if (!$inchange and 0 === strpos($line, 'diff -r')) {
|
|
||||||
$inchange = true;
|
|
||||||
}
|
|
||||||
if ($inchange) {
|
|
||||||
$change[] = $line;
|
|
||||||
} else {
|
|
||||||
$log[] = $line;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$out = self::parseLog($log);
|
|
||||||
$out[0]->diff = implode("\n", $change);
|
$diffStart = strpos($out, 'diff -r');
|
||||||
|
$diff = '';
|
||||||
|
if ($diffStart !== false) {
|
||||||
|
$log = substr($out, 0, $diffStart);
|
||||||
|
$diff = substr($out, $diffStart);
|
||||||
|
} else {
|
||||||
|
$log = $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = self::parseLog(preg_split('/\r\n|\n/', $log));
|
||||||
|
$out[0]->diff = $diff;
|
||||||
return $out[0];
|
return $out[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -58,7 +58,7 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
|
|||||||
implode('|', $nouns);
|
implode('|', $nouns);
|
||||||
$text = IDF_Template_safePregReplace('#((?:'.$prefix.')(?:\s+r?))([0-9a-f]{1,40}((?:\s+and|\s+or|,)\s+r?[0-9a-f]{1,40})*)\b#i',
|
$text = IDF_Template_safePregReplace('#((?:'.$prefix.')(?:\s+r?))([0-9a-f]{1,40}((?:\s+and|\s+or|,)\s+r?[0-9a-f]{1,40})*)\b#i',
|
||||||
array($this, 'callbackCommits'), $text);
|
array($this, 'callbackCommits'), $text);
|
||||||
$text = IDF_Template_safePregReplace('=(src:)([^\s@#,\(\)\\\\]+(?:(\\\\)[\s@#][^\s@#,\(\)\\\\]+){0,})+(?:\@([^\s#,]+))(?:#(\d+))?=im',
|
$text = IDF_Template_safePregReplace('=(src:)([^\s@#,\(\)\\\\]+(?:(\\\\)[\s@#][^\s@#,\(\)\\\\]+){0,})+(?:\@([^\s#,]+))?(?:#(\d+))?=im',
|
||||||
array($this, 'callbackSource'), $text);
|
array($this, 'callbackSource'), $text);
|
||||||
}
|
}
|
||||||
if ($wordwrap) $text = Pluf_Text::wrapHtml($text, 69, "\n");
|
if ($wordwrap) $text = Pluf_Text::wrapHtml($text, 69, "\n");
|
||||||
|
35
src/IDF/Template/Tag/UploadUrl.php
Normal file
35
src/IDF/Template/Tag/UploadUrl.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||||
|
/*
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# This file is part of InDefero, an open source project management application.
|
||||||
|
# Copyright (C) 2011 Céondo Ltd and contributors.
|
||||||
|
#
|
||||||
|
# InDefero is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# InDefero is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
class IDF_Template_Tag_UploadUrl extends Pluf_Template_Tag
|
||||||
|
{
|
||||||
|
function start($file='')
|
||||||
|
{
|
||||||
|
echo IDF_Template_Tag_UploadUrl::url($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function url($file='')
|
||||||
|
{
|
||||||
|
return Pluf::f('url_upload', Pluf_Template_Tag_MediaUrl::url() . '/upload') . $file;
|
||||||
|
}
|
||||||
|
}
|
@@ -32,21 +32,24 @@ class IDF_Tests_TestDiff extends UnitTestCase
|
|||||||
parent::__construct('Test the diff parser.');
|
parent::__construct('Test the diff parser.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBinaryDiff()
|
//
|
||||||
{
|
// IDF_Diff::mergeChunks() is now private, so this test needs to be rewritten
|
||||||
$diff_content = file_get_contents(dirname(__FILE__).'/test-diff.diff');
|
//
|
||||||
$orig = file_get_contents(dirname(__FILE__).'/test-diff-view.html');
|
//public function testBinaryDiff()
|
||||||
$diff = new IDF_Diff($diff_content);
|
//{
|
||||||
$diff->parse();
|
// $diff_content = file_get_contents(dirname(__FILE__).'/test-diff.diff');
|
||||||
$def = $diff->files['src/IDF/templates/idf/issues/view.html'];
|
// $orig = file_get_contents(dirname(__FILE__).'/test-diff-view.html');
|
||||||
|
// $diff = new IDF_Diff($diff_content);
|
||||||
$orig_lines = preg_split("/\015\012|\015|\012/", $orig);
|
// $diff->parse();
|
||||||
$merged = $diff->mergeChunks($orig_lines, $def, 10);
|
// $def = $diff->files['src/IDF/templates/idf/issues/view.html'];
|
||||||
$lchunk = end($merged);
|
//
|
||||||
$lline = end($lchunk);
|
// $orig_lines = preg_split("/\015\012|\015|\012/", $orig);
|
||||||
$this->assertEqual(array('', '166', '{/if}{/block}'),
|
// $merged = $diff->mergeChunks($orig_lines, $def, 10);
|
||||||
$lline);
|
// $lchunk = end($merged);
|
||||||
}
|
// $lline = end($lchunk);
|
||||||
|
// $this->assertEqual(array('', '166', '{/if}{/block}'),
|
||||||
|
// $lline);
|
||||||
|
//}
|
||||||
|
|
||||||
public function testDiffWithHeaders()
|
public function testDiffWithHeaders()
|
||||||
{
|
{
|
||||||
|
@@ -319,13 +319,11 @@ class IDF_Views_Download
|
|||||||
$pag->no_results_text = __('No downloads were found.');
|
$pag->no_results_text = __('No downloads were found.');
|
||||||
$pag->sort_order = array('creation_dtime', 'DESC');
|
$pag->sort_order = array('creation_dtime', 'DESC');
|
||||||
$pag->setFromRequest($request);
|
$pag->setFromRequest($request);
|
||||||
$tags = $prj->getTagCloud('downloads');
|
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/downloads/index.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/downloads/index.html',
|
||||||
array(
|
array(
|
||||||
'page_title' => $title,
|
'page_title' => $title,
|
||||||
'label' => $tag,
|
'label' => $tag,
|
||||||
'downloads' => $pag,
|
'downloads' => $pag,
|
||||||
'tags' => $tags,
|
|
||||||
'dlabel' => $dtag,
|
'dlabel' => $dtag,
|
||||||
),
|
),
|
||||||
$request);
|
$request);
|
||||||
|
@@ -71,7 +71,9 @@ class IDF_Views_Issue
|
|||||||
'page_title' => $title,
|
'page_title' => $title,
|
||||||
'open' => $open,
|
'open' => $open,
|
||||||
'closed' => $closed,
|
'closed' => $closed,
|
||||||
'issues' => $pag);
|
'issues' => $pag,
|
||||||
|
'cloud' => 'issues',
|
||||||
|
);
|
||||||
if ($api) return $params;
|
if ($api) return $params;
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/issues/index.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/issues/index.html',
|
||||||
$params, $request);
|
$params, $request);
|
||||||
@@ -88,7 +90,7 @@ class IDF_Views_Issue
|
|||||||
$ownerStatistics = array();
|
$ownerStatistics = array();
|
||||||
$status = array();
|
$status = array();
|
||||||
$isTrackerEmpty = false;
|
$isTrackerEmpty = false;
|
||||||
|
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
$opened = $prj->getIssueCountByStatus('open');
|
$opened = $prj->getIssueCountByStatus('open');
|
||||||
$closed = $prj->getIssueCountByStatus('closed');
|
$closed = $prj->getIssueCountByStatus('closed');
|
||||||
@@ -102,24 +104,28 @@ class IDF_Views_Issue
|
|||||||
$status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));
|
$status['Open'] = array($opened, (int)(100 * $opened / ($opened + $closed)));
|
||||||
$status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));
|
$status['Closed'] = array($closed, (int)(100 * $closed / ($opened + $closed)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($opened > 0) {
|
if ($opened > 0) {
|
||||||
// Issue owner statistics
|
// Issue owner statistics
|
||||||
$owners = $prj->getIssueCountByOwner('open');
|
$owners = $prj->getIssueCountByOwner('open');
|
||||||
foreach ($owners as $user => $nb) {
|
foreach ($owners as $user => $nb) {
|
||||||
if ($user === '') {
|
if ($user === '') {
|
||||||
$key = __('Not assigned');
|
$key = __('Not assigned');
|
||||||
|
$login = null;
|
||||||
} else {
|
} else {
|
||||||
$obj = Pluf::factory('Pluf_User')->getOne(array('filter'=>'id='.$user));
|
$obj = Pluf::factory('Pluf_User')->getOne(array('filter'=>'id='.$user));
|
||||||
$key = $obj->first_name . ' ' . $obj->last_name;
|
$key = $obj->first_name . ' ' . $obj->last_name;
|
||||||
|
$login = $obj->login;
|
||||||
}
|
}
|
||||||
$ownerStatistics[$key] = array($nb, (int)(100 * $nb / $opened));
|
$ownerStatistics[$key] = array($nb, (int)(100 * $nb / $opened), $login);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Issue class tag statistics
|
// Issue class tag statistics
|
||||||
$tags = $prj->getTagCloud();
|
$grouped_tags = $prj->getTagCloud();
|
||||||
foreach ($tags as $t) {
|
foreach ($grouped_tags as $class => $tags) {
|
||||||
$tagStatistics[$t->class][$t->name] = array($t->nb_use, $t->id);
|
foreach ($tags as $tag) {
|
||||||
|
$tagStatistics[$class][$tag->name] = array($tag->nb_use, $tag->id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
foreach($tagStatistics as $k => $v) {
|
foreach($tagStatistics as $k => $v) {
|
||||||
$nbIssueInClass = 0;
|
$nbIssueInClass = 0;
|
||||||
@@ -130,15 +136,15 @@ class IDF_Views_Issue
|
|||||||
$tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);
|
$tagStatistics[$k][$kk] = array($vv[0], (int)(100 * $vv[0] / $nbIssueInClass), $vv[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort
|
// Sort
|
||||||
krsort($tagStatistics);
|
krsort($tagStatistics);
|
||||||
arsort($ownerStatistics);
|
arsort($ownerStatistics);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$title = sprintf(__('Summary of tracked issues in %s.'), (string) $prj);
|
$title = sprintf(__('Summary of tracked issues in %s.'), (string) $prj);
|
||||||
|
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/issues/summary.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/issues/summary.html',
|
||||||
array('page_title' => $title,
|
array('page_title' => $title,
|
||||||
'trackerEmpty' => $isTrackerEmpty,
|
'trackerEmpty' => $isTrackerEmpty,
|
||||||
@@ -149,7 +155,7 @@ class IDF_Views_Issue
|
|||||||
),
|
),
|
||||||
$request);
|
$request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View the issues watch list of a given user.
|
* View the issues watch list of a given user.
|
||||||
* Limited to a specified project
|
* Limited to a specified project
|
||||||
@@ -313,42 +319,55 @@ class IDF_Views_Issue
|
|||||||
*
|
*
|
||||||
* Only open issues are shown.
|
* Only open issues are shown.
|
||||||
*/
|
*/
|
||||||
public $myIssues_precond = array('IDF_Precondition::accessIssues',
|
public $userIssues_precond = array('IDF_Precondition::accessIssues');
|
||||||
'Pluf_Precondition::loginRequired');
|
public function userIssues($request, $match)
|
||||||
public function myIssues($request, $match)
|
|
||||||
{
|
{
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
|
|
||||||
|
$sql = new Pluf_SQL('login=%s', array($match[2]));
|
||||||
|
$user = Pluf::factory('Pluf_User')->getOne(array('filter' => $sql->gen()));
|
||||||
|
if ($user === null) {
|
||||||
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index',
|
||||||
|
array($prj->shortname));
|
||||||
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
|
}
|
||||||
|
|
||||||
$otags = $prj->getTagIdsByStatus('open');
|
$otags = $prj->getTagIdsByStatus('open');
|
||||||
$ctags = $prj->getTagIdsByStatus('closed');
|
$ctags = $prj->getTagIdsByStatus('closed');
|
||||||
if (count($otags) == 0) $otags[] = 0;
|
if (count($otags) == 0) $otags[] = 0;
|
||||||
if (count($ctags) == 0) $ctags[] = 0;
|
if (count($ctags) == 0) $ctags[] = 0;
|
||||||
switch ($match[2]) {
|
switch ($match[3]) {
|
||||||
case 'submit':
|
case 'submit':
|
||||||
$title = sprintf(__('My Submitted %s Issues'), (string) $prj);
|
$titleFormat = __('%s %s Submitted %s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $request->user->id));
|
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
||||||
break;
|
break;
|
||||||
case 'submitclosed':
|
case 'submitclosed':
|
||||||
$title = sprintf(__('My Closed Submitted %s Issues'), (string) $prj);
|
$titleFormat = __('%s %s Closed Submitted %s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $request->user->id));
|
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $user->id));
|
||||||
break;
|
break;
|
||||||
case 'ownerclosed':
|
case 'ownerclosed':
|
||||||
$title = sprintf(__('My Closed Working %s Issues'), (string) $prj);
|
$titleFormat = __('%s %s Closed Working %s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $request->user->id));
|
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $user->id));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$title = sprintf(__('My Working %s Issues'), (string) $prj);
|
$titleFormat = __('%s %s Working %s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $request->user->id));
|
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
$title = sprintf($titleFormat,
|
||||||
|
$user->first_name,
|
||||||
|
$user->last_name,
|
||||||
|
(string) $prj);
|
||||||
|
|
||||||
// Get stats about the issues
|
// Get stats about the issues
|
||||||
$sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $request->user->id));
|
$sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
||||||
$nb_submit = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
$nb_submit = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
||||||
$sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $request->user->id));
|
$sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
||||||
$nb_owner = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
$nb_owner = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
||||||
// Closed issues
|
// Closed issues
|
||||||
$sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $request->user->id));
|
$sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $user->id));
|
||||||
$nb_submit_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
$nb_submit_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
||||||
$sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $request->user->id));
|
$sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $user->id));
|
||||||
$nb_owner_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
$nb_owner_closed = Pluf::factory('IDF_Issue')->getCount(array('filter'=>$sql->gen()));
|
||||||
|
|
||||||
// Paginator to paginate the issues
|
// Paginator to paginate the issues
|
||||||
@@ -359,7 +378,7 @@ class IDF_Views_Issue
|
|||||||
'current_user' => $request->user);
|
'current_user' => $request->user);
|
||||||
$pag->summary = __('This table shows the open issues.');
|
$pag->summary = __('This table shows the open issues.');
|
||||||
$pag->forced_where = $f_sql;
|
$pag->forced_where = $f_sql;
|
||||||
$pag->action = array('IDF_Views_Issue::myIssues', array($prj->shortname, $match[2]));
|
$pag->action = array('IDF_Views_Issue::userIssues', array($prj->shortname, $match[2]));
|
||||||
$pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted
|
$pag->sort_order = array('modif_dtime', 'ASC'); // will be reverted
|
||||||
$pag->sort_reverse_order = array('modif_dtime');
|
$pag->sort_reverse_order = array('modif_dtime');
|
||||||
$pag->sort_link_title = true;
|
$pag->sort_link_title = true;
|
||||||
@@ -374,9 +393,10 @@ class IDF_Views_Issue
|
|||||||
$pag->items_per_page = 10;
|
$pag->items_per_page = 10;
|
||||||
$pag->no_results_text = __('No issues were found.');
|
$pag->no_results_text = __('No issues were found.');
|
||||||
$pag->setFromRequest($request);
|
$pag->setFromRequest($request);
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/issues/my-issues.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/issues/userIssues.html',
|
||||||
array('project' => $prj,
|
array('project' => $prj,
|
||||||
'page_title' => $title,
|
'page_title' => $title,
|
||||||
|
'login' => $user->login,
|
||||||
'nb_submit' => $nb_submit,
|
'nb_submit' => $nb_submit,
|
||||||
'nb_owner' => $nb_owner,
|
'nb_owner' => $nb_owner,
|
||||||
'nb_submit_closed' => $nb_submit_closed,
|
'nb_submit_closed' => $nb_submit_closed,
|
||||||
@@ -429,45 +449,142 @@ class IDF_Views_Issue
|
|||||||
|
|
||||||
public $search_precond = array('IDF_Precondition::accessIssues');
|
public $search_precond = array('IDF_Precondition::accessIssues');
|
||||||
public function search($request, $match)
|
public function search($request, $match)
|
||||||
|
{
|
||||||
|
$query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];
|
||||||
|
return $this->doSearch($request, $query, 'open');
|
||||||
|
}
|
||||||
|
|
||||||
|
public $searchStatus_precond = array('IDF_Precondition::accessIssues');
|
||||||
|
public function searchStatus($request, $match)
|
||||||
|
{
|
||||||
|
$query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];
|
||||||
|
$status = in_array($match[2], array('open', 'closed')) ? $match[2] : 'open';
|
||||||
|
return $this->doSearch($request, $query, $status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public $searchLabel_precond = array('IDF_Precondition::accessIssues');
|
||||||
|
public function searchLabel($request, $match)
|
||||||
|
{
|
||||||
|
$query = !isset($request->REQUEST['q']) ? '' : $request->REQUEST['q'];
|
||||||
|
$tag_id = intval($match[2]);
|
||||||
|
$status = in_array($match[3], array('open', 'closed')) ? $match[3] : 'open';
|
||||||
|
return $this->doSearch($request, $query, $status, $tag_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function doSearch($request, $query, $status, $tag_id=null)
|
||||||
{
|
{
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
if (!isset($request->REQUEST['q']) or trim($request->REQUEST['q']) == '') {
|
if (trim($query) == '') {
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index', array($prj->shortname));
|
||||||
array($prj->shortname));
|
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
}
|
}
|
||||||
$q = $request->REQUEST['q'];
|
|
||||||
$title = sprintf(__('Search Issues - %s'), $q);
|
$tag = null;
|
||||||
$issues = new Pluf_Search_ResultSet(IDF_Search::mySearch($q, $prj, 'IDF_Issue'));
|
if ($tag_id !== null) {
|
||||||
if (count($issues) > 100) {
|
$tag = Pluf_Shortcuts_GetObjectOr404('IDF_Tag', $tag_id);
|
||||||
// no more than 100 results as we do not care
|
|
||||||
$issues->results = array_slice($issues->results, 0, 100);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$title = sprintf(__('Search issues - %s'), $query);
|
||||||
|
if ($status === 'closed') {
|
||||||
|
$title = sprintf(__('Search closed issues - %s'), $query);
|
||||||
|
}
|
||||||
|
|
||||||
|
// using Plufs ResultSet implementation here is inefficient, because
|
||||||
|
// it makes a SELECT for each item and does not allow for further
|
||||||
|
// filtering neither, so we just return the ids and filter by them
|
||||||
|
// and other things in the next round
|
||||||
|
$results = IDF_Search::mySearch($query, $prj, 'IDF_Issue');
|
||||||
|
|
||||||
|
$issue_ids = array(0);
|
||||||
|
foreach ($results as $result) {
|
||||||
|
$issue_ids[] = $result['model_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$otags = $prj->getTagIdsByStatus($status);
|
||||||
|
if (count($otags) == 0) $otags[] = 0;
|
||||||
|
$sql = new Pluf_SQL(
|
||||||
|
'id IN ('.implode(',', $issue_ids).') '.
|
||||||
|
'AND status IN ('.implode(', ', $otags).') '.
|
||||||
|
($tag_id !== null ? 'AND idf_tag_id='.$tag_id.' ' : '')
|
||||||
|
);
|
||||||
|
$model = new IDF_Issue();
|
||||||
|
$issues = $model->getList(array('filter' => $sql->gen(), 'view' => 'join_tags'));
|
||||||
|
|
||||||
|
// we unfortunately loose the original sort order,
|
||||||
|
// so we manually have to apply it here again
|
||||||
|
$sorted_issues = new ArrayObject();
|
||||||
|
$filtered_issue_ids = array(0);
|
||||||
|
foreach ($issue_ids as $issue_id) {
|
||||||
|
foreach ($issues as $issue) {
|
||||||
|
if ($issue->id != $issue_id)
|
||||||
|
continue;
|
||||||
|
if (array_key_exists($issue_id, $sorted_issues))
|
||||||
|
continue;
|
||||||
|
$sorted_issues[$issue_id] = $issue;
|
||||||
|
$filtered_issue_ids[] = $issue_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$pag = new Pluf_Paginator();
|
$pag = new Pluf_Paginator();
|
||||||
$pag->items = $issues;
|
|
||||||
$pag->class = 'recent-issues';
|
$pag->class = 'recent-issues';
|
||||||
$pag->item_extra_props = array('project_m' => $prj,
|
$pag->items = $sorted_issues;
|
||||||
'shortname' => $prj->shortname,
|
$pag->item_extra_props = array(
|
||||||
'current_user' => $request->user);
|
'project_m' => $prj,
|
||||||
|
'shortname' => $prj->shortname,
|
||||||
|
'current_user' => $request->user
|
||||||
|
);
|
||||||
$pag->summary = __('This table shows the found issues.');
|
$pag->summary = __('This table shows the found issues.');
|
||||||
$pag->action = array('IDF_Views_Issue::search', array($prj->shortname), array('q'=> $q));
|
|
||||||
$pag->extra_classes = array('a-c', '', 'a-c', '');
|
$pag->extra_classes = array('a-c', '', 'a-c', '');
|
||||||
$list_display = array(
|
$pag->configure(array(
|
||||||
'id' => __('Id'),
|
'id' => __('Id'),
|
||||||
array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),
|
array('summary', 'IDF_Views_Issue_SummaryAndLabels', __('Summary')),
|
||||||
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
|
array('status', 'IDF_Views_Issue_ShowStatus', __('Status')),
|
||||||
array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
|
array('modif_dtime', 'Pluf_Paginator_DateAgo', __('Last Updated')),
|
||||||
);
|
));
|
||||||
$pag->configure($list_display);
|
// disable paginating
|
||||||
$pag->items_per_page = 100;
|
$pag->items_per_page = PHP_INT_MAX;
|
||||||
$pag->no_results_text = __('No issues were found.');
|
$pag->no_results_text = __('No issues were found.');
|
||||||
$pag->setFromRequest($request);
|
$pag->setFromRequest($request);
|
||||||
$params = array('page_title' => $title,
|
|
||||||
'issues' => $pag,
|
|
||||||
'q' => $q,
|
|
||||||
);
|
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/issues/search.html', $params, $request);
|
|
||||||
|
|
||||||
|
if ($tag_id === null) {
|
||||||
|
$pag->action = array('IDF_Views_Issue::searchStatus',
|
||||||
|
array($prj->shortname, $status),
|
||||||
|
array('q'=> $query),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$pag->action = array('IDF_Views_Issue::searchLabel',
|
||||||
|
array($prj->shortname, $tag_id, $status),
|
||||||
|
array('q'=> $query),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get stats about the issues
|
||||||
|
$open = $prj->getIssueCountByStatus('open', $tag, $issue_ids);
|
||||||
|
$closed = $prj->getIssueCountByStatus('closed', $tag, $issue_ids);
|
||||||
|
|
||||||
|
// query the available tags for this search result
|
||||||
|
$all_tags = $prj->getTagsByIssues($filtered_issue_ids);
|
||||||
|
$grouped_tags = array();
|
||||||
|
foreach ($all_tags as $atag) {
|
||||||
|
// group by class
|
||||||
|
if (!array_key_exists($atag->class, $grouped_tags)) {
|
||||||
|
$grouped_tags[$atag->class] = array();
|
||||||
|
}
|
||||||
|
$grouped_tags[$atag->class][] = $atag;
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = array(
|
||||||
|
'page_title' => $title,
|
||||||
|
'issues' => $pag,
|
||||||
|
'query' => $query,
|
||||||
|
'status' => $status,
|
||||||
|
'open' => $open,
|
||||||
|
'closed' => $closed,
|
||||||
|
'tag' => $tag,
|
||||||
|
'all_tags' => $grouped_tags,
|
||||||
|
);
|
||||||
|
|
||||||
|
return Pluf_Shortcuts_RenderToResponse('idf/issues/search.html', $params, $request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public $view_precond = array('IDF_Precondition::accessIssues');
|
public $view_precond = array('IDF_Precondition::accessIssues');
|
||||||
@@ -615,6 +732,13 @@ class IDF_Views_Issue
|
|||||||
{
|
{
|
||||||
$prj = $request->project;
|
$prj = $request->project;
|
||||||
$status = $match[2];
|
$status = $match[2];
|
||||||
|
|
||||||
|
if (mb_strtolower($status) == 'open') {
|
||||||
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::index',
|
||||||
|
array($prj->shortname));
|
||||||
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
|
}
|
||||||
|
|
||||||
$title = sprintf(__('%s Closed Issues'), (string) $prj);
|
$title = sprintf(__('%s Closed Issues'), (string) $prj);
|
||||||
// Get stats about the issues
|
// Get stats about the issues
|
||||||
$open = $prj->getIssueCountByStatus('open');
|
$open = $prj->getIssueCountByStatus('open');
|
||||||
|
@@ -152,13 +152,11 @@ class IDF_Views_Wiki
|
|||||||
$pag->items_per_page = 25;
|
$pag->items_per_page = 25;
|
||||||
$pag->no_results_text = __('No documentation pages were found.');
|
$pag->no_results_text = __('No documentation pages were found.');
|
||||||
$pag->setFromRequest($request);
|
$pag->setFromRequest($request);
|
||||||
$tags = $prj->getTagCloud('wiki');
|
|
||||||
return Pluf_Shortcuts_RenderToResponse('idf/wiki/index.html',
|
return Pluf_Shortcuts_RenderToResponse('idf/wiki/index.html',
|
||||||
array(
|
array(
|
||||||
'page_title' => $title,
|
'page_title' => $title,
|
||||||
'label' => $tag,
|
'label' => $tag,
|
||||||
'pages' => $pag,
|
'pages' => $pag,
|
||||||
'tags' => $tags,
|
|
||||||
'dlabel' => $dtag,
|
'dlabel' => $dtag,
|
||||||
),
|
),
|
||||||
$request);
|
$request);
|
||||||
|
@@ -117,7 +117,7 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/$#',
|
|||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
'method' => 'index');
|
'method' => 'index');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/summary/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/summary/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
@@ -128,6 +128,16 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/search/$#',
|
|||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
'method' => 'search');
|
'method' => 'search');
|
||||||
|
|
||||||
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/search/status/(\w+)/$#',
|
||||||
|
'base' => $base,
|
||||||
|
'model' => 'IDF_Views_Issue',
|
||||||
|
'method' => 'searchStatus');
|
||||||
|
|
||||||
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/search/label/(\d+)/(\w+)/$#',
|
||||||
|
'base' => $base,
|
||||||
|
'model' => 'IDF_Views_Issue',
|
||||||
|
'method' => 'searchLabel');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/(\d+)/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/(\d+)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
@@ -153,10 +163,10 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/create/$#',
|
|||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
'method' => 'create');
|
'method' => 'create');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/my/(\w+)/$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/(.*)/(\w+)/$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
'model' => 'IDF_Views_Issue',
|
'model' => 'IDF_Views_Issue',
|
||||||
'method' => 'myIssues');
|
'method' => 'userIssues');
|
||||||
|
|
||||||
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/attachment/(\d+)/(.*)$#',
|
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/attachment/(\d+)/(.*)$#',
|
||||||
'base' => $base,
|
'base' => $base,
|
||||||
|
@@ -4,10 +4,10 @@
|
|||||||
<div id="sub-tabs">
|
<div id="sub-tabs">
|
||||||
<a {if $inSummaryIssues}class="active" {/if}href="{url 'IDF_Views_Issue::summary', array($project.shortname)}">{trans 'Summary'}</a>
|
<a {if $inSummaryIssues}class="active" {/if}href="{url 'IDF_Views_Issue::summary', array($project.shortname)}">{trans 'Summary'}</a>
|
||||||
| <a {if $inOpenIssues}class="active" {/if}href="{url 'IDF_Views_Issue::index', array($project.shortname)}">{trans 'Open Issues'}</a>
|
| <a {if $inOpenIssues}class="active" {/if}href="{url 'IDF_Views_Issue::index', array($project.shortname)}">{trans 'Open Issues'}</a>
|
||||||
{if !$user.isAnonymous()} | <a {if $inCreate}class="active" {/if}href="{url 'IDF_Views_Issue::create', array($project.shortname)}">{trans 'New Issue'}</a> | <a {if $inMyIssues}class="active" {/if}href="{url 'IDF_Views_Issue::myIssues', array($project.shortname, 'submit')}">{trans 'My Issues'}</a>
|
{if !$user.isAnonymous()} | <a {if $inCreate}class="active" {/if}href="{url 'IDF_Views_Issue::create', array($project.shortname)}">{trans 'New Issue'}</a> | <a {if $inMyIssues}class="active" {/if}href="{url 'IDF_Views_Issue::userIssues', array($project.shortname, $user.login, 'submit')}">{trans 'My Issues'}</a>
|
||||||
| <a {if $inWatchList}class="active" {/if}href="{url 'IDF_Views_Issue::watchList', array($project.shortname, 'open')}">{trans 'My watch list'}</a>{/if} |
|
| <a {if $inWatchList}class="active" {/if}href="{url 'IDF_Views_Issue::watchList', array($project.shortname, 'open')}">{trans 'My watch list'}</a>{/if} |
|
||||||
<form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
<form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
||||||
<input accesskey="4" type="text" value="{$q}" name="q" size="20" />
|
<input accesskey="4" type="text" value="{$query}" name="q" size="20" />
|
||||||
<input type="submit" name="s" value="{trans 'Search'}" />
|
<input type="submit" name="s" value="{trans 'Search'}" />
|
||||||
</form>
|
</form>
|
||||||
{if $inIssue} |
|
{if $inIssue} |
|
||||||
|
@@ -8,16 +8,15 @@
|
|||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
{block context}
|
{block context}
|
||||||
<p><strong>{trans 'Label:'}</strong>
|
|
||||||
{aurl 'url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'open')}
|
|
||||||
<a href="{$url}" class="label"><strong>{$label.class}:</strong>{$label.name}</a></p>
|
|
||||||
{aurl 'open_url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'open')}
|
{aurl 'open_url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'open')}
|
||||||
{aurl 'closed_url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'closed')}
|
{aurl 'closed_url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'closed')}
|
||||||
{blocktrans}<p><strong>Open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
{blocktrans}<p><strong>Open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
||||||
<p><strong>Closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>
|
<p><strong>Closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>
|
||||||
{/blocktrans}{if $completion}
|
{/blocktrans}
|
||||||
|
<p><strong>{trans 'Label:'}</strong>
|
||||||
|
{aurl 'url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'open')}
|
||||||
|
<a href="{$url}" class="label"><strong>{$label.class}:</strong>{$label.name}</a></p>
|
||||||
|
{if $completion}
|
||||||
<p><strong>{trans 'Completion:'}</strong> {$completion}</p>
|
<p><strong>{trans 'Completion:'}</strong> {$completion}</p>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
|
@@ -13,6 +13,5 @@
|
|||||||
{blocktrans}<p><strong>Open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
{blocktrans}<p><strong>Open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
||||||
<p><strong>Closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>{/blocktrans}
|
<p><strong>Closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>{/blocktrans}
|
||||||
{assign $cloud_url = 'IDF_Views_Issue::listLabel'}
|
{assign $cloud_url = 'IDF_Views_Issue::listLabel'}
|
||||||
{assign $cloud = 'issues'}
|
|
||||||
{include 'idf/tags-cloud.html'}
|
{include 'idf/tags-cloud.html'}
|
||||||
{/block}
|
{/block}
|
||||||
|
@@ -68,6 +68,9 @@
|
|||||||
return row.to;
|
return row.to;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
{/literal}
|
||||||
|
{if $issue}
|
||||||
|
{literal}
|
||||||
$("#id_relation_issue" + idx).autocomplete("{/literal}{url 'IDF_Views_Issue::autoCompleteIssueList', array($project.shortname, $issue.id)}{literal}", {
|
$("#id_relation_issue" + idx).autocomplete("{/literal}{url 'IDF_Views_Issue::autoCompleteIssueList', array($project.shortname, $issue.id)}{literal}", {
|
||||||
minChars: 0,
|
minChars: 0,
|
||||||
width: 310,
|
width: 310,
|
||||||
@@ -83,6 +86,9 @@
|
|||||||
return row[1];
|
return row[1];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
{/literal}
|
||||||
|
{/if}
|
||||||
|
{literal}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
{/literal} //-->
|
{/literal} //-->
|
||||||
|
@@ -8,5 +8,25 @@
|
|||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
{block context}
|
{block context}
|
||||||
<p><strong>{trans 'Found issues:'}</strong> {$issues.nb_items}</p>
|
{aurl 'open_url', 'IDF_Views_Issue::searchStatus', array($project.shortname, 'open'), array('q' => $query)}
|
||||||
|
{aurl 'closed_url', 'IDF_Views_Issue::searchStatus', array($project.shortname, 'closed'), array('q' => $query)}
|
||||||
|
{if $tag != null}
|
||||||
|
{aurl 'open_url', 'IDF_Views_Issue::searchLabel', array($project.shortname, $tag.id, 'open'), array('q' => $query)}
|
||||||
|
{aurl 'closed_url', 'IDF_Views_Issue::searchLabel', array($project.shortname, $tag.id, 'closed'), array('q' => $query)}
|
||||||
|
{/if}
|
||||||
|
{blocktrans}
|
||||||
|
<p><strong>Found open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
||||||
|
<p><strong>Found closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>{/blocktrans}
|
||||||
|
{if $tag !== null}
|
||||||
|
{blocktrans}<p><strong>Label:</strong>
|
||||||
|
<a href="{$open_url}" class="label"><strong>{$tag.class}:</strong>{$tag.name}</a></p>{/blocktrans}
|
||||||
|
{else}
|
||||||
|
{* yes, this is duplicated from tags-cloud.html, but the code there cannot be easily overridden *}
|
||||||
|
<div id="tagscloud" class="smaller"><dl>{foreach $all_tags as $class => $labels}
|
||||||
|
<dt class="label">{$class}</dt>
|
||||||
|
{foreach $labels as $idx => $label}
|
||||||
|
{aurl 'url', 'IDF_Views_Issue::searchLabel', array($project.shortname, $label.id, $status), array('q'=> $query)}
|
||||||
|
<dd><a href="{$url}" class="label">{$label.name}{if $idx != count($labels) - 1},{/if}</a></dd>
|
||||||
|
{/foreach}{/foreach}</dl></p>
|
||||||
|
{/if}
|
||||||
{/block}
|
{/block}
|
||||||
|
@@ -71,7 +71,12 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{foreach $ownerStatistics as $key => $value}
|
{foreach $ownerStatistics as $key => $value}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="name">{$key}</td>
|
<td class="name">
|
||||||
|
{if !empty($value[2])}
|
||||||
|
{aurl 'url', 'IDF_Views_Issue::userIssues', array($project.shortname, $value[2], 'owner')}
|
||||||
|
<a href="{$url}">{$key}</a>
|
||||||
|
{else}{$key}{/if}
|
||||||
|
</td>
|
||||||
<td class="count">{$value[0]}</td>
|
<td class="count">{$value[0]}</td>
|
||||||
<td class="graph">
|
<td class="graph">
|
||||||
<table class='graph'>
|
<table class='graph'>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
{extends "idf/issues/base.html"}
|
{extends "idf/issues/base.html"}
|
||||||
{block docclass}yui-t2{assign $inMyIssues = true}{/block}
|
{block docclass}yui-t2{if $user.login == $login}{assign $inMyIssues = true}{/if}{/block}
|
||||||
{block body}
|
{block body}
|
||||||
{$issues.render}
|
{$issues.render}
|
||||||
{if !$user.isAnonymous()}
|
{if !$user.isAnonymous()}
|
||||||
@@ -8,10 +8,10 @@
|
|||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
{block context}
|
{block context}
|
||||||
{aurl 'owner_url', 'IDF_Views_Issue::myIssues', array($project.shortname, 'owner')}
|
{aurl 'owner_url', 'IDF_Views_Issue::userIssues', array($project.shortname, $login, 'owner')}
|
||||||
{aurl 'submit_url', 'IDF_Views_Issue::myIssues', array($project.shortname, 'submit')}
|
{aurl 'submit_url', 'IDF_Views_Issue::userIssues', array($project.shortname, $login, 'submit')}
|
||||||
{aurl 'owner_closed_url', 'IDF_Views_Issue::myIssues', array($project.shortname, 'ownerclosed')}
|
{aurl 'owner_closed_url', 'IDF_Views_Issue::userIssues', array($project.shortname, $login, 'ownerclosed')}
|
||||||
{aurl 'submit_closed_url', 'IDF_Views_Issue::myIssues', array($project.shortname, 'submitclosed')}
|
{aurl 'submit_closed_url', 'IDF_Views_Issue::userIssues', array($project.shortname, $login, 'submitclosed')}
|
||||||
<p><strong>{trans 'Submitted issues:'}</strong> <a href="{$submit_url}">{$nb_submit}</a>
|
<p><strong>{trans 'Submitted issues:'}</strong> <a href="{$submit_url}">{$nb_submit}</a>
|
||||||
{if $nb_submit_closed}<br /><span class="helptext">{blocktrans $nb_submit_closed}See the <a href="{$submit_closed_url}">{$nb_submit_closed} closed</a>.{plural}See the <a href="{$submit_closed_url}">{$nb_submit_closed} closed</a>.{/blocktrans}</span>{/if}</p>
|
{if $nb_submit_closed}<br /><span class="helptext">{blocktrans $nb_submit_closed}See the <a href="{$submit_closed_url}">{$nb_submit_closed} closed</a>.{plural}See the <a href="{$submit_closed_url}">{$nb_submit_closed} closed</a>.{/blocktrans}</span>{/if}</p>
|
||||||
{if $nb_owner > 0}
|
{if $nb_owner > 0}
|
@@ -17,7 +17,7 @@
|
|||||||
{assign $submitter_data = $c.get_submitter_data()}
|
{assign $submitter_data = $c.get_submitter_data()}
|
||||||
<div class="issue-comment{if $i == 0} issue-comment-first{/if}{if $i == ($nc-1)} issue-comment-last{/if}" id="ic{$c.id}">
|
<div class="issue-comment{if $i == 0} issue-comment-first{/if}{if $i == ($nc-1)} issue-comment-last{/if}" id="ic{$c.id}">
|
||||||
{if $submitter_data.avatar != ''}
|
{if $submitter_data.avatar != ''}
|
||||||
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="{media}/upload/avatars/{$submitter_data.avatar}" alt=" " />
|
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="{upload}/avatars/{$submitter_data.avatar}" alt=" " />
|
||||||
{else}
|
{else}
|
||||||
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="http://www.gravatar.com/avatar/{$submitter.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="http://www.gravatar.com/avatar/{$submitter.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
||||||
{/if}
|
{/if}
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
{if $hasWikiAccess}{hotkey 'Shift+o', 'IDF_Views_Wiki::index', array($project.shortname)}{/if}
|
{if $hasWikiAccess}{hotkey 'Shift+o', 'IDF_Views_Wiki::index', array($project.shortname)}{/if}
|
||||||
{if $hasSourceAccess}{hotkey 'Shift+s', 'IDF_Views_Source::treeBase', array($project.shortname, $project.getScmRoot())}{/if}
|
{if $hasSourceAccess}{hotkey 'Shift+s', 'IDF_Views_Source::treeBase', array($project.shortname, $project.getScmRoot())}{/if}
|
||||||
{if $hasIssuesAccess and !$user.isAnonymous()}
|
{if $hasIssuesAccess and !$user.isAnonymous()}
|
||||||
{hotkey 'Shift+m', 'IDF_Views_Issue::myIssues', array($project.shortname, 'submit')}
|
{hotkey 'Shift+m', 'IDF_Views_Issue::userIssues', array($project.shortname, $user.login, 'submit')}
|
||||||
{hotkey 'Shift+w', 'IDF_Views_Issue::myIssues', array($project.shortname, 'owner')}
|
{hotkey 'Shift+w', 'IDF_Views_Issue::userIssues', array($project.shortname, $user.login, 'owner')}
|
||||||
{/if}{/if} //-->
|
{/if}{/if} //-->
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<div id="sub-tabs">
|
<div id="sub-tabs">
|
||||||
<a {if $inOpenReviews}class="active" {/if}href="{url 'IDF_Views_Review::index', array($project.shortname)}">{trans 'Open Reviews'}</a> {*
|
<a {if $inOpenReviews}class="active" {/if}href="{url 'IDF_Views_Review::index', array($project.shortname)}">{trans 'Open Reviews'}</a> {*
|
||||||
|
|
||||||
{if !$user.isAnonymous()} | <a {if $inCreate}class="active" {/if}href="{url 'IDF_Views_Issue::create', array($project.shortname)}">{trans 'New Issue'}</a> | <a {if $inMyIssues}class="active" {/if}href="{url 'IDF_Views_Issue::myIssues', array($project.shortname, 'submit')}">{trans 'My Issues'}</a>{/if} |
|
{if !$user.isAnonymous()} | <a {if $inCreate}class="active" {/if}href="{url 'IDF_Views_Issue::create', array($project.shortname)}">{trans 'New Issue'}</a> | <a {if $inMyIssues}class="active" {/if}href="{url 'IDF_Views_Issue::userIssues', array($project.shortname, $user.login, 'submit')}">{trans 'My Issues'}</a>{/if} |
|
||||||
<form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
<form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
||||||
<input accesskey="4" type="text" value="{$q}" name="q" size="20" />
|
<input accesskey="4" type="text" value="{$q}" name="q" size="20" />
|
||||||
<input type="submit" name="s" value="{trans 'Search'}" />
|
<input type="submit" name="s" value="{trans 'Search'}" />
|
||||||
|
@@ -5,17 +5,4 @@
|
|||||||
{if !$user.isAnonymous()}
|
{if !$user.isAnonymous()}
|
||||||
{aurl 'url', 'IDF_Views_Review::create', array($project.shortname)}
|
{aurl 'url', 'IDF_Views_Review::create', array($project.shortname)}
|
||||||
<p><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/add.png'}" alt="+" align="bottom" /></a> <a href="{$url}">{trans 'Start Code Review'}</a></p>{/if}
|
<p><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/add.png'}" alt="+" align="bottom" /></a> <a href="{$url}">{trans 'Start Code Review'}</a></p>{/if}
|
||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
{block context}
|
|
||||||
{*
|
|
||||||
{aurl 'open_url', 'IDF_Views_Issue::index', array($project.shortname)}
|
|
||||||
{aurl 'closed_url', 'IDF_Views_Issue::listStatus', array($project.shortname, 'closed')}
|
|
||||||
{blocktrans}<p><strong>Open issues:</strong> <a href="{$open_url}">{$open}</a></p>
|
|
||||||
<p><strong>Closed issues:</strong> <a href="{$closed_url}">{$closed}</a></p>{/blocktrans}
|
|
||||||
{assign $class = ''}{assign $i = 0}
|
|
||||||
<p class="smaller">{foreach $project.getTagCloud($cloud) as $label}
|
|
||||||
{aurl 'url', 'IDF_Views_Issue::listLabel', array($project.shortname, $label.id, 'open')}
|
|
||||||
{if $class != $label.class}{if $i != 0}<br />{/if}<strong class="label">{$label.class}:</strong> {/if}
|
|
||||||
<a href="{$url}" class="label">{$label.name}</a>,{assign $class = $label.class}{assign $i = $i + 1}{/foreach}</p>
|
|
||||||
*}{/block}
|
|
||||||
|
@@ -10,8 +10,26 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<table class="disp" summary="">
|
{if !$user.isAnonymous()}
|
||||||
<tr><td>
|
<div class="issue-submit-info" style="width: 50%; float: right; position: relative;">
|
||||||
|
<p><strong>{trans 'How to Participate in a Code Review'}</strong></p>
|
||||||
|
|
||||||
|
<p>{blocktrans}Code review is a process in which
|
||||||
|
after or before changes are commited into the code repository,
|
||||||
|
different people discuss the code changes. The goal is
|
||||||
|
to <strong>improve the quality of the code and the
|
||||||
|
contributions</strong>, as such, you must be pragmatic when writing
|
||||||
|
your review. Correctly mention the line numbers (in the old or in the
|
||||||
|
new file) and try to keep a good balance between seriousness and fun.
|
||||||
|
{/blocktrans}</p>
|
||||||
|
<p>{blocktrans}
|
||||||
|
<strong>Proposing code for review is intimidating</strong>, you know
|
||||||
|
you will receive critics, so please, as a reviewer, <strong>keep this
|
||||||
|
process fun</strong>, use it to help your contributor learn your
|
||||||
|
coding standards and the structure of the code and <strong>make them want
|
||||||
|
to propose more contributions</strong>.
|
||||||
|
{/blocktrans}</p></div>
|
||||||
|
{/if}
|
||||||
<table class="commit" summary="">
|
<table class="commit" summary="">
|
||||||
<tr>
|
<tr>
|
||||||
<th><strong>{trans 'Created:'}</strong></th><td>{$patch.creation_dtime|date:"%Y-%m-%d %H:%M:%S"} ({$patch.creation_dtime|dateago})</td>
|
<th><strong>{trans 'Created:'}</strong></th><td>{$patch.creation_dtime|date:"%Y-%m-%d %H:%M:%S"} ({$patch.creation_dtime|dateago})</td>
|
||||||
@@ -45,39 +63,12 @@
|
|||||||
<th> </th><td><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}" class="soft">{trans 'Download the corresponding diff file'}</a></td>
|
<th> </th><td><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}" class="soft">{trans 'Download the corresponding diff file'}</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</td><td>
|
|
||||||
{if !$user.isAnonymous()}
|
|
||||||
<div class="issue-submit-info" style="width: 90%; float: right; position: relative;">
|
|
||||||
<p><strong>{trans 'How to Participate in a Code Review'}</strong></p>
|
|
||||||
|
|
||||||
<p>{blocktrans}Code review is a process in which
|
|
||||||
after or before changes are commited into the code repository,
|
|
||||||
different people discuss the code changes. The goal is
|
|
||||||
to <strong>improve the quality of the code and the
|
|
||||||
contributions</strong>, as such, you must be pragmatic when writing
|
|
||||||
your review. Correctly mention the line numbers (in the old or in the
|
|
||||||
new file) and try to keep a good balance between seriousness and fun.
|
|
||||||
{/blocktrans}</p>
|
|
||||||
<p>{blocktrans}
|
|
||||||
<strong>Proposing code for review is intimidating</strong>, you know
|
|
||||||
you will receive critics, so please, as a reviewer, <strong>keep this
|
|
||||||
process fun</strong>, use it to help your contributor learn your
|
|
||||||
coding standards and the structure of the code and <strong>make them want
|
|
||||||
to propose more contributions</strong>.
|
|
||||||
{/blocktrans}</p></div>
|
|
||||||
{/if}
|
|
||||||
</td></tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<form method="post" action=".">
|
<form method="post" action=".">
|
||||||
{foreach $files as $file=>$def}
|
{foreach $files as $file=>$def}
|
||||||
<table class="diff" summary=" ">
|
|
||||||
<tbody>
|
{$def[0]}
|
||||||
<tr id="diff-{$file|md5}"><th colspan="4">{$file}</th></tr>
|
|
||||||
<tr><th colspan="2">{trans 'Old'}</th><th colspan="2">{trans 'New'}</th></tr>
|
|
||||||
{$def[0]}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{assign $fcomments = $def[2]}
|
{assign $fcomments = $def[2]}
|
||||||
{assign $nc = $fcomments.count()}
|
{assign $nc = $fcomments.count()}
|
||||||
{assign $i = 1}
|
{assign $i = 1}
|
||||||
@@ -109,7 +100,7 @@ to propose more contributions</strong>.
|
|||||||
{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request}{assign $submitter = $c.get_submitter()}{assign $submitter_data = $c.get_submitter_data()}
|
{foreach $comments as $c}{ashowuser 'submitter', $c.get_submitter(), $request}{assign $submitter = $c.get_submitter()}{assign $submitter_data = $c.get_submitter_data()}
|
||||||
<div class="issue-comment{if $i == 1} issue-comment-first{/if}{if $i == ($nc)} issue-comment-last{/if}" id="ic{$c.id}">
|
<div class="issue-comment{if $i == 1} issue-comment-first{/if}{if $i == ($nc)} issue-comment-last{/if}" id="ic{$c.id}">
|
||||||
{if $submitter_data.avatar != ''}
|
{if $submitter_data.avatar != ''}
|
||||||
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="{media}/upload/avatars/{$submitter_data.avatar}" alt=" " />
|
<img style="float:right; position: relative; max-height: 60px; max-width: 60px;" src="{upload}/avatars/{$submitter_data.avatar}" alt=" " />
|
||||||
{else}
|
{else}
|
||||||
<img style="float:right; position: relative;" src="http://www.gravatar.com/avatar/{$submitter.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
<img style="float:right; position: relative;" src="http://www.gravatar.com/avatar/{$submitter.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
||||||
{/if}
|
{/if}
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
{assign $class = ''}{assign $i = 0}
|
<div id="tagscloud" class="smaller"><dl>{foreach $project.getTagCloud($cloud) as $class => $labels}
|
||||||
<div id="tagscloud" class="smaller"><dl>{foreach $project.getTagCloud($cloud) as $label}
|
<dt class="label">{$class}</dt>
|
||||||
|
{foreach $labels as $idx => $label}
|
||||||
{aurl 'url', $cloud_url, array($project.shortname, $label.id, 'open')}
|
{aurl 'url', $cloud_url, array($project.shortname, $label.id, 'open')}
|
||||||
{if $class != $label.class}<dt class="label">{$label.class}</dt>{assign $i = 0}{/if}
|
<dd><a href="{$url}" class="label">{$label.name}{if $idx != count($labels) - 1},{/if}</a></dd>
|
||||||
<dd><a href="{$url}" class="label">{$label.name},</a></dd>
|
{/foreach}{/foreach}</dl></p>
|
||||||
{assign $class = $label.class}
|
|
||||||
{assign $i = $i + 1}
|
|
||||||
{/foreach}</dl></p>
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<table class="form" summary="">
|
<table class="form" summary="">
|
||||||
<tr>
|
<tr>
|
||||||
<th style="text-align: right">{if $user_data.avatar != ''}
|
<th style="text-align: right">{if $user_data.avatar != ''}
|
||||||
<img style="max-height: 60px; max-width: 60px;" src="{media}/upload/avatars/{$user_data.avatar}" alt=" " />
|
<img style="max-height: 60px; max-width: 60px;" src="{upload}/avatars/{$user_data.avatar}" alt=" " />
|
||||||
{else}
|
{else}
|
||||||
<img src="http://www.gravatar.com/avatar/{$member.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
<img src="http://www.gravatar.com/avatar/{$member.email|md5}.jpg?s=60&d={media}/idf/img/spacer.gif" alt=" " />
|
||||||
{/if}
|
{/if}
|
||||||
|
@@ -1,5 +1,10 @@
|
|||||||
{extends "idf/wiki/base.html"}
|
{extends "idf/wiki/base.html"}
|
||||||
{block extraheader}{if $oldrev}<meta name="ROBOTS" content="NOINDEX" />{/if}{/block}
|
|
||||||
|
{block extraheader}
|
||||||
|
{if $oldrev}<meta name="ROBOTS" content="NOINDEX" />{/if}
|
||||||
|
<link rel="stylesheet" type="text/css" media="print" href="{media '/idf/css/print-wiki.css'}" />
|
||||||
|
{/block}
|
||||||
|
|
||||||
{block docclass}yui-t3{assign $inView=true}{/block}
|
{block docclass}yui-t3{assign $inView=true}{/block}
|
||||||
|
|
||||||
{block body}
|
{block body}
|
||||||
|
@@ -38,11 +38,9 @@ class IDF_DiffTest extends PHPUnit_Framework_TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
$expectedfile = str_replace('.diff', '.expected', $difffile);
|
$expectedfile = str_replace('.diff', '.expected', $difffile);
|
||||||
$expectedcontent = @file_get_contents($expectedfile);
|
|
||||||
|
|
||||||
$diffcontent = file_get_contents($difffile);
|
$diffcontent = file_get_contents($difffile);
|
||||||
$diff = new IDF_Diff($diffcontent, $diffprefix);
|
$diff = new IDF_Diff($diffcontent, $diffprefix);
|
||||||
$this->assertEquals(unserialize($expectedcontent),
|
$this->assertEquals(require_once($expectedfile),
|
||||||
$diff->parse(),
|
$diff->parse(),
|
||||||
'parsed diff '.$difffile.' does not match');
|
'parsed diff '.$difffile.' does not match');
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ if (file_exists($testconfig['db_database'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
echo ">>> creating empty test database...\n";
|
echo ">>> creating empty test database...\n";
|
||||||
passthru('php ' . PLUF_PATH . '/migrate.php --conf=' . TESTDIR . '/config.php -a -i');
|
passthru('php ' . escapeshellarg(PLUF_PATH.'/migrate.php') . ' --conf=' . escapeshellarg(TESTDIR.'/config.php').' -a -i');
|
||||||
|
|
||||||
echo ">>> setting up web application...\n";
|
echo ">>> setting up web application...\n";
|
||||||
require 'Pluf.php';
|
require 'Pluf.php';
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -15,375 +15,10 @@ Index: LinuxBIOSv1/src/include/cpu/i786/cpufixup.h
|
|||||||
+
|
+
|
||||||
+
|
+
|
||||||
|
|
||||||
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\include\cpu\i786\cpufixup.h
|
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\include\cpu\i786\cpufixup.h
|
||||||
___________________________________________________________________
|
___________________________________________________________________
|
||||||
Hinzugef<EFBFBD>gt: svn:keywords
|
Hinzugef<EFBFBD>gt: svn:keywords
|
||||||
+ Author Date Id Revision
|
+ Author Date Id Revision
|
||||||
Hinzugef<EFBFBD>gt: svn:eol-style
|
Hinzugef<EFBFBD>gt: svn:eol-style
|
||||||
+ native
|
|
||||||
|
|
||||||
Index: LinuxBIOSv1/src/mainboard/tyan/guiness/cmos.layout
|
|
||||||
===================================================================
|
|
||||||
--- LinuxBIOSv1/src/mainboard/tyan/guiness/cmos.layout (Revision 0)
|
|
||||||
+++ LinuxBIOSv1/src/mainboard/tyan/guiness/cmos.layout (Revision 665)
|
|
||||||
@@ -0,0 +1,63 @@
|
|
||||||
+entries
|
|
||||||
+
|
|
||||||
+#start-bit length config config-ID name
|
|
||||||
+#0 8 r 0 seconds
|
|
||||||
+#8 8 r 0 alarm_seconds
|
|
||||||
+#16 8 r 0 minutes
|
|
||||||
+#24 8 r 0 alarm_minutes
|
|
||||||
+#32 8 r 0 hours
|
|
||||||
+#40 8 r 0 alarm_hours
|
|
||||||
+#48 8 r 0 day_of_week
|
|
||||||
+#56 8 r 0 day_of_month
|
|
||||||
+#64 8 r 0 month
|
|
||||||
+#72 8 r 0 year
|
|
||||||
+#80 4 r 0 rate_select
|
|
||||||
+#84 3 r 0 REF_Clock
|
|
||||||
+#87 1 r 0 UIP
|
|
||||||
+#88 1 r 0 auto_switch_DST
|
|
||||||
+#89 1 r 0 24_hour_mode
|
|
||||||
+#90 1 r 0 binary_values_enable
|
|
||||||
+#91 1 r 0 square-wave_out_enable
|
|
||||||
+#92 1 r 0 update_finished_enable
|
|
||||||
+#93 1 r 0 alarm_interrupt_enable
|
|
||||||
+#94 1 r 0 periodic_interrupt_enable
|
|
||||||
+#95 1 r 0 disable_clock_updates
|
|
||||||
+#96 288 r 0 temporary_filler
|
|
||||||
+0 384 r 0 reserved_memory
|
|
||||||
+384 1 e 4 boot_option
|
|
||||||
+385 1 e 4 last_boot
|
|
||||||
+386 3 e 5 baud_rate
|
|
||||||
+392 4 e 6 debug_level
|
|
||||||
+396 1 e 1 power_on_after_fail
|
|
||||||
+#401 1 e 1 ECC_memory
|
|
||||||
+#402 1 e 2 hda_disk
|
|
||||||
+#403 1 e 2 hdb_disk
|
|
||||||
+#404 1 e 2 hdc_disk
|
|
||||||
+#405 1 e 2 hdd_disk
|
|
||||||
+#406 2 e 7 boot_device
|
|
||||||
+
|
|
||||||
+enumerations
|
|
||||||
+
|
|
||||||
+#ID value text
|
|
||||||
+1 0 Disable
|
|
||||||
+1 1 Enable
|
|
||||||
+#2 0 No
|
|
||||||
+#2 1 Yes
|
|
||||||
+4 0 Fallback
|
|
||||||
+4 1 Normal
|
|
||||||
+5 0 115200
|
|
||||||
+5 1 57600
|
|
||||||
+5 2 38400
|
|
||||||
+5 3 19200
|
|
||||||
+5 4 9600
|
|
||||||
+5 5 4800
|
|
||||||
+5 6 2400
|
|
||||||
+5 7 1200
|
|
||||||
+6 6 Notice
|
|
||||||
+6 7 Info
|
|
||||||
+6 8 Debug
|
|
||||||
+6 9 Spew
|
|
||||||
+#7 0 Network
|
|
||||||
+#7 1 HDD
|
|
||||||
+#7 2 Floppy
|
|
||||||
+#7 3 ROM
|
|
||||||
|
|
||||||
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\mainboard\tyan\guiness\cmos.layout
|
|
||||||
___________________________________________________________________
|
|
||||||
Hinzugef<EFBFBD>gt: svn:keywords
|
|
||||||
+ Author Date Id Revision
|
|
||||||
Hinzugef<EFBFBD>gt: svn:eol-style
|
|
||||||
+ native
|
|
||||||
|
|
||||||
Index: LinuxBIOSv1/src/config/linuxbios_c.ld
|
|
||||||
===================================================================
|
|
||||||
--- LinuxBIOSv1/src/config/linuxbios_c.ld (Revision 0)
|
|
||||||
+++ LinuxBIOSv1/src/config/linuxbios_c.ld (Revision 665)
|
|
||||||
@@ -0,0 +1,105 @@
|
|
||||||
+/*
|
|
||||||
+ * Memory map:
|
|
||||||
+ *
|
|
||||||
+ * _RAMBASE
|
|
||||||
+ * : data segment
|
|
||||||
+ * : bss segment
|
|
||||||
+ * : heap
|
|
||||||
+ * : stack
|
|
||||||
+ */
|
|
||||||
+/*
|
|
||||||
+ * Bootstrap code for the STPC Consumer
|
|
||||||
+ * Copyright (c) 1999 by Net Insight AB. All Rights Reserved.
|
|
||||||
+ *
|
|
||||||
+ * $Id$
|
|
||||||
+ *
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Written by Johan Rydberg, based on work by Daniel Kahlin.
|
|
||||||
+ * Rewritten by Eric Biederman
|
|
||||||
+ */
|
|
||||||
+/*
|
|
||||||
+ * We use ELF as output format. So that we can
|
|
||||||
+ * debug the code in some form.
|
|
||||||
+ */
|
|
||||||
+INCLUDE ldoptions
|
|
||||||
+
|
|
||||||
+ENTRY(_start)
|
|
||||||
+
|
|
||||||
+SECTIONS
|
|
||||||
+{
|
|
||||||
+ . = _RAMBASE;
|
|
||||||
+ /*
|
|
||||||
+ * First we place the code and read only data (typically const declared).
|
|
||||||
+ * This get placed in rom.
|
|
||||||
+ */
|
|
||||||
+ .text : {
|
|
||||||
+ _text = .;
|
|
||||||
+ *(.text);
|
|
||||||
+ *(.text.*);
|
|
||||||
+ . = ALIGN(16);
|
|
||||||
+ _etext = .;
|
|
||||||
+ }
|
|
||||||
+ .rodata : {
|
|
||||||
+ _rodata = .;
|
|
||||||
+ . = ALIGN(4);
|
|
||||||
+ streams = . ;
|
|
||||||
+ *(.rodata.streams)
|
|
||||||
+ estreams = .;
|
|
||||||
+ . = ALIGN(4);
|
|
||||||
+ pci_drivers = . ;
|
|
||||||
+ *(.rodata.pci_drivers)
|
|
||||||
+ epci_drivers = . ;
|
|
||||||
+ *(.rodata)
|
|
||||||
+ *(.rodata.*)
|
|
||||||
+ _erodata = .;
|
|
||||||
+ }
|
|
||||||
+ /*
|
|
||||||
+ * After the code we place initialized data (typically initialized
|
|
||||||
+ * global variables). This gets copied into ram by startup code.
|
|
||||||
+ * __data_start and __data_end shows where in ram this should be placed,
|
|
||||||
+ * whereas __data_loadstart and __data_loadend shows where in rom to
|
|
||||||
+ * copy from.
|
|
||||||
+ */
|
|
||||||
+ .data : {
|
|
||||||
+ _data = .;
|
|
||||||
+ *(.data)
|
|
||||||
+ _edata = .;
|
|
||||||
+ }
|
|
||||||
+ /*
|
|
||||||
+ * bss does not contain data, it is just a space that should be zero
|
|
||||||
+ * initialized on startup. (typically uninitialized global variables)
|
|
||||||
+ * crt0.S fills between _bss and _ebss with zeroes.
|
|
||||||
+ */
|
|
||||||
+ _bss = .;
|
|
||||||
+ .bss . : {
|
|
||||||
+ *(.bss)
|
|
||||||
+ *(.sbss)
|
|
||||||
+ *(COMMON)
|
|
||||||
+ }
|
|
||||||
+ _ebss = .;
|
|
||||||
+ _end = .;
|
|
||||||
+ _stack = .;
|
|
||||||
+ .stack . : {
|
|
||||||
+ /* Reserve a stack for each possible cpu, +1 extra */
|
|
||||||
+ . = ((MAX_CPUS * STACK_SIZE) + STACK_SIZE) ;
|
|
||||||
+ }
|
|
||||||
+ _estack = .;
|
|
||||||
+ _heap = .;
|
|
||||||
+ .heap . : {
|
|
||||||
+ /* Reserve 256K for the heap */
|
|
||||||
+ . = HEAP_SIZE ;
|
|
||||||
+ . = ALIGN(4);
|
|
||||||
+ }
|
|
||||||
+ _eheap = .;
|
|
||||||
+ /* The ram segment
|
|
||||||
+ * This is all address of the memory resident copy of linuxBIOS.
|
|
||||||
+ */
|
|
||||||
+ _ram_seg = _text;
|
|
||||||
+ _eram_seg = _eheap;
|
|
||||||
+ /DISCARD/ : {
|
|
||||||
+ *(.comment)
|
|
||||||
+ *(.note)
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
|
|
||||||
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\config\linuxbios_c.ld
|
|
||||||
___________________________________________________________________
|
|
||||||
Hinzugef<EFBFBD>gt: svn:keywords
|
|
||||||
+ Author Date Id Revision
|
|
||||||
Hinzugef<EFBFBD>gt: svn:eol-style
|
|
||||||
+ native
|
|
||||||
|
|
||||||
Index: LinuxBIOSv1/src/arch/i386/include/arch/rom_segs.h
|
|
||||||
===================================================================
|
|
||||||
--- LinuxBIOSv1/src/arch/i386/include/arch/rom_segs.h (Revision 0)
|
|
||||||
+++ LinuxBIOSv1/src/arch/i386/include/arch/rom_segs.h (Revision 665)
|
|
||||||
@@ -0,0 +1,10 @@
|
|
||||||
+#ifndef ROM_SEGS_H
|
|
||||||
+#define ROM_SEGS_H
|
|
||||||
+
|
|
||||||
+#define ROM_CODE_SEG 0x08
|
|
||||||
+#define ROM_DATA_SEG 0x10
|
|
||||||
+
|
|
||||||
+#define CACHE_RAM_CODE_SEG 0x18
|
|
||||||
+#define CACHE_RAM_DATA_SEG 0x20
|
|
||||||
+
|
|
||||||
+#endif /* ROM_SEGS_H */
|
|
||||||
|
|
||||||
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\arch\i386\include\arch\rom_segs.h
|
|
||||||
___________________________________________________________________
|
|
||||||
Hinzugef<EFBFBD>gt: svn:keywords
|
|
||||||
+ Author Date Id Revision
|
|
||||||
Hinzugef<EFBFBD>gt: svn:eol-style
|
|
||||||
+ native
|
|
||||||
|
|
||||||
Index: LinuxBIOSv1/src/arch/i386/lib/c_start.S
|
|
||||||
===================================================================
|
|
||||||
--- LinuxBIOSv1/src/arch/i386/lib/c_start.S (Revision 0)
|
|
||||||
+++ LinuxBIOSv1/src/arch/i386/lib/c_start.S (Revision 665)
|
|
||||||
@@ -0,0 +1,135 @@
|
|
||||||
+#include <arch/asm.h>
|
|
||||||
+#include <arch/intel.h>
|
|
||||||
+#ifdef SMP
|
|
||||||
+#include <cpu/p6/apic.h>
|
|
||||||
+#endif
|
|
||||||
+ .section ".text"
|
|
||||||
+ .code32
|
|
||||||
+ .globl _start
|
|
||||||
+_start:
|
|
||||||
+ cli
|
|
||||||
+ lgdt %cs:gdtaddr
|
|
||||||
+ ljmp $0x10, $1f
|
|
||||||
+1: movl $0x18, %ax
|
|
||||||
+ movl %eax, %ds
|
|
||||||
+ movl %eax, %es
|
|
||||||
+ movl %eax, %ss
|
|
||||||
+ movl %eax, %fs
|
|
||||||
+ movl %eax, %gs
|
|
||||||
+
|
|
||||||
+ intel_chip_post_macro(0x13) /* post 12 */
|
|
||||||
+
|
|
||||||
+ /** clear stack */
|
|
||||||
+ leal EXT(_stack), %edi
|
|
||||||
+ movl $EXT(_estack), %ecx
|
|
||||||
+ subl %edi, %ecx
|
|
||||||
+ xorl %eax, %eax
|
|
||||||
+ rep
|
|
||||||
+ stosb
|
|
||||||
+
|
|
||||||
+ /** clear bss */
|
|
||||||
+ leal EXT(_bss), %edi
|
|
||||||
+ movl $EXT(_ebss), %ecx
|
|
||||||
+ subl %edi, %ecx
|
|
||||||
+ jz .Lnobss
|
|
||||||
+ xorl %eax, %eax
|
|
||||||
+ rep
|
|
||||||
+ stosb
|
|
||||||
+.Lnobss:
|
|
||||||
+
|
|
||||||
+ /* set new stack */
|
|
||||||
+ movl $_estack, %esp
|
|
||||||
+#ifdef SMP
|
|
||||||
+ /* Get the cpu id */
|
|
||||||
+ movl $APIC_DEFAULT_BASE, %edi
|
|
||||||
+ movl APIC_ID(%edi), %eax
|
|
||||||
+ shrl $24, %eax
|
|
||||||
+
|
|
||||||
+ /* Get the cpu index (MAX_CPUS on error) */
|
|
||||||
+ movl $-4, %ebx
|
|
||||||
+1: addl $4, %ebx
|
|
||||||
+ cmpl $(MAX_CPUS << 2), %ebx
|
|
||||||
+ je 2
|
|
||||||
+ cmpl %eax, EXT(initial_apicid)(%ebx)
|
|
||||||
+ jne 1b
|
|
||||||
+2: shrl $2, %ebx
|
|
||||||
+
|
|
||||||
+ /* Now compute the appropriate stack */
|
|
||||||
+ movl %ebx, %eax
|
|
||||||
+ movl $STACK_SIZE, %ebx
|
|
||||||
+ mull %ebx
|
|
||||||
+ subl %eax, %esp
|
|
||||||
+
|
|
||||||
+ /* push the boot_complete flag */
|
|
||||||
+ pushl %ebp
|
|
||||||
+
|
|
||||||
+ /* Save the stack location */
|
|
||||||
+ movl %esp, %ebp
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * Now we are finished. Memory is up, data is copied and
|
|
||||||
+ * bss is cleared. Now we call the main routine and
|
|
||||||
+ * let it do the rest.
|
|
||||||
+ */
|
|
||||||
+ intel_chip_post_macro(0xfe) /* post fe */
|
|
||||||
+
|
|
||||||
+ /* Resort the stack location */
|
|
||||||
+ movl %ebp, %esp
|
|
||||||
+
|
|
||||||
+ /* The boot_complete flag has already been pushed */
|
|
||||||
+ call EXT(hardwaremain)
|
|
||||||
+ /*NOTREACHED*/
|
|
||||||
+.Lhlt:
|
|
||||||
+ intel_chip_post_macro(0xee) /* post fe */
|
|
||||||
+ hlt
|
|
||||||
+ jmp .Lhlt
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ .globl gdt, gdt_end, gdt_limit
|
|
||||||
+
|
|
||||||
+gdt_limit = gdt_end - gdt - 1 /* compute the table limit */
|
|
||||||
+gdtaddr:
|
|
||||||
+ .word gdt_limit
|
|
||||||
+ .long gdt /* we know the offset */
|
|
||||||
+
|
|
||||||
+gdt:
|
|
||||||
+// selgdt 0
|
|
||||||
+ .word 0x0000, 0x0000 /* dummy */
|
|
||||||
+ .byte 0x00, 0x00, 0x00, 0x00
|
|
||||||
+
|
|
||||||
+// selgdt 8
|
|
||||||
+ .word 0x0000, 0x0000 /* dummy */
|
|
||||||
+ .byte 0x00, 0x00, 0x00, 0x00
|
|
||||||
+
|
|
||||||
+// selgdt 0x10
|
|
||||||
+/* flat code segment */
|
|
||||||
+ .word 0xffff, 0x0000
|
|
||||||
+ .byte 0x00, 0x9b, 0xcf, 0x00
|
|
||||||
+
|
|
||||||
+//selgdt 0x18
|
|
||||||
+/* flat data segment */
|
|
||||||
+ .word 0xffff, 0x0000
|
|
||||||
+ .byte 0x00, 0x93, 0xcf, 0x00
|
|
||||||
+
|
|
||||||
+//selgdt 0x20
|
|
||||||
+ .word 0x0000, 0x0000 /* dummy */
|
|
||||||
+ .byte 0x00, 0x00, 0x00, 0x00
|
|
||||||
+
|
|
||||||
+#if defined(CONFIG_VGABIOS) && (CONFIG_VGABIOS == 1)
|
|
||||||
+ // from monty:
|
|
||||||
+ /* 0x00009a00,0000ffffULL, 20h: 16-bit 64k code at 0x00000000 */
|
|
||||||
+ /* 0x00009200,0000ffffULL 28h: 16-bit 64k data at 0x00000000 */
|
|
||||||
+// selgdt 0x28
|
|
||||||
+/*16-bit 64k code at 0x00000000 */
|
|
||||||
+ .word 0xffff, 0x0000
|
|
||||||
+ .byte 0, 0x9a, 0, 0
|
|
||||||
+
|
|
||||||
+// selgdt 0x30
|
|
||||||
+/*16-bit 64k data at 0x00000000 */
|
|
||||||
+ .word 0xffff, 0x0000
|
|
||||||
+ .byte 0, 0x92, 0, 0
|
|
||||||
+#endif // defined(CONFIG_VGABIOS) && (CONFIG_VGABIOS == 1)
|
|
||||||
+gdt_end:
|
|
||||||
+
|
|
||||||
+.code32
|
|
||||||
|
|
||||||
Eigenschafts<EFBFBD>nderungen: LinuxBIOSv1\src\arch\i386\lib\c_start.S
|
|
||||||
___________________________________________________________________
|
|
||||||
Hinzugef<EFBFBD>gt: svn:keywords
|
|
||||||
+ Author Date Id Revision
|
|
||||||
Hinzugef<EFBFBD>gt: svn:eol-style
|
|
||||||
+ native
|
+ native
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -1 +1,33 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:1:{i:0;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:3:"abc";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"0";i:1;s:1:"0";}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '0',
|
||||||
|
1 => '0',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:3:"abc";}i:1;a:3:{i:0;s:0:"";i:1;i:2;i:2;s:3:"abc";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"0";i:1;s:1:"0";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"2";}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 2,
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '0',
|
||||||
|
1 => '0',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '2',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:3:"abc";}i:1;a:3:{i:0;i:2;i:1;s:0:"";i:2;s:3:"abc";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;s:1:"2";}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => 2,
|
||||||
|
1 => '',
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '2',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:0:"";i:2;s:3:"abc";}i:1;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:2:"ls";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;i:1;}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '',
|
||||||
|
2 => "abc\r\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "ls\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:2:"ls";}i:1;a:3:{i:0;s:0:"";i:1;i:2;i:2;s:2:"ls";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;i:1;}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"2";}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "ls\r\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 2,
|
||||||
|
2 => "ls\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '2',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,45 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:3:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:2:"ls";}i:1;a:3:{i:0;i:2;i:1;i:2;i:2;s:2:"ls";}i:2;a:3:{i:0;s:0:"";i:1;i:3;i:2;s:1:"l";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;s:1:"2";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"3";}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "ls\r\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => 2,
|
||||||
|
1 => 2,
|
||||||
|
2 => "ls\r\n",
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 3,
|
||||||
|
2 => "l\r\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '2',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '3',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,33 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:1:{i:0;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:3:"foo";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"0";i:1;s:1:"0";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"1";}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "foo\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '0',
|
||||||
|
1 => '0',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:3:"foo";}i:1;a:3:{i:0;s:0:"";i:1;i:2;i:2;s:2:"bf";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;s:1:"1";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"2";}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "foo\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 2,
|
||||||
|
2 => "bf\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '2',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,33 @@
|
|||||||
a:1:{s:1:"a";a:2:{s:6:"chunks";a:1:{i:0;a:1:{i:0;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:3:"abc";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"0";i:1;s:1:"0";}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'a' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "abc\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '0',
|
||||||
|
1 => '0',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,45 @@
|
|||||||
a:1:{s:1:"b";a:2:{s:6:"chunks";a:1:{i:0;a:3:{i:0;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:1:"a";}i:1;a:3:{i:0;s:0:"";i:1;i:2;i:2;s:1:"b";}i:2;a:3:{i:0;s:0:"";i:1;i:3;i:2;b:0;}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"0";i:1;s:1:"0";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"3";}}}}}
|
<?php return array (
|
||||||
|
'b' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "a\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 2,
|
||||||
|
2 => "b\n",
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 3,
|
||||||
|
2 => "\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '0',
|
||||||
|
1 => '0',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '3',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,51 @@
|
|||||||
a:1:{s:1:"b";a:2:{s:6:"chunks";a:1:{i:0;a:4:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:1:"a";}i:1;a:3:{i:0;s:0:"";i:1;i:2;i:2;s:1:"l";}i:2;a:3:{i:0;i:2;i:1;i:3;i:2;s:1:"b";}i:3;a:3:{i:0;i:3;i:1;i:4;i:2;b:0;}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;s:1:"3";}i:1;a:2:{i:0;s:1:"1";i:1;s:1:"4";}}}}}
|
<?php return array (
|
||||||
|
'b' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "a\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => 2,
|
||||||
|
2 => "l\n",
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
array (
|
||||||
|
0 => 2,
|
||||||
|
1 => 3,
|
||||||
|
2 => "b\n",
|
||||||
|
),
|
||||||
|
3 =>
|
||||||
|
array (
|
||||||
|
0 => 3,
|
||||||
|
1 => 4,
|
||||||
|
2 => "\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '3',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '4',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,45 @@
|
|||||||
a:1:{s:1:"b";a:2:{s:6:"chunks";a:1:{i:0;a:3:{i:0;a:3:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:1:"a";}i:1;a:3:{i:0;i:2;i:1;s:0:"";i:2;s:1:"b";}i:2;a:3:{i:0;i:3;i:1;s:0:"";i:2;b:0;}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;s:1:"3";}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'b' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '1',
|
||||||
|
2 => "a\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => 2,
|
||||||
|
1 => '',
|
||||||
|
2 => "b\n",
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
array (
|
||||||
|
0 => 3,
|
||||||
|
1 => '',
|
||||||
|
2 => "\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '3',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:9:"test_file";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:0:"";i:2;s:17:"Steddy is awesome";}i:1;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:22:"Steddy is very awesome";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;i:1;}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'test_file' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '',
|
||||||
|
2 => "Steddy is awesome\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => 'Steddy is very awesome',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:3:"foo";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:0:"";i:2;s:11:"This is foo";}i:1;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:11:"This is foo";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;i:1;}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'foo' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '',
|
||||||
|
2 => "This is foo\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => 'This is foo',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
@@ -1 +1,39 @@
|
|||||||
a:1:{s:3:"foo";a:2:{s:6:"chunks";a:1:{i:0;a:2:{i:0;a:3:{i:0;s:1:"1";i:1;s:0:"";i:2;s:11:"This is foo";}i:1;a:3:{i:0;s:0:"";i:1;s:1:"1";i:2;s:11:"This is foo";}}}s:10:"chunks_def";a:1:{i:0;a:2:{i:0;a:2:{i:0;s:1:"1";i:1;i:1;}i:1;a:2:{i:0;s:1:"1";i:1;i:1;}}}}}
|
<?php return array (
|
||||||
|
'foo' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '',
|
||||||
|
2 => "This is foo",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "This is foo\n",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
10
test/data/IDF_DiffTest/test-18-git-lineendings.diff
Normal file
10
test/data/IDF_DiffTest/test-18-git-lineendings.diff
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
diff --git a/lineendings b/lineendings
|
||||||
|
index 7c2b7ec..9c59944 100644
|
||||||
|
--- a/lineendings
|
||||||
|
+++ b/lineendings
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+Unix, again
|
||||||
|
Windows
|
||||||
|
Unix
|
||||||
|
Old Macintosh
|
||||||
|
Nothing
|
51
test/data/IDF_DiffTest/test-18-git-lineendings.expected
Normal file
51
test/data/IDF_DiffTest/test-18-git-lineendings.expected
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php return array (
|
||||||
|
'lineendings' =>
|
||||||
|
array (
|
||||||
|
'chunks' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '',
|
||||||
|
1 => '1',
|
||||||
|
2 => "Unix, again\n",
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => 2,
|
||||||
|
2 => "Windows\r\n",
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
array (
|
||||||
|
0 => 2,
|
||||||
|
1 => 3,
|
||||||
|
2 => "Unix\n",
|
||||||
|
),
|
||||||
|
3 =>
|
||||||
|
array (
|
||||||
|
0 => 3,
|
||||||
|
1 => 4,
|
||||||
|
2 => "Old Macintosh\rNothing",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'chunks_def' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '3',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
array (
|
||||||
|
0 => '1',
|
||||||
|
1 => '4',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
32
www/media/idf/css/print-wiki.css
Normal file
32
www/media/idf/css/print-wiki.css
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# This file is part of InDefero, an open source project management application.
|
||||||
|
# Copyright (C) 2008-2011 Céondo Ltd and contributors.
|
||||||
|
#
|
||||||
|
# InDefero is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# InDefero is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#hd, #ft, #context {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.yui-t3 #yui-main .yui-b {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wiki-toc {
|
||||||
|
float: none;
|
||||||
|
}
|
@@ -212,17 +212,17 @@ span.px-header-title a, span.px-header-title a:link, span.px-header-title a:visi
|
|||||||
* Issue
|
* Issue
|
||||||
*/
|
*/
|
||||||
#tagscloud dl {
|
#tagscloud dl {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#tagscloud dt {
|
#tagscloud dt {
|
||||||
margin-top: .5em;
|
margin-top: .5em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
#tagscloud dd {
|
#tagscloud dd {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.issue-c {
|
a.issue-c {
|
||||||
@@ -506,16 +506,16 @@ table td.fileicon {
|
|||||||
cursor: default;
|
cursor: default;
|
||||||
display: block;
|
display: block;
|
||||||
/*
|
/*
|
||||||
if width will be 100% horizontal scrollbar will apear
|
if width will be 100% horizontal scrollbar will apear
|
||||||
when scroll mode will be used
|
when scroll mode will be used
|
||||||
*/
|
*/
|
||||||
/*width: 100%;*/
|
/*width: 100%;*/
|
||||||
font: menu;
|
font: menu;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
/*
|
/*
|
||||||
it is very important, if line-height not setted or setted
|
it is very important, if line-height not setted or setted
|
||||||
in relative units scroll will be broken in firefox
|
in relative units scroll will be broken in firefox
|
||||||
*/
|
*/
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@@ -571,9 +571,38 @@ table.commit table.changes table.properties td.removed {
|
|||||||
/**
|
/**
|
||||||
* syntax highlighting of diffs
|
* syntax highlighting of diffs
|
||||||
*/
|
*/
|
||||||
|
span.ctrl-char {
|
||||||
|
color: white;
|
||||||
|
background: black;
|
||||||
|
text-align: center;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 1px 1px 0px 1px;
|
||||||
|
margin-left: 1px;
|
||||||
|
margin-right: 1px;
|
||||||
|
-moz-border-radius: 2px;
|
||||||
|
-webkit-border-radius: 2px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* special formatting for the TAB character: make it wider, so it is rendered more properly */
|
||||||
|
span.ctrl-char[title="0x09"] {
|
||||||
|
width: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
table.diff {
|
table.diff {
|
||||||
border-bottom: 1px solid #d3d7cf;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff td {
|
||||||
|
border: none;
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff.unified > tbody > tr > td + td,
|
||||||
|
table.diff.context > tbody > tr > td + td + td + td {
|
||||||
|
border-right: 1px solid #d3d7cf;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.diff th {
|
table.diff th {
|
||||||
@@ -582,61 +611,92 @@ table.diff th {
|
|||||||
border-color: #d3d7cf;
|
border-color: #d3d7cf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.diff div.scroll {
|
||||||
table.diff tr {
|
overflow: auto;
|
||||||
border-left: 1px solid #d3d7cf;
|
|
||||||
border-right: 1px solid #d3d7cf;
|
|
||||||
border-bottom: none;
|
|
||||||
border-top: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
table.diff td {
|
table.diff-contents td,
|
||||||
font-size: 90%;
|
table.diff-linecounts td {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
padding: 1px;
|
|
||||||
border-color: inherit;
|
border-color: inherit;
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.diff td.diff-lc {
|
table.diff-contents td.next,
|
||||||
text-align: right;
|
table.diff-linecounts td.next {
|
||||||
padding: 1px 5px;
|
|
||||||
border-color: inherit;
|
|
||||||
border-top: 1px solid #d3d7cf;
|
|
||||||
border-bottom: 1px solid #d3d7cf;
|
|
||||||
width: 3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.diff-a {
|
|
||||||
background-color: #dfd;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.diff-r {
|
|
||||||
background-color: #fdd;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.diff-a, td.diff-r, td.diff-c {
|
|
||||||
border-bottom: none;
|
|
||||||
border-top: none;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
td.diff-a > span,
|
|
||||||
td.diff-r > span,
|
|
||||||
td.diff-c > span {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.diff tr.diff-next {
|
|
||||||
background-color: #e4e8E0;
|
background-color: #e4e8E0;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border-color: #d3d7cf;
|
border-color: #d3d7cf;
|
||||||
|
padding: 1px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.diff tr.diff-next td {
|
table.diff-linecounts {
|
||||||
padding: 1px 5px;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.diff-contents {
|
||||||
|
border-bottom: 1px solid #d3d7cf;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts tr,
|
||||||
|
table.diff-contents tr {
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts tr {
|
||||||
|
border: 1px solid #d3d7cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts tr:first-child {
|
||||||
|
border-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts td {
|
||||||
|
font-size: 90%;
|
||||||
|
padding: 1px 10px;
|
||||||
|
text-align: right;
|
||||||
|
border-left: 1px solid #d3d7cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td {
|
||||||
|
line-height: 12px;
|
||||||
|
padding: 2px;
|
||||||
|
font-size: 90%;
|
||||||
|
border: none;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td.added {
|
||||||
|
background-color: #dfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td.removed {
|
||||||
|
background-color: #fdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td > span.ctrl-char {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td:hover > span.ctrl-char {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td.added > span.ctrl-char {
|
||||||
|
background: #0A0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-contents td.removed > span.ctrl-char {
|
||||||
|
background: #A00;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* override prettify css rule */
|
||||||
|
table.diff-contents td > span.ctrl-char > * {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* view file content
|
* view file content
|
||||||
@@ -680,6 +740,14 @@ table.code td.code {
|
|||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table.code td.code span.ctrl-char {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.code td.code:hover span.ctrl-char {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
table.code td.code-lc {
|
table.code td.code-lc {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
padding: 1px 5px;
|
padding: 1px 5px;
|
||||||
@@ -801,37 +869,37 @@ ol > li {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc {
|
#wiki-toc {
|
||||||
float: right;
|
float: right;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
max-width: 33%;
|
max-width: 33%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc-content {
|
#wiki-toc-content {
|
||||||
border: 1px solid #999999;
|
border: 1px solid #999999;
|
||||||
border-width: 1px 0;
|
border-width: 1px 0;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
padding-bottom: 15px;
|
padding-bottom: 15px;
|
||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc-content a {
|
#wiki-toc-content a {
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 0.5em;
|
margin-top: 0.5em;
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc-content a:first-child {
|
#wiki-toc-content a:first-child {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc-content a.wiki-h2 {
|
#wiki-toc-content a.wiki-h2 {
|
||||||
margin-left: 1em;
|
margin-left: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
#wiki-toc-content a.wiki-h3 {
|
#wiki-toc-content a.wiki-h3 {
|
||||||
margin-left: 2em;
|
margin-left: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1070,87 +1138,86 @@ span.scm-action.property-changed {
|
|||||||
* Stats on index
|
* Stats on index
|
||||||
*/
|
*/
|
||||||
#stats > h3 {
|
#stats > h3 {
|
||||||
text-decoration : underline;
|
text-decoration : underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
#stats table tr td {
|
#stats table tr td {
|
||||||
border-style: none;
|
border-style: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#stats td {
|
#stats td {
|
||||||
padding: .2em;
|
padding: .2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Project list on index
|
* Project list on index
|
||||||
*/
|
*/
|
||||||
div.p-list-img {
|
div.p-list-img {
|
||||||
float: left;
|
float: left;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
margin-top: .5em;
|
margin-top: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.p-list-prj {
|
div.p-list-prj {
|
||||||
float: left;
|
float: left;
|
||||||
margin: .5em 0 .5em .8em;
|
margin: .5em 0 .5em .8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.p-list-prj p {
|
div.p-list-prj p {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.p-list-private {
|
div.p-list-private {
|
||||||
bottom: 16px;
|
bottom: 16px;
|
||||||
right: -3px;
|
right: -3px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Issue summary
|
* Issue summary
|
||||||
*/
|
*/
|
||||||
div.issue-summary {
|
div.issue-summary {
|
||||||
float: left;
|
float: left;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.issue-summary > div {
|
div.issue-summary > div {
|
||||||
margin-right: 3em;
|
margin-right: 3em;
|
||||||
padding-top: 1em;
|
padding-top: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.issue-summary h2 {
|
div.issue-summary h2 {
|
||||||
border-bottom: 1px solid #A5E26A;
|
border-bottom: 1px solid #A5E26A;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary {
|
table.issue-summary {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary tr td {
|
table.issue-summary tr td {
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: .1em .005em;
|
padding: .1em .005em;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary td.graph {
|
table.issue-summary td.graph {
|
||||||
width: 60%;
|
width: 60%;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary td.count {
|
table.issue-summary td.count {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
padding-right: .5em;
|
padding-right: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.graph {
|
table.graph {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary td.graph-color {
|
table.issue-summary td.graph-color {
|
||||||
background: #3C78B5;
|
background: #3C78B5;
|
||||||
}
|
}
|
||||||
|
|
||||||
table.issue-summary td.graph-percent {
|
table.issue-summary td.graph-percent {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user