Compare commits
63 Commits
feature.is
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
|
6a44af34e1 | ||
|
7342566c6e | ||
|
bfc568967b | ||
|
154597c09c | ||
|
8f886155b0 | ||
|
df1130b4c9 | ||
|
c9f2575469 | ||
|
5101ae5f35 | ||
|
aa09862059 | ||
|
884f50155c | ||
|
cf684c1514 | ||
|
91b189b75f | ||
|
623c562054 | ||
|
8a9f8c66e8 | ||
|
81f433085a | ||
|
6e59a0a526 | ||
|
8397d86313 | ||
|
b0ac05b608 | ||
|
48c3989ae3 | ||
|
b949b7e83a | ||
|
ad7fad9fbe | ||
|
d2db3b16d2 | ||
|
ae11b1de4a | ||
|
6f620e3f54 | ||
|
810b753edf | ||
|
958fb1b9ad | ||
|
48992adefa | ||
|
d95e1e13e5 | ||
|
381dc5b8f7 | ||
|
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 | ||
|
ef2d3a9af9 | ||
|
9a8bd464a3 | ||
|
9e2ea7404b | ||
|
160d11b89b | ||
|
85978a4d18 | ||
|
e1e7696d53 | ||
|
695428075b | ||
|
e7c2e721b4 |
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
|
||||||
|
5
AUTHORS
5
AUTHORS
@@ -17,22 +17,27 @@ Much appreciated contributors (in alphabetical order):
|
|||||||
Denis Kot <denis.kot@gmail.com> - Russian translation
|
Denis Kot <denis.kot@gmail.com> - Russian translation
|
||||||
Dmitry Dulepov <dmitryd>
|
Dmitry Dulepov <dmitryd>
|
||||||
Fernando Sayago Gil <mikados.mikados@gmail.com> - Spanish translation
|
Fernando Sayago Gil <mikados.mikados@gmail.com> - Spanish translation
|
||||||
|
Gert van Valkenhoef <gertvv>
|
||||||
Jakub Viták <mainiak@gmail.com> - Czech translation
|
Jakub Viták <mainiak@gmail.com> - Czech translation
|
||||||
Janez Troha <http://www.dz0ny.info> - Slovenian translation
|
Janez Troha <http://www.dz0ny.info> - Slovenian translation
|
||||||
Jean-Philippe Fleury <jpfleury>
|
Jean-Philippe Fleury <jpfleury>
|
||||||
Jerry <lxb429@gmail.com> - Chinese translation
|
Jerry <lxb429@gmail.com> - Chinese translation
|
||||||
Julien Issler <julien@issler.net>
|
Julien Issler <julien@issler.net>
|
||||||
|
Litew <litew9@gmail.com> - Russian translation
|
||||||
Ludovic Bellière <xrogaan>
|
Ludovic Bellière <xrogaan>
|
||||||
Manuel Eidenberger <eidenberger@gmail.com>
|
Manuel Eidenberger <eidenberger@gmail.com>
|
||||||
Matthew Dawson <mjd>
|
Matthew Dawson <mjd>
|
||||||
Matías Halles <matias@halles.cl>
|
Matías Halles <matias@halles.cl>
|
||||||
Mehdi Kabab <http://pioupioum.fr/>
|
Mehdi Kabab <http://pioupioum.fr/>
|
||||||
Nicolas Lassalle <nicolas@beroot.org> - Subversion support
|
Nicolas Lassalle <nicolas@beroot.org> - Subversion support
|
||||||
|
Ozan <uobasar@gmail.com> - Turkish translation
|
||||||
Patrick Georgi <patrick.georgi@coresystems.de>
|
Patrick Georgi <patrick.georgi@coresystems.de>
|
||||||
|
Pedro Kiefer <pedro@kiefer.com.br> - Brazilian Portuguese translation
|
||||||
Raphaël Emourgeon <raphael>
|
Raphaël Emourgeon <raphael>
|
||||||
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>
|
||||||
|
10
Makefile
10
Makefile
@@ -62,11 +62,11 @@ pot-update: pluf_path
|
|||||||
fi
|
fi
|
||||||
touch src/IDF/locale/idf.pot;
|
touch src/IDF/locale/idf.pot;
|
||||||
# Extract string
|
# Extract string
|
||||||
@cd src; php $(PLUF_PATH)/extracttemplates.php IDF/conf/idf.php IDF/gettexttemplates
|
@cd src; php "$(PLUF_PATH)/extracttemplates.php" IDF/conf/idf.php IDF/gettexttemplates
|
||||||
@cd src; for phpfile in `find . -iname "*.php"`; do \
|
@cd src; for phpfile in `find . -iname "*.php"`; do \
|
||||||
printf "Parsing file : "$$phpfile"\n"; \
|
printf "Parsing file : "$$phpfile"\n"; \
|
||||||
xgettext -o idf.pot -p ./IDF/locale/ --from-code=UTF-8 -j \
|
xgettext -o idf.pot -p ./IDF/locale/ --from-code=UTF-8 -j \
|
||||||
--keyword --keyword=__ --keyword=_n:1,2 -L PHP $$phpfile ; \
|
--keyword --keyword=__ --keyword=_n:1,2 -L PHP "$$phpfile" ; \
|
||||||
done
|
done
|
||||||
# Remove tmp folder
|
# Remove tmp folder
|
||||||
rm -Rf src/IDF/gettexttemplates
|
rm -Rf src/IDF/gettexttemplates
|
||||||
@@ -76,7 +76,7 @@ pot-update: pluf_path
|
|||||||
po-update: pluf_path
|
po-update: pluf_path
|
||||||
@for pofile in `ls src/IDF/locale/*/idf.po`; do \
|
@for pofile in `ls src/IDF/locale/*/idf.po`; do \
|
||||||
printf "Updating file : "$$pofile"\n"; \
|
printf "Updating file : "$$pofile"\n"; \
|
||||||
msgmerge -v -U $$pofile src/IDF/locale/idf.pot; \
|
msgmerge -v -U "$$pofile" src/IDF/locale/idf.pot; \
|
||||||
printf "\n"; \
|
printf "\n"; \
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ po-stats:
|
|||||||
--pretty=format:%h`.zip
|
--pretty=format:%h`.zip
|
||||||
|
|
||||||
db-install:
|
db-install:
|
||||||
@cd src && php $(PLUF_PATH)/migrate.php --conf=IDF/conf/idf.php -a -d -i
|
@cd src && php "$(PLUF_PATH)/migrate.php" --conf=IDF/conf/idf.php -a -d -i
|
||||||
|
|
||||||
db-update:
|
db-update:
|
||||||
@cd src && php $(PLUF_PATH)/migrate.php --conf=IDF/conf/idf.php -a -d
|
@cd src && php "$(PLUF_PATH)/migrate.php" --conf=IDF/conf/idf.php -a -d
|
||||||
|
93
NEWS.mdtext
93
NEWS.mdtext
@@ -1,45 +1,85 @@
|
|||||||
# InDefero 1.2 - xxx xxx xx xx:xx 2011 UTC
|
# InDefero 1.2.1 - XXX XXX XX XX:XX:XX UTC 201X
|
||||||
|
|
||||||
ATTENTION: You need Pluf [324ae60b](http://projects.ceondo.com/p/pluf/source/commit/324ae60b)
|
## Bugfixes
|
||||||
|
|
||||||
|
- The diff view now renders properly in Firefox when a minimum font size
|
||||||
|
is configured or the user zooms the web page (fixes issue 773)
|
||||||
|
|
||||||
|
## Language and Translations
|
||||||
|
|
||||||
|
- Multiple fixes to English source strings (fixes issues 763, 766, and 772,
|
||||||
|
thanks to JP Fleury!)
|
||||||
|
|
||||||
|
# InDefero 1.2 - Sun Nov 6 23:04:00 UTC 2011
|
||||||
|
|
||||||
|
ATTENTION: You need Pluf [46b7f251](http://projects.ceondo.com/p/pluf/source/commit/46b7f251)
|
||||||
or newer to properly run this version of Indefero!
|
or newer to properly run this version of Indefero!
|
||||||
|
|
||||||
## New Features
|
## New Features
|
||||||
|
|
||||||
- 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,
|
||||||
terms, such as "is related to", "is blocked by" or "is duplicated by" (issue 638)
|
configurable terms, such as "is related to", "is blocked by" or
|
||||||
- Mercurial source views now show parent revisions (if any) and detailed change information
|
"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)
|
||||||
|
- Source and diff views now make characters like line endings, tabs and other
|
||||||
|
"invisible" control characters visible on hover and cope with long lines much
|
||||||
|
better (issue 636)
|
||||||
|
- 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;
|
||||||
- Display monotone file and directory attributes in the tree and file view
|
old links still work though (issues 559 and 686)
|
||||||
|
- monotone file and directory attributes are displayed 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
|
||||||
|
- A summary section has been added to the issue tracker with statistics about
|
||||||
|
open / closed issues, unresolved issues grouped by tags and owners
|
||||||
|
- The project list and title has gathered a customizable icon for each project
|
||||||
|
- The download section now provides MD5 checksums for uploaded files
|
||||||
|
- Wiki pages now come with a designated stylesheet for printer output (issue 713)
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
||||||
- The SVN interface acts more robust if an underlying repository has been restructured (issues 364 and 721)
|
- Git's cron job doesn't erase manually added keys anymore (issue 247)
|
||||||
|
- The SVN interface acts more robust if an underlying repository has been
|
||||||
|
restructured (issues 364 and 721)
|
||||||
- monotone zip archive entries now all carry the revision date as mtime (issue 645)
|
- monotone zip archive entries now all carry the revision date as mtime (issue 645)
|
||||||
- Timeline only displays filter options for items a user has actually access to (issue 655)
|
- The timeline only now only displays filter options for items a user has
|
||||||
|
actually access to (issue 655)
|
||||||
- The log, tags and branches parsers for Mercurial are more robust now (issue 663)
|
- The log, tags and branches parsers for Mercurial are more robust now (issue 663)
|
||||||
- Fix SSH public key parsing issues and improve the check for existing, uploaded keys (issue 679)
|
- Several SSH public key parsing issues have been fixed and the check for existing,
|
||||||
|
uploaded keys has been improved (issue 679)
|
||||||
- Diff views now show empty context lines for git and hg again (issue 688)
|
- Diff views now show empty context lines for git and hg again (issue 688)
|
||||||
- Let the SVN command line client not store the login credentials we give him as arguments
|
- The SVN command line client no longer accidential tries to store the login
|
||||||
|
credentials we give him as arguments for the user executing the SVN command
|
||||||
- The usher section in the forge administration no longer displays a bogus
|
- The usher section in the forge administration no longer displays a bogus
|
||||||
server enty in case no monotone server is configured in the connected
|
server enty in case no monotone server is configured in the connected
|
||||||
usher instance
|
usher instance
|
||||||
- Prevent a timeout from popping up when Usher is restarted (issue 695)
|
- A timeout that popped up when Usher is restarted has been fixed (issue 695)
|
||||||
- The SyncMonotone plugin now cleans up partial artifacts it created during the addition of
|
- The SyncMonotone plugin now cleans up partial artifacts it created during the
|
||||||
a new project or monotone key, in case an error popped up in the middle (issue 697)
|
addition of 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)
|
- Source links without a specific revision did not work due to a wrong regex
|
||||||
- Better error detection and reporting in the SyncMonotone plugin
|
(issue 730)
|
||||||
ATTENTION: This needs Pluf 46b7f251 or newer!
|
- Avatar URL generation use correctly the configuration (issue 732)
|
||||||
- Fix the branch links users of the Subversion frontend get when they enter a wrong revision
|
- The SyncGit plugin no longer fails to remove a non-existing post-update hook
|
||||||
and only display this list if there are any branches available for all SCMs
|
on repository creation (issue 752)
|
||||||
- If git's author name is not encoded in an UTF-8 compatible encoding, skip the author lookup,
|
- When uploading a project logo, an existing uploaded file with the same name
|
||||||
as we have no information what the author string is actually encoded in
|
no longer leads to an error, but is simple overwritten (fixes issue 740)
|
||||||
- Indefero no longer displays an empty parents paragraph in the commit view for root revisions of
|
- The error detection and reporting in the SyncMonotone plugin has been improved
|
||||||
a git repository
|
- The branch links users of the Subversion frontend get when they enter a wrong
|
||||||
|
revision are fixed; this list is now also only displayed (for any SCM) if
|
||||||
|
there are actually branches available in the repository
|
||||||
|
- If git's author name is not encoded in an UTF-8 compatible encoding, skip the
|
||||||
|
author lookup, 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 a git repository
|
||||||
|
- Indefero now only shows the tags of the closed and not the open issues in the
|
||||||
|
closed issues list
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
@@ -47,6 +87,11 @@ or newer to properly run this version of Indefero!
|
|||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
|
- The Russian translation has been enabled by default (thanks for all the great
|
||||||
|
work, Denis Kot and Litew!)
|
||||||
|
- Brazilian Portuguese translation started (thanks to Pedro Kiefer!)
|
||||||
|
- Turkish translation started (thanks to Ozan!)
|
||||||
|
|
||||||
# InDefero 1.1.2 - Thu May 26 07:42:25 2011 UTC
|
# InDefero 1.1.2 - Thu May 26 07:42:25 2011 UTC
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
@@ -235,7 +235,7 @@ class IDF_Commit extends Pluf_Model
|
|||||||
</tr>
|
</tr>
|
||||||
<tr class="extra">
|
<tr class="extra">
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Commit %s, by %s'), '<a href="'.$url.'" class="mono">'.$this->scm_id.'</a>', $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Commit %1$s, by %2$s'), '<a href="'.$url.'" class="mono">'.$this->scm_id.'</a>', $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,7 +326,7 @@ class IDF_Commit extends Pluf_Model
|
|||||||
foreach ($addresses as $address) {
|
foreach ($addresses as $address) {
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'),
|
$email = new Pluf_Mail(Pluf::f('from_email'),
|
||||||
$address,
|
$address,
|
||||||
sprintf(__('New Commit %s - %s (%s)'),
|
sprintf(__('New Commit %1$s - %2$s (%3$s)'),
|
||||||
$this->scm_id, $this->summary,
|
$this->scm_id, $this->summary,
|
||||||
$this->get_project()->shortname));
|
$this->get_project()->shortname));
|
||||||
$email->addTextMessage($text_email);
|
$email->addTextMessage($text_email);
|
||||||
|
235
src/IDF/Diff.php
235
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,92 @@ 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);
|
|
||||||
}
|
|
||||||
if (count($file['chunks']) > $cc)
|
|
||||||
$out .= '<tr class="diff-next"><td>...</td><td>...</td><td> </td></tr>'."\n";
|
|
||||||
$cc++;
|
|
||||||
}
|
|
||||||
$out .= '</table>';
|
|
||||||
}
|
|
||||||
return Pluf_Template::markSafe($out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function padLine($line)
|
$offsets[] = sprintf('<td>%s</td><td>%s</td>', $left, $right);
|
||||||
{
|
$content = IDF_FileUtil::emphasizeControlCharacters(Pluf_esc($content));
|
||||||
$line = str_replace("\t", ' ', $line);
|
$contents[] = sprintf('<td class="%s%s mono">%s</td>', $class, $pretty, $content);
|
||||||
$n = strlen($line);
|
|
||||||
for ($i=0;$i<$n;$i++) {
|
|
||||||
if (substr($line, $i, 1) != ' ') {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
if (count($file['chunks']) > $cc) {
|
||||||
|
$offsets[] = '<td class="next">...</td><td class="next">...</td>';
|
||||||
|
$contents[] = '<td class="next"></td>';
|
||||||
}
|
}
|
||||||
return str_repeat(' ', $i).substr($line, $i);
|
$cc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($added, $removed) = end($file['chunks_def']);
|
||||||
|
|
||||||
|
$added = $added[0] + $added[1];
|
||||||
|
$leftwidth = 0;
|
||||||
|
if ($added > 0)
|
||||||
|
$leftwidth = ((ceil(log10($added)) + 1) * 8) + 17;
|
||||||
|
|
||||||
|
$removed = $removed[0] + $removed[1];
|
||||||
|
$rightwidth = 0;
|
||||||
|
if ($removed > 0)
|
||||||
|
$rightwidth = ((ceil(log10($removed)) + 1) * 8) + 17;
|
||||||
|
|
||||||
|
// we need to correct the width of a single column a little
|
||||||
|
// to take less space and to hide the empty one
|
||||||
|
$class = '';
|
||||||
|
if ($leftwidth == 0) {
|
||||||
|
$class = 'left-hidden';
|
||||||
|
$rightwidth -= floor(log10($removed));
|
||||||
|
}
|
||||||
|
else if ($rightwidth == 0) {
|
||||||
|
$class = 'right-hidden';
|
||||||
|
$leftwidth -= floor(log10($added));
|
||||||
|
}
|
||||||
|
|
||||||
|
$inner_linecounts =
|
||||||
|
'<table class="diff-linecounts '.$class.'">' ."\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 Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -208,12 +256,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 +358,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) + 17;
|
||||||
|
|
||||||
|
$rightwidth = 1;
|
||||||
|
if ($max_lineno_right > 0)
|
||||||
|
$rightwidth = ((ceil(log10($max_lineno_right)) + 1) * 8) + 17;
|
||||||
|
|
||||||
|
$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.
|
||||||
|
@@ -199,7 +199,7 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form
|
|||||||
$mtn_master_branch)) {
|
$mtn_master_branch)) {
|
||||||
throw new Pluf_Form_Invalid(__(
|
throw new Pluf_Form_Invalid(__(
|
||||||
'The master branch is empty or contains illegal characters, '.
|
'The master branch is empty or contains illegal characters, '.
|
||||||
'please use only letters, digits, dashs and dots as separators.'
|
'please use only letters, digits, dashes and dots as separators.'
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -161,7 +161,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form
|
|||||||
'label' => __('Staff'),
|
'label' => __('Staff'),
|
||||||
'initial' => $this->user->staff,
|
'initial' => $this->user->staff,
|
||||||
'widget' => 'Pluf_Form_Widget_CheckboxInput',
|
'widget' => 'Pluf_Form_Widget_CheckboxInput',
|
||||||
'help_text' => __('If you give staff rights to a user, you really need to trust them.'),
|
'help_text' => __('If you give staff rights to a user, you really need to trust him.'),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -214,7 +214,7 @@ class IDF_Form_IssueCreate extends Pluf_Form
|
|||||||
else $count[$class] += 1;
|
else $count[$class] += 1;
|
||||||
if (in_array($class, $onemax) and $count[$class] > 1) {
|
if (in_array($class, $onemax) and $count[$class] > 1) {
|
||||||
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
||||||
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than label from the %s class to an issue.'), $class);
|
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than one label from the %s class to an issue.'), $class);
|
||||||
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -67,6 +67,7 @@ class IDF_Form_ProjectConf extends Pluf_Form
|
|||||||
'move_function_params' =>
|
'move_function_params' =>
|
||||||
array('upload_path' => $upload_path,
|
array('upload_path' => $upload_path,
|
||||||
'upload_path_create' => true,
|
'upload_path_create' => true,
|
||||||
|
'upload_overwrite' => true,
|
||||||
'file_name' => $filename,
|
'file_name' => $filename,
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
@@ -94,7 +94,7 @@ class IDF_Form_Register extends Pluf_Form
|
|||||||
{
|
{
|
||||||
$this->cleaned_data['email'] = mb_strtolower(trim($this->cleaned_data['email']));
|
$this->cleaned_data['email'] = mb_strtolower(trim($this->cleaned_data['email']));
|
||||||
if (Pluf::factory('IDF_EmailAddress')->get_user_for_email_address($this->cleaned_data['email']) != null) {
|
if (Pluf::factory('IDF_EmailAddress')->get_user_for_email_address($this->cleaned_data['email']) != null) {
|
||||||
throw new Pluf_Form_Invalid(sprintf(__('The email "%s" is already used. If you need to, click on the help link to recover your password.'), $this->cleaned_data['email']));
|
throw new Pluf_Form_Invalid(sprintf(__('The email "%1$s" is already used. If you need to, you can <a href="%2$s">recover your password</a>.'), $this->cleaned_data['email'], Pluf_HTTP_URL_urlForView('IDF_Views::passwordRecoveryAsk')));
|
||||||
}
|
}
|
||||||
return $this->cleaned_data['email'];
|
return $this->cleaned_data['email'];
|
||||||
}
|
}
|
||||||
|
@@ -107,7 +107,7 @@ class IDF_Form_RegisterConfirmation extends Pluf_Form
|
|||||||
throw new Pluf_Form_Invalid($error);
|
throw new Pluf_Form_Invalid($error);
|
||||||
}
|
}
|
||||||
if ($users[0]->active) {
|
if ($users[0]->active) {
|
||||||
throw new Pluf_Form_Invalid(__('This account has already been confirmed. Maybe should you try to recover your password using the help link.'));
|
throw new Pluf_Form_Invalid(sprintf(__('This account has already been confirmed. Maybe should you try to <a href="%s">recover your password</a>.'), Pluf_HTTP_URL_urlForView('IDF_Views::passwordRecoveryAsk')));
|
||||||
}
|
}
|
||||||
$this->_user_id = $email_id[1];
|
$this->_user_id = $email_id[1];
|
||||||
return $this->cleaned_data['key'];
|
return $this->cleaned_data['key'];
|
||||||
|
@@ -55,7 +55,7 @@ class IDF_Form_SourceConf extends Pluf_Form
|
|||||||
array('required' => false,
|
array('required' => false,
|
||||||
'label' => __('Webhook URL'),
|
'label' => __('Webhook URL'),
|
||||||
'initial' => $this->conf->getVal('webhook_url', ''),
|
'initial' => $this->conf->getVal('webhook_url', ''),
|
||||||
'help_text' => sprintf(__('Learn more about the <a href="%s">post-commit web hooks</a>.'), $url),
|
'help_text' => sprintf(__('Learn more about the <a href="%s">post-commit webhooks</a>.'), $url),
|
||||||
'widget_attrs' => array('size' => 35),
|
'widget_attrs' => array('size' => 35),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@@ -106,7 +106,7 @@ class IDF_Form_UpdateUpload extends Pluf_Form
|
|||||||
else $count[$class] += 1;
|
else $count[$class] += 1;
|
||||||
if (in_array($class, $onemax) and $count[$class] > 1) {
|
if (in_array($class, $onemax) and $count[$class] > 1) {
|
||||||
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
||||||
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than label from the %s class to an issue.'), $class);
|
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than one label from the %s class to an issue.'), $class);
|
||||||
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -116,7 +116,7 @@ class IDF_Form_Upload extends Pluf_Form
|
|||||||
else $count[$class] += 1;
|
else $count[$class] += 1;
|
||||||
if (in_array($class, $onemax) and $count[$class] > 1) {
|
if (in_array($class, $onemax) and $count[$class] > 1) {
|
||||||
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
||||||
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than label from the %s class to an issue.'), $class);
|
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than one label from the %s class to an issue.'), $class);
|
||||||
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,7 +56,7 @@ class IDF_Form_UserAccount extends Pluf_Form
|
|||||||
|
|
||||||
$this->fields['email'] = new Pluf_Form_Field_Email(
|
$this->fields['email'] = new Pluf_Form_Field_Email(
|
||||||
array('required' => true,
|
array('required' => true,
|
||||||
'label' => __('Your mail'),
|
'label' => __('Your email'),
|
||||||
'initial' => $this->user->email,
|
'initial' => $this->user->email,
|
||||||
'help_text' => __('If you change your email address, an email will be sent to the new address to confirm it.'),
|
'help_text' => __('If you change your email address, an email will be sent to the new address to confirm it.'),
|
||||||
));
|
));
|
||||||
@@ -168,9 +168,9 @@ class IDF_Form_UserAccount extends Pluf_Form
|
|||||||
|
|
||||||
$this->fields['secondary_mail'] = new Pluf_Form_Field_Email(
|
$this->fields['secondary_mail'] = new Pluf_Form_Field_Email(
|
||||||
array('required' => false,
|
array('required' => false,
|
||||||
'label' => __('Add a secondary mail address'),
|
'label' => __('Add a secondary email address'),
|
||||||
'initial' => '',
|
'initial' => '',
|
||||||
'help_text' => __('You will get a mail to confirm that you own the address you specify.'),
|
'help_text' => __('You will get an email to confirm that you own the address you specify.'),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -147,7 +147,7 @@ Add your content here. Format your content with:
|
|||||||
else $count[$class] += 1;
|
else $count[$class] += 1;
|
||||||
if (in_array($class, $onemax) and $count[$class] > 1) {
|
if (in_array($class, $onemax) and $count[$class] > 1) {
|
||||||
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
||||||
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than label from the %s class to a page.'), $class);
|
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than one label from the %s class to a page.'), $class);
|
||||||
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -158,7 +158,7 @@ class IDF_Form_WikiUpdate extends Pluf_Form
|
|||||||
else $count[$class] += 1;
|
else $count[$class] += 1;
|
||||||
if (in_array($class, $onemax) and $count[$class] > 1) {
|
if (in_array($class, $onemax) and $count[$class] > 1) {
|
||||||
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
if (!isset($this->errors['label'.$i])) $this->errors['label'.$i] = array();
|
||||||
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than label from the %s class to a page.'), $class);
|
$this->errors['label'.$i][] = sprintf(__('You cannot provide more than one label from the %s class to a page.'), $class);
|
||||||
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
throw new Pluf_Form_Invalid(__('You provided an invalid label.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -211,7 +211,7 @@ class IDF_Issue extends Pluf_Model
|
|||||||
$ic = (in_array($this->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
$ic = (in_array($this->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
||||||
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View issue">Issue %3$d</a>, %4$s'), $url, $ic, $this->id, Pluf_esc($this->summary)).'</td>';
|
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View issue">Issue %3$d</a>, %4$s'), $url, $ic, $this->id, Pluf_esc($this->summary)).'</td>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Creation of <a href="%s" class="%s">issue %d</a>, by %s'), $url, $ic, $this->id, $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Creation of <a href="%1$s" class="%2$s">issue %3$d</a>, by %4$s'), $url, $ic, $this->id, $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,7 +221,7 @@ class IDF_Issue extends Pluf_Model
|
|||||||
.Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
.Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$this->id));
|
$this->id));
|
||||||
$title = sprintf(__('%s: Issue %d created - %s'),
|
$title = sprintf(__('%1$s: Issue %2$d created - %3$s'),
|
||||||
$request->project->name,
|
$request->project->name,
|
||||||
$this->id, $this->summary);
|
$this->id, $this->summary);
|
||||||
$cts = $this->get_comments_list(array('order' => 'id ASC',
|
$cts = $this->get_comments_list(array('order' => 'id ASC',
|
||||||
@@ -287,7 +287,7 @@ class IDF_Issue extends Pluf_Model
|
|||||||
foreach ($to_email as $email_lang) {
|
foreach ($to_email as $email_lang) {
|
||||||
Pluf_Translation::loadSetLocale($email_lang[1]);
|
Pluf_Translation::loadSetLocale($email_lang[1]);
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
||||||
sprintf(__('Issue %s - %s (%s)'),
|
sprintf(__('Issue %1$s - %2$s (%3$s)'),
|
||||||
$this->id, $this->summary, $prj->shortname));
|
$this->id, $this->summary, $prj->shortname));
|
||||||
$tmpl = new Pluf_Template('idf/issues/issue-created-email.txt');
|
$tmpl = new Pluf_Template('idf/issues/issue-created-email.txt');
|
||||||
$email->addTextMessage($tmpl->render($context));
|
$email->addTextMessage($tmpl->render($context));
|
||||||
@@ -333,7 +333,7 @@ class IDF_Issue extends Pluf_Model
|
|||||||
}
|
}
|
||||||
Pluf_Translation::loadSetLocale($email_lang[1]);
|
Pluf_Translation::loadSetLocale($email_lang[1]);
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
||||||
sprintf(__('Updated Issue %s - %s (%s)'),
|
sprintf(__('Updated Issue %1$s - %2$s (%3$s)'),
|
||||||
$this->id, $this->summary, $prj->shortname));
|
$this->id, $this->summary, $prj->shortname));
|
||||||
$tmpl = new Pluf_Template('idf/issues/issue-updated-email.txt');
|
$tmpl = new Pluf_Template('idf/issues/issue-updated-email.txt');
|
||||||
$email->addTextMessage($tmpl->render($context));
|
$email->addTextMessage($tmpl->render($context));
|
||||||
|
@@ -177,7 +177,7 @@ class IDF_IssueComment extends Pluf_Model
|
|||||||
}
|
}
|
||||||
$out .= '</td></tr>';
|
$out .= '</td></tr>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Comment on <a href="%s" class="%s">issue %d</a>, by %s'), $url, $ic, $issue->id, $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Comment on <a href="%1$s" class="%2$s">issue %3$d</a>, by %4$s'), $url, $ic, $issue->id, $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ class IDF_IssueComment extends Pluf_Model
|
|||||||
.Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
.Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$issue->id));
|
$issue->id));
|
||||||
$title = sprintf(__('%s: Comment on issue %d - %s'),
|
$title = sprintf(__('%1$s: Comment on issue %2$d - %3$s'),
|
||||||
Pluf_esc($request->project->name),
|
Pluf_esc($request->project->name),
|
||||||
$issue->id, Pluf_esc($issue->summary));
|
$issue->id, Pluf_esc($issue->summary));
|
||||||
$url .= '#ic'.$this->id;
|
$url .= '#ic'.$this->id;
|
||||||
|
@@ -210,22 +210,23 @@ class IDF_Plugin_SyncGit_Serve
|
|||||||
// Indefero's one.
|
// Indefero's one.
|
||||||
$p = realpath(dirname(__FILE__).'/../../../../scripts/git-post-update');
|
$p = realpath(dirname(__FILE__).'/../../../../scripts/git-post-update');
|
||||||
$p = Pluf::f('idf_plugin_syncgit_post_update', $p);
|
$p = Pluf::f('idf_plugin_syncgit_post_update', $p);
|
||||||
if (!@unlink($fullpath.'/hooks/post-update')) {
|
$post_update_hook = $fullpath.'/hooks/post-update';
|
||||||
|
if (file_exists($post_update_hook) && !@unlink($post_update_hook)) {
|
||||||
Pluf_Log::warn(array('IDF_Plugin_Git_Serve::initRepository',
|
Pluf_Log::warn(array('IDF_Plugin_Git_Serve::initRepository',
|
||||||
'post-update hook removal error.',
|
'post-update hook removal error.',
|
||||||
$fullpath.'/hooks/post-update'));
|
$post_update_hook));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$out = array();
|
$out = array();
|
||||||
$res = 0;
|
$res = 0;
|
||||||
exec(sprintf(Pluf::f('idf_exec_cmd_prefix', '').'ln -s %s %s',
|
exec(sprintf(Pluf::f('idf_exec_cmd_prefix', '').'ln -s %s %s',
|
||||||
escapeshellarg($p),
|
escapeshellarg($p),
|
||||||
escapeshellarg($fullpath.'/hooks/post-update')),
|
escapeshellarg($post_update_hook)),
|
||||||
$out, $res);
|
$out, $res);
|
||||||
if ($res != 0) {
|
if ($res != 0) {
|
||||||
Pluf_Log::warn(array('IDF_Plugin_Git_Serve::initRepository',
|
Pluf_Log::warn(array('IDF_Plugin_Git_Serve::initRepository',
|
||||||
'post-update hook creation error.',
|
'post-update hook creation error.',
|
||||||
$fullpath.'/hooks/post-update'));
|
$post_update_hook));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Pluf_Log::debug(array('IDF_Plugin_Git_Serve::initRepository',
|
Pluf_Log::debug(array('IDF_Plugin_Git_Serve::initRepository',
|
||||||
|
@@ -306,7 +306,7 @@ class IDF_Plugin_SyncMonotone
|
|||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$this->_diagnoseProblem(sprintf(
|
$this->_diagnoseProblem(sprintf(
|
||||||
__('Could not parse usher configuration in "%s": %s'),
|
__('Could not parse usher configuration in "%1$s": %2$s'),
|
||||||
$usher_config, $e->getMessage()
|
$usher_config, $e->getMessage()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -522,7 +522,7 @@ class IDF_Plugin_SyncMonotone
|
|||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$this->_diagnoseProblem(sprintf(
|
$this->_diagnoseProblem(sprintf(
|
||||||
__('Could not parse usher configuration in "%s": %s'),
|
__('Could not parse usher configuration in "%1$s": %2$s'),
|
||||||
$usher_config, $e->getMessage()
|
$usher_config, $e->getMessage()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -596,7 +596,7 @@ class IDF_Plugin_SyncMonotone
|
|||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$this->_diagnoseProblem(sprintf(
|
$this->_diagnoseProblem(sprintf(
|
||||||
__('Could not parse read-permissions for project "%s": %s'),
|
__('Could not parse read-permissions for project "%1$s": %2$s'),
|
||||||
$shortname, $e->getMessage()
|
$shortname, $e->getMessage()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -715,7 +715,7 @@ class IDF_Plugin_SyncMonotone
|
|||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
$this->_diagnoseProblem(sprintf(
|
$this->_diagnoseProblem(sprintf(
|
||||||
__('Could not parse read-permissions for project "%s": %s'),
|
__('Could not parse read-permissions for project "%1$s": %2$s'),
|
||||||
$shortname, $e->getMessage()
|
$shortname, $e->getMessage()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@@ -67,7 +67,7 @@ class IDF_Project extends Pluf_Model
|
|||||||
'blank' => false,
|
'blank' => false,
|
||||||
'size' => 50,
|
'size' => 50,
|
||||||
'verbose' => __('short name'),
|
'verbose' => __('short name'),
|
||||||
'help_text' => __('Used in the url to access the project, must be short with only letters and numbers.'),
|
'help_text' => __('Used in the URL to access the project, must be short with only letters and numbers.'),
|
||||||
'unique' => true,
|
'unique' => true,
|
||||||
),
|
),
|
||||||
'shortdesc' =>
|
'shortdesc' =>
|
||||||
@@ -84,7 +84,7 @@ class IDF_Project extends Pluf_Model
|
|||||||
'blank' => false,
|
'blank' => false,
|
||||||
'size' => 250,
|
'size' => 250,
|
||||||
'verbose' => __('description'),
|
'verbose' => __('description'),
|
||||||
'help_text' => __('The description can be extended using the markdown syntax.'),
|
'help_text' => __('The description can be extended using the Markdown syntax.'),
|
||||||
),
|
),
|
||||||
'private' =>
|
'private' =>
|
||||||
array(
|
array(
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -138,7 +138,7 @@ class IDF_Review_Comment extends Pluf_Model
|
|||||||
$ic = (in_array($review->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
$ic = (in_array($review->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
||||||
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View review">Review %3$d</a>, %4$s'), $url, $ic, $review->id, Pluf_esc($review->summary)).'</td>';
|
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View review">Review %3$d</a>, %4$s'), $url, $ic, $review->id, Pluf_esc($review->summary)).'</td>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Update of <a href="%s" class="%s">review %d</a>, by %s'), $url, $ic, $review->id, $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Update of <a href="%1$s" class="%2$s">review %3$d</a>, by %4$s'), $url, $ic, $review->id, $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ class IDF_Review_Comment extends Pluf_Model
|
|||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$review->id));
|
$review->id));
|
||||||
$title = sprintf(__('%s: Updated review %d - %s'),
|
$title = sprintf(__('%1$s: Updated review %2$d - %3$s'),
|
||||||
Pluf_esc($request->project->name),
|
Pluf_esc($request->project->name),
|
||||||
$review->id, Pluf_esc($review->summary));
|
$review->id, Pluf_esc($review->summary));
|
||||||
$url .= '#ic'.$this->id;
|
$url .= '#ic'.$this->id;
|
||||||
@@ -213,7 +213,7 @@ class IDF_Review_Comment extends Pluf_Model
|
|||||||
foreach ($to_email as $email_lang) {
|
foreach ($to_email as $email_lang) {
|
||||||
Pluf_Translation::loadSetLocale($email_lang[1]);
|
Pluf_Translation::loadSetLocale($email_lang[1]);
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
$email = new Pluf_Mail(Pluf::f('from_email'), $email_lang[0],
|
||||||
sprintf(__('Updated Code Review %s - %s (%s)'),
|
sprintf(__('Updated Code Review %1$s - %2$s (%3$s)'),
|
||||||
$review->id, $review->summary, $prj->shortname));
|
$review->id, $review->summary, $prj->shortname));
|
||||||
|
|
||||||
$email->addTextMessage($tmpl->render($context));
|
$email->addTextMessage($tmpl->render($context));
|
||||||
|
@@ -150,7 +150,7 @@ class IDF_Review_Patch extends Pluf_Model
|
|||||||
$ic = (in_array($review->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
$ic = (in_array($review->status, $request->project->getTagIdsByStatus('closed'))) ? 'issue-c' : 'issue-o';
|
||||||
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View review">Review %3$d</a>, %4$s'), $url, $ic, $review->id, Pluf_esc($review->summary)).'</td>';
|
$out .= sprintf(__('<a href="%1$s" class="%2$s" title="View review">Review %3$d</a>, %4$s'), $url, $ic, $review->id, Pluf_esc($review->summary)).'</td>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Creation of <a href="%s" class="%s">review %d</a>, by %s'), $url, $ic, $review->id, $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Creation of <a href="%1$s" class="%2$s">review %3$d</a>, by %4$s'), $url, $ic, $review->id, $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ class IDF_Review_Patch extends Pluf_Model
|
|||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$review->id));
|
$review->id));
|
||||||
$title = sprintf(__('%s: Creation of Review %d - %s'),
|
$title = sprintf(__('%1$s: Creation of Review %2$d - %3$s'),
|
||||||
Pluf_esc($request->project->name),
|
Pluf_esc($request->project->name),
|
||||||
$review->id, Pluf_esc($review->summary));
|
$review->id, Pluf_esc($review->summary));
|
||||||
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
||||||
@@ -201,7 +201,7 @@ class IDF_Review_Patch extends Pluf_Model
|
|||||||
foreach ($addresses as $address) {
|
foreach ($addresses as $address) {
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'),
|
$email = new Pluf_Mail(Pluf::f('from_email'),
|
||||||
$address,
|
$address,
|
||||||
sprintf(__('New Code Review %s - %s (%s)'),
|
sprintf(__('New Code Review %1$s - %2$s (%3$s)'),
|
||||||
$this->get_review()->id,
|
$this->get_review()->id,
|
||||||
$this->get_review()->summary,
|
$this->get_review()->summary,
|
||||||
$this->get_review()->get_project()->shortname));
|
$this->get_review()->get_project()->shortname));
|
||||||
|
@@ -87,7 +87,7 @@ class IDF_Scm_Git extends IDF_Scm
|
|||||||
$filename = trim(substr($line, 1));
|
$filename = trim(substr($line, 1));
|
||||||
$return->patches[] = $filename;
|
$return->patches[] = $filename;
|
||||||
} else if ($action == 'R') {
|
} else if ($action == 'R') {
|
||||||
$matches = split ("\t", $line);
|
$matches = preg_split("/\t/", $line);
|
||||||
$return->renames[$matches[1]] = $matches[2];
|
$return->renames[$matches[1]] = $matches[2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
$diffStart = strpos($out, 'diff -r');
|
||||||
|
$diff = '';
|
||||||
|
if ($diffStart !== false) {
|
||||||
|
$log = substr($out, 0, $diffStart);
|
||||||
|
$diff = substr($out, $diffStart);
|
||||||
} else {
|
} else {
|
||||||
$log[] = $line;
|
$log = $out;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
$out = self::parseLog($log);
|
$out = self::parseLog(preg_split('/\r\n|\n/', $log));
|
||||||
$out[0]->diff = implode("\n", $change);
|
$out[0]->diff = $diff;
|
||||||
return $out[0];
|
return $out[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
# ***** END LICENSE BLOCK ***** */
|
# ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Storage of the occurence of the words.
|
* Storage of the occurrence of the words.
|
||||||
*/
|
*/
|
||||||
class IDF_Search_Occ extends Pluf_Model
|
class IDF_Search_Occ extends Pluf_Model
|
||||||
{
|
{
|
||||||
@@ -30,7 +30,7 @@ class IDF_Search_Occ extends Pluf_Model
|
|||||||
|
|
||||||
function init()
|
function init()
|
||||||
{
|
{
|
||||||
$this->_a['verbose'] = __('occurence');
|
$this->_a['verbose'] = __('occurrence');
|
||||||
$this->_a['table'] = 'idf_search_occs';
|
$this->_a['table'] = 'idf_search_occs';
|
||||||
$this->_a['model'] = 'IDF_Search_Occ';
|
$this->_a['model'] = 'IDF_Search_Occ';
|
||||||
$this->_a['cols'] = array(
|
$this->_a['cols'] = array(
|
||||||
@@ -72,13 +72,13 @@ class IDF_Search_Occ extends Pluf_Model
|
|||||||
array(
|
array(
|
||||||
'type' => 'Pluf_DB_Field_Integer',
|
'type' => 'Pluf_DB_Field_Integer',
|
||||||
'blank' => false,
|
'blank' => false,
|
||||||
'verbose' => __('occurences'),
|
'verbose' => __('occurrences'),
|
||||||
),
|
),
|
||||||
'pondocc' =>
|
'pondocc' =>
|
||||||
array(
|
array(
|
||||||
'type' => 'Pluf_DB_Field_Float',
|
'type' => 'Pluf_DB_Field_Float',
|
||||||
'blank' => false,
|
'blank' => false,
|
||||||
'verbose' => __('ponderated occurence'),
|
'verbose' => __('ponderated occurrence'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
$this->_a['idx'] = array(
|
$this->_a['idx'] = array(
|
||||||
|
@@ -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()
|
||||||
{
|
{
|
||||||
|
@@ -201,7 +201,7 @@ class IDF_Upload extends Pluf_Model
|
|||||||
$out .= sprintf(__('<a href="%1$s" title="View download">Download %2$d</a>, %3$s'), $url, $this->id, Pluf_esc($this->summary)).'</td>';
|
$out .= sprintf(__('<a href="%1$s" title="View download">Download %2$d</a>, %3$s'), $url, $this->id, Pluf_esc($this->summary)).'</td>';
|
||||||
$out .= '</tr>';
|
$out .= '</tr>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Addition of <a href="%s">download %d</a>, by %s'), $url, $this->id, $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Addition of <a href="%1$s">download %2$d</a>, by %3$s'), $url, $this->id, $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ class IDF_Upload extends Pluf_Model
|
|||||||
.Pluf_HTTP_URL_urlForView('IDF_Views_Download::view',
|
.Pluf_HTTP_URL_urlForView('IDF_Views_Download::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$this->id));
|
$this->id));
|
||||||
$title = sprintf(__('%s: Download %d added - %s'),
|
$title = sprintf(__('%1$s: Download %2$d added - %3$s'),
|
||||||
$request->project->name,
|
$request->project->name,
|
||||||
$this->id, $this->summary);
|
$this->id, $this->summary);
|
||||||
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
||||||
@@ -253,7 +253,7 @@ class IDF_Upload extends Pluf_Model
|
|||||||
foreach ($addresses as $address) {
|
foreach ($addresses as $address) {
|
||||||
$email = new Pluf_Mail(Pluf::f('from_email'),
|
$email = new Pluf_Mail(Pluf::f('from_email'),
|
||||||
$address,
|
$address,
|
||||||
sprintf(__('New download - %s (%s)'),
|
sprintf(__('New download - %1$s (%2$s)'),
|
||||||
$this->summary,
|
$this->summary,
|
||||||
$this->get_project()->shortname));
|
$this->get_project()->shortname));
|
||||||
$email->addTextMessage($text_email);
|
$email->addTextMessage($text_email);
|
||||||
|
@@ -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);
|
||||||
@@ -119,9 +121,11 @@ class IDF_Views_Issue
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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;
|
||||||
@@ -334,19 +338,19 @@ class IDF_Views_Issue
|
|||||||
if (count($ctags) == 0) $ctags[] = 0;
|
if (count($ctags) == 0) $ctags[] = 0;
|
||||||
switch ($match[3]) {
|
switch ($match[3]) {
|
||||||
case 'submit':
|
case 'submit':
|
||||||
$titleFormat = __('%s %s Submitted %s Issues');
|
$titleFormat = __('%1$s %2$s Submitted %3$s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $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':
|
||||||
$titleFormat = __('%s %s Closed Submitted %s Issues');
|
$titleFormat = __('%1$s %2$s Closed Submitted %3$s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND submitter=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $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':
|
||||||
$titleFormat = __('%s %s Closed Working %s Issues');
|
$titleFormat = __('%1$s %2$s Closed Working %3$s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $ctags).')', array($prj->id, $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:
|
||||||
$titleFormat = __('%s %s Working %s Issues');
|
$titleFormat = __('%1$s %2$s Working %3$s Issues');
|
||||||
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
$f_sql = new Pluf_SQL('project=%s AND owner=%s AND status IN ('.implode(', ', $otags).')', array($prj->id, $user->id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -423,7 +427,7 @@ class IDF_Views_Issue
|
|||||||
array($prj->shortname, $issue->id));
|
array($prj->shortname, $issue->id));
|
||||||
$issue->notify($request->conf);
|
$issue->notify($request->conf);
|
||||||
if ($api) return $issue;
|
if ($api) return $issue;
|
||||||
$request->user->setMessage(sprintf(__('<a href="%s">Issue %d</a> has been created.'), $url, $issue->id));
|
$request->user->setMessage(sprintf(__('<a href="%1$s">Issue %2$d</a> has been created.'), $url, $issue->id));
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -445,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;
|
||||||
|
$pag->item_extra_props = array(
|
||||||
|
'project_m' => $prj,
|
||||||
'shortname' => $prj->shortname,
|
'shortname' => $prj->shortname,
|
||||||
'current_user' => $request->user);
|
'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');
|
||||||
@@ -497,7 +598,7 @@ class IDF_Views_Issue
|
|||||||
|
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Issue::view',
|
||||||
array($prj->shortname, $issue->id));
|
array($prj->shortname, $issue->id));
|
||||||
$title = Pluf_Template::markSafe(sprintf(__('Issue <a href="%s">%d</a>: %s'), $url, $issue->id, $issue->summary));
|
$title = Pluf_Template::markSafe(sprintf(__('Issue <a href="%1$s">%2$d</a>: %3$s'), $url, $issue->id, $issue->summary));
|
||||||
$form = false; // The form is available only if logged in.
|
$form = false; // The form is available only if logged in.
|
||||||
$starred = false;
|
$starred = false;
|
||||||
$closed = in_array($issue->status, $prj->getTagIdsByStatus('closed'));
|
$closed = in_array($issue->status, $prj->getTagIdsByStatus('closed'));
|
||||||
@@ -521,7 +622,7 @@ class IDF_Views_Issue
|
|||||||
$issue->notify($request->conf, false);
|
$issue->notify($request->conf, false);
|
||||||
$comments = $issue->get_comments_list(array('order' => 'id DESC'));
|
$comments = $issue->get_comments_list(array('order' => 'id DESC'));
|
||||||
$url .= '#ic' . $comments[0]->id;
|
$url .= '#ic' . $comments[0]->id;
|
||||||
$request->user->setMessage(sprintf(__('<a href="%s">Issue %d</a> has been updated.'), $url, $issue->id));
|
$request->user->setMessage(sprintf(__('<a href="%1$s">Issue %2$d</a> has been updated.'), $url, $issue->id));
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -631,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');
|
||||||
@@ -885,9 +993,8 @@ class IDF_Views_Issue
|
|||||||
$r = $project->getRelationsFromConfig();
|
$r = $project->getRelationsFromConfig();
|
||||||
$auto['auto_relation_types'] = '';
|
$auto['auto_relation_types'] = '';
|
||||||
foreach ($r as $rt) {
|
foreach ($r as $rt) {
|
||||||
$esc = Pluf_esc($rt);
|
|
||||||
$auto['auto_relation_types'] .= sprintf('{ name: "%s", to: "%s" }, ',
|
$auto['auto_relation_types'] .= sprintf('{ name: "%s", to: "%s" }, ',
|
||||||
$esc, $esc);
|
Pluf_esc(__($rt)), Pluf_esc($rt));
|
||||||
}
|
}
|
||||||
$auto['auto_relation_types'] = substr($auto['auto_relation_types'], 0, -2);
|
$auto['auto_relation_types'] = substr($auto['auto_relation_types'], 0, -2);
|
||||||
return $auto;
|
return $auto;
|
||||||
|
@@ -91,7 +91,7 @@ class IDF_Views_Review
|
|||||||
$review = $form->save();
|
$review = $form->save();
|
||||||
$urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
$urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
||||||
array($prj->shortname, $review->id));
|
array($prj->shortname, $review->id));
|
||||||
$request->user->setMessage(sprintf(__('The <a href="%s">code review %d</a> has been created.'), $urlr, $review->id));
|
$request->user->setMessage(sprintf(__('The <a href="%1$s">code review %2$d</a> has been created.'), $urlr, $review->id));
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index',
|
||||||
array($prj->shortname));
|
array($prj->shortname));
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
@@ -137,7 +137,7 @@ class IDF_Views_Review
|
|||||||
$prj->inOr404($review);
|
$prj->inOr404($review);
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
||||||
array($prj->shortname, $review->id));
|
array($prj->shortname, $review->id));
|
||||||
$title = Pluf_Template::markSafe(sprintf(__('Review <a href="%s">%d</a>: %s'), $url, $review->id, $review->summary));
|
$title = Pluf_Template::markSafe(sprintf(__('Review <a href="%1$s">%2$d</a>: %3$s'), $url, $review->id, $review->summary));
|
||||||
|
|
||||||
$patches = $review->get_patches_list();
|
$patches = $review->get_patches_list();
|
||||||
$patch = $patches[0];
|
$patch = $patches[0];
|
||||||
@@ -157,7 +157,7 @@ class IDF_Views_Review
|
|||||||
$review = $patch->get_review();
|
$review = $patch->get_review();
|
||||||
$urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
$urlr = Pluf_HTTP_URL_urlForView('IDF_Views_Review::view',
|
||||||
array($prj->shortname, $review->id));
|
array($prj->shortname, $review->id));
|
||||||
$request->user->setMessage(sprintf(__('Your <a href="%s">code review %d</a> has been published.'), $urlr, $review->id));
|
$request->user->setMessage(sprintf(__('Your <a href="%1$s">code review %2$d</a> has been published.'), $urlr, $review->id));
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Review::index',
|
||||||
array($prj->shortname));
|
array($prj->shortname));
|
||||||
$review_comment->notify($request->conf);
|
$review_comment->notify($request->conf);
|
||||||
|
@@ -302,7 +302,7 @@ class IDF_Views_Source
|
|||||||
throw new Exception('could not retrieve commit object for '. $commit);
|
throw new Exception('could not retrieve commit object for '. $commit);
|
||||||
}
|
}
|
||||||
$title = sprintf(__('%s Commit Details'), (string) $request->project);
|
$title = sprintf(__('%s Commit Details'), (string) $request->project);
|
||||||
$page_title = sprintf(__('%s Commit Details - %s'), (string) $request->project, $commit);
|
$page_title = sprintf(__('%1$s Commit Details - %2$s'), (string) $request->project, $commit);
|
||||||
$rcommit = IDF_Commit::getOrAdd($cobject, $request->project);
|
$rcommit = IDF_Commit::getOrAdd($cobject, $request->project);
|
||||||
$diff = new IDF_Diff($cobject->diff, $scm->getDiffPathStripLevel());
|
$diff = new IDF_Diff($cobject->diff, $scm->getDiffPathStripLevel());
|
||||||
$cobject->diff = null;
|
$cobject->diff = null;
|
||||||
|
@@ -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);
|
||||||
@@ -183,7 +181,7 @@ class IDF_Views_Wiki
|
|||||||
$page = $form->save();
|
$page = $form->save();
|
||||||
$urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
$urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
||||||
array($prj->shortname, $page->title));
|
array($prj->shortname, $page->title));
|
||||||
$request->user->setMessage(sprintf(__('The page <a href="%s">%s</a> has been created.'), $urlpage, Pluf_esc($page->title)));
|
$request->user->setMessage(sprintf(__('The page <a href="%1$s">%2$s</a> has been created.'), $urlpage, Pluf_esc($page->title)));
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index',
|
||||||
array($prj->shortname));
|
array($prj->shortname));
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
@@ -321,7 +319,7 @@ class IDF_Views_Wiki
|
|||||||
$page = $form->save();
|
$page = $form->save();
|
||||||
$urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
$urlpage = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
||||||
array($prj->shortname, $page->title));
|
array($prj->shortname, $page->title));
|
||||||
$request->user->setMessage(sprintf(__('The page <a href="%s">%s</a> has been updated.'), $urlpage, Pluf_esc($page->title)));
|
$request->user->setMessage(sprintf(__('The page <a href="%1$s">%2$s</a> has been updated.'), $urlpage, Pluf_esc($page->title)));
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::index',
|
||||||
array($prj->shortname));
|
array($prj->shortname));
|
||||||
return new Pluf_HTTP_Response_Redirect($url);
|
return new Pluf_HTTP_Response_Redirect($url);
|
||||||
|
@@ -195,7 +195,7 @@ class IDF_WikiPage extends Pluf_Model
|
|||||||
$user = $stag->start($this->get_submitter(), $request, '', false);
|
$user = $stag->start($this->get_submitter(), $request, '', false);
|
||||||
$out .= sprintf(__('<a href="%1$s" title="View page">%2$s</a>, %3$s'), $url, Pluf_esc($this->title), Pluf_esc($this->summary)).'</td>';
|
$out .= sprintf(__('<a href="%1$s" title="View page">%2$s</a>, %3$s'), $url, Pluf_esc($this->title), Pluf_esc($this->summary)).'</td>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Creation of <a href="%s">page %s</a>, by %s'), $url, Pluf_esc($this->title), $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Creation of <a href="%1$s">page %2$s</a>, by %3$s'), $url, Pluf_esc($this->title), $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ class IDF_WikiPage extends Pluf_Model
|
|||||||
.Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
.Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',
|
||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$this->title));
|
$this->title));
|
||||||
$title = sprintf(__('%s: Documentation page %s added - %s'),
|
$title = sprintf(__('%1$s: Documentation page %2$s added - %3$s'),
|
||||||
$request->project->name,
|
$request->project->name,
|
||||||
$this->title, $this->summary);
|
$this->title, $this->summary);
|
||||||
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
||||||
|
@@ -186,7 +186,7 @@ class IDF_WikiRevision extends Pluf_Model
|
|||||||
}
|
}
|
||||||
$out .= '</td></tr>';
|
$out .= '</td></tr>';
|
||||||
$out .= "\n".'<tr class="extra"><td colspan="2">
|
$out .= "\n".'<tr class="extra"><td colspan="2">
|
||||||
<div class="helptext right">'.sprintf(__('Change of <a href="%s">%s</a>, by %s'), $url, Pluf_esc($page->title), $user).'</div></td></tr>';
|
<div class="helptext right">'.sprintf(__('Change of <a href="%1$s">%2$s</a>, by %3$s'), $url, Pluf_esc($page->title), $user).'</div></td></tr>';
|
||||||
return Pluf_Template::markSafe($out);
|
return Pluf_Template::markSafe($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ class IDF_WikiRevision extends Pluf_Model
|
|||||||
array($request->project->shortname,
|
array($request->project->shortname,
|
||||||
$page->title));
|
$page->title));
|
||||||
}
|
}
|
||||||
$title = sprintf(__('%s: Documentation page %s updated - %s'),
|
$title = sprintf(__('%1$s: Documentation page %2$s updated - %3$s'),
|
||||||
$request->project->name,
|
$request->project->name,
|
||||||
$page->title, $page->summary);
|
$page->title, $page->summary);
|
||||||
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);
|
||||||
@@ -259,13 +259,13 @@ class IDF_WikiRevision extends Pluf_Model
|
|||||||
);
|
);
|
||||||
if ($create) {
|
if ($create) {
|
||||||
$template = 'idf/wiki/wiki-created-email.txt';
|
$template = 'idf/wiki/wiki-created-email.txt';
|
||||||
$title = sprintf(__('New Documentation Page %s - %s (%s)'),
|
$title = sprintf(__('New Documentation Page %1$s - %2$s (%3$s)'),
|
||||||
$this->get_wikipage()->title,
|
$this->get_wikipage()->title,
|
||||||
$this->get_wikipage()->summary,
|
$this->get_wikipage()->summary,
|
||||||
$this->get_wikipage()->get_project()->shortname);
|
$this->get_wikipage()->get_project()->shortname);
|
||||||
} else {
|
} else {
|
||||||
$template = 'idf/wiki/wiki-updated-email.txt';
|
$template = 'idf/wiki/wiki-updated-email.txt';
|
||||||
$title = sprintf(__('Documentation Page Changed %s - %s (%s)'),
|
$title = sprintf(__('Documentation Page Changed %1$s - %2$s (%3$s)'),
|
||||||
$this->get_wikipage()->title,
|
$this->get_wikipage()->title,
|
||||||
$this->get_wikipage()->summary,
|
$this->get_wikipage()->summary,
|
||||||
$this->get_wikipage()->get_project()->shortname);
|
$this->get_wikipage()->get_project()->shortname);
|
||||||
|
@@ -119,7 +119,7 @@ $cfg['time_zone'] = 'Europe/Berlin';
|
|||||||
# Configure which languages should be available in your forge.
|
# Configure which languages should be available in your forge.
|
||||||
# If you want to enable an additional language, ensure that the
|
# If you want to enable an additional language, ensure that the
|
||||||
# language file in question resides in 'src/IDF/locale'.
|
# language file in question resides in 'src/IDF/locale'.
|
||||||
$cfg['languages'] = array('en', 'fr', 'de', 'es_ES');
|
$cfg['languages'] = array('en', 'fr', 'de', 'es_ES', 'ru');
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------- #
|
# ---------------------------------------------------------------------------- #
|
||||||
|
@@ -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',
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
4587
src/IDF/locale/pt_BR/idf.po
Normal file
4587
src/IDF/locale/pt_BR/idf.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
4581
src/IDF/locale/tr/idf.po
Normal file
4581
src/IDF/locale/tr/idf.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th> </th>
|
<th> </th>
|
||||||
<th class="a-c"><strong>{trans 'Access Rights'}</strong></th>
|
<th class="a-c"><strong>{trans 'Access Rights'}</strong></th>
|
||||||
<th class="a-c"><strong>{trans 'Notification Email'}</strong></th>
|
<th class="a-c"><strong>{trans 'Notification Emails'}</strong></th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><strong>{$form.f.downloads_access_rights.labelTag}:</strong></th>
|
<th><strong>{$form.f.downloads_access_rights.labelTag}:</strong></th>
|
||||||
|
@@ -2,12 +2,15 @@
|
|||||||
{block tabissues} class="active"{/block}
|
{block tabissues} class="active"{/block}
|
||||||
{block subtabs}
|
{block subtabs}
|
||||||
<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 $inAllIssues}class="active" {/if}href="{url 'IDF_Views_Issue::index', array($project.shortname)}">{trans 'All 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>
|
{if !$user.isAnonymous()}
|
||||||
| <a {if $inWatchList}class="active" {/if}href="{url 'IDF_Views_Issue::watchList', array($project.shortname, 'open')}">{trans 'My watch list'}</a>{/if} |
|
| <a {if $inMyIssues}class="active" {/if}href="{url 'IDF_Views_Issue::userIssues', array($project.shortname, $user.login, 'submit')}">{trans 'My Issues'}</a>
|
||||||
<form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
| <a {if $inWatchList}class="active" {/if}href="{url 'IDF_Views_Issue::watchList', array($project.shortname, 'open')}">{trans 'My watch list'}</a>
|
||||||
<input accesskey="4" type="text" value="{$q}" name="q" size="20" />
|
| <a {if $inCreate}class="active" {/if}href="{url 'IDF_Views_Issue::create', array($project.shortname)}">{trans 'New Issue'}</a>
|
||||||
|
{/if}
|
||||||
|
| <form class="star" action="{url 'IDF_Views_Issue::search', array($project.shortname)}" method="get">
|
||||||
|
<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} |
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
{extends "idf/issues/base.html"}
|
{extends "idf/issues/base.html"}
|
||||||
{block docclass}yui-t1{/block}
|
{block docclass}yui-t1{assign $inAllIssues=true}{/block}
|
||||||
{block body}
|
{block body}
|
||||||
{$issues.render}
|
{$issues.render}
|
||||||
{if !$user.isAnonymous()}
|
{if !$user.isAnonymous()}
|
||||||
@@ -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}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
{extends "idf/issues/base.html"}
|
{extends "idf/issues/base.html"}
|
||||||
{block docclass}yui-t2{assign $inOpenIssues=true}{/block}
|
{block docclass}yui-t2{assign $inAllIssues=true}{/block}
|
||||||
{block body}
|
{block body}
|
||||||
{$issues.render}
|
{$issues.render}
|
||||||
{if !$user.isAnonymous()}
|
{if !$user.isAnonymous()}
|
||||||
@@ -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}
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
{block body}
|
{block body}
|
||||||
{if $trackerEmpty}
|
{if $trackerEmpty}
|
||||||
{aurl 'create_url', 'IDF_Views_Issue::create', array($project.shortname)}
|
{aurl 'create_url', 'IDF_Views_Issue::create', array($project.shortname)}
|
||||||
<p>{blocktrans}The issue tracker is empty.<br />You can create your first issue <a href="{$create_url}">here</a>.{/blocktrans}</p>
|
<p>{blocktrans}The issue tracker is empty.<br /><a href="{$create_url}">Create your first issue</a>.{/blocktrans}</p>
|
||||||
{else}
|
{else}
|
||||||
<div class='issue-summary'>
|
<div class='issue-summary'>
|
||||||
{foreach $tagStatistics as $key => $class}
|
{foreach $tagStatistics as $key => $class}
|
||||||
|
@@ -3,11 +3,11 @@
|
|||||||
{block body}
|
{block body}
|
||||||
<div class="issue-prev-next">
|
<div class="issue-prev-next">
|
||||||
{if $previous_issue_id}
|
{if $previous_issue_id}
|
||||||
<a href="{url 'IDF_Views_Issue::view', array($project.shortname, $previous_issue_id)}" title="{if $closed}{trans 'Click here to view the previous closed issue'}{else}{trans 'Click here to view the previous open issue'}{/if}">Previous issue</a>
|
<a href="{url 'IDF_Views_Issue::view', array($project.shortname, $previous_issue_id)}" title="{if $closed}{trans 'View the previous closed issue'}{else}{trans 'View the previous open issue'}{/if}">Previous issue</a>
|
||||||
{/if}
|
{/if}
|
||||||
{if $previous_issue_id and $next_issue_id} - {/if}
|
{if $previous_issue_id and $next_issue_id} - {/if}
|
||||||
{if $next_issue_id}
|
{if $next_issue_id}
|
||||||
<a href="{url 'IDF_Views_Issue::view', array($project.shortname, $next_issue_id)}" title="{if $closed}{trans 'Click here to view the next closed issue'}{else}{trans 'Click here to view the next open issue'}{/if}">Next issue</a>
|
<a href="{url 'IDF_Views_Issue::view', array($project.shortname, $next_issue_id)}" title="{if $closed}{trans 'View the next closed issue'}{else}{trans 'View the next open issue'}{/if}">Next issue</a>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{assign $i = 0}
|
{assign $i = 0}
|
||||||
@@ -190,6 +190,7 @@
|
|||||||
{if count($related_issues) > 0}
|
{if count($related_issues) > 0}
|
||||||
{foreach $related_issues as $verb => $rel_issues}
|
{foreach $related_issues as $verb => $rel_issues}
|
||||||
<p>
|
<p>
|
||||||
|
{assign $verb = __($verb)}
|
||||||
<strong>{blocktrans}This issue {$verb}{/blocktrans}</strong><br />
|
<strong>{blocktrans}This issue {$verb}{/blocktrans}</strong><br />
|
||||||
{foreach $rel_issues as $rel_issue}
|
{foreach $rel_issues as $rel_issue}
|
||||||
<span class="label">
|
<span class="label">
|
||||||
|
@@ -30,6 +30,6 @@ document.getElementById('id_login').focus()
|
|||||||
<div class="issue-submit-info">
|
<div class="issue-submit-info">
|
||||||
<h3>{trans 'Welcome.'}</h3>
|
<h3>{trans 'Welcome.'}</h3>
|
||||||
{aurl 'url', 'IDF_Views::register', array()}
|
{aurl 'url', 'IDF_Views::register', array()}
|
||||||
<p>{blocktrans}If you don't have an account yet, you can create one <a href="{$url}">here</a>.{/blocktrans}</a></p>
|
<p>{blocktrans}You can <a href="{$url}">create an account</a> if you don't have one yet.{/blocktrans}</a></p>
|
||||||
<p>{trans 'It takes less than a minute to create your account.'}</p></div>
|
<p>{trans 'It takes less than a minute to create your account.'}</p></div>
|
||||||
{/block}
|
{/block}
|
||||||
|
@@ -15,14 +15,14 @@
|
|||||||
{foreach $downloads as $download}
|
{foreach $downloads as $download}
|
||||||
<span class="label"><a href="{url 'IDF_Views_Download::view', array($project.shortname, $download.id)}" title="{$download.summary}">{$download}</a></span><br />
|
<span class="label"><a href="{url 'IDF_Views_Download::view', array($project.shortname, $download.id)}" title="{$download.summary}">{$download}</a></span><br />
|
||||||
{/foreach}
|
{/foreach}
|
||||||
<span class="label"> </span><span class="note"><a href="{url 'IDF_Views_Download::index', array($project.shortname)}">{trans 'show more...'}</a></span>
|
<span class="label"> </span><span class="note"><a href="{url 'IDF_Views_Download::index', array($project.shortname)}" title="{trans 'Show more featured downloads'}">{trans 'show more...'}</a></span>
|
||||||
{/if}
|
{/if}
|
||||||
{if count($pages) > 0}
|
{if count($pages) > 0}
|
||||||
<p><strong>{trans 'Featured Documentation'}</strong><br />
|
<p><strong>{trans 'Featured Documentation'}</strong><br />
|
||||||
{foreach $pages as $page}
|
{foreach $pages as $page}
|
||||||
<span class="label"><a href="{url 'IDF_Views_Wiki::view', array($project.shortname, $page.title)}" title="{$page.summary}">{$page.title}</a></span><br />
|
<span class="label"><a href="{url 'IDF_Views_Wiki::view', array($project.shortname, $page.title)}" title="{$page.summary}">{$page.title}</a></span><br />
|
||||||
{/foreach}
|
{/foreach}
|
||||||
<span class="label"> </span><span class="note"><a href="{url 'IDF_Views_Wiki::index', array($project.shortname)}">{trans 'show more...'}</a></span>
|
<span class="label"> </span><span class="note"><a href="{url 'IDF_Views_Wiki::index', array($project.shortname)}" title="{trans 'Show more featured documentation'}">{trans 'show more...'}</a></span>
|
||||||
{/if}
|
{/if}
|
||||||
{assign $ko = 'owners'}
|
{assign $ko = 'owners'}
|
||||||
{assign $km = 'members'}
|
{assign $km = 'members'}
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
<td>
|
<td>
|
||||||
{if $form.f.terms.errors}{$form.f.terms.fieldErrors}{/if}
|
{if $form.f.terms.errors}{$form.f.terms.fieldErrors}{/if}
|
||||||
{$form.f.terms|unsafe} <strong>{$form.f.terms.labelTag}</strong><br />
|
{$form.f.terms|unsafe} <strong>{$form.f.terms.labelTag}</strong><br />
|
||||||
<span class="helptext">{blocktrans}Read the <a id="showterms" href="#theterms">terms and conditions</a> – basically <em>"Please be nice, we respect you"</em>.{/blocktrans}</span>
|
<span class="helptext">{blocktrans}Read the <a id="showterms" href="#theterms">terms and conditions</a> – basically <em>"Please be nice, we respect you"</em>.{/blocktrans}</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
<div class="issue-submit-info">
|
<div class="issue-submit-info">
|
||||||
<p>{trans 'Be sure to provide a valid email address, as we are sending a validation link by email.'}</p>
|
<p>{trans 'Be sure to provide a valid email address, as we are sending a validation link by email.'}</p>
|
||||||
{aurl 'url', 'IDF_Views::passwordRecoveryAsk'}
|
{aurl 'url', 'IDF_Views::passwordRecoveryAsk'}
|
||||||
<p>{blocktrans}If you have just forgotten your login information, then there is no need to create a new account. Just go <a href="{$url}">here</a> to recover your login name and password.{/blocktrans}</p>
|
<p>{blocktrans}If you have just forgotten your login information, then there is no need to create a new account. You can just <a href="{$url}">recover your login name and password</a>.{/blocktrans}</p>
|
||||||
<p><strong>{trans 'Did you know?'}</strong><br />
|
<p><strong>{trans 'Did you know?'}</strong><br />
|
||||||
{aurl 'url', 'IDF_Views::faq'}
|
{aurl 'url', 'IDF_Views::faq'}
|
||||||
{blocktrans}With your account, you will able to participate in the life of all the projects hosted here. Participating in a software project must be fun, so if you have troubles, you can <a href="{$url}">let us know about your issues at anytime</a>!{/blocktrans}</p>
|
{blocktrans}With your account, you will able to participate in the life of all the projects hosted here. Participating in a software project must be fun, so if you have troubles, you can <a href="{$url}">let us know about your issues at anytime</a>!{/blocktrans}</p>
|
||||||
|
@@ -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}
|
||||||
|
@@ -44,7 +44,7 @@
|
|||||||
<tr><td><span class="scm-action patched" title="{trans 'modified'}">M</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>{if !empty($diff.files[$filename])}{assign $ndiff = count($diff.files[$filename]['chunks'])} (<a href="#diff-{$filename|md5}">{blocktrans $ndiff}{$ndiff} diff{plural}{$ndiff} diffs{/blocktrans}</a>){/if}</td></tr>
|
<tr><td><span class="scm-action patched" title="{trans 'modified'}">M</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>{if !empty($diff.files[$filename])}{assign $ndiff = count($diff.files[$filename]['chunks'])} (<a href="#diff-{$filename|md5}">{blocktrans $ndiff}{$ndiff} diff{plural}{$ndiff} diffs{/blocktrans}</a>){/if}</td></tr>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
{foreach $changes.properties as $filename => $properties}
|
{foreach $changes.properties as $filename => $properties}
|
||||||
<tr><td><span class="scm-action property-changed" title="{trans 'properies changed'}">P</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>
|
<tr><td><span class="scm-action property-changed" title="{trans 'properties changed'}">P</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>
|
||||||
<table class="properties">
|
<table class="properties">
|
||||||
{foreach $properties as $key => $value}
|
{foreach $properties as $key => $value}
|
||||||
<tr><td>{$key}</td>
|
<tr><td>{$key}</td>
|
||||||
|
@@ -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>
|
|
||||||
|
@@ -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}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
return array(
|
return array(
|
||||||
'version' => '1.2-dev',
|
'version' => '1.2.1-dev',
|
||||||
'revision' => '$Format:%H$',
|
'revision' => '$Format:%H$',
|
||||||
);
|
);
|
||||||
|
@@ -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;
|
||||||
|
}
|
@@ -85,6 +85,7 @@ a.soft:visited {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.context {
|
div.context {
|
||||||
|
padding-top: 0.5em;
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 0;
|
top: 0;
|
||||||
@@ -378,6 +379,9 @@ span.active {
|
|||||||
.helptext {
|
.helptext {
|
||||||
font-size: 80%;
|
font-size: 80%;
|
||||||
color: #555753;
|
color: #555753;
|
||||||
|
max-width: 600px;
|
||||||
|
margin-top: 0.25em;
|
||||||
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.container {
|
div.container {
|
||||||
@@ -571,9 +575,43 @@ 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* override any prettify css rule */
|
||||||
|
span.ctrl-char > * {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
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 +620,93 @@ 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: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts tr {
|
||||||
|
border: 1px solid #d3d7cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts tr:first-child {
|
||||||
|
border-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts td {
|
||||||
|
line-height: 12px;
|
||||||
|
font-size: 90%;
|
||||||
|
padding: 2px 10px;
|
||||||
|
text-align: right;
|
||||||
|
border-left: 1px solid #d3d7cf;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.diff-linecounts.left-hidden tr > td:first-child,
|
||||||
|
table.diff-linecounts.right-hidden tr > td + td {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* view file content
|
* view file content
|
||||||
@@ -680,6 +750,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;
|
||||||
@@ -1153,4 +1231,3 @@ table.issue-summary td.graph-color {
|
|||||||
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