Merge branch 'release-1.1' into develop

This commit is contained in:
Thomas Keller 2011-03-20 13:46:45 +01:00
commit 7af7ef8357
87 changed files with 23515 additions and 20974 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
src/IDF/version.php export-subst

50
AUTHORS
View File

@ -1,32 +1,40 @@
InDefero was originally created during summer 2008 InDefero was originally created during summer 2008
by Loïc d'Anterroches with the support of Céondo Ltd. by Loïc d'Anterroches with the support of Céondo Ltd.
Much appreciated contributors: Much appreciated contributors (in alphabetical order):
Nicolas Lassalle <http://www.beroot.org/> - Subversion support Adrien Bustany <madcat@mymadcat.com>
bohwaz <http://bohwaz.net/> Andrew Nguyen <andrew-git-indefero@na-consulting.net>
Baptiste Durand-Bret <bathizte@ozazar.org>
Baptiste Michaud <bactisme@gmail.com> - Subversion sync
Benjamin Jorand <benjamin.jorand@gmail.com> - Mercurial support Benjamin Jorand <benjamin.jorand@gmail.com> - Mercurial support
Baptiste Michaud <bactisme@gmail.com> - Subversion synchronization Brenda Wallace <shiny@cpan.org>
Julien Issler Brian Armstrong <brianar>
Charles Melbye <charlie@yourwiki.net>
Ciaran Gultnieks <ciaran@ciarang.com>
David Feeney <davidf>
Denis Kot <denis.kot@gmail.com> - Russian translation
Dmitry Dulepov <dmitryd>
Fernando Sayago Gil <mikados.mikados@gmail.com> - Spanish translation
Jakub Viták <mainiak@gmail.com> - Czech translation
Janez Troha <http://www.dz0ny.info> - Slovenian translation
Jerry <lxb429@gmail.com> - Chinese translation
Julien Issler <julien@issler.net>
Ludovic Bellière <xrogaan>
Manuel Eidenberger <eidenberger@gmail.com> Manuel Eidenberger <eidenberger@gmail.com>
Ciaran Gultnieks Matthew Dawson <mjd>
Matías Halles <matias@halles.cl>
Mehdi Kabab <http://pioupioum.fr/> Mehdi Kabab <http://pioupioum.fr/>
Sindre R. Myren Nicolas Lassalle <nicolas@beroot.org> - Subversion support
Patrick Georgi <patrick.georgi@coresystems.de> Patrick Georgi <patrick.georgi@coresystems.de>
Adrien Bustany Raphaël Emourgeon <raphael>
Charles Melbye Samuel Suther <info@suther.de> - German translation
Baptiste Durand-Bret Sindre R. Myren <sindrero@stud.ntnu.no>
Andrew Nguyen Thomas Keller <me@thomaskeller.biz> - Monotone support
David Feeney Vladimir Solomatin <slash>
Denis Kot <denis.kot@gmail.com> William Martin <william.martin@lcpc.fr>
Samuel Suther Xavier Brochard <xavier@alternatif.org>
Ludovic Bellière bohwaz <http://bohwaz.net/>
Brian Armstrong
Raphaël Emourgeon
Jakub Viták
Vladimir Solomatin
William Martin <wysman@gmail.com>
Thomas Keller <me@thomaskeller.biz>
And all the nice users who spent time reporting issues and promoting And all the nice users who spent time reporting issues and promoting
the project. The project could not live without them. the project. The project could not live without them.

View File

@ -104,12 +104,13 @@ without first talking to us.
## I am a translator ## I am a translator
We currently use (transifex)[http://trac.transifex.org] to help our We currently use [transifex](http://trac.transifex.org) to help our
users to translate indefero. You don't have to use it, but it's an users translate indefero. You don't have to use it, but it's an easy
easy way to do the job. You can visit the indefero page at transifex way to do the job. You can visit the indefero page at transifex here:
here : http://www.transifex.net/projects/p/indefero/c/indefero/
http://www.transifex.net/projects/p/indefero/
Please understand that your changes will not be commited instantly, Please understand that your changes will not be commited instantly,
but are sent to the maintainers e-mails before. Then, your changes but are sent to the maintainers e-mails before. Then, your changes
will not be in the main repository until da-loic push the changes. In will not be in the main repository until the maintainer pushs the
that way, try to do big changes with less submissions. changes. In that way, try to do big changes with less submissions.

View File

@ -26,19 +26,20 @@
.PHONY: help .PHONY: help
help: help:
@printf "Rules for generate tarball :\n" @printf "Rules for generating distributable files :\n"
@for b in `git branch | sed "s/^. //g"`; do \ @for b in `git branch | sed "s/^. //g"`; do \
printf "\t"$$b"_tarball - Generate a zip archive of the "$$b" branch.\n"; \ printf "\t"$$b"-zipfile - Generate a zip archive of the "$$b" branch.\n"; \
done done
@printf "\nRules for internationnalization :\n"; @printf "\nRules for internationalization :\n";
@printf "\tpot-update - Update the POT file from HTML template and PHP source, then merge it with PO file.\n" @printf "\tpot-update - Update the POT file from HTML templates and PHP sources, then merge it with PO file.\n"
@printf "\tpot-push - Send the POT file on transifex server.\n" @printf "\tpot-push - Send the POT file to the transifex server.\n"
@printf "\tpo-update - Merge POT file into PO file. POT is not regenerated.\n" @printf "\tpo-update - Merge the POT file into the PO file. The POT is not regenerated.\n"
@printf "\tpo-push - Send the all PO file on transifex server.\n" @printf "\tpo-push - Send the all PO files to the transifex server.\n"
@printf "\tpo-pull - Get all PO file from transifex server.\n" @printf "\tpo-pull - Get all PO files from the transifex server.\n"
@printf "\tpo-stats - Show translation statistics of all PO files.\n"
# #
# Internationnalization rule, POT & PO file manipulation # Internationalization rule, POT & PO file manipulation
# #
.PHONY: pluf_path .PHONY: pluf_path
pluf_path: pluf_path:
@ -60,7 +61,8 @@ pot-update: pluf_path
@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 --keyword --keyword=__ --keyword=_n:1,2 -L PHP $$phpfile ; \ xgettext -o idf.pot -p ./IDF/locale/ --from-code=UTF-8 -j \
--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
@ -108,13 +110,32 @@ po-push: check-tx-config
@tx push -t @tx push -t
po-pull: check-tx-config po-pull: check-tx-config
# Save PO
@for pofile in `ls src/IDF/locale/*/idf.po`; do \
cp $$pofile $$pofile".save"; \
done
# Get new one
@tx pull -a @tx pull -a
# Merge Transifex PO into local PO (so fuzzy entry is correctly saved)
@for pofile in `ls src/IDF/locale/*/idf.po`; do \
msgmerge -U $$pofile".save" $$pofile; \
rm -f $$pofile; \
mv $$pofile".save" $$pofile; \
done
po-stats:
@msgfmt --statistics -v src/IDF/locale/idf.pot
@for pofile in `ls src/IDF/locale/*/idf.po`; do \
msgfmt --statistics -v $$pofile; \
done
# #
# Generic rule to build a tarball of indefero for a specified branch # Generic rule to build a zipfile of indefero for a specified branch
# ex: make master_tarball # ex: make master_zipfile
# make dev_tarball # make develop_zipfile
# #
%_tarball: %-zipfile:
@git archive --format=zip --prefix="indefero/" $(@:_tarball=) > indefero-$(@:_tarball=)-`git log $(@:_tarball=) -n 1 --pretty=format:%H`.zip @git archive --format=zip --prefix="indefero/" $(@:-zipfile=) \
> indefero-$(@:-zipfile=)-`git log $(@:-zipfile=) -n 1 \
--pretty=format:%h`.zip

80
NEWS.mdtext Normal file
View File

@ -0,0 +1,80 @@
# InDefero 1.1 - Sun Mar 20 11:44 2011 UTC
## New Features
* _Version control_:
- Support for the monotone Version Control system (see [[InstallationScmMonotone]])
- Display detailed changeset information in the commit details (git, mtn) (issue 544)
- Show branch in the commit details (git, mtn, hg) (issue 450)
- Render branch and tag names in a popup and make them filterable (git, hg, mtn) (issue 601)
* _Issue tracking_:
- Forge-wide and per-project watch lists of starred issues (issue 589)
- Configure a default issue template for each project (issues 212 and 540)
- Pick default issue labels from the configured project settings (issue 556)
- Navigate to a preceding / following issue in the issue detail view
- Many new text syntaxes to auto-link revisions (see [[AutomaticLinks]], issue 569)
* _Documentation wiki_:
- Automatically create a table of contents on wiki pages (issue 350)
- Allow the usage of text labels for Wiki text links (issue 456)
* _Other_:
- Enhanced user profile page (issue 510)
- Manage multiple (commit) emails in the account settings (issues 136 and 500)
- Filter the timeline and its feed by item type (issue 543)
- Add multiple email addresses for project notifications (issue 372)
- Direct links to other projects via the new `Project List` dropdown
- InDefero gained a favicon (issue 594)
## Bugfixes
- Fix `Need SSH_ORIGINAL_COMMAND in environment` error for git sync (issue 198)
- Added an option to disable lengthy project size calculation in the forge (issue 403)
- Fix a problem when deleting an orphaned git repository (issue 467)
- Ignore XML parsing problems when trying to retrieve commit messages for svn (issues 469 and 518)
- Sort the project list by the display name of the project (issue 477)
- Project creation form now has a short description field as well (issue 479)
- Add more file extensions supported by our in-tree prettify version (issues 490 and 567)
- Improve the parsing of hg's log output (issues 507 and 508)
- Do not clean `<ins>` and `<del>` HTML markup from user input (issue 509)
- Improve HTML validation by switching from `strict` to `transitional` DOCTYPE (issue 511)
- Properly handle git commits without a changelog title (issue 520)
- Improve BSD compatibility in shell scripts (issue 526)
- Properly render inner whitespaces in viewed issue attachments (issue 528)
- Support for uploading SSH keys without optional comment (issue 531)
- Recognize irc: and git: protocols in Markdown renderer (issue 546)
- New config option `git_core_quotepath` to handle non-ASCII git file names (issue 553)
- Ensured that active views are rendered in the menu as such (issue 555)
- Add CSS for nested and mixed ordered and unordered lists (issue 557)
- Directories are now sorted before files in source tree views (issue 573)
- File attachments now have explicit view and download links in issue views (issue 575)
- Display anonymous access URL when user has no SSH key registered (issue 588)
- Improve the rendering of tag lists in issue views (issue 591)
- Improved error page when a commit or branch was not found (issue 609)
- Disable browser autocomplete of password fields in the account settings (issue 616)
- Improvements in the automatic linker parser (issue 618)
- The `createIssue` API method did not check the API authentication (issue 619)
- Reduce the memory footprint and compatibility of the internal diff parser (issues 627 and 633)
- Print the git branches and tags in bold which contain the currently displayed revision
## Documentation
- Document how to contribute to Indefero in `CONTRIBUTE.mdtext` (issue 486)
- Note possible problems with mbstring.func_overload in `INSTALL.mdtext` (issue 481)
- Improve links to Markdown documentation (issue 489)
- Explain purpose of `idf_strong_key_check` in `idf.php-dist` (issue 516)
## Translations
- Spanish translation added
- Started with a Simplified Chinese translation (issue 521)
- Started with a Russian translation
- Updates and fixes to the French translation (issue 574)
- Updates and fixes to the German translation
- English source language has been improved (issues 441, 478, and 631)
# InDefero 1.0 - Tue Apr 20 07:00 2010 UTC
First stable release.

15
phpunit.xml Normal file
View File

@ -0,0 +1,15 @@
<phpunit backupGlobals="true"
backupStaticAttributes="false"
bootstrap="test/bootstrap.php"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
strict="false"
verbose="true">
<testsuites>
<testsuite name="Everything">
<directory>test/IDF/</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -27,17 +27,17 @@
*/ */
class IDF_Diff class IDF_Diff
{ {
public $repo = ''; public $path_strip_level = 0;
public $diff = '';
protected $lines = array(); protected $lines = array();
public $files = array(); public $files = array();
public function __construct($diff, $repo='') public function __construct($diff, $path_strip_level = 0)
{ {
$this->repo = $repo; $this->path_strip_level = $path_strip_level;
$this->diff = $diff; // this works because in unified diff format even empty lines are
$this->lines = preg_split("/\015\012|\015|\012/", $diff); // 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()
@ -49,118 +49,95 @@ class IDF_Diff
$files = array(); $files = array();
$indiff = false; // Used to skip the headers in the git patches $indiff = false; // Used to skip the headers in the git patches
$i = 0; // Used to skip the end of a git patch with --\nversion number $i = 0; // Used to skip the end of a git patch with --\nversion number
foreach ($this->lines as $line) { $diffsize = count($this->lines);
while ($i < $diffsize) {
// look for the potential beginning of a diff
if (substr($this->lines[$i], 0, 4) !== '--- ') {
$i++; $i++;
if (0 === strpos($line, '--') and isset($this->lines[$i]) continue;
and preg_match('/^\d+\.\d+\.\d+\.\d+$/', $this->lines[$i])) { }
// we're inside a diff candiate
$oldfileline = $this->lines[$i++];
$newfileline = $this->lines[$i++];
if (substr($newfileline, 0, 4) !== '+++ ') {
// not a valid diff here, move on
continue;
}
// use new file name by default
preg_match("/^\+\+\+ ([^\t]+)/", $newfileline, $m);
$current_file = $m[1];
if ($current_file === '/dev/null') {
// except if it's /dev/null, use the old one instead
// eg. mtn 0.48 and newer
preg_match("/^--- ([^\t]+)/", $oldfileline, $m);
$current_file = $m[1];
}
if ($this->path_strip_level > 0) {
$fileparts = explode('/', $current_file, $this->path_strip_level+1);
$current_file = array_pop($fileparts);
}
$current_chunk = 0;
$files[$current_file] = array();
$files[$current_file]['chunks'] = array();
$files[$current_file]['chunks_def'] = array();
while ($i < $diffsize && substr($this->lines[$i], 0, 3) === '@@ ') {
$elems = preg_match('/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@.*/',
$this->lines[$i++], $results);
if ($elems != 1) {
// hunk is badly formatted
break; break;
} }
if (0 === strpos($line, 'diff --git a')) { $delstart = $results[1];
$current_file = self::getFile($line); $dellines = $results[2] === '' ? 1 : $results[2];
$files[$current_file] = array(); $addstart = $results[3];
$files[$current_file]['chunks'] = array(); $addlines = $results[4] === '' ? 1 : $results[4];
$files[$current_file]['chunks_def'] = array();
$current_chunk = 0; $files[$current_file]['chunks_def'][] = array(
$indiff = true; array($delstart, $dellines), array($addstart, $addlines)
continue;
} else if (preg_match('#^diff -r [^\s]+ -r [^\s]+ (.+)$#', $line, $matches)) {
$current_file = $matches[1];
$files[$current_file] = array();
$files[$current_file]['chunks'] = array();
$files[$current_file]['chunks_def'] = array();
$current_chunk = 0;
$indiff = true;
continue;
} else if (!$indiff && 0 === strpos($line, '=========')) {
// ignore pseudo stanzas with a hint of a binary file
if (preg_match("/^# (.+) is binary/", $this->lines[$i]))
continue;
// by default always use the new name of a possibly renamed file
$current_file = self::getMtnFile($this->lines[$i+1]);
// mtn 0.48 and newer set /dev/null as file path for dropped files
// so we display the old name here
if ($current_file == "/dev/null") {
$current_file = self::getMtnFile($this->lines[$i]);
}
if ($current_file == "/dev/null") {
throw new Exception(
"could not determine path from diff"
); );
}
$files[$current_file] = array();
$files[$current_file]['chunks'] = array();
$files[$current_file]['chunks_def'] = array();
$current_chunk = 0;
$indiff = true;
continue;
} else if (0 === strpos($line, 'Index: ')) {
$current_file = self::getSvnFile($line);
$files[$current_file] = array();
$files[$current_file]['chunks'] = array();
$files[$current_file]['chunks_def'] = array();
$current_chunk = 0;
$indiff = true;
continue;
}
if (!$indiff) {
continue;
}
if (0 === strpos($line, '@@ ')) {
$files[$current_file]['chunks_def'][] = self::getChunk($line);
$files[$current_file]['chunks'][] = array(); $files[$current_file]['chunks'][] = array();
while ($i < $diffsize && ($addlines >= 0 || $dellines >= 0)) {
$linetype = $this->lines[$i] != '' ? $this->lines[$i][0] : ' ';
switch ($linetype) {
case ' ':
$files[$current_file]['chunks'][$current_chunk][] =
array($delstart, $addstart, substr($this->lines[$i++], 1));
$dellines--;
$addlines--;
$delstart++;
$addstart++;
break;
case '+':
$files[$current_file]['chunks'][$current_chunk][] =
array('', $addstart, substr($this->lines[$i++], 1));
$addlines--;
$addstart++;
break;
case '-':
$files[$current_file]['chunks'][$current_chunk][] =
array($delstart, '', substr($this->lines[$i++], 1));
$dellines--;
$delstart++;
break;
case '\\':
// ignore newline handling for now, see issue 636
$i++;
continue;
default:
break 2;
}
}
$current_chunk++; $current_chunk++;
$lline = $files[$current_file]['chunks_def'][$current_chunk-1][0][0];
$rline = $files[$current_file]['chunks_def'][$current_chunk-1][1][0];
continue;
}
if (0 === strpos($line, '---') or 0 === strpos($line, '+++')) {
continue;
}
if (0 === strpos($line, '-')) {
$files[$current_file]['chunks'][$current_chunk-1][] = array($lline, '', substr($line, 1));
$lline++;
continue;
}
if (0 === strpos($line, '+')) {
$files[$current_file]['chunks'][$current_chunk-1][] = array('', $rline, substr($line, 1));
$rline++;
continue;
}
if (0 === strpos($line, ' ')) {
$files[$current_file]['chunks'][$current_chunk-1][] = array($lline, $rline, substr($line, 1));
$rline++;
$lline++;
continue;
}
if ($line == '') {
$files[$current_file]['chunks'][$current_chunk-1][] = array($lline, $rline, $line);
$rline++;
$lline++;
continue;
} }
} }
$this->files = $files; $this->files = $files;
return $files; return $files;
} }
public static function getFile($line)
{
$line = substr(trim($line), 10);
$n = (int) strlen($line)/2;
return trim(substr($line, 3, $n-3));
}
public static function getSvnFile($line)
{
return substr(trim($line), 7);
}
public static function getMtnFile($line)
{
preg_match("/^[+-]{3} ([^\t]+)/", $line, $m);
return $m[1];
}
/** /**
* Return the html version of a parsed diff. * Return the html version of a parsed diff.
*/ */
@ -197,7 +174,6 @@ class IDF_Diff
return Pluf_Template::markSafe($out); return Pluf_Template::markSafe($out);
} }
public static function padLine($line) public static function padLine($line)
{ {
$line = str_replace("\t", ' ', $line); $line = str_replace("\t", ' ', $line);
@ -210,19 +186,6 @@ class IDF_Diff
return str_repeat('&nbsp;', $i).substr($line, $i); return str_repeat('&nbsp;', $i).substr($line, $i);
} }
/**
* @return array array(array(start, n), array(start, n))
*/
public static function getChunk($line)
{
$elts = explode(' ', $line);
$res = array();
for ($i=1;$i<3;$i++) {
$res[] = explode(',', trim(substr($elts[$i], 1)));
}
return $res;
}
/** /**
* Review patch. * Review patch.
* *
@ -347,7 +310,6 @@ class IDF_Diff
return $nnew_chunks; return $nnew_chunks;
} }
public function renderCompared($chunks, $filename) public function renderCompared($chunks, $filename)
{ {
$fileinfo = IDF_FileUtil::getMimeType($filename); $fileinfo = IDF_FileUtil::getMimeType($filename);
@ -381,6 +343,5 @@ class IDF_Diff
$i++; $i++;
} }
return Pluf_Template::markSafe($out); return Pluf_Template::markSafe($out);
} }
} }

View File

@ -182,7 +182,7 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form
// we accept only starting with http(s):// to avoid people // we accept only starting with http(s):// to avoid people
// trying to access the local filesystem. // trying to access the local filesystem.
if (!preg_match('#^(http|https)://#', $url)) { if (!preg_match('#^(http|https)://#', $url)) {
throw new Pluf_Form_Invalid(__('Only a remote repository available throught http or https are allowed. For example "http://somewhere.com/svn/trunk".')); throw new Pluf_Form_Invalid(__('Only a remote repository available through HTTP or HTTPS is allowed. For example "http://somewhere.com/svn/trunk".'));
} }
return $url; return $url;
} }

View File

@ -88,7 +88,7 @@ class IDF_Form_Admin_ProjectUpdate 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.'
)); ));
} }

View File

@ -68,7 +68,7 @@ class IDF_Form_Admin_UserCreate extends Pluf_Form
array('required' => true, array('required' => true,
'label' => __('Email'), 'label' => __('Email'),
'initial' => '', 'initial' => '',
'help_text' => __('Double check the email address as the password is directly sent to the user.'), 'help_text' => __('Double check the email address as the password is sent directly to the user.'),
)); ));
$this->fields['language'] = new Pluf_Form_Field_Varchar( $this->fields['language'] = new Pluf_Form_Field_Varchar(

View File

@ -78,7 +78,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form
'label' => __('Password'), 'label' => __('Password'),
'initial' => '', 'initial' => '',
'widget' => 'Pluf_Form_Widget_PasswordInput', 'widget' => 'Pluf_Form_Widget_PasswordInput',
'help_text' => Pluf_Template::markSafe(__('Leave blank if you do not want to change the password.').'<br />'.__('The password must be hard for other people to find it, but easy for the user to remember.')), 'help_text' => Pluf_Template::markSafe(__('Leave blank if you do not want to change the password.').'<br />'.__('The password must be hard for other people to guess, but easy for the user to remember.')),
'widget_attrs' => array( 'widget_attrs' => array(
'maxlength' => 50, 'maxlength' => 50,
'size' => 15, 'size' => 15,
@ -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 him.'), 'help_text' => __('If you give staff rights to a user, you really need to trust them.'),
)); ));
} }
@ -173,7 +173,7 @@ class IDF_Form_Admin_UserUpdate extends Pluf_Form
'initial' => $this->user->active, 'initial' => $this->user->active,
'widget' => 'Pluf_Form_Widget_CheckboxInput', 'widget' => 'Pluf_Form_Widget_CheckboxInput',
'widget_attrs' => $attrs, 'widget_attrs' => $attrs,
'help_text' => __('If the user is not getting the confirmation email or is abusing the system, you can directly enable or disable his account here.'), 'help_text' => __('If the user is not getting the confirmation email or is abusing the system, you can directly enable or disable their account here.'),
)); ));
} }

View File

@ -77,7 +77,7 @@ Maintainability = Hinders future changes';
{ {
$this->fields['labels_issue_template'] = new Pluf_Form_Field_Varchar( $this->fields['labels_issue_template'] = new Pluf_Form_Field_Varchar(
array('required' => false, array('required' => false,
'label' => __('Define an issue template to hint the reporter to provide certain information'), 'label' => __('Define an issue template to hint to the reporter to provide certain information'),
'initial' => self::init_template, 'initial' => self::init_template,
'widget_attrs' => array('rows' => 7, 'widget_attrs' => array('rows' => 7,
'cols' => 75), 'cols' => 75),

View File

@ -42,7 +42,7 @@ class IDF_Form_Register extends Pluf_Form
'max_length' => 15, 'max_length' => 15,
'min_length' => 3, 'min_length' => 3,
'initial' => $login, 'initial' => $login,
'help_text' => __('The login must be between 3 and 15 characters long and contains only letters and digits.'), 'help_text' => __('The login must be between 3 and 15 characters long and contain only letters and digits.'),
'widget_attrs' => array( 'widget_attrs' => array(
'maxlength' => 15, 'maxlength' => 15,
'size' => 10, 'size' => 10,
@ -52,7 +52,7 @@ class IDF_Form_Register extends Pluf_Form
array('required' => true, array('required' => true,
'label' => __('Your email'), 'label' => __('Your email'),
'initial' => '', 'initial' => '',
'help_text' => __('We will never send you any unsolicited emails. We hate spams too!'), 'help_text' => __('We will never send you any unsolicited emails. We hate spam too!'),
)); ));
$this->fields['terms'] = new Pluf_Form_Field_Boolean( $this->fields['terms'] = new Pluf_Form_Field_Boolean(
@ -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, click on the help link to recover your password.'), $this->cleaned_data['email'])); 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']));
} }
return $this->cleaned_data['email']; return $this->cleaned_data['email'];
} }

View File

@ -69,7 +69,7 @@ class IDF_Form_RegisterConfirmation extends Pluf_Form
'label' => __('Your password'), 'label' => __('Your password'),
'initial' => '', 'initial' => '',
'widget' => 'Pluf_Form_Widget_PasswordInput', 'widget' => 'Pluf_Form_Widget_PasswordInput',
'help_text' => __('Your password must be hard for other people to find it, but easy for you to remember.'), 'help_text' => __('Your password must be hard for other people to guess, but easy for you to remember.'),
'widget_attrs' => array( 'widget_attrs' => array(
'maxlength' => 50, 'maxlength' => 50,
'size' => 15, 'size' => 15,

View File

@ -64,6 +64,8 @@ class IDF_Form_ReviewFileComment extends Pluf_Form
if ($this->user->hasPerm('IDF.project-owner', $this->project) if ($this->user->hasPerm('IDF.project-owner', $this->project)
or $this->user->hasPerm('IDF.project-member', $this->project)) { or $this->user->hasPerm('IDF.project-member', $this->project)) {
$this->show_full = true; $this->show_full = true;
} else {
$this->show_full = false;
} }
if ($this->show_full) { if ($this->show_full) {
$this->fields['summary'] = new Pluf_Form_Field_Varchar( $this->fields['summary'] = new Pluf_Form_Field_Varchar(

View File

@ -83,7 +83,7 @@ class IDF_Form_Upload extends Pluf_Form
if (strlen($extra)) $extra .= '|'; if (strlen($extra)) $extra .= '|';
if (!preg_match('/\.('.$extra.'png|jpg|jpeg|gif|bmp|psd|tif|aiff|asf|avi|bz2|css|doc|eps|gz|jar|mdtext|mid|mov|mp3|mpg|ogg|pdf|ppt|ps|qt|ra|ram|rm|rtf|sdd|sdw|sit|sxi|sxw|swf|tgz|txt|wav|xls|xml|war|wmv|zip)$/i', $this->cleaned_data['file'])) { if (!preg_match('/\.('.$extra.'png|jpg|jpeg|gif|bmp|psd|tif|aiff|asf|avi|bz2|css|doc|eps|gz|jar|mdtext|mid|mov|mp3|mpg|ogg|pdf|ppt|ps|qt|ra|ram|rm|rtf|sdd|sdw|sit|sxi|sxw|swf|tgz|txt|wav|xls|xml|war|wmv|zip)$/i', $this->cleaned_data['file'])) {
@unlink(Pluf::f('upload_path').'/'.$this->project->shortname.'/files/'.$this->cleaned_data['file']); @unlink(Pluf::f('upload_path').'/'.$this->project->shortname.'/files/'.$this->cleaned_data['file']);
throw new Pluf_Form_Invalid(__('For security reason, you cannot upload a file with this extension.')); throw new Pluf_Form_Invalid(__('For security reasons, you cannot upload a file with this extension.'));
} }
return $this->cleaned_data['file']; return $this->cleaned_data['file'];
} }

View File

@ -163,7 +163,7 @@ class IDF_Form_UserAccount extends Pluf_Form
'widget_attrs' => array('rows' => 3, 'widget_attrs' => array('rows' => 3,
'cols' => 40), 'cols' => 40),
'widget' => 'Pluf_Form_Widget_TextareaInput', 'widget' => 'Pluf_Form_Widget_TextareaInput',
'help_text' => __('Paste a SSH or monotone public key. Be careful to not provide your private key here!') 'help_text' => __('Paste an SSH or monotone public key. Be careful to not provide your private key here!')
)); ));
$this->fields['secondary_mail'] = new Pluf_Form_Field_Email( $this->fields['secondary_mail'] = new Pluf_Form_Field_Email(
@ -359,7 +359,7 @@ class IDF_Form_UserAccount extends Pluf_Form
} }
else { else {
throw new Pluf_Form_Invalid( throw new Pluf_Form_Invalid(
__('Public key looks neither like a SSH '. __('Public key looks like neither an SSH '.
'nor monotone public key.')); 'nor monotone public key.'));
} }

View File

@ -87,6 +87,7 @@ class IDF_Middleware
'markdown' => 'IDF_Template_Markdown', 'markdown' => 'IDF_Template_Markdown',
'showuser' => 'IDF_Template_ShowUser', 'showuser' => 'IDF_Template_ShowUser',
'ashowuser' => 'IDF_Template_AssignShowUser', 'ashowuser' => 'IDF_Template_AssignShowUser',
'appversion' => 'IDF_Template_AppVersion',
)); ));
$params['modifiers'] = array_merge($params['modifiers'], $params['modifiers'] = array_merge($params['modifiers'],
array( array(

View File

@ -50,6 +50,7 @@ function IDF_Migrations_Install_setup($params=null)
'IDF_Scm_Cache_Git', 'IDF_Scm_Cache_Git',
'IDF_Queue', 'IDF_Queue',
'IDF_Gconf', 'IDF_Gconf',
'IDF_EmailAddress',
); );
$db = Pluf::db(); $db = Pluf::db();
$schema = new Pluf_DB_Schema($db); $schema = new Pluf_DB_Schema($db);
@ -107,6 +108,7 @@ function IDF_Migrations_Install_teardown($params=null)
'IDF_Tag', 'IDF_Tag',
'IDF_Commit', 'IDF_Commit',
'IDF_Project', 'IDF_Project',
'IDF_EmailAddress',
); );
$db = Pluf::db(); $db = Pluf::db();
$schema = new Pluf_DB_Schema($db); $schema = new Pluf_DB_Schema($db);

View File

@ -473,5 +473,14 @@ class IDF_Scm
{ {
return str_replace('%2F', '/', rawurlencode($path)); return str_replace('%2F', '/', rawurlencode($path));
} }
/**
* Returns the number of slashes and preceeding path components
* that should be stripped from paths in the SCM's diff output
*/
public function getDiffPathStripLevel()
{
return 0;
}
} }

View File

@ -167,7 +167,29 @@ class IDF_Scm_Git extends IDF_Scm
*/ */
public function inBranches($commit, $path) public function inBranches($commit, $path)
{ {
return $this->_inObject($commit, 'branch'); if (isset($this->cache['inBranches'][$commit])) {
return $this->cache['inBranches'][$commit];
}
$cmd = Pluf::f('idf_exec_cmd_prefix', '')
.sprintf('GIT_DIR=%s %s branch --contains %s',
escapeshellarg($this->repo),
Pluf::f('git_path', 'git'),
escapeshellarg($commit));
self::exec('IDF_Scm_Git::inBranches', $cmd, $out, $return);
if (0 != $return) {
throw new IDF_Scm_Exception(sprintf($this->error_tpl,
$cmd, $return,
implode("\n", $out)));
}
$res = array();
foreach ($out as $line) {
$res[] = substr($line, 2);
}
$this->cache['inBranches'][$commit] = $res;
return $res;
} }
/** /**
@ -216,35 +238,36 @@ class IDF_Scm_Git extends IDF_Scm
**/ **/
public function inTags($commit, $path) public function inTags($commit, $path)
{ {
return $this->_inObject($commit, 'tag'); if (isset($this->cache['inTags'][$commit])) {
return $this->cache['inTags'][$commit];
} }
/** $cmd = Pluf::f('idf_exec_cmd_prefix', '')
* Returns in which branches or tags a commit is. .sprintf('GIT_DIR=%s %s tag --contains %s',
* escapeshellarg($this->repo),
* @param string Commit Pluf::f('git_path', 'git'),
* @param string Object's type: 'branch' or 'tag'. escapeshellarg($commit));
* @return array self::exec('IDF_Scm_Git::inTags', $cmd, $out, $return);
*/ // `git tag` gained the `--contains` option in 1.6.2, earlier
private function _inObject($commit, $object) // versions report a bad usage error (129) which we ignore here
{ if (129 == $return) {
$object = strtolower($object); $this->cache['inTags'][$commit] = array();
if ('branch' === $object) { return array();
$objects = $this->getBranches();
} else if ('tag' === $object) {
$objects = $this->getTags();
} else {
throw new InvalidArgumentException(sprintf(__('Invalid value for the parameter %1$s: %2$s. Use %3$s.'),
'$object',
$object,
'\'branch\' or \'tag\''));
} }
unset($object); // any other error should of course get noted
$result = array(); if (0 != $return) {
if (array_key_exists($commit, $objects)) { throw new IDF_Scm_Exception(sprintf($this->error_tpl,
$result[] = $commit; $cmd, $return,
implode("\n", $out)));
} }
return $result;
$res = array();
foreach ($out as $line) {
$res[] = $line;
}
$this->cache['inTags'][$commit] = $res;
return $res;
} }
/** /**
@ -505,7 +528,7 @@ class IDF_Scm_Git extends IDF_Scm
$out[0]->diff = ''; $out[0]->diff = '';
} }
$out[0]->branch = implode(', ', $this->inBranches($commit, null)); $out[0]->branch = implode(', ', $this->inBranches($out[0]->commit, null));
return $out[0]; return $out[0];
} }
@ -633,6 +656,14 @@ class IDF_Scm_Git extends IDF_Scm
return new Pluf_HTTP_Response_CommandPassThru($cmd, 'application/x-zip'); return new Pluf_HTTP_Response_CommandPassThru($cmd, 'application/x-zip');
} }
/**
* @see IDF_Scm::getDiffPathStripLevel()
*/
public function getDiffPathStripLevel()
{
return 1;
}
/* /*
* ===================================================== * =====================================================
* Specific Git Commands * Specific Git Commands

View File

@ -27,10 +27,13 @@
*/ */
class IDF_Scm_Mercurial extends IDF_Scm class IDF_Scm_Mercurial extends IDF_Scm
{ {
protected $hg_log_template;
public function __construct($repo, $project=null) public function __construct($repo, $project=null)
{ {
$this->repo = $repo; $this->repo = $repo;
$this->project = $project; $this->project = $project;
$this->hg_log_template = "'".'changeset: {rev}:{node|short}\nauthor: {author}\ndate: {date|isodate}\nfiles: {files}\n{desc}\n'."'";
} }
public function getRepositorySize() public function getRepositorySize()
@ -336,10 +339,14 @@ class IDF_Scm_Mercurial extends IDF_Scm
if (!$this->isValidRevision($commit)) { if (!$this->isValidRevision($commit)) {
return false; return false;
} }
$tmpl = ($getdiff) ? $tmpl = ($getdiff)
Pluf::f('hg_path', 'hg').' log -p -r %s -R %s' : Pluf::f('hg_path', 'hg').' log -r %s -R %s'; ? Pluf::f('hg_path', 'hg').' log -p -r %s -R %s --template %s'
: Pluf::f('hg_path', 'hg').' log -r %s -R %s --template %s';
$cmd = sprintf($tmpl, $cmd = sprintf($tmpl,
escapeshellarg($commit), escapeshellarg($this->repo)); escapeshellarg($commit),
escapeshellarg($this->repo),
$this->hg_log_template);
$out = array(); $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); self::exec('IDF_Scm_Mercurial::getCommit', $cmd, $out);
@ -356,7 +363,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
$log[] = $line; $log[] = $line;
} }
} }
$out = self::parseLog($log, 6); $out = self::parseLog($log, 4);
$out[0]->diff = implode("\n", $change); $out[0]->diff = implode("\n", $change);
return $out[0]; return $out[0];
} }
@ -381,11 +388,11 @@ class IDF_Scm_Mercurial extends IDF_Scm
*/ */
public function getChangeLog($commit='tip', $n=10) public function getChangeLog($commit='tip', $n=10)
{ {
$cmd = sprintf(Pluf::f('hg_path', 'hg').' log -R %s -l%s ', escapeshellarg($this->repo), $n, $commit); $cmd = sprintf(Pluf::f('hg_path', 'hg').' log -R %s -l%s --template %s', escapeshellarg($this->repo), $n, $this->hg_log_template, $commit);
$out = array(); $out = array();
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
self::exec('IDF_Scm_Mercurial::getChangeLog', $cmd, $out); self::exec('IDF_Scm_Mercurial::getChangeLog', $cmd, $out);
return self::parseLog($out, 6); return self::parseLog($out, 4);
} }
/** /**
@ -421,7 +428,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
continue; continue;
} }
$match = array(); $match = array();
if (preg_match('/(\S+)\s*:\s*(.*)/', $line, $match)) { if (preg_match('/^(\S+):\s*(.*)/', $line, $match)) {
$match[1] = strtolower($match[1]); $match[1] = strtolower($match[1]);
if ($match[1] == 'user') { if ($match[1] == 'user') {
$c['author'] = $match[2]; $c['author'] = $match[2];
@ -464,4 +471,12 @@ class IDF_Scm_Mercurial extends IDF_Scm
escapeshellarg($commit)); escapeshellarg($commit));
return new Pluf_HTTP_Response_CommandPassThru($cmd, 'application/x-zip'); return new Pluf_HTTP_Response_CommandPassThru($cmd, 'application/x-zip');
} }
/**
* @see IDF_Scm::getDiffPathStripLevel()
*/
public function getDiffPathStripLevel()
{
return 1;
}
} }

View File

@ -266,8 +266,13 @@ class IDF_Scm_Svn extends IDF_Scm
escapeshellarg($this->repo), escapeshellarg($this->repo),
escapeshellarg($rev)); escapeshellarg($rev));
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
try {
$xml = simplexml_load_string(self::shell_exec('IDF_Scm_Svn::getCommitMessage', $cmd)); $xml = simplexml_load_string(self::shell_exec('IDF_Scm_Svn::getCommitMessage', $cmd));
$this->cache['commitmess'][$rev] = (string) $xml->logentry->msg; $this->cache['commitmess'][$rev] = (string) $xml->logentry->msg;
}
catch (Exception $e) {
$this->cache['commitmess'][$rev] = '';
}
return $this->cache['commitmess'][$rev]; return $this->cache['commitmess'][$rev];
} }

51
src/IDF/Template.php Normal file
View File

@ -0,0 +1,51 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* PHP sets the backtrack limit quite low, so some (harder to analyze) regexes may fail
* unexpectedly on large inputs or weird cornercases (see issue 618). Unfortunately this
* fix does not always work and the execution time gets bigger the bigger we set the limit,
* so in case PCRE fails to analyze the input string and preg_replace(_callback) returns NULL,
* we at least return the input string unaltered.
*
* @param $pattern The pattern
* @param $mixed Callback or replacement string
* @param $input The input
* @return The output
*/
function IDF_Template_safePregReplace($pattern, $mixed, $input)
{
$pcre_backtrack_limit = ini_get('pcre.backtrack_limit');
ini_set('pcre.backtrack_limit', 10000000);
if (is_string($mixed) && !function_exists($mixed))
$output = preg_replace($pattern, $mixed, $input);
else
$output = preg_replace_callback($pattern, $mixed, $input);
if ($output === null)
$output = $input;
ini_set('pcre.backtrack_limit', $pcre_backtrack_limit);
return $output;
}

View File

@ -0,0 +1,61 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* AppVersion tag.
*
* Renders two meta tags that include the application's version and revision
*/
class IDF_Template_AppVersion extends Pluf_Template_Tag
{
function start($file = 'IDF/version.php')
{
if (!Pluf::fileExists($file)) {
return;
}
$info = include_once($file);
if (!is_array($info)) {
return;
}
if (array_key_exists('version', $info)) {
echo '<meta name="indefero-version" content="'.$info['version'].'" />'."\n";
}
if (array_key_exists('revision', $info)) {
if (strpos($info['revision'], '$') !== false) {
$info['revision'] = 'unknown';
$cmd = Pluf::f('idf_exec_cmd_prefix', '').
Pluf::f('git_path', 'git').
' log -1 --format=%H';
if (IDF_Scm::exec('IDF_Template_AppVersion::start', $cmd, $output)) {
$info['revision'] = trim(@$output[0]);
}
}
echo '<meta name="indefero-revision" content="'.$info['revision'].'" />'."\n";
}
}
}

View File

@ -22,6 +22,7 @@
# ***** END LICENSE BLOCK ***** */ # ***** END LICENSE BLOCK ***** */
Pluf::loadFunction('Pluf_HTTP_URL_urlForView'); Pluf::loadFunction('Pluf_HTTP_URL_urlForView');
Pluf::loadFunction('IDF_Template_safePregReplace');
/** /**
* Make the links to issues and commits. * Make the links to issues and commits.
@ -34,25 +35,20 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
function start($text, $request, $echo=true, $wordwrap=true, $esc=true, $autolink=true, $nl2br=false) function start($text, $request, $echo=true, $wordwrap=true, $esc=true, $autolink=true, $nl2br=false)
{ {
// PHP sets the backtrack limit quite low, so some regexes may
// fail unexpectedly on large inputs or weird cornercases (see issue 618)
$pcre_backtrack_limit = ini_get('pcre.backtrack_limit');
ini_set('pcre.backtrack_limit', 10000000);
$this->project = $request->project; $this->project = $request->project;
$this->request = $request; $this->request = $request;
$this->scm = IDF_Scm::get($request->project); $this->scm = IDF_Scm::get($request->project);
if ($esc) $text = Pluf_esc($text); if ($esc) $text = Pluf_esc($text);
if ($autolink) { if ($autolink) {
$text = preg_replace('#([a-z]+://[^\s\(\)]+)#i', $text = IDF_Template_safePregReplace('#([a-z]+://[^\s\(\)]+)#i',
'<a href="\1">\1</a>', $text); '<a href="\1">\1</a>', $text);
} }
if ($request->rights['hasIssuesAccess']) { if ($request->rights['hasIssuesAccess']) {
$text = preg_replace_callback('#((?:issue|bug|ticket)(s)?\s+|\s+\#)(\d+)(\#ic\d+)?(?(2)((?:[, \w]+(?:\s+\#)?)?\d+(?:\#ic\d+)?){0,})#im', $text = IDF_Template_safePregReplace('#((?:issue|bug|ticket)(s)?\s+|\s+\#)(\d+)(\#ic\d+)?(?(2)((?:[, \w]+(?:\s+\#)?)?\d+(?:\#ic\d+)?){0,})#im',
array($this, 'callbackIssues'), $text); array($this, 'callbackIssues'), $text);
} }
if ($request->rights['hasReviewAccess']) { if ($request->rights['hasReviewAccess']) {
$text = preg_replace_callback('#(reviews?\s+)(\d+(?:(?:\s+and|\s+or|,)\s+\d+)*)\b#i', $text = IDF_Template_safePregReplace('#(reviews?\s+)(\d+(?:(?:\s+and|\s+or|,)\s+\d+)*)\b#i',
array($this, 'callbackReviews'), $text); array($this, 'callbackReviews'), $text);
} }
if ($request->rights['hasSourceAccess']) { if ($request->rights['hasSourceAccess']) {
@ -60,9 +56,9 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
$nouns = array('commit', 'commits', 'revision', 'revisions', 'rev', 'revs'); $nouns = array('commit', 'commits', 'revision', 'revisions', 'rev', 'revs');
$prefix = implode(' in|', $verbs).' in' . '|'. $prefix = implode(' in|', $verbs).' in' . '|'.
implode('|', $nouns); implode('|', $nouns);
$text = preg_replace_callback('#((?:'.$prefix.')(?:\s+r?))([0-9a-f]{1,40}((?:\s+and|\s+or|,)\s+r?[0-9a-f]{1,40})*)\b#i', $text = IDF_Template_safePregReplace('#((?:'.$prefix.')(?:\s+r?))([0-9a-f]{1,40}((?:\s+and|\s+or|,)\s+r?[0-9a-f]{1,40})*)\b#i',
array($this, 'callbackCommits'), $text); array($this, 'callbackCommits'), $text);
$text = preg_replace_callback('=(src:)([^\s@#,\(\)\\\\]+(?:(\\\\)[\s@#][^\s@#,\(\)\\\\]+){0,})+(?:\@([^\s#,]+))(?:#(\d+))?=im', $text = IDF_Template_safePregReplace('=(src:)([^\s@#,\(\)\\\\]+(?:(\\\\)[\s@#][^\s@#,\(\)\\\\]+){0,})+(?:\@([^\s#,]+))(?:#(\d+))?=im',
array($this, 'callbackSource'), $text); array($this, 'callbackSource'), $text);
} }
if ($wordwrap) $text = Pluf_Text::wrapHtml($text, 69, "\n"); if ($wordwrap) $text = Pluf_Text::wrapHtml($text, 69, "\n");
@ -72,8 +68,6 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
} else { } else {
return $text; return $text;
} }
ini_set('pcre.backtrack_limit', $pcre_backtrack_limit);
} }
/** /**
@ -101,7 +95,7 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
} }
return $m[0]; // not existing issue. return $m[0]; // not existing issue.
} }
return preg_replace_callback('#(\#)?(\d+)(\#ic\d+)?#', return IDF_Template_safePregReplace('#(\#)?(\d+)(\#ic\d+)?#',
array($this, 'callbackIssue'), array($this, 'callbackIssue'),
$m[0]); $m[0]);
} }
@ -138,7 +132,7 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
return $m[1].call_user_func(array($this, 'callbackCommit'), array($m[2])); return $m[1].call_user_func(array($this, 'callbackCommit'), array($m[2]));
} }
// Multiple commits like 'commits 6e030e6, a25bfc1 and 3c094f8'. // Multiple commits like 'commits 6e030e6, a25bfc1 and 3c094f8'.
return $m[1].preg_replace_callback('#\b[0-9a-f]{1,40}\b#i', array($this, 'callbackCommit'), $m[2]); return $m[1].IDF_Template_safePregReplace('#\b[0-9a-f]{1,40}\b#i', array($this, 'callbackCommit'), $m[2]);
} }
/** /**
@ -170,7 +164,7 @@ class IDF_Template_IssueComment extends Pluf_Template_Tag
{ {
$keyword = rtrim($m[1]); $keyword = rtrim($m[1]);
if ('reviews' === $keyword) { if ('reviews' === $keyword) {
return $m[1].preg_replace_callback('#\b(\d+)\b#i', array($this, 'callbackReview'), $m[2]); return $m[1].IDF_Template_safePregReplace('#\b(\d+)\b#i', array($this, 'callbackReview'), $m[2]);
} else if ('review' === $keyword) { } else if ('review' === $keyword) {
return $m[1].call_user_func(array($this, 'callbackReview'), array('', $m[2])); return $m[1].call_user_func(array($this, 'callbackReview'), array('', $m[2]));
} }

View File

@ -22,6 +22,7 @@
# ***** END LICENSE BLOCK ***** */ # ***** END LICENSE BLOCK ***** */
Pluf::loadFunction('Pluf_Text_MarkDown_parse'); Pluf::loadFunction('Pluf_Text_MarkDown_parse');
Pluf::loadFunction('IDF_Template_safePregReplace');
/** /**
* Make the links to issues and commits. * Make the links to issues and commits.
@ -34,11 +35,6 @@ class IDF_Template_Markdown extends Pluf_Template_Tag
function start($text, $request) function start($text, $request)
{ {
// PHP sets the backtrack limit quite low, so some regexes may
// fail unexpectedly on large inputs or weird cornercases (see issue 618)
$pcre_backtrack_limit = ini_get('pcre.backtrack_limit');
ini_set('pcre.backtrack_limit', 10000000);
$this->project = $request->project; $this->project = $request->project;
$this->request = $request; $this->request = $request;
// Replace like in the issue text // Replace like in the issue text
@ -47,22 +43,20 @@ class IDF_Template_Markdown extends Pluf_Template_Tag
// Replace [[[path/to/file.mdtext, commit]]] with embedding // Replace [[[path/to/file.mdtext, commit]]] with embedding
// the content of the file into the wki page // the content of the file into the wki page
if ($this->request->rights['hasSourceAccess']) { if ($this->request->rights['hasSourceAccess']) {
$text = preg_replace_callback('#\[\[\[([^\,]+)(?:, ([^/]+))?\]\]\]#im', $text = IDF_Template_safePregReplace('#\[\[\[([^\,]+)(?:, ([^/]+))?\]\]\]#im',
array($this, 'callbackEmbeddedDoc'), array($this, 'callbackEmbeddedDoc'),
$text); $text);
} }
// Replace [Page]([[PageName]]) with corresponding link to the page, with link text being Page. // Replace [Page]([[PageName]]) with corresponding link to the page, with link text being Page.
$text = preg_replace_callback('#\[([^\]]+)\]\(\[\[([A-Za-z0-9\-]+)\]\]\)#im', $text = IDF_Template_safePregReplace('#\[([^\]]+)\]\(\[\[([A-Za-z0-9\-]+)\]\]\)#im',
array($this, 'callbackWikiPage'), array($this, 'callbackWikiPage'),
$text); $text);
// Replace [[PageName]] with corresponding link to the page. // Replace [[PageName]] with corresponding link to the page.
$text = preg_replace_callback('#\[\[([A-Za-z0-9\-]+)\]\]#im', $text = IDF_Template_safePregReplace('#\[\[([A-Za-z0-9\-]+)\]\]#im',
array($this, 'callbackWikiPageNoName'), array($this, 'callbackWikiPageNoName'),
$text); $text);
$filter = new IDF_Template_MarkdownPrefilter(); $filter = new IDF_Template_MarkdownPrefilter();
echo $filter->go(Pluf_Text_MarkDown_parse($text)); echo $filter->go(Pluf_Text_MarkDown_parse($text));
ini_set('pcre.backtrack_limit', $pcre_backtrack_limit);
} }
function callbackWikiPageNoName($m) function callbackWikiPageNoName($m)

View File

@ -32,29 +32,6 @@ class IDF_Tests_TestDiff extends UnitTestCase
parent::__construct('Test the diff parser.'); parent::__construct('Test the diff parser.');
} }
public function testGetFile()
{
$lines = array(
'diff --git a/src/IDF/Form/Register.php b/src/IDF/Form/Register.php',
'diff --git a/src/IDF/Form/RegisterConfirmation.php b/src/IDF/Form/RegisterConfirmation.php',
'diff --git a/src/IDF/Form/RegisterInputKey.php b/src/IDF/Form/RegisterInputKey.php',
'diff --git a/src/IDF/Views.php b/src/IDF/Views.php',
'diff --git a/src/IDF/conf/views.php b/src/IDF/conf/views.php',
);
$files = array(
'src/IDF/Form/Register.php',
'src/IDF/Form/RegisterConfirmation.php',
'src/IDF/Form/RegisterInputKey.php',
'src/IDF/Views.php',
'src/IDF/conf/views.php',
);
$i = 0;
foreach ($lines as $line) {
$this->assertEqual($files[$i], IDF_Diff::getFile($line));
$i++;
}
}
public function testBinaryDiff() public function testBinaryDiff()
{ {
$diff_content = file_get_contents(dirname(__FILE__).'/test-diff.diff'); $diff_content = file_get_contents(dirname(__FILE__).'/test-diff.diff');

View File

@ -377,10 +377,9 @@ class IDF_Views
$forgestats['projects'] = count($projects); $forgestats['projects'] = count($projects);
// Count members // Count members
$db =& Pluf::db(); $sql = new Pluf_SQL('first_name != %s', array('---'));
$sql = "SELECT count(id) as nb FROM indefero_users WHERE first_name != '---'"; $forgestats['members'] = Pluf::factory('Pluf_User')
$ret = $db->select ($sql); ->getCount(array('filter' => $sql->gen()));
$forgestats['members'] = $ret[0]['nb'];
return $forgestats; return $forgestats;
} }

View File

@ -121,6 +121,17 @@ class IDF_Views_Project
return $classes; return $classes;
} }
/**
* This action serves as URI compatibility layer for v1.0.
*
* @deprecated
*/
public function timelineCompat($request, $match)
{
$match[2] = 'all';
return $this->timeline($request, $match);
}
/** /**
* Timeline of the project. * Timeline of the project.
*/ */
@ -178,6 +189,17 @@ class IDF_Views_Project
} }
/**
* This action serves as URI compatibility layer for v1.0.
*
* @deprecated
*/
public function timelineFeedCompat($request, $match)
{
$match[2] = 'all';
return $this->timelineFeed($request, $match);
}
/** /**
* Timeline feed. * Timeline feed.
* *
@ -192,7 +214,6 @@ class IDF_Views_Project
$prj = $request->project; $prj = $request->project;
$model_filter = @$match[2]; $model_filter = @$match[2];
$model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters(); $all_model_filters = self::getAvailableModelFilters();
if (!array_key_exists($model_filter, $all_model_filters)) { if (!array_key_exists($model_filter, $all_model_filters)) {
$model_filter = 'all'; $model_filter = 'all';

View File

@ -303,7 +303,8 @@ class IDF_Views_Source
$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(__('%s Commit Details - %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); $diff = new IDF_Diff($cobject->diff, $scm->getDiffPathStripLevel());
$cobject->diff = null;
$diff->parse(); $diff->parse();
$scmConf = $request->conf->getVal('scm', 'git'); $scmConf = $request->conf->getVal('scm', 'git');
try { try {

View File

@ -246,7 +246,7 @@ $cfg['template_context_processors'] = array('IDF_Middleware_ContextPreProcessor'
$cfg['idf_views'] = dirname(__FILE__).'/urls.php'; $cfg['idf_views'] = dirname(__FILE__).'/urls.php';
# available languages # available languages
$cfg['languages'] = array('en', 'fr'); $cfg['languages'] = array('en', 'fr', 'de', 'es_ES');
# SCM base configuration # SCM base configuration
$cfg['allowed_scm'] = array('git' => 'IDF_Scm_Git', $cfg['allowed_scm'] = array('git' => 'IDF_Scm_Git',

View File

@ -91,6 +91,23 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/(\w+)/token/(.*)/$#',
'method' => 'timelineFeed', 'method' => 'timelineFeed',
'name' => 'idf_project_timeline_feed_auth'); 'name' => 'idf_project_timeline_feed_auth');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/$#',
'base' => $base,
'model' => 'IDF_Views_Project',
'method' => 'timelineCompat');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/$#',
'base' => $base,
'model' => 'IDF_Views_Project',
'method' => 'timelineFeedCompat',
'name' => 'idf_project_timeline_feed');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/feed/timeline/token/(.*)/$#',
'base' => $base,
'model' => 'IDF_Views_Project',
'method' => 'timelineFeedCompat',
'name' => 'idf_project_timeline_feed_auth');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/$#', $ctl[] = array('regex' => '#^/p/([\-\w]+)/issues/$#',
'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

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Indefero\n" "Project-Id-Version: Indefero\n"
"Report-Msgid-Bugs-To: http://projects.ceondo.com/p/indefero/issues/\n" "Report-Msgid-Bugs-To: http://projects.ceondo.com/p/indefero/issues/\n"
"POT-Creation-Date: 2011-02-23 23:41+0100\n" "POT-Creation-Date: 2011-03-18 23:30+0100\n"
"PO-Revision-Date: 2011-02-24 08:07+0000\n" "PO-Revision-Date: 2011-03-19 07:43+0000\n"
"Last-Translator: Delkia <wysman@gmail.com>\n" "Last-Translator: Delkia <wysman@gmail.com>\n"
"Language-Team: French <>\n" "Language-Team: French <>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -63,19 +63,27 @@ msgstr "clef"
msgid "value" msgid "value"
msgstr "valeur" msgstr "valeur"
#: IDF/Form/Admin/ProjectCreate.php:38 IDF/Views/Project.php:540 #: IDF/EmailAddress.php:49 IDF/Key.php:49
msgid "user"
msgstr "utilisateur"
#: IDF/EmailAddress.php:55
msgid "email"
msgstr "e-mail"
#: IDF/Form/Admin/ProjectCreate.php:38 IDF/Views/Project.php:561
msgid "git" msgid "git"
msgstr "git" msgstr "git"
#: IDF/Form/Admin/ProjectCreate.php:39 IDF/Views/Project.php:541 #: IDF/Form/Admin/ProjectCreate.php:39 IDF/Views/Project.php:562
msgid "Subversion" msgid "Subversion"
msgstr "Subversion" msgstr "Subversion"
#: IDF/Form/Admin/ProjectCreate.php:40 IDF/Views/Project.php:542 #: IDF/Form/Admin/ProjectCreate.php:40 IDF/Views/Project.php:563
msgid "mercurial" msgid "mercurial"
msgstr "mercurial" msgstr "mercurial"
#: IDF/Form/Admin/ProjectCreate.php:41 IDF/Views/Project.php:543 #: IDF/Form/Admin/ProjectCreate.php:41 IDF/Views/Project.php:564
msgid "monotone" msgid "monotone"
msgstr "monotone" msgstr "monotone"
@ -163,13 +171,13 @@ msgstr ""
#: IDF/Form/Admin/ProjectCreate.php:185 #: IDF/Form/Admin/ProjectCreate.php:185
msgid "" msgid ""
"Only a remote repository available throught http or https are allowed. For " "Only a remote repository available through HTTP or HTTPS is allowed. For "
"example \"http://somewhere.com/svn/trunk\"." "example \"http://somewhere.com/svn/trunk\"."
msgstr "" msgstr ""
"Only a remote repository available throught http or https are allowed. For " "Seulement les dépôts utilisant http ou http sont autorisés, par exemple : "
"example \"http://somewhere.com/svn/trunk\"." "http://example.com/svn/trunk."
#: IDF/Form/Admin/ProjectCreate.php:201 IDF/Form/Admin/ProjectUpdate.php:90 #: IDF/Form/Admin/ProjectCreate.php:201
msgid "" msgid ""
"The master branch is empty or contains illegal characters, please use only " "The master branch is empty or contains illegal characters, please use only "
"letters, digits, dashs and dots as separators." "letters, digits, dashs and dots as separators."
@ -208,10 +216,10 @@ msgstr "Ce nom court est déjà utilisé, veuillez en sélectionner un autre."
#: IDF/Form/Admin/ProjectUpdate.php:121 IDF/Form/Admin/UserCreate.php:106 #: IDF/Form/Admin/ProjectUpdate.php:121 IDF/Form/Admin/UserCreate.php:106
#: IDF/Form/Admin/UserUpdate.php:191 IDF/Form/IssueCreate.php:263 #: IDF/Form/Admin/UserUpdate.php:191 IDF/Form/IssueCreate.php:263
#: IDF/Form/IssueUpdate.php:232 IDF/Form/MembersConf.php:64 #: IDF/Form/IssueUpdate.php:232 IDF/Form/MembersConf.php:64
#: IDF/Form/Password.php:76 IDF/Form/Register.php:114 #: IDF/Form/Password.php:76 IDF/Form/Register.php:112
#: IDF/Form/ReviewCreate.php:187 IDF/Form/ReviewFileComment.php:125 #: IDF/Form/ReviewCreate.php:187 IDF/Form/ReviewFileComment.php:127
#: IDF/Form/TabsConf.php:98 IDF/Form/UpdateUpload.php:126 #: IDF/Form/TabsConf.php:98 IDF/Form/UpdateUpload.php:126
#: IDF/Form/Upload.php:148 IDF/Form/UserAccount.php:180 #: IDF/Form/Upload.php:148 IDF/Form/UserAccount.php:216
#: IDF/Form/UserChangeEmail.php:80 IDF/Form/WikiCreate.php:167 #: IDF/Form/UserChangeEmail.php:80 IDF/Form/WikiCreate.php:167
#: IDF/Form/WikiDelete.php:59 IDF/Form/WikiUpdate.php:178 #: IDF/Form/WikiDelete.php:59 IDF/Form/WikiUpdate.php:178
msgid "Cannot save the model from an invalid form." msgid "Cannot save the model from an invalid form."
@ -252,6 +260,15 @@ msgstr ""
"Désolé, vous devez vraiment faire une copie de sauvegarde des informations " "Désolé, vous devez vraiment faire une copie de sauvegarde des informations "
"importantes de ce projet." "importantes de ce projet."
#: IDF/Form/Admin/ProjectUpdate.php:90
msgid ""
"The master branch is empty or contains illegal characters, please use only "
"letters, digits, dashes and dots as separators."
msgstr ""
"La branche principale contient des caractères non autorisés, il ne doit être"
" composé que de lettres, de chiffres, du point d'exclamation (!) ou du point"
" (.)."
#: IDF/Form/Admin/UserCreate.php:37 IDF/Form/Admin/UserUpdate.php:38 #: IDF/Form/Admin/UserCreate.php:37 IDF/Form/Admin/UserUpdate.php:38
#: IDF/Form/RegisterConfirmation.php:50 IDF/Form/UserAccount.php:40 #: IDF/Form/RegisterConfirmation.php:50 IDF/Form/UserAccount.php:40
msgid "First name" msgid "First name"
@ -266,7 +283,7 @@ msgstr "Nom de famille"
msgid "Login" msgid "Login"
msgstr "Identifiant" msgstr "Identifiant"
#: IDF/Form/Admin/UserCreate.php:60 IDF/Form/Register.php:45 #: IDF/Form/Admin/UserCreate.php:60
msgid "" msgid ""
"The login must be between 3 and 15 characters long and contains only letters" "The login must be between 3 and 15 characters long and contains only letters"
" and digits." " and digits."
@ -280,7 +297,7 @@ msgstr "Email"
#: IDF/Form/Admin/UserCreate.php:71 #: IDF/Form/Admin/UserCreate.php:71
msgid "" msgid ""
"Double check the email address as the password is directly sent to the user." "Double check the email address as the password is sent directly to the user."
msgstr "" msgstr ""
"Vérifiez particulièrement l'adresse email car le mot de passe est " "Vérifiez particulièrement l'adresse email car le mot de passe est "
"directement envoyé à l'utilisateur." "directement envoyé à l'utilisateur."
@ -294,7 +311,7 @@ msgstr "Langage"
msgid "Add a public key" msgid "Add a public key"
msgstr "Ajouter une clef publique" msgstr "Ajouter une clef publique"
#: IDF/Form/Admin/UserCreate.php:92 IDF/Form/UserAccount.php:166 #: IDF/Form/Admin/UserCreate.php:92
msgid "" msgid ""
"Paste a SSH or monotone public key. Be careful to not provide your private " "Paste a SSH or monotone public key. Be careful to not provide your private "
"key here!" "key here!"
@ -306,7 +323,8 @@ msgstr ""
msgid "Your details to access your forge." msgid "Your details to access your forge."
msgstr "Vos informations pour accéder à votre forge." msgstr "Vos informations pour accéder à votre forge."
#: IDF/Form/Admin/UserCreate.php:189 IDF/Form/UserAccount.php:402 #: IDF/Form/Admin/UserCreate.php:189 IDF/Form/UserAccount.php:420
#: IDF/Form/UserAccount.php:429
#, php-format #, php-format
msgid "The email \"%s\" is already used." msgid "The email \"%s\" is already used."
msgstr "L'adresse email \"%s\" est déjà utilisée." msgstr "L'adresse email \"%s\" est déjà utilisée."
@ -331,7 +349,7 @@ msgstr "Laissez vide si vous ne voulez pas changer le mot de passe."
#: IDF/Form/Admin/UserUpdate.php:81 #: IDF/Form/Admin/UserUpdate.php:81
msgid "" msgid ""
"The password must be hard for other people to find it, but easy for the user" "The password must be hard for other people to guess, but easy for the user "
"to remember." "to remember."
msgstr "" msgstr ""
"Le mot de passe doit être difficile à trouver pour d'autres personnes, mais " "Le mot de passe doit être difficile à trouver pour d'autres personnes, mais "
@ -385,9 +403,9 @@ msgid "Staff"
msgstr "Staff" msgstr "Staff"
#: IDF/Form/Admin/UserUpdate.php:164 #: IDF/Form/Admin/UserUpdate.php:164
msgid "If you give staff rights to a user, you really need to trust him." msgid "If you give staff rights to a user, you really need to trust them."
msgstr "" msgstr ""
"Si vous donnez les droits de staff à un utilisateur, vous devez vraiment lui" "Si vous donnez le status de staff à un utilisateur, vous devez vraiment lui "
"faire confiance." "faire confiance."
#: IDF/Form/Admin/UserUpdate.php:172 IDF/Views/Admin.php:213 #: IDF/Form/Admin/UserUpdate.php:172 IDF/Views/Admin.php:213
@ -397,7 +415,7 @@ msgstr "Actif"
#: IDF/Form/Admin/UserUpdate.php:176 #: IDF/Form/Admin/UserUpdate.php:176
msgid "" msgid ""
"If the user is not getting the confirmation email or is abusing the system, " "If the user is not getting the confirmation email or is abusing the system, "
"you can directly enable or disable his account here." "you can directly enable or disable their account here."
msgstr "" msgstr ""
"Si l'utilisateur ne reçoit pas l'email de confirmation ou s'il abuse du " "Si l'utilisateur ne reçoit pas l'email de confirmation ou s'il abuse du "
"système, vous pouvez directement activer ou désactiver son compte ici." "système, vous pouvez directement activer ou désactiver son compte ici."
@ -413,14 +431,13 @@ msgstr ""
"Un utilisateur avec cet email existe déjà, merci de fournir une autre " "Un utilisateur avec cet email existe déjà, merci de fournir une autre "
"adresse email." "adresse email."
#: IDF/Form/Admin/UserUpdate.php:301 IDF/Form/Upload.php:86 #: IDF/Form/Admin/UserUpdate.php:301 IDF/Form/UserAccount.php:389
#: IDF/Form/UserAccount.php:369
msgid "For security reason, you cannot upload a file with this extension." msgid "For security reason, you cannot upload a file with this extension."
msgstr "" msgstr ""
"Pour des raisons de sécurité, vous ne pouvez pas mettre en ligne un fichier " "Pour des raisons de sécurité, vous ne pouvez pas mettre en ligne un fichier "
"avec cette extension." "avec cette extension."
#: IDF/Form/Admin/UserUpdate.php:316 IDF/Form/UserAccount.php:425 #: IDF/Form/Admin/UserUpdate.php:316 IDF/Form/UserAccount.php:452
msgid "The passwords do not match. Please give them again." msgid "The passwords do not match. Please give them again."
msgstr "" msgstr ""
"Les mots de passe ne sont pas identiques, veuillez les donner de nouveau." "Les mots de passe ne sont pas identiques, veuillez les donner de nouveau."
@ -430,7 +447,7 @@ msgid "Please enter one or more valid email addresses."
msgstr "Veuillez entrer une ou plusieurs adresse email valides." msgstr "Veuillez entrer une ou plusieurs adresse email valides."
#: IDF/Form/IssueCreate.php:53 IDF/Form/IssueUpdate.php:45 #: IDF/Form/IssueCreate.php:53 IDF/Form/IssueUpdate.php:45
#: IDF/Form/ReviewCreate.php:45 IDF/Form/ReviewFileComment.php:71 #: IDF/Form/ReviewCreate.php:45 IDF/Form/ReviewFileComment.php:73
#: IDF/Form/UpdateUpload.php:42 IDF/Form/Upload.php:40 #: IDF/Form/UpdateUpload.php:42 IDF/Form/Upload.php:40
#: IDF/Views/Download.php:65 IDF/Views/Download.php:293 IDF/Views/Issue.php:62 #: IDF/Views/Download.php:65 IDF/Views/Download.php:293 IDF/Views/Issue.php:62
#: IDF/Views/Issue.php:139 IDF/Views/Issue.php:220 IDF/Views/Issue.php:296 #: IDF/Views/Issue.php:139 IDF/Views/Issue.php:220 IDF/Views/Issue.php:296
@ -450,7 +467,7 @@ msgid "Attach a file"
msgstr "Attacher un fichier" msgstr "Attacher un fichier"
#: IDF/Form/IssueCreate.php:95 IDF/Form/IssueUpdate.php:88 #: IDF/Form/IssueCreate.php:95 IDF/Form/IssueUpdate.php:88
#: IDF/Form/ReviewCreate.php:103 IDF/Form/ReviewFileComment.php:81 #: IDF/Form/ReviewCreate.php:103 IDF/Form/ReviewFileComment.php:83
#: IDF/Views/Issue.php:63 IDF/Views/Issue.php:140 IDF/Views/Issue.php:222 #: IDF/Views/Issue.php:63 IDF/Views/Issue.php:140 IDF/Views/Issue.php:222
#: IDF/Views/Issue.php:297 IDF/Views/Issue.php:384 IDF/Views/Issue.php:563 #: IDF/Views/Issue.php:297 IDF/Views/Issue.php:384 IDF/Views/Issue.php:563
#: IDF/Views/Issue.php:622 IDF/Views/Review.php:59 IDF/Views/User.php:84 #: IDF/Views/Issue.php:622 IDF/Views/Review.php:59 IDF/Views/User.php:84
@ -496,10 +513,11 @@ msgstr "Vous avez fourni un statut invalide."
#: IDF/Form/IssueTrackingConf.php:80 #: IDF/Form/IssueTrackingConf.php:80
msgid "" msgid ""
"Define an issue template to hint the reporter to provide certain information" "Define an issue template to hint to the reporter to provide certain "
"information"
msgstr "" msgstr ""
"Définissez un ticket gabarit pour inciter le rapporteur à fournir certaines " "Définissez un modèle de ticket pour guider le rapporteur à fournir certaines"
"informations" " informations."
#: IDF/Form/IssueTrackingConf.php:89 #: IDF/Form/IssueTrackingConf.php:89
msgid "Open issue status values" msgid "Open issue status values"
@ -599,8 +617,7 @@ msgstr "Ne peut pas sauvegarder un formulaire invalide."
msgid "Your password" msgid "Your password"
msgstr "Votre mot de passe" msgstr "Votre mot de passe"
#: IDF/Form/PasswordReset.php:48 IDF/Form/RegisterConfirmation.php:72 #: IDF/Form/PasswordReset.php:48 IDF/Form/UserAccount.php:80
#: IDF/Form/UserAccount.php:80
msgid "" msgid ""
"Your password must be hard for other people to find it, but easy for you to " "Your password must be hard for other people to find it, but easy for you to "
"remember." "remember."
@ -629,12 +646,20 @@ msgstr ""
msgid "Your login" msgid "Your login"
msgstr "Votre identifiant" msgstr "Votre identifiant"
#: IDF/Form/Register.php:45
msgid ""
"The login must be between 3 and 15 characters long and contain only letters "
"and digits."
msgstr ""
"L'identifiant doit avoir entre 3 et 15 caractères et ne doit contenir que "
"des lettres et des chiffres."
#: IDF/Form/Register.php:53 #: IDF/Form/Register.php:53
msgid "Your email" msgid "Your email"
msgstr "Votre email" msgstr "Votre email"
#: IDF/Form/Register.php:55 #: IDF/Form/Register.php:55
msgid "We will never send you any unsolicited emails. We hate spams too!" msgid "We will never send you any unsolicited emails. We hate spam too!"
msgstr "" msgstr ""
"Nous ne vous enverrons aucun message non sollicité. Comme vous, nous avons " "Nous ne vous enverrons aucun message non sollicité. Comme vous, nous avons "
"ras le bol du spam." "ras le bol du spam."
@ -651,16 +676,16 @@ msgstr ""
"Nous savons que c'est inintéressant, mais vous devez accepter les conditions" "Nous savons que c'est inintéressant, mais vous devez accepter les conditions"
" d'usage du service." " d'usage du service."
#: IDF/Form/Register.php:99 #: IDF/Form/Register.php:97
#, php-format #, php-format
msgid "" msgid ""
"The email \"%s\" is already used. If you need, click on the help link to " "The email \"%s\" is already used. If you need to, click on the help link to "
"recover your password." "recover your password."
msgstr "" msgstr ""
"L'email \"%s\" est déjà utilisé. Si vous devez, vous pouvez récupérer votre " "L'email \"%s\" est déjà utilisé. Si vous avez perdu votre mot de passe, vous"
"mot de passe via le lien d'aide." " pouvez le récupérer à l'aide de ce lien."
#: IDF/Form/Register.php:150 #: IDF/Form/Register.php:148
msgid "Confirm the creation of your account." msgid "Confirm the creation of your account."
msgstr "Confirmez la création de votre compte." msgstr "Confirmez la création de votre compte."
@ -668,6 +693,14 @@ msgstr "Confirmez la création de votre compte."
msgid "Your confirmation key" msgid "Your confirmation key"
msgstr "Votre clef de confirmation" msgstr "Votre clef de confirmation"
#: IDF/Form/RegisterConfirmation.php:72
msgid ""
"Your password must be hard for other people to guess, but easy for you to "
"remember."
msgstr ""
"Le mot de passe doit être difficile à trouver pour d'autres personnes, mais "
"simple à retenir pour l'utilisateur."
#: IDF/Form/RegisterConfirmation.php:99 IDF/Form/RegisterInputKey.php:50 #: IDF/Form/RegisterConfirmation.php:99 IDF/Form/RegisterInputKey.php:50
msgid "" msgid ""
"We are sorry but this confirmation key is not valid. Maybe you should " "We are sorry but this confirmation key is not valid. Maybe you should "
@ -713,11 +746,11 @@ msgstr "Patch initial à discuter."
msgid "General comment" msgid "General comment"
msgstr "Commentaire général" msgstr "Commentaire général"
#: IDF/Form/ReviewFileComment.php:102 #: IDF/Form/ReviewFileComment.php:104
msgid "You need to provide comments on at least one file." msgid "You need to provide comments on at least one file."
msgstr "Vous devez au moins apporter un commentaire à un fichier." msgstr "Vous devez au moins apporter un commentaire à un fichier."
#: IDF/Form/ReviewFileComment.php:109 #: IDF/Form/ReviewFileComment.php:111
msgid "You need to provide your general comment about the proposal." msgid "You need to provide your general comment about the proposal."
msgstr "Vous devez apporter un commentaire général sur la proposition." msgstr "Vous devez apporter un commentaire général sur la proposition."
@ -731,9 +764,7 @@ msgid "Learn more about the <a href=\"%s\">post-commit web hooks</a>."
msgstr "En savoir plus à propos des <a href=\"%s\">Webhooks post-commit</a>." msgstr "En savoir plus à propos des <a href=\"%s\">Webhooks post-commit</a>."
#: IDF/Form/TabsConf.php:38 IDF/gettexttemplates/idf/admin/base.html.php:4 #: IDF/Form/TabsConf.php:38 IDF/gettexttemplates/idf/admin/base.html.php:4
#: IDF/gettexttemplates/idf/base-full.html.orig.php:5
#: IDF/gettexttemplates/idf/base-full.html.php:5 #: IDF/gettexttemplates/idf/base-full.html.php:5
#: IDF/gettexttemplates/idf/base.html.orig.php:5
#: IDF/gettexttemplates/idf/base.html.php:5 #: IDF/gettexttemplates/idf/base.html.php:5
#: IDF/gettexttemplates/idf/downloads/base.html.php:3 #: IDF/gettexttemplates/idf/downloads/base.html.php:3
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:14 #: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:14
@ -741,32 +772,24 @@ msgstr "En savoir plus à propos des <a href=\"%s\">Webhooks post-commit</a>."
msgid "Downloads" msgid "Downloads"
msgstr "Téléchargements" msgstr "Téléchargements"
#: IDF/Form/TabsConf.php:39 IDF/gettexttemplates/idf/base-full.html.orig.php:9 #: IDF/Form/TabsConf.php:39 IDF/gettexttemplates/idf/base-full.html.php:9
#: IDF/gettexttemplates/idf/base-full.html.php:9
#: IDF/gettexttemplates/idf/base.html.orig.php:9
#: IDF/gettexttemplates/idf/base.html.php:9 #: IDF/gettexttemplates/idf/base.html.php:9
msgid "Code Review" msgid "Code Review"
msgstr "Revue de code" msgstr "Revue de code"
#: IDF/Form/TabsConf.php:40 IDF/gettexttemplates/idf/admin/base.html.php:5 #: IDF/Form/TabsConf.php:40 IDF/gettexttemplates/idf/admin/base.html.php:5
#: IDF/gettexttemplates/idf/base-full.html.orig.php:6
#: IDF/gettexttemplates/idf/base-full.html.php:6 #: IDF/gettexttemplates/idf/base-full.html.php:6
#: IDF/gettexttemplates/idf/base.html.orig.php:6
#: IDF/gettexttemplates/idf/base.html.php:6 #: IDF/gettexttemplates/idf/base.html.php:6
msgid "Documentation" msgid "Documentation"
msgstr "Documentation" msgstr "Documentation"
#: IDF/Form/TabsConf.php:41 IDF/gettexttemplates/idf/admin/base.html.php:7 #: IDF/Form/TabsConf.php:41 IDF/gettexttemplates/idf/admin/base.html.php:7
#: IDF/gettexttemplates/idf/base-full.html.orig.php:8
#: IDF/gettexttemplates/idf/base-full.html.php:8 #: IDF/gettexttemplates/idf/base-full.html.php:8
#: IDF/gettexttemplates/idf/base.html.orig.php:8
#: IDF/gettexttemplates/idf/base.html.php:8 #: IDF/gettexttemplates/idf/base.html.php:8
msgid "Source" msgid "Source"
msgstr "Source" msgstr "Source"
#: IDF/Form/TabsConf.php:42 IDF/gettexttemplates/idf/base-full.html.orig.php:7 #: IDF/Form/TabsConf.php:42 IDF/gettexttemplates/idf/base-full.html.php:7
#: IDF/gettexttemplates/idf/base-full.html.php:7
#: IDF/gettexttemplates/idf/base.html.orig.php:7
#: IDF/gettexttemplates/idf/base.html.php:7 #: IDF/gettexttemplates/idf/base.html.php:7
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:17 #: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:17
msgid "Issues" msgid "Issues"
@ -796,6 +819,12 @@ msgstr "Utilisateurs autorisés supplémentaires"
msgid "File" msgid "File"
msgstr "Fichier" msgstr "Fichier"
#: IDF/Form/Upload.php:86
msgid "For security reasons, you cannot upload a file with this extension."
msgstr ""
"Pour des raisons de sécurité, vous ne pouvez pas mettre en ligne un fichier "
"avec cette extension."
#: IDF/Form/UploadConf.php:53 #: IDF/Form/UploadConf.php:53
msgid "Predefined download labels" msgid "Predefined download labels"
msgstr "Étiquettes prédéfinies des téléchargements" msgstr "Étiquettes prédéfinies des téléchargements"
@ -822,25 +851,41 @@ msgstr ""
msgid "Leave blank if you do not want to change your password." msgid "Leave blank if you do not want to change your password."
msgstr "Laissez vide si vous ne voulez pas changer votre mot de passe." msgstr "Laissez vide si vous ne voulez pas changer votre mot de passe."
#: IDF/Form/UserAccount.php:209 #: IDF/Form/UserAccount.php:166
msgid ""
"Paste an SSH or monotone public key. Be careful to not provide your private "
"key here!"
msgstr ""
"Copiez une clef publique SSH ou monotone. Faites bien attention à ne pas y "
"mettre la clef privée !"
#: IDF/Form/UserAccount.php:171
msgid "Add a secondary mail address"
msgstr "Ajouter un e-mail secondaire"
#: IDF/Form/UserAccount.php:173
msgid "You will get a mail to confirm that you own the address you specify."
msgstr "Vous allez recevoir un e-mail de confirmation afin de la vérifier. "
#: IDF/Form/UserAccount.php:200
msgid "Confirm your new email address." msgid "Confirm your new email address."
msgstr "Confirmez votre nouvelle adresse email." msgstr "Confirmez votre nouvelle adresse email."
#: IDF/Form/UserAccount.php:212 #: IDF/Form/UserAccount.php:203
#, php-format #, php-format
msgid "" msgid ""
"A validation email has been sent to \"%s\" to validate the email address " "A validation email has been sent to \"%s\" to validate the email address "
"change." "change."
msgstr "Un email a été envoyé à \"%s\" pour valider le changement d'adresse." msgstr "Un email a été envoyé à \"%s\" pour valider le changement d'adresse."
#: IDF/Form/UserAccount.php:314 #: IDF/Form/UserAccount.php:334
msgid "" msgid ""
"Please check the key as it does not appear to be a valid SSH public key." "Please check the key as it does not appear to be a valid SSH public key."
msgstr "" msgstr ""
"Vérifiez s'il vous plaît la clef car elle ne semble pas être une clef " "Vérifiez s'il vous plaît la clef car elle ne semble pas être une clef "
"publique SSH valide." "publique SSH valide."
#: IDF/Form/UserAccount.php:334 #: IDF/Form/UserAccount.php:354
msgid "" msgid ""
"Please check the key as it does not appear to be a valid monotone public " "Please check the key as it does not appear to be a valid monotone public "
"key." "key."
@ -848,13 +893,13 @@ msgstr ""
"Vérifiez s'il vous plaît la clef car elle ne semble pas être une clef " "Vérifiez s'il vous plaît la clef car elle ne semble pas être une clef "
"publique monotone valide." "publique monotone valide."
#: IDF/Form/UserAccount.php:342 #: IDF/Form/UserAccount.php:362
msgid "Public key looks neither like a SSH nor monotone public key." msgid "Public key looks like neither an SSH nor monotone public key."
msgstr "" msgstr ""
"La clef publique ne ressemble ni à une clef publique SSH ni une clef " "La clef publique ne ressemble ni à une clef publique SSH ni une clef "
"publique monotone." "publique monotone."
#: IDF/Form/UserAccount.php:354 #: IDF/Form/UserAccount.php:374
msgid "You already have uploaded this key." msgid "You already have uploaded this key."
msgstr "Vous avez déjà cette clef SSH dans votre trousseau." msgstr "Vous avez déjà cette clef SSH dans votre trousseau."
@ -1214,9 +1259,7 @@ msgstr "Emails de notification"
msgid "Instructions:" msgid "Instructions:"
msgstr "Instructions :" msgstr "Instructions :"
#: IDF/gettexttemplates/idf/base-full.html.orig.php:3
#: IDF/gettexttemplates/idf/base-full.html.php:3 #: IDF/gettexttemplates/idf/base-full.html.php:3
#: IDF/gettexttemplates/idf/base.html.orig.php:3
#: IDF/gettexttemplates/idf/base.html.php:3 #: IDF/gettexttemplates/idf/base.html.php:3
#, php-format #, php-format
msgid "" msgid ""
@ -1226,16 +1269,12 @@ msgstr ""
"<a href=\"%%url%%\">Connectez-vous ou créez votre compte</a> pour soumettre " "<a href=\"%%url%%\">Connectez-vous ou créez votre compte</a> pour soumettre "
"des tickets ou ajouter des commentaires" "des tickets ou ajouter des commentaires"
#: IDF/gettexttemplates/idf/base-full.html.orig.php:4
#: IDF/gettexttemplates/idf/base-full.html.php:4 #: IDF/gettexttemplates/idf/base-full.html.php:4
#: IDF/gettexttemplates/idf/base.html.orig.php:4
#: IDF/gettexttemplates/idf/base.html.php:4 #: IDF/gettexttemplates/idf/base.html.php:4
msgid "Project Home" msgid "Project Home"
msgstr "Page d'Accueil" msgstr "Page d'Accueil"
#: IDF/gettexttemplates/idf/base-full.html.orig.php:10
#: IDF/gettexttemplates/idf/base-full.html.php:10 #: IDF/gettexttemplates/idf/base-full.html.php:10
#: IDF/gettexttemplates/idf/base.html.orig.php:10
#: IDF/gettexttemplates/idf/base.html.php:10 #: IDF/gettexttemplates/idf/base.html.php:10
msgid "Project Management" msgid "Project Management"
msgstr "Administration du projet" msgstr "Administration du projet"
@ -1299,7 +1338,7 @@ msgstr "Supprimer le fichier"
#: IDF/gettexttemplates/idf/review/create.html.php:12 #: IDF/gettexttemplates/idf/review/create.html.php:12
#: IDF/gettexttemplates/idf/review/view.html.php:43 #: IDF/gettexttemplates/idf/review/view.html.php:43
#: IDF/gettexttemplates/idf/user/changeemail.html.php:5 #: IDF/gettexttemplates/idf/user/changeemail.html.php:5
#: IDF/gettexttemplates/idf/user/myaccount.html.php:12 #: IDF/gettexttemplates/idf/user/myaccount.html.php:13
#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:5 #: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:5
#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:5 #: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:5
#: IDF/gettexttemplates/idf/user/passrecovery.html.php:7 #: IDF/gettexttemplates/idf/user/passrecovery.html.php:7
@ -1328,7 +1367,7 @@ msgstr "Mis à jour :"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:10 #: IDF/gettexttemplates/idf/downloads/delete.html.php:10
#: IDF/gettexttemplates/idf/downloads/view.html.php:15 #: IDF/gettexttemplates/idf/downloads/view.html.php:15
#: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:6 #: IDF/gettexttemplates/idf/gadmin/projects/index.html.php:6
#: IDF/gettexttemplates/idf/index.html.php:12 #: IDF/gettexttemplates/idf/index.html.php:13
msgid "Downloads:" msgid "Downloads:"
msgstr "Téléchargements :" msgstr "Téléchargements :"
@ -1490,7 +1529,7 @@ msgstr "Nous sommes là, juste pour vous aider."
#: IDF/gettexttemplates/idf/faq.html.php:35 #: IDF/gettexttemplates/idf/faq.html.php:35
#: IDF/gettexttemplates/idf/gadmin/base.html.php:3 #: IDF/gettexttemplates/idf/gadmin/base.html.php:3
#: IDF/gettexttemplates/idf/index.html.php:3 IDF/Views/Admin.php:57 #: IDF/gettexttemplates/idf/index.html.php:3 IDF/Views/Admin.php:57
#: IDF/Views.php:45 #: IDF/Views.php:47
msgid "Projects" msgid "Projects"
msgstr "Projets" msgstr "Projets"
@ -1553,7 +1592,7 @@ msgstr "Comment puis-je afficher ma tête à côté de mes commentaires ?"
#: IDF/gettexttemplates/idf/faq.html.php:15 #: IDF/gettexttemplates/idf/faq.html.php:15
#: IDF/gettexttemplates/idf/faq.html.php:33 #: IDF/gettexttemplates/idf/faq.html.php:33
msgid "What is the API and how to use it?" msgid "What is the API and how is it used?"
msgstr "Qu'est-ce que l'API et comment l'utiliser ?" msgstr "Qu'est-ce que l'API et comment l'utiliser ?"
#: IDF/gettexttemplates/idf/faq.html.php:17 #: IDF/gettexttemplates/idf/faq.html.php:17
@ -1627,6 +1666,7 @@ msgstr "Vous avez ici accès à l'administration de la forge."
#: IDF/gettexttemplates/idf/gadmin/home.html.php:4 #: IDF/gettexttemplates/idf/gadmin/home.html.php:4
#: IDF/gettexttemplates/idf/project/home.html.php:3 #: IDF/gettexttemplates/idf/project/home.html.php:3
#: IDF/gettexttemplates/idf/project/timeline.html.php:4 #: IDF/gettexttemplates/idf/project/timeline.html.php:4
#: IDF/gettexttemplates/idf/project/timeline.html~.php:4
msgid "Welcome" msgid "Welcome"
msgstr "Bienvenue" msgstr "Bienvenue"
@ -2031,26 +2071,30 @@ msgid "No projects managed with InDefero were found."
msgstr "Aucun projet supervisé avec InDefero n'a été trouvé." msgstr "Aucun projet supervisé avec InDefero n'a été trouvé."
#: IDF/gettexttemplates/idf/index.html.php:7 #: IDF/gettexttemplates/idf/index.html.php:7
msgid "Forge statistics"
msgstr "Statistiques de la forge"
#: IDF/gettexttemplates/idf/index.html.php:8
msgid "Projects:" msgid "Projects:"
msgstr "Projets :" msgstr "Projets :"
#: IDF/gettexttemplates/idf/index.html.php:8 #: IDF/gettexttemplates/idf/index.html.php:9
msgid "Members:" msgid "Members:"
msgstr "Membres :" msgstr "Membres :"
#: IDF/gettexttemplates/idf/index.html.php:9 #: IDF/gettexttemplates/idf/index.html.php:10
msgid "Issues:" msgid "Issues:"
msgstr "Ticket :" msgstr "Ticket :"
#: IDF/gettexttemplates/idf/index.html.php:10 #: IDF/gettexttemplates/idf/index.html.php:11
msgid "Commits:" msgid "Commits:"
msgstr "Commits :" msgstr "Commits :"
#: IDF/gettexttemplates/idf/index.html.php:11 #: IDF/gettexttemplates/idf/index.html.php:12
msgid "Documentations:" msgid "Documentations:"
msgstr "Documentation :" msgstr "Documentation :"
#: IDF/gettexttemplates/idf/index.html.php:13 #: IDF/gettexttemplates/idf/index.html.php:14
msgid "Code reviews:" msgid "Code reviews:"
msgstr "Revues de code :" msgstr "Revues de code :"
@ -2449,6 +2493,7 @@ msgstr "Aide"
#: IDF/gettexttemplates/idf/project/home.html.php:4 #: IDF/gettexttemplates/idf/project/home.html.php:4
#: IDF/gettexttemplates/idf/project/timeline.html.php:5 #: IDF/gettexttemplates/idf/project/timeline.html.php:5
#: IDF/gettexttemplates/idf/project/timeline.html~.php:5
msgid "Latest Updates" msgid "Latest Updates"
msgstr "Dernières mises à jour" msgstr "Dernières mises à jour"
@ -2478,10 +2523,17 @@ msgid "Happy Crew"
msgstr "Équipe sympa" msgstr "Équipe sympa"
#: IDF/gettexttemplates/idf/project/timeline.html.php:3 #: IDF/gettexttemplates/idf/project/timeline.html.php:3
#: IDF/gettexttemplates/idf/project/timeline.html~.php:3
msgid "Latest updates" msgid "Latest updates"
msgstr "Dernières mises à jour" msgstr "Dernières mises à jour"
#: IDF/gettexttemplates/idf/project/timeline.html.php:6 #: IDF/gettexttemplates/idf/project/timeline.html.php:6
#: IDF/Views/Project.php:72
msgid "All Updates"
msgstr "Mises à jour"
#: IDF/gettexttemplates/idf/project/timeline.html.php:7
#: IDF/gettexttemplates/idf/project/timeline.html~.php:6
msgid "Filter by type" msgid "Filter by type"
msgstr "Filtrer par type" msgstr "Filtrer par type"
@ -2543,7 +2595,7 @@ msgstr ""
#: IDF/gettexttemplates/idf/register/confirmation.html.php:3 #: IDF/gettexttemplates/idf/register/confirmation.html.php:3
#: IDF/gettexttemplates/idf/user/myaccount.html.php:3 #: IDF/gettexttemplates/idf/user/myaccount.html.php:3
#: IDF/gettexttemplates/idf/user/passrecovery.html.php:3 #: IDF/gettexttemplates/idf/user/passrecovery.html.php:3
msgid "Oups, please check the form for errors." msgid "Oops, please check the form for errors."
msgstr "Oups, veuillez corriger les erreurs dans le formulaire." msgstr "Oups, veuillez corriger les erreurs dans le formulaire."
#: IDF/gettexttemplates/idf/register/confirmation.html.php:5 #: IDF/gettexttemplates/idf/register/confirmation.html.php:5
@ -2586,12 +2638,12 @@ msgstr ""
"faire savoir à tout instant</a> !" "faire savoir à tout instant</a> !"
#: IDF/gettexttemplates/idf/register/index.html.php:5 #: IDF/gettexttemplates/idf/register/index.html.php:5
msgid "Oups, please check the provided login and email address to register." msgid "Oops, please check the provided login and email address to register."
msgstr "" msgstr ""
"Oups, veuillez vérifier l'identifiant et l'adresse email pour vous " "Oups, veuillez vérifier l'identifiant et l'adresse email pour vous "
"enregistrer." "enregistrer."
#: IDF/gettexttemplates/idf/register/index.html.php:6 IDF/Views.php:88 #: IDF/gettexttemplates/idf/register/index.html.php:6 IDF/Views.php:90
msgid "Create Your Account" msgid "Create Your Account"
msgstr "Créez votre compte" msgstr "Créez votre compte"
@ -2610,7 +2662,7 @@ msgstr "Le saviez-vous ?"
#: IDF/gettexttemplates/idf/register/inputkey.html.php:3 #: IDF/gettexttemplates/idf/register/inputkey.html.php:3
#: IDF/gettexttemplates/idf/user/changeemail.html.php:3 #: IDF/gettexttemplates/idf/user/changeemail.html.php:3
#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:3 #: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:3
msgid "Oups, we found an error in the form." msgid "Oops, we found an error in the form."
msgstr "Oups, nous avons trouvé une erreur dans le formulaire." msgstr "Oups, nous avons trouvé une erreur dans le formulaire."
#: IDF/gettexttemplates/idf/register/inputkey.html.php:4 #: IDF/gettexttemplates/idf/register/inputkey.html.php:4
@ -2652,15 +2704,15 @@ msgid ""
"<ul>\n" "<ul>\n"
"<li>A commit or revision of the current code in the repository from which you started your work.</li>\n" "<li>A commit or revision of the current code in the repository from which you started your work.</li>\n"
"<li>A patch describing your changes with respect to the reference commit.</li>\n" "<li>A patch describing your changes with respect to the reference commit.</li>\n"
"<li><strong>Ensure your patch does not contain any passwords or confidential information!</strong></li>\n" "<li><strong>Check your patch does not provide any password or confidential information!</strong></li>\n"
"</ul>" "</ul>"
msgstr "" msgstr ""
"<p>Pour démarrer une revue de code vous devez fournir :</p>\n" "&lt;p&gt;Pour démarrer une revue de code vous devez fournir :&lt;/p&gt;\n"
"<ul>\n" "&lt;ul&gt;\n"
"<li>La révision ou le commit de référence qui a servi de base à votre travail.</li>\n" "&lt;li&gt;La révision ou le commit de référence qui a servi de base à votre travail.&lt;/li&gt;\n"
"<li>Un patch qui décrit les changements par rapport à la référence.</li>\n" "&lt;li&gt;Un patch qui décrit les changements par rapport à la référence.&lt;/li&gt;\n"
"<li><strong>Vérifiez votre patch pour ne fournir aucun mot de passe ou information confidentielle !</strong></li>\n" "&lt;li&gt;&lt;strong&gt;Vérifiez votre patch pour ne fournir aucun mot de passe ou information confidentielle !&lt;/strong&gt;&lt;/li&gt;\n"
"</ul>" "&lt;/ul&gt;"
#: IDF/gettexttemplates/idf/review/create.html.php:9 #: IDF/gettexttemplates/idf/review/create.html.php:9
msgid "" msgid ""
@ -2850,7 +2902,7 @@ msgstr "Comment obtenir le code"
#: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:7 #: IDF/gettexttemplates/idf/source/mercurial/tree.html.php:7
#: IDF/gettexttemplates/idf/source/mtn/tree.html.php:7 #: IDF/gettexttemplates/idf/source/mtn/tree.html.php:7
#: IDF/gettexttemplates/idf/source/svn/tree.html.php:7 #: IDF/gettexttemplates/idf/source/svn/tree.html.php:7
#: IDF/Views/Project.php:152 #: IDF/Views/Project.php:163
msgid "Age" msgid "Age"
msgstr "Âge" msgstr "Âge"
@ -3067,13 +3119,10 @@ msgid ""
"synchronization of your SSH key can take a couple of minutes. You can learn " "synchronization of your SSH key can take a couple of minutes. You can learn "
"more about <a " "more about <a "
"href=\"http://www.google.com/search?q=public+ssh+key+authentication\">SSH " "href=\"http://www.google.com/search?q=public+ssh+key+authentication\">SSH "
"key authentification</a>." "key authentication</a>."
msgstr "" msgstr ""
"Vous devez probablement fournir <a href=\"%%url%%\">votre clef SSH</a>. La " "Vous devez probablement fournir &lt;a href=\"%%url%%\"&gt;votre clef SSH&lt;/a&gt;. La synchronisation de votre clef SSH peut prendre quelques minutes. Vous pouvez en apprendre plus sur l'authentification &lt;a href=\"http://www.google.fr/search?\"\n"
"synchronisation de votre clef SSH peut prendre quelques minutes. Vous pouvez" "\"q=authentification+clef+ssh+publique\"&gt;avec une clef SSH publique&lt;/a&gt;."
" apprendre plus sur l'authentification <a "
"href=\"http://www.google.fr/search?q=authentification+clef+ssh+publique\">avec"
" une clef SSH publique</a>."
#: IDF/gettexttemplates/idf/source/git/help.html.php:7 #: IDF/gettexttemplates/idf/source/git/help.html.php:7
#: IDF/gettexttemplates/idf/source/mtn/help.html.php:6 #: IDF/gettexttemplates/idf/source/mtn/help.html.php:6
@ -3315,10 +3364,14 @@ msgid "Key Management"
msgstr "Administration des clefs" msgstr "Administration des clefs"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:7 #: IDF/gettexttemplates/idf/user/myaccount.html.php:7
msgid "Secondary Emails"
msgstr "E-mail secondaires"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:8
msgid "Extra password" msgid "Extra password"
msgstr "Mot de passe supplémentaire" msgstr "Mot de passe supplémentaire"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:8 #: IDF/gettexttemplates/idf/user/myaccount.html.php:9
msgid "" msgid ""
"This password is used to access some of the external systems managed by our " "This password is used to access some of the external systems managed by our "
"infrastructure. It will be regenerated if you change your password." "infrastructure. It will be regenerated if you change your password."
@ -3326,30 +3379,38 @@ msgstr ""
"Ce mot de passe est utilisé pour accéder à une partie des systèmes de notre " "Ce mot de passe est utilisé pour accéder à une partie des systèmes de notre "
"infrastructure. Il sera régénéré si vous changez votre mot de passe." "infrastructure. Il sera régénéré si vous changez votre mot de passe."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:9 #: IDF/gettexttemplates/idf/user/myaccount.html.php:10
msgid "API key" msgid "API key"
msgstr "Clé d'API" msgstr "Clé d'API"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:10 #: IDF/gettexttemplates/idf/user/myaccount.html.php:11
msgid "" msgid ""
"Your API key will be regenerated automatically if you change your password." "Your API key will be regenerated automatically if you change your password."
msgstr "" msgstr ""
"Votre clef d'API sera automatiquement régénérée si vous changez votre mot de" "Votre clef d'API sera automatiquement régénérée si vous changez votre mot de"
" passe." " passe."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:11 #: IDF/gettexttemplates/idf/user/myaccount.html.php:12
msgid "Update Your Account" msgid "Update Your Account"
msgstr "Mettre à jour votre compte" msgstr "Mettre à jour votre compte"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:13 #: IDF/gettexttemplates/idf/user/myaccount.html.php:14
msgid "Your Current Public Keys" msgid "Your Current Public Keys"
msgstr "Vos clefs publique jusqu'à présent" msgstr "Vos clefs publique jusqu'à présent"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:14 #: IDF/gettexttemplates/idf/user/myaccount.html.php:15
msgid "Delete this key" msgid "Delete this key"
msgstr "Supprimer cette clef" msgstr "Supprimer cette clef"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:15 #: IDF/gettexttemplates/idf/user/myaccount.html.php:16
msgid "Your additional email addresses"
msgstr "Vos e-mails secondaires"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:17
msgid "Delete this address"
msgstr "Supprimer cette e-mail"
#: IDF/gettexttemplates/idf/user/myaccount.html.php:18
msgid "" msgid ""
"If possible, use your real name. By using your real name, people will have " "If possible, use your real name. By using your real name, people will have "
"more trust in your comments and remarks." "more trust in your comments and remarks."
@ -3358,7 +3419,7 @@ msgstr ""
"personnes utilisant ce site auront naturellement plus confiance en vos " "personnes utilisant ce site auront naturellement plus confiance en vos "
"commentaires et remarques." "commentaires et remarques."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:16 #: IDF/gettexttemplates/idf/user/myaccount.html.php:19
msgid "" msgid ""
"The extra password is used to access some of the external systems and the " "The extra password is used to access some of the external systems and the "
"API key is used to interact with this website using a program." "API key is used to interact with this website using a program."
@ -3367,13 +3428,13 @@ msgstr ""
"programme externe et le mot de passe supplémentaire est utilisé pour accéder" "programme externe et le mot de passe supplémentaire est utilisé pour accéder"
" à certaines parties de l'infrastructure." " à certaines parties de l'infrastructure."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:17 #: IDF/gettexttemplates/idf/user/myaccount.html.php:20
msgid "Show API key and extra password" msgid "Show API key and extra password"
msgstr "Montrer la clef d'API et le mot de passe supplémentaire" msgstr "Montrer la clef d'API et le mot de passe supplémentaire"
#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:3 #: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:3
msgid "" msgid ""
"Oups, please check the provided login or email address to recover your " "Oops, please check the provided login or email address to recover your "
"password." "password."
msgstr "" msgstr ""
"Oups, veuillez vérifier l'identifiant ou l'adresse email pour récupérer " "Oups, veuillez vérifier l'identifiant ou l'adresse email pour récupérer "
@ -3446,10 +3507,10 @@ msgstr "Récupérer votre mot de passe"
#: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:8 #: IDF/gettexttemplates/idf/user/passrecovery-inputkey.html.php:8
msgid "" msgid ""
"Just after providing the confirmation key, you will be able to reset your " "Just after providing the confirmation key, you will be able to reset your "
"password and use again this website fully." "password and use this website fully."
msgstr "" msgstr ""
"Juste après avoir fourni la clef de vérification, vous pourrez donner votre " "Juste après avoir fourni la clef de vérification, vous pourrez réinitialiser"
"mot de passe et réutiliser complètement le site." " votre mot de passe et réutiliser complètement le site."
#: IDF/gettexttemplates/idf/user/passrecovery.html.php:6 #: IDF/gettexttemplates/idf/user/passrecovery.html.php:6
msgid "Reset Your Password" msgid "Reset Your Password"
@ -3747,10 +3808,6 @@ msgstr "Image"
msgid "Other" msgid "Other"
msgstr "Autre" msgstr "Autre"
#: IDF/Key.php:49
msgid "user"
msgstr "utilisateur"
#: IDF/Key.php:55 #: IDF/Key.php:55
msgid "public key" msgid "public key"
msgstr "clef publique" msgstr "clef publique"
@ -3982,17 +4039,12 @@ msgstr "%s: Création de la revue %d - %s"
msgid "New Code Review %s - %s (%s)" msgid "New Code Review %s - %s (%s)"
msgstr "Nouvelle revue de code %s - %s (%s)" msgstr "Nouvelle revue de code %s - %s (%s)"
#: IDF/Scm/Git.php:183 #: IDF/Scm/Git.php:311 IDF/Scm/Mercurial.php:141
#, php-format
msgid "Invalid value for the parameter %1$s: %2$s. Use %3$s."
msgstr "Valeur invalide pour le paramètre %1$s: %2$s. Use %3$s."
#: IDF/Scm/Git.php:234 IDF/Scm/Mercurial.php:140
#, php-format #, php-format
msgid "Folder %1$s not found in commit %2$s." msgid "Folder %1$s not found in commit %2$s."
msgstr "Répertoire %1$s non trouvé dans le commit %2$s." msgstr "Répertoire %1$s non trouvé dans le commit %2$s."
#: IDF/Scm/Git.php:352 IDF/Scm/Mercurial.php:157 #: IDF/Scm/Git.php:427 IDF/Scm/Mercurial.php:158
#, php-format #, php-format
msgid "Not a valid tree: %s." msgid "Not a valid tree: %s."
msgstr "Arbre non valide : %s." msgstr "Arbre non valide : %s."
@ -4040,7 +4092,7 @@ msgstr "lcname"
msgid "Lower case version of the name for fast searching." msgid "Lower case version of the name for fast searching."
msgstr "Version minuscule du nom pour chercher rapidement." msgstr "Version minuscule du nom pour chercher rapidement."
#: IDF/Template/Markdown.php:74 #: IDF/Template/Markdown.php:81
msgid "Create this documentation page" msgid "Create this documentation page"
msgstr "Créer cette page de documentation" msgstr "Créer cette page de documentation"
@ -4115,7 +4167,7 @@ msgstr "Aucun projet n'a été trouvé."
msgid "Update %s" msgid "Update %s"
msgstr "Mise à jour de %s" msgstr "Mise à jour de %s"
#: IDF/Views/Admin.php:101 IDF/Views/Project.php:256 #: IDF/Views/Admin.php:101 IDF/Views/Project.php:277
msgid "The project has been updated." msgid "The project has been updated."
msgstr "Le projet a été mis à jour." msgstr "Le projet a été mis à jour."
@ -4435,10 +4487,6 @@ msgstr "Le ticket a été ajouté à votre liste de surveillance."
msgid "On your watch list." msgid "On your watch list."
msgstr "Dans votre liste de surveillance." msgstr "Dans votre liste de surveillance."
#: IDF/Views/Project.php:72
msgid "All Updates"
msgstr "Mises à jour"
#: IDF/Views/Project.php:74 #: IDF/Views/Project.php:74
msgid "Issues and Comments" msgid "Issues and Comments"
msgstr "Tickets et commentaires" msgstr "Tickets et commentaires"
@ -4451,74 +4499,74 @@ msgstr "Documents"
msgid "Reviews and Patches" msgid "Reviews and Patches"
msgstr "Revues et Patchs" msgstr "Revues et Patchs"
#: IDF/Views/Project.php:142 #: IDF/Views/Project.php:153
msgid "This table shows the project updates." msgid "This table shows the project updates."
msgstr "Ce tableau montre les mises à jour du projet." msgstr "Ce tableau montre les mises à jour du projet."
#: IDF/Views/Project.php:153 #: IDF/Views/Project.php:164
msgid "Change" msgid "Change"
msgstr "Changement" msgstr "Changement"
#: IDF/Views/Project.php:157 #: IDF/Views/Project.php:168
msgid "No changes were found." msgid "No changes were found."
msgstr "Aucun changement trouvé." msgstr "Aucun changement trouvé."
#: IDF/Views/Project.php:248 #: IDF/Views/Project.php:269
#, php-format #, php-format
msgid "%s Project Summary" msgid "%s Project Summary"
msgstr "Résumé du projet %s" msgstr "Résumé du projet %s"
#: IDF/Views/Project.php:283 #: IDF/Views/Project.php:304
#, php-format #, php-format
msgid "%s Issue Tracking Configuration" msgid "%s Issue Tracking Configuration"
msgstr "Configuration du gestionnaire de tickets de %s" msgstr "Configuration du gestionnaire de tickets de %s"
#: IDF/Views/Project.php:292 #: IDF/Views/Project.php:313
msgid "The issue tracking configuration has been saved." msgid "The issue tracking configuration has been saved."
msgstr "La configuration du gestionnaire de tickets a été sauvegardée." msgstr "La configuration du gestionnaire de tickets a été sauvegardée."
#: IDF/Views/Project.php:328 #: IDF/Views/Project.php:349
#, php-format #, php-format
msgid "%s Downloads Configuration" msgid "%s Downloads Configuration"
msgstr "Configuration des Téléchargements de %s" msgstr "Configuration des Téléchargements de %s"
#: IDF/Views/Project.php:337 #: IDF/Views/Project.php:358
msgid "The downloads configuration has been saved." msgid "The downloads configuration has been saved."
msgstr "La configuration des téléchargements a été sauvegardée." msgstr "La configuration des téléchargements a été sauvegardée."
#: IDF/Views/Project.php:371 #: IDF/Views/Project.php:392
#, php-format #, php-format
msgid "%s Documentation Configuration" msgid "%s Documentation Configuration"
msgstr "Configuration de la documentation de %s" msgstr "Configuration de la documentation de %s"
#: IDF/Views/Project.php:380 #: IDF/Views/Project.php:401
msgid "The documentation configuration has been saved." msgid "The documentation configuration has been saved."
msgstr "La configuration de la documentation a été sauvegardée." msgstr "La configuration de la documentation a été sauvegardée."
#: IDF/Views/Project.php:414 #: IDF/Views/Project.php:435
#, php-format #, php-format
msgid "%s Project Members" msgid "%s Project Members"
msgstr "Membres du projet %s" msgstr "Membres du projet %s"
#: IDF/Views/Project.php:423 #: IDF/Views/Project.php:444
msgid "The project membership has been saved." msgid "The project membership has been saved."
msgstr "Les membres du projet ont été sauvegardés." msgstr "Les membres du projet ont été sauvegardés."
#: IDF/Views/Project.php:446 #: IDF/Views/Project.php:467
#, php-format #, php-format
msgid "%s Tabs Access Rights" msgid "%s Tabs Access Rights"
msgstr "Accès aux onglets de %s" msgstr "Accès aux onglets de %s"
#: IDF/Views/Project.php:460 #: IDF/Views/Project.php:481
msgid "The project tabs access rights have been saved." msgid "The project tabs access rights have been saved."
msgstr "Les droits d'accès aux onglets du projet ont été sauvegardés." msgstr "Les droits d'accès aux onglets du projet ont été sauvegardés."
#: IDF/Views/Project.php:506 #: IDF/Views/Project.php:527
#, php-format #, php-format
msgid "%s Source" msgid "%s Source"
msgstr "Source de %s" msgstr "Source de %s"
#: IDF/Views/Project.php:520 #: IDF/Views/Project.php:541
msgid "The project source configuration has been saved." msgid "The project source configuration has been saved."
msgstr "La configuration du dépôt a été sauvegardée." msgstr "La configuration du dépôt a été sauvegardée."
@ -4570,7 +4618,7 @@ msgstr "%s Révision ambiguë "
msgid "%1$s %2$s Change Log" msgid "%1$s %2$s Change Log"
msgstr "Changements %2$s de %1$s" msgstr "Changements %2$s de %1$s"
#: IDF/Views/Source.php:146 IDF/Views/Source.php:227 IDF/Views/Source.php:359 #: IDF/Views/Source.php:146 IDF/Views/Source.php:227 IDF/Views/Source.php:360
#, php-format #, php-format
msgid "%1$s %2$s Source Tree" msgid "%1$s %2$s Source Tree"
msgstr "Arbre des sources %2$s de %1$s" msgstr "Arbre des sources %2$s de %1$s"
@ -4605,19 +4653,23 @@ msgstr "Tous les tickets que vous avez soumis ont été fixés, yeah !"
msgid "Your personal information has been updated." msgid "Your personal information has been updated."
msgstr "Vos informations personnelles ont été mises à jour." msgstr "Vos informations personnelles ont été mises à jour."
#: IDF/Views/User.php:132 #: IDF/Views/User.php:133
msgid "Your Account" msgid "Your Account"
msgstr "Votre compte" msgstr "Votre compte"
#: IDF/Views/User.php:155 #: IDF/Views/User.php:157
msgid "The public key has been deleted." msgid "The public key has been deleted."
msgstr "La clef clef publique a été supprimée." msgstr "La clef clef publique a été supprimée."
#: IDF/Views/User.php:178 #: IDF/Views/User.php:177
msgid "The address has been deleted."
msgstr "Cet e-mail a été supprimé."
#: IDF/Views/User.php:200
msgid "Confirm The Email Change" msgid "Confirm The Email Change"
msgstr "Confirmez le changement d'adresse" msgstr "Confirmez le changement d'adresse"
#: IDF/Views/User.php:203 #: IDF/Views/User.php:232
#, php-format #, php-format
msgid "Your new email address \"%s\" has been validated. Thank you!" msgid "Your new email address \"%s\" has been validated. Thank you!"
msgstr "Votre nouvelle adresse email \"%s\" a été validée. Merci !" msgstr "Votre nouvelle adresse email \"%s\" a été validée. Merci !"
@ -4694,22 +4746,22 @@ msgstr "La page de documentation a été supprimée."
msgid "Delete Page %s" msgid "Delete Page %s"
msgstr "Suppprimer la page %s" msgstr "Suppprimer la page %s"
#: IDF/Views.php:124 IDF/Views.php:150 #: IDF/Views.php:126 IDF/Views.php:152
msgid "Confirm Your Account Creation" msgid "Confirm Your Account Creation"
msgstr "Confirmez la création de votre compte" msgstr "Confirmez la création de votre compte"
#: IDF/Views.php:170 #: IDF/Views.php:172
msgid "" msgid ""
"Welcome! You can now participate in the life of your project of choice." "Welcome! You can now participate in the life of your project of choice."
msgstr "" msgstr ""
"Bienvenue ! Vous pouvez maintenant prendre part à la vie du projet de votre " "Bienvenue ! Vous pouvez maintenant prendre part à la vie du projet de votre "
"choix." "choix."
#: IDF/Views.php:196 IDF/Views.php:220 IDF/Views.php:261 #: IDF/Views.php:198 IDF/Views.php:222 IDF/Views.php:263
msgid "Password Recovery" msgid "Password Recovery"
msgstr "Récupération du mot de passe" msgstr "Récupération du mot de passe"
#: IDF/Views.php:240 #: IDF/Views.php:242
msgid "" msgid ""
"Welcome back! Next time, you can use your broswer options to remember the " "Welcome back! Next time, you can use your broswer options to remember the "
"password." "password."
@ -4717,11 +4769,11 @@ msgstr ""
"Re bienvenue ! La prochaine fois, vous pouvez utiliser les options de votre " "Re bienvenue ! La prochaine fois, vous pouvez utiliser les options de votre "
"navigateur pour qu'il se souvienne de votre mot de passe." "navigateur pour qu'il se souvienne de votre mot de passe."
#: IDF/Views.php:282 #: IDF/Views.php:284
msgid "Here to Help You!" msgid "Here to Help You!"
msgstr "Ici pour vous aider !" msgstr "Ici pour vous aider !"
#: IDF/Views.php:298 #: IDF/Views.php:300
msgid "InDefero API (Application Programming Interface)" msgid "InDefero API (Application Programming Interface)"
msgstr "API d'InDefero (Interface de Programmation de l'Application)" msgstr "API d'InDefero (Interface de Programmation de l'Application)"

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

View File

@ -32,6 +32,7 @@
{block extraheader}{/block} {block extraheader}{/block}
<title>{block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if}</title> <title>{block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if}</title>
<script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script> <script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script>
{appversion}
</head> </head>
<body> <body>
<div id="{block docid}doc3{/block}"> <div id="{block docid}doc3{/block}">

View File

@ -32,6 +32,7 @@
{block extraheader}{/block} {block extraheader}{/block}
<title>{block pagetitle}{$page_title|strip_tags}{/block}</title> <title>{block pagetitle}{$page_title|strip_tags}{/block}</title>
<script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script> <script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script>
{appversion}
</head> </head>
<body> <body>
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}"> <div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">

View File

@ -32,6 +32,7 @@
{block extraheader}{/block} {block extraheader}{/block}
<title>{block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if}</title> <title>{block pagetitle}{$page_title|strip_tags}{/block}{if $project} - {$project.shortdesc}{/if}</title>
<script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script> <script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script>
{appversion}
</head> </head>
<body> <body>
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}"> <div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">

View File

@ -31,6 +31,7 @@
{block extraheader}{/block} {block extraheader}{/block}
<title>{block pagetitle}{$page_title|strip_tags}{/block}</title> <title>{block pagetitle}{$page_title|strip_tags}{/block}</title>
<script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script> <script type="text/javascript" src="{media '/idf/js/jquery-1.2.6.min.js'}"></script>
{appversion}
</head> </head>
<body> <body>
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}"> <div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">

View File

@ -16,7 +16,7 @@
{/block} {/block}
{block context} {block context}
<div id="stats" class="issue-submit-info"> <div id="stats" class="issue-submit-info">
<h3 class="a-c">Forge statistics</h3> <h3 class="a-c">{trans 'Forge statistics'}</h3>
<table> <table>
<tr><td class="right">{trans 'Projects:'}</td><td>{$stats.projects}</td></tr> <tr><td class="right">{trans 'Projects:'}</td><td>{$stats.projects}</td></tr>
<tr><td class="right">{trans 'Members:'}</td><td>{$stats.members}</td></tr> <tr><td class="right">{trans 'Members:'}</td><td>{$stats.members}</td></tr>

View File

@ -1,7 +1,7 @@
{extends "idf/issues/base.html"} {extends "idf/issues/base.html"}
{block titleicon}{if $form}<form class="star" method="post" action="{url 'IDF_Views_Issue::star', array($project.shortname, $issue.id)}"><input type="image" src="{if $starred}{media '/idf/img/star.png'}{else}{media '/idf/img/star-grey.png'}{/if}" name="submit" title="{if $starred}{trans 'Remove this issue from your watch list'}{else}{trans 'Add this issue to your watch list'}{/if}" /></form> {/if}{/block} {block titleicon}{if $form}<form class="star" method="post" action="{url 'IDF_Views_Issue::star', array($project.shortname, $issue.id)}"><input type="image" src="{if $starred}{media '/idf/img/star.png'}{else}{media '/idf/img/star-grey.png'}{/if}" name="submit" title="{if $starred}{trans 'Remove this issue from your watch list'}{else}{trans 'Add this issue to your watch list'}{/if}" /></form> {/if}{/block}
{block body} {block body}
<div style="float:right;"> <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 'Click here to view the previous closed issue'}{else}{trans 'Click here to view the previous open issue'}{/if}">Previous issue</a>
{/if} {/if}

View File

@ -13,9 +13,12 @@
{/block} {/block}
{block context} {block context}
<p><span class="label{if 'all' == $model_filter} active{/if}"><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, 'all')}">{trans 'All Updates'}</a></span></p>
<p><strong>{trans 'Filter by type'}</strong><br /> <p><strong>{trans 'Filter by type'}</strong><br />
{foreach $all_model_filters as $filter_key => $filter_name} {foreach $all_model_filters as $filter_key => $filter_name}
{if $filter_key != 'all'}
<span class="label{if $filter_key == $model_filter} active{/if}"><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, $filter_key)}">{$filter_name}</a></span><br /> <span class="label{if $filter_key == $model_filter} active{/if}"><a href="{url 'IDF_Views_Project::timeline', array($project.shortname, $filter_key)}">{$filter_name}</a></span><br />
{/if}
{/foreach} {/foreach}
</p> </p>
{/block} {/block}

View File

@ -9,9 +9,9 @@
<tr> <tr>
<th><strong>{trans 'Author:'}</strong></th><td>{showuser $rcommit.get_author(), $request, $cobject.author}</td> <th><strong>{trans 'Author:'}</strong></th><td>{showuser $rcommit.get_author(), $request, $cobject.author}</td>
</tr> </tr>
<tr> {if $cobject.branch}<tr>
<th><strong>{trans 'Branch:'}</strong></th><td>{$cobject.branch}</td> <th><strong>{trans 'Branch:'}</strong></th><td>{$cobject.branch}</td>
</tr> </tr>{/if}
<tr> <tr>
<th><strong>{trans 'Commit:'}</strong></th><td class="mono"><a href="{url 'IDF_Views_Source::treeBase', array($project.shortname, $commit)}" title="{trans 'View corresponding source tree'}">{$cobject.commit}</a></td> <th><strong>{trans 'Commit:'}</strong></th><td class="mono"><a href="{url 'IDF_Views_Source::treeBase', array($project.shortname, $commit)}" title="{trans 'View corresponding source tree'}">{$cobject.commit}</a></td>
</tr> </tr>

5
src/IDF/version.php Normal file
View File

@ -0,0 +1,5 @@
<?php
return array(
'version' => '1.1',
'revision' => '$Format:%H$',
);

30
test/IDF/DiffTest.php Normal file
View File

@ -0,0 +1,30 @@
<?php
include 'IDF/Diff.php';
class IDF_DiffTest extends PHPUnit_Framework_TestCase
{
public function testParse()
{
$datadir = DATADIR.'/'.__CLASS__;
foreach (glob($datadir.'/*.diff') as $difffile)
{
$diffprefix = 0;
if (strpos($difffile, '-git-') != false || strpos($difffile, '-hg-') != false)
{
$diffprefix = 1;
}
$expectedfile = str_replace('.diff', '.expected', $difffile);
$expectedcontent = @file_get_contents($expectedfile);
$diffcontent = file_get_contents($difffile);
$diff = new IDF_Diff($diffcontent, $diffprefix);
$this->assertEquals(unserialize($expectedcontent),
$diff->parse(),
'parsed diff '.$difffile.' does not match');
}
}
}

7
test/bootstrap.php Normal file
View File

@ -0,0 +1,7 @@
<?php
define('SRCDIR', realpath(dirname(__FILE__) . '/../src'));
define('TESTDIR', dirname(__FILE__));
define('DATADIR', TESTDIR . '/data');
set_include_path(get_include_path() . PATH_SEPARATOR . SRCDIR);

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,389 @@
Index: LinuxBIOSv1/src/include/cpu/i786/cpufixup.h
===================================================================
--- LinuxBIOSv1/src/include/cpu/i786/cpufixup.h (Revision 0)
+++ LinuxBIOSv1/src/include/cpu/i786/cpufixup.h (Revision 665)
@@ -0,0 +1,11 @@
+#ifndef CPU_I786_CPUFIXUP_H
+#define CPU_I786_CPUFIXUP_H
+
+
+void i786_cpufixup(struct mem_range *mem);
+
+#define L3_CACHE_DISABLE 0x40
+
+#endif /* CPU_I786_CPUFIXUP_H */
+
+
Eigenschaftsänderungen: LinuxBIOSv1\src\include\cpu\i786\cpufixup.h
___________________________________________________________________
Hinzugefügt: svn:keywords
+ Author Date Id Revision
Hinzugefü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änderungen: LinuxBIOSv1\src\mainboard\tyan\guiness\cmos.layout
___________________________________________________________________
Hinzugefügt: svn:keywords
+ Author Date Id Revision
Hinzugefü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änderungen: LinuxBIOSv1\src\config\linuxbios_c.ld
___________________________________________________________________
Hinzugefügt: svn:keywords
+ Author Date Id Revision
Hinzugefü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änderungen: LinuxBIOSv1\src\arch\i386\include\arch\rom_segs.h
___________________________________________________________________
Hinzugefügt: svn:keywords
+ Author Date Id Revision
Hinzugefü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änderungen: LinuxBIOSv1\src\arch\i386\lib\c_start.S
___________________________________________________________________
Hinzugefügt: svn:keywords
+ Author Date Id Revision
Hinzugefügt: svn:eol-style
+ native

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
#
# old_revision []
#
# add_dir ""
#
# add_file "a"
# content [03cfd743661f07975fa2f1220c5194cbaff48451]
#
============================================================
--- /dev/null
+++ a 03cfd743661f07975fa2f1220c5194cbaff48451
@@ -0,0 +1 @@
+abc

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,14 @@
#
# old_revision []
#
# add_dir ""
#
# add_file "a"
# content [9decd90bc2eedb78c74d5059a6bb6244dd2d0562]
#
============================================================
--- /dev/null
+++ a 9decd90bc2eedb78c74d5059a6bb6244dd2d0562
@@ -0,0 +1,2 @@
+abc
+abc

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,13 @@
#
# old_revision [1f31865f7c91525e96aa7615e660303ca04c708f]
#
# patch "a"
# from [9decd90bc2eedb78c74d5059a6bb6244dd2d0562]
# to [03cfd743661f07975fa2f1220c5194cbaff48451]
#
============================================================
--- a 9decd90bc2eedb78c74d5059a6bb6244dd2d0562
+++ a 03cfd743661f07975fa2f1220c5194cbaff48451
@@ -1,2 +1 @@ abc
abc
-abc

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,13 @@
#
# old_revision [019c2c7a876819db59add22c98c7939e32d81161]
#
# patch "a"
# from [03cfd743661f07975fa2f1220c5194cbaff48451]
# to [023cc93272e5cbc11f128ffc90fbbe42f6f08d8c]
#
============================================================
--- a 03cfd743661f07975fa2f1220c5194cbaff48451
+++ a 023cc93272e5cbc11f128ffc90fbbe42f6f08d8c
@@ -1 +1 @@
-abc
+ls

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,13 @@
#
# old_revision [7950c8a4e13342d1dca94c05efc49b291ab327f5]
#
# patch "a"
# from [023cc93272e5cbc11f128ffc90fbbe42f6f08d8c]
# to [b3d40c241ccfd6ff1a06047a9f6d609227d2893f]
#
============================================================
--- a 023cc93272e5cbc11f128ffc90fbbe42f6f08d8c
+++ a b3d40c241ccfd6ff1a06047a9f6d609227d2893f
@@ -1 +1,2 @@ ls
ls
+ls

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,18 @@
#
# old_revision [9b51b47c6fdd4918f970b81a8672503b8bb30402]
#
# patch "a"
# from [b3d40c241ccfd6ff1a06047a9f6d609227d2893f]
# to [4ba8cb789fc34bd4557b5bbf7cb9f4b68b3a9f5e]
#
# set "a"
# attr "foo"
# value "bar"
#
============================================================
--- a b3d40c241ccfd6ff1a06047a9f6d609227d2893f
+++ a 4ba8cb789fc34bd4557b5bbf7cb9f4b68b3a9f5e
@@ -1,2 +1,3 @@ ls
ls
ls
+l

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,5 @@
diff -r 000000000000 -r 5203a6d9dc87 a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/a Wed Mar 16 16:12:09 2011 +0100
@@ -0,0 +1,1 @@
+foo

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,6 @@
diff -r 5203a6d9dc87 -r 76fd636881a3 a
--- a/a Wed Mar 16 16:12:09 2011 +0100
+++ b/a Wed Mar 16 16:13:23 2011 +0100
@@ -1,1 +1,2 @@
foo
+bf

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,13 @@
commit c28f1dd026dd832398d699fa1fee0cce0562f350
Author: Patrick Georgi <patrick@georgi-clan.de>
Date: Wed Mar 16 15:14:41 2011 +0100
foo
diff --git a/a b/a
new file mode 100644
index 0000000..8baef1b
--- /dev/null
+++ b/a
@@ -0,0 +1 @@
+abc

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,9 @@
diff --git a/b b/b
new file mode 100644
index 0000000..bfdaa0f
--- /dev/null
+++ b/b
@@ -0,0 +1,3 @@
+a
+b
+

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,9 @@
diff --git a/b b/b
index bfdaa0f..e528a92 100644
--- a/b
+++ b/b
@@ -1,3 +1,4 @@
a
+l
b

View File

@ -0,0 +1 @@
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";}}}}}

View File

@ -0,0 +1,8 @@
diff --git a/b b/b
index bfdaa0f..7898192 100644
--- a/b
+++ b/b
@@ -1,3 +1 @@
a
-b
-

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,7 @@
diff --git a/test_file b/test_file
index 2134e75..2eaf9ea 100644
--- a/test_file
+++ b/test_file
@@ -1 +1 @@
-Steddy is awesome
+Steddy is very awesome

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,8 @@
diff --git a/foo b/foo
index a86c18f..71ccdd0 100644
--- a/foo
+++ b/foo
@@ -1 +1 @@
-This is foo
+This is foo
\ No newline at end of file

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -0,0 +1,8 @@
diff --git a/foo b/foo
index 71ccdd0..a86c18f 100644
--- a/foo
+++ b/foo
@@ -1 +1 @@
-This is foo
\ No newline at end of file
+This is foo

View File

@ -0,0 +1 @@
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;}}}}}

View File

@ -273,6 +273,11 @@ div.issue-changes-timeline {
color: #888a85; color: #888a85;
} }
div.issue-prev-next {
float: right;
margin-top: -25px;
}
div.issue-submit-info { div.issue-submit-info {
background-color: #d3d7cf; background-color: #d3d7cf;
-moz-border-radius: 3px; -moz-border-radius: 3px;
@ -577,10 +582,6 @@ td.diff-a {
background-color: #dfd; background-color: #dfd;
} }
td.diff-a > span {
float: left;
}
td.diff-r { td.diff-r {
background-color: #fdd; background-color: #fdd;
} }
@ -588,6 +589,13 @@ td.diff-r {
td.diff-a, td.diff-r, td.diff-c { td.diff-a, td.diff-r, td.diff-c {
border-bottom: none; border-bottom: none;
border-top: 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 { table.diff tr.diff-next {