44 Commits

Author SHA1 Message Date
Thomas Keller
b36b8e3afb Final adjustions to the project logo code
- remove the question mark from the default logo for simplification,
  add a soft drop shadow to make the logo more visible on not so light
  backgrounds
- display the project logo and the lock icon in the project list dropdown
- re-position the project title and display the lock icon (if needed)
  on top of the main logo
The code now works best with uploaded logos of 32x32px^2; smaller logos
will be downsampled and repositioned on a best breed basis.
2011-04-27 00:03:44 +02:00
William MARTIN
dc31155de1 Second pass of code review 2011-04-11 15:37:40 +02:00
Thomas Keller
0bae69908b Spelling 2011-04-07 22:40:32 +02:00
Thomas Keller
47a077bc82 Merge branch 'feature.better-home' of projects.ceondo.com:indefero into feature.better-home 2011-04-07 22:38:40 +02:00
William MARTIN
836ff71364 Update code to fix thomas review's 2011-04-06 15:33:26 +02:00
Thomas Keller
576c06ffaf Merge branch 'feature.better-home' of git://projects.ceondo.com/indefero into feature.better-home 2011-04-02 00:17:51 +02:00
William MARTIN
352dc3e179 Add IDF_Form_ProjectConf
Update template
2011-04-01 16:05:32 +02:00
William MARTIN
aa164936f4 Remove commented code 2011-04-01 14:19:07 +02:00
William MARTIN
9a93acd1a5 Update the admin template 2011-04-01 14:17:56 +02:00
William MARTIN
587aa11cda Update the index template 2011-04-01 14:14:30 +02:00
William MARTIN
d04ecd60c4 Add default logo for project without one 2011-04-01 14:13:42 +02:00
Thomas Keller
aa68fe3485 Note fix for issue 655. 2011-03-30 00:19:18 +02:00
Thomas Keller
e408fe8733 Make the function static again; this change silently slipped through. 2011-03-30 00:17:35 +02:00
Thomas Keller
836986462a Add Stewart to AUTHORS. 2011-03-30 00:13:50 +02:00
Stewart Platt
51c6cdb20d Only display those filter options for items the user actually has access to
(fixes issue 655)
2011-03-30 00:12:07 +02:00
Thomas Keller
766232f29b Add missing license header. 2011-03-30 00:00:22 +02:00
Thomas Keller
2ed021f30b Merge branch 'develop' of projects.ceondo.com:indefero into develop 2011-03-28 18:00:23 +02:00
Thomas Keller
899fe561df Merge branch 'release-1.1' into develop 2011-03-28 17:59:08 +02:00
Thomas Keller
67d8936083 Start 1.1.2 development 2011-03-28 17:57:15 +02:00
Thomas Keller
78f5cef5bd Enter a release date (i.e. release) 1.1.1 2011-03-28 17:52:53 +02:00
Fernando Sayago Gil
8928b1654c One new string translated. 2011-03-28 17:46:08 +02:00
William MARTIN
977fa0d1d4 Translate a new string. 2011-03-28 12:46:06 +02:00
Thomas Keller
1d89cec2cf Merge branch 'release-1.1' into develop 2011-03-28 01:26:20 +02:00
Thomas Keller
6c6b7d6bb2 Bump to 1.1.1 (not released yet, though) 2011-03-28 01:21:10 +02:00
Thomas Keller
f92e88e9b4 Note the recent fixes 2011-03-28 01:20:54 +02:00
Thomas Keller
6e58899fdf Add the new string to idf.pot and update the German translation
accordingly.
2011-03-28 01:15:22 +02:00
Thomas Keller
1513598420 Add a short sentence about password recovery on the registration page
(fixes issue 652)
2011-03-28 01:13:15 +02:00
Thomas Keller
9cfc060760 Improve a translation. 2011-03-28 00:56:44 +02:00
Patrick Georgi
a531e34ec2 Add IDF_EmailAddress to backup 2011-03-25 20:39:11 +01:00
Jean-Philippe Fleury
2cce23b5b4 Fix a typo in the French translation and add myself to AUTHORS. 2011-03-25 13:17:49 +01:00
Sindre Myren
e518bc9b68 Updated gitserve.py to work with python 3.x 2011-03-25 11:08:18 +01:00
Thomas Keller
8e02d05ba9 Notice the fix of issue 643 in NEWS 2011-03-25 00:53:12 +01:00
Thomas Keller
f131083315 Skip linking to a non-existing diff section for changed binary files
(fixes issue 643)
2011-03-25 00:45:06 +01:00
Thomas Keller
39ba5b37ef Ignore a couple of files for code coverage that should not be covered;
add a simle run-tests script that steals some code from photon to
return the code coverage at the end of the test execution
(we're only at about 8% - lots of work left...)
2011-03-25 00:29:50 +01:00
Thomas Keller
002fa05c7f Merge branch 'release-1.1' into develop 2011-03-25 00:14:26 +01:00
Thomas Keller
1a52133fd4 getArchiveStream() should actually be public (issue 648) 2011-03-25 00:11:44 +01:00
Thomas Keller
30900f7196 monotone zip archive entries now all carry the revision date as mtime (issue 645);
add a test case for the zip render response that works with and without PHP's
zip extension
2011-03-24 23:54:52 +01:00
Thomas Keller
b753cf0837 Fix a coment. 2011-03-24 01:19:05 +01:00
Thomas Keller
53ab5b6aff Expand the bootstrap script to setup an empty IDF environment. 2011-03-24 00:41:22 +01:00
Thomas Keller
78a0402351 Prepare the Stdio class for easier testing.
- create an interface that describes the basic methods
- let the real stdio class implement this interface
- inject the stdio instance into IDF_Scm_Monotone and do not
  create it in the constructor
- ensure in IDF_Scm_Monotone_ZipRender that we get the proper
  constructor arguments
On a slighly unrelated note, make _getAuthOptions() in the stdio
implementation private.
2011-03-23 00:47:17 +01:00
Thomas Keller
5b5705fe90 Add a unit test for monotone's basicio parser and compiler.
Also note a couple of quirks and be less strict (for now) when it
comes to hash parsing and stanza lines without values.
2011-03-23 00:26:26 +01:00
Thomas Keller
f08b5c5e3f Note syncmonotone.mdtext in INSTALL.mdtext 2011-03-20 14:19:53 +01:00
Thomas Keller
aa87acd432 Start 1.2 development. 2011-03-20 13:48:49 +01:00
Thomas Keller
7af7ef8357 Merge branch 'release-1.1' into develop 2011-03-20 13:46:45 +01:00
40 changed files with 8403 additions and 6974 deletions

3
.gitignore vendored
View File

@@ -9,3 +9,6 @@ indefero-*.zip
src/IDF/conf/path.php
.tx/config
src/IDF/locale/idf.pot.bak
test/test.db
test/tmp
test/config.php

View File

@@ -18,6 +18,7 @@ Much appreciated contributors (in alphabetical order):
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
Jean-Philippe Fleury <jpfleury>
Jerry <lxb429@gmail.com> - Chinese translation
Julien Issler <julien@issler.net>
Ludovic Bellière <xrogaan>
@@ -30,6 +31,7 @@ Much appreciated contributors (in alphabetical order):
Raphaël Emourgeon <raphael>
Samuel Suther <info@suther.de> - German translation
Sindre R. Myren <sindrero@stud.ntnu.no>
Stewart Platt <stew@futurete.ch>
Thomas Keller <me@thomaskeller.biz> - Monotone support
Vladimir Solomatin <slash>
William Martin <william.martin@lcpc.fr>

View File

@@ -4,6 +4,12 @@ The installation of InDefero is composed of 2 parts, first the
installation of the [Pluf framework](http://www.pluf.org) and second,
the installation of InDefero by itself.
## PHP modules for indefero
Indefero need the GD module for PHP. It's named "php5-gd" in debian.
$ apt-get install php5-gd
## Recommended Layout of the Files
If your server document root is in `/var/www` a good thing is to keep
@@ -126,6 +132,7 @@ The documentation is available in the `doc` folder.
* Subversion: `doc/syncsvn.mdtext`.
* Mercurial: `doc/syncmercurial.mdtext`.
* Git: `doc/syncgit.mdtext`.
* Monotone: `doc/syncmonotone.mdtext`
## For the Apache Webserver Users

View File

@@ -1,3 +1,27 @@
# InDefero 1.2 - xxx xxx xx xx:xx 2011 UTC
## New Features
## Bugfixes
- monotone zip archive entries now all carry the revision date as mtime (issue 645)
- Timeline only displays filter options for items a user has actually access to (issue 655)
## Documentation
## Translations
# InDefero 1.1.1 - Mon Mar 28 15:52 2011 UTC
## Bugfixes
- Fix an incompatibility with Python 3.1 in gitserve.py (issue 554)
- Fix PHP error when the commit view shows a commit with changed binary files (issue 643)
- A migration problem prevented the preferences page being displayed properly (issues 644 and 653)
- Fix PHP error when trying to create Mercurial source archives (issue 648)
- Improve the French translation (issue 651)
- Registration page missed a link to password recovery that was mentioned in a form error (issue 652)
# InDefero 1.1 - Sun Mar 20 11:44 2011 UTC
## New Features

173
logo/no_logo.svg Normal file
View File

@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="no_logo.svg"
inkscape:version="0.47 r22583"
id="svg2985"
height="32"
width="32"
version="1.1"
inkscape:export-filename="/Users/tommyd/Entwicklung/indefero/www/media/idf/img/no_logo.png"
inkscape:export-xdpi="89.989998"
inkscape:export-ydpi="89.989998">
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="852"
id="namedview9"
showgrid="false"
inkscape:zoom="16.0625"
inkscape:cx="8.5507561"
inkscape:cy="16.122403"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="g2847"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
orientation="1,0"
position="16,25.836575"
id="guide3752" />
<sodipodi:guide
orientation="0,1"
position="-18.677042,16"
id="guide3754" />
</sodipodi:namedview>
<defs
id="defs2987">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective13" />
<inkscape:perspective
id="perspective2863"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3676"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3717"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<filter
inkscape:collect="always"
id="filter3816"
x="-0.14434362"
width="1.2886872"
y="-0.11562817"
height="1.2312563">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.1799243"
id="feGaussianBlur3818" />
</filter>
</defs>
<metadata
id="metadata2990">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="shadow"
style="display:inline"
sodipodi:insensitive="true">
<g
transform="translate(0.44042901,0.78704792)"
id="g2847-8"
style="opacity:0.79710143;fill:#000000;stroke:#000000;stroke-opacity:1;filter:url(#filter3816)">
<g
id="g3838-0"
style="fill:#000000;stroke:#000000;stroke-opacity:1" />
<g
id="g2401-2"
transform="matrix(0.21219597,0,0,0.21219597,-70.751966,-27.73328)"
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:export-filename="/home/loa/Projects/indefero/logo/powered-by-indefero.png"
inkscape:export-xdpi="12.330909"
inkscape:export-ydpi="12.330909">
<path
id="path2383-4"
d="m 396.19089,173.14471 c -7.67621,0.80661 -14.40195,5.39406 -19.58101,10.89131 -7.23597,7.88004 -11.69742,18.07908 -13.32198,28.60362 -1.7236,11.28173 -0.25925,23.20635 5.07686,33.37271 3.78607,7.24384 9.53161,13.92339 17.29701,16.96772 3.86478,1.53937 8.98362,1.03284 11.67912,-2.41036 2.64357,-3.5671 2.69463,-8.234 2.85756,-12.48867 0.045,-7.61054 -0.54749,-15.25544 0.45618,-22.83193 0.87131,-9.50623 4.03944,-18.56751 6.71612,-27.66851 1.16242,-4.44333 2.25094,-9.02808 1.97499,-13.64988 -0.48817,-4.62476 -3.58059,-9.31042 -8.2964,-10.4067 -1.57489,-0.44882 -3.23412,-0.48948 -4.85845,-0.37931 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0" />
<path
id="path2391-8"
d="m 433.14691,149.28687 c 7.2059,2.76589 12.51512,8.93778 16.09494,15.58815 4.94991,9.48434 6.61962,20.49058 5.46486,31.07695 -1.25505,11.34342 -5.75582,22.48271 -13.54134,30.92159 -5.53192,6.01709 -12.81048,10.98198 -21.09918,11.91276 -4.13154,0.4866 -8.94486,-1.32748 -10.65734,-5.35104 -1.63027,-4.12976 -0.4717,-8.65084 0.47212,-12.80269 1.92628,-7.36287 4.47721,-14.59393 5.4687,-22.17201 1.61875,-9.40784 0.90381,-18.98034 0.67386,-28.46402 0.0272,-4.59278 0.1624,-9.30303 1.62515,-13.69592 1.66851,-4.34082 5.86829,-8.06645 10.70716,-7.90484 1.63738,-0.0259 3.25061,0.36424 4.79107,0.89107 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="logo"
style="display:inline">
<g
id="layer1"
transform="translate(-0.06540759,0.09444087)">
<g
id="g2847">
<g
id="g3838" />
<g
id="g2401"
transform="matrix(0.21219597,0,0,0.21219597,-70.751966,-27.73328)"
style="fill:#e6e6e6;fill-opacity:1;stroke:#a0a0a0;stroke-width:2.4000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
inkscape:export-filename="/home/loa/Projects/indefero/logo/powered-by-indefero.png"
inkscape:export-xdpi="12.330909"
inkscape:export-ydpi="12.330909">
<path
id="path2383"
d="m 396.19089,173.14471 c -7.67621,0.80661 -14.40195,5.39406 -19.58101,10.89131 -7.23597,7.88004 -11.69742,18.07908 -13.32198,28.60362 -1.7236,11.28173 -0.25925,23.20635 5.07686,33.37271 3.78607,7.24384 9.53161,13.92339 17.29701,16.96772 3.86478,1.53937 8.98362,1.03284 11.67912,-2.41036 2.64357,-3.5671 2.69463,-8.234 2.85756,-12.48867 0.045,-7.61054 -0.54749,-15.25544 0.45618,-22.83193 0.87131,-9.50623 4.03944,-18.56751 6.71612,-27.66851 1.16242,-4.44333 2.25094,-9.02808 1.97499,-13.64988 -0.48817,-4.62476 -3.58059,-9.31042 -8.2964,-10.4067 -1.57489,-0.44882 -3.23412,-0.48948 -4.85845,-0.37931 z"
style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#a0a0a0;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0" />
<path
id="path2391"
d="m 433.14691,149.28687 c 7.2059,2.76589 12.51512,8.93778 16.09494,15.58815 4.94991,9.48434 6.61962,20.49058 5.46486,31.07695 -1.25505,11.34342 -5.75582,22.48271 -13.54134,30.92159 -5.53192,6.01709 -12.81048,10.98198 -21.09918,11.91276 -4.13154,0.4866 -8.94486,-1.32748 -10.65734,-5.35104 -1.63027,-4.12976 -0.4717,-8.65084 0.47212,-12.80269 1.92628,-7.36287 4.47721,-14.59393 5.4687,-22.17201 1.61875,-9.40784 0.90381,-18.98034 0.67386,-28.46402 0.0272,-4.59278 0.1624,-9.30303 1.62515,-13.69592 1.66851,-4.34082 5.86829,-8.06645 10.70716,-7.90484 1.63738,-0.0259 3.25061,0.36424 4.79107,0.89107 z"
style="fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#a0a0a0;stroke-width:2.4000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@@ -12,4 +12,16 @@
<directory>test/IDF/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/IDF</directory>
<exclude>
<directory suffix=".php">src/IDF/Tests</directory>
<directory suffix=".php">src/IDF/conf</directory>
<file>src/IDF/version.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>

14
run-tests Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env php
<?php
$xmlfile = dirname(__FILE__) .'/test/report.xml';
passthru('phpunit --coverage-clover='.$xmlfile);
$xml = simplexml_load_string(file_get_contents($xmlfile));
unlink($xmlfile);
printf(
'>>> code coverage %s/%s (%s%%)'."\n",
$xml->project->metrics['coveredstatements'],
$xml->project->metrics['statements'],
round(($xml->project->metrics['coveredstatements']/(float)$xml->project->metrics['statements']) * 100.0, 2)
);

View File

@@ -23,14 +23,17 @@
import os
import sys
import commands
import traceback
import subprocess
SCRIPTDIR = os.path.abspath(__file__).rsplit(os.path.sep, 1)[0]
GITSERVEPHP = '%s/gitserve.php' % SCRIPTDIR
process = subprocess.Popen(['php', GITSERVEPHP, sys.argv[1]],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = str.encode("\n").join(process.communicate()).strip()
status = process.wait()
n = len("/gitserve.py")
GITSERVEPHP = '%s/gitserve.php' % traceback.extract_stack(limit=1)[0][0][0:-n]
status, output = commands.getstatusoutput('php %s %s' % (GITSERVEPHP, sys.argv[1]))
if status == 0:
os.execvp('git', ['git', 'shell', '-c', output.strip()])
else:
sys.stderr.write("%s\n" % output)
sys.stderr.write("%s\n" % output.strip())
sys.exit(1)

View File

@@ -0,0 +1,140 @@
<?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) 2008-2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* Configuration of the project.
*/
class IDF_Form_ProjectConf extends Pluf_Form
{
public $project = null;
public function initFields($extra=array())
{
$this->project = $extra['project'];
// Basic part
$this->fields['name'] = new Pluf_Form_Field_Varchar(array('required' => true,
'label' => __('Name'),
'initial' => $this->project->name,
));
$this->fields['shortdesc'] = new Pluf_Form_Field_Varchar(array('required' => true,
'label' => __('Short Description'),
'initial' => $this->project->shortdesc,
'widget_attrs' => array('size' => '68'),
));
$this->fields['description'] = new Pluf_Form_Field_Varchar(array('required' => true,
'label' => __('Description'),
'initial' => $this->project->description,
'widget_attrs' => array('cols' => 68,
'rows' => 26,
),
'widget' => 'Pluf_Form_Widget_TextareaInput',
));
// Logo part
$upload_path = Pluf::f('upload_path', false);
if (false === $upload_path) {
throw new Pluf_Exception_SettingError(__('The "upload_path" configuration variable was not set.'));
}
$upload_path .= '/' . $this->project->shortname;
$filename = '/%s';
$this->fields['logo'] = new Pluf_Form_Field_File(array('required' => false,
'label' => __('Update the logo'),
'initial' => '',
'help_text' => __('The logo must be a picture with a size of 32 by 32.'),
'max_size' => Pluf::f('max_upload_size', 5 * 1024),
'move_function_params' =>
array('upload_path' => $upload_path,
'upload_path_create' => true,
'file_name' => $filename,
)
));
$this->fields['logo_remove'] = new Pluf_Form_Field_Boolean(array('required' => false,
'label' => __('Remove the current logo'),
'initial' => false,
'widget' => 'Pluf_Form_Widget_CheckboxInput',
));
}
/**
* If we have uploaded a file, but the form failed remove it.
*
*/
function failed()
{
if (!empty($this->cleaned_data['logo'])
&& file_exists(Pluf::f('upload_path').'/'.$this->cleaned_data['logo'])) {
unlink(Pluf::f('upload_path').'/'.$this->cleaned_data['logo']);
}
}
public function clean()
{
if (!isset($this->cleaned_data['logo_remove'])) {
$this->cleaned_data['logo_remove'] = false;
}
return $this->cleaned_data;
}
public function clean_logo()
{
if (empty($this->cleaned_data['logo'])) {
return '';
}
$meta = getimagesize(Pluf::f('upload_path') . '/' . $this->project->shortname . $this->cleaned_data['logo']);
if ($meta === false) {
throw new Pluf_Form_Invalid("Could not determine the size of the uploaded picture.");
}
if ($meta[0] !== 32 || $meta[1] !== 32) {
throw new Pluf_Form_Invalid("The picture must have a size of 32 by 32.");
}
return $this->cleaned_data['logo'];
}
public function save($commit=true)
{
$conf = $this->project->getConf();
// Basic part
$this->project->name = $this->cleaned_data['name'];
$this->project->shortdesc = $this->cleaned_data['shortdesc'];
$this->project->description = $this->cleaned_data['description'];
$this->project->update();
// Logo part
if ($this->cleaned_data['logo'] !== "") {
$conf->setVal('logo', $this->cleaned_data['logo']);
}
if ($this->cleaned_data['logo_remove'] === true) {
@unlink(Pluf::f('upload_path') . '/' . $this->project->shortname . $conf->getVal('logo'));
$conf->delVal('logo');
}
}
}

View File

@@ -53,6 +53,7 @@ function IDF_Migrations_Backup_run($folder, $name=null)
'IDF_Scm_Cache_Git',
'IDF_Queue',
'IDF_Gconf',
'IDF_EmailAddress',
);
$db = Pluf::db();
// Now, for each table, we dump the content in json, this is a
@@ -98,6 +99,7 @@ function IDF_Migrations_Backup_restore($folder, $name)
'IDF_Scm_Cache_Git',
'IDF_Queue',
'IDF_Gconf',
'IDF_EmailAddress',
);
$db = Pluf::db();
$schema = new Pluf_DB_Schema($db);

View File

@@ -463,7 +463,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
* @param string Prefix ('git-repo-dump')
* @return Pluf_HTTP_Response The HTTP response containing the zip archive
*/
protected function getArchiveStream($commit, $prefix='')
public function getArchiveStream($commit, $prefix='')
{
$cmd = sprintf(Pluf::f('idf_exec_cmd_prefix', '').
Pluf::f('hg_path', 'hg').' archive --type=zip -R %s -r %s -',

View File

@@ -36,12 +36,12 @@ class IDF_Scm_Monotone extends IDF_Scm
private static $instances = array();
/**
* @see IDF_Scm::__construct()
* Constructor
*/
public function __construct($project)
public function __construct(IDF_Project $project, IDF_Scm_Monotone_IStdio $stdio)
{
$this->project = $project;
$this->stdio = new IDF_Scm_Monotone_Stdio($project);
$this->stdio = $stdio;
}
/**
@@ -458,8 +458,9 @@ class IDF_Scm_Monotone extends IDF_Scm
public static function factory($project)
{
if (!array_key_exists($project->shortname, self::$instances)) {
$stdio = new IDF_Scm_Monotone_Stdio($project);
self::$instances[$project->shortname] =
new IDF_Scm_Monotone($project);
new IDF_Scm_Monotone($project, $stdio);
}
return self::$instances[$project->shortname];
}

View File

@@ -21,6 +21,8 @@
#
# ***** END LICENSE BLOCK ***** */
require_once 'IDF/Scm/Exception.php';
/**
* Utility class to parse and compile basic_io stanzas
*
@@ -31,6 +33,11 @@ class IDF_Scm_Monotone_BasicIO
/**
* Parses monotone's basic_io format
*
* Known quirks:
* - does not handle multi-values starting with a hash '[]' (no known output)
* - does not validate hashes (should be /[0-9a-f]{40}/i)
* - does not handle forbidden \0
*
* @param string $in
* @return array of arrays
*/
@@ -54,50 +61,56 @@ class IDF_Scm_Monotone_BasicIO
$stanzaLine['key'] .= $ch;
}
// symbol w/o a value list
if ($pos >= $length || $in[$pos] == "\n") break;
if ($in[$pos] == '[') {
// ensure we don't look at a symbol w/o a value list
if ($pos >= $length || $in[$pos] == "\n") {
unset($stanzaLine['values']);
++$pos; // opening square bracket
$stanzaLine['hash'] = substr($in, $pos, 40);
$pos += 40;
++$pos; // closing square bracket
}
else
{
unset($stanzaLine['hash']);
$valCount = 0;
// if hashs and plain values are encountered in the same
// value list, we add the hash values as simple values as well
while ($in[$pos] == '"' || $in[$pos] == '[') {
$isHashValue = $in[$pos] == '[';
++$pos; // opening quote / bracket
$stanzaLine['values'][$valCount] = '';
while ($pos < $length) {
$ch = $in[$pos]; $pr = $in[$pos-1];
if (($isHashValue && $ch == ']')
||(!$isHashValue && $ch == '"' && $pr != '\\'))
break;
}
else {
if ($in[$pos] == '[') {
unset($stanzaLine['values']);
++$pos; // opening square bracket
while ($pos < $length && $in[$pos] != ']') {
$stanzaLine['hash'] .= $in[$pos];
++$pos;
$stanzaLine['values'][$valCount] .= $ch;
}
++$pos; // closing quote
++$pos; // closing square bracket
}
else
{
unset($stanzaLine['hash']);
$valCount = 0;
// if hashs and plain values are encountered in the same
// value list, we add the hash values as simple values as well
while ($in[$pos] == '"' || $in[$pos] == '[') {
$isHashValue = $in[$pos] == '[';
++$pos; // opening quote / bracket
$stanzaLine['values'][$valCount] = '';
while ($pos < $length) {
$ch = $in[$pos]; $pr = $in[$pos-1];
if (($isHashValue && $ch == ']')
||(!$isHashValue && $ch == '"' && $pr != '\\'))
break;
++$pos;
$stanzaLine['values'][$valCount] .= $ch;
}
++$pos; // closing quote
if (!$isHashValue) {
$stanzaLine['values'][$valCount] = str_replace(
array("\\\\", "\\\""),
array("\\", "\""),
$stanzaLine['values'][$valCount]
);
}
if (!$isHashValue) {
$stanzaLine['values'][$valCount] = str_replace(
array("\\\\", "\\\""),
array("\\", "\""),
$stanzaLine['values'][$valCount]
);
}
if ($pos >= $length)
break;
if ($pos >= $length)
break;
if ($in[$pos] == ' ') {
++$pos; // space
++$valCount;
if ($in[$pos] == ' ') {
++$pos; // space
++$valCount;
}
}
}
}
@@ -114,6 +127,12 @@ class IDF_Scm_Monotone_BasicIO
/**
* Compiles monotone's basicio format
*
* Known quirks:
* - does not validate keys for /[a-z_]+/
* - does not validate hashes (should be /[0-9a-f]{40}/i)
* - does not support intermixed value / hash formats
* - does not handle forbidden \0
*
* @param array $in Array of arrays
* @return string
*/
@@ -129,7 +148,7 @@ class IDF_Scm_Monotone_BasicIO
$maxkeylength = 0;
foreach ((array)$stanza as $lx => $line) {
if (!array_key_exists('key', $line)) {
if (!array_key_exists('key', $line) || empty($line['key'])) {
throw new IDF_Scm_Exception(
'"key" not found in basicio stanza '.$sx.', line '.$lx
);
@@ -157,13 +176,6 @@ class IDF_Scm_Monotone_BasicIO
$value).'"';
}
}
else
{
throw new IDF_Scm_Exception(
'neither "hash" nor "values" found in basicio '.
'stanza '.$sx.', line '.$lx
);
}
$out .= "\n";
}

View File

@@ -0,0 +1,66 @@
<?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 ***** */
/**
* Monotone stdio interface
*
* @author Thomas Keller <me@thomaskeller.biz>
*/
interface IDF_Scm_Monotone_IStdio
{
/**
* Constructor
*/
public function __construct(IDF_Project $project);
/**
* Starts the stdio process and resets the command counter
*/
public function start();
/**
* Stops the stdio process and closes all pipes
*/
public function stop();
/**
* Executes a command over stdio and returns its result
*
* @param array Array of arguments
* @param array Array of options as key-value pairs. Multiple options
* can be defined in sub-arrays, like
* "r" => array("123...", "456...")
* @return string
*/
public function exec(array $args, array $options = array());
/**
* Returns the last out-of-band output for a previously executed
* command as associative array with 'e' (error), 'w' (warning),
* 'p' (progress) and 't' (ticker, unparsed) as keys
*
* @return array
*/
public function getLastOutOfBandOutput();
}

View File

@@ -21,6 +21,8 @@
#
# ***** END LICENSE BLOCK ***** */
require_once 'IDF/Scm/Monotone/IStdio.php';
/**
* Monotone stdio class
*
@@ -29,7 +31,7 @@
*
* @author Thomas Keller <me@thomaskeller.biz>
*/
class IDF_Scm_Monotone_Stdio
class IDF_Scm_Monotone_Stdio implements IDF_Scm_Monotone_IStdio
{
/** this is the most recent STDIO version. The number is output
at the protocol start. Older versions of monotone (prior 0.47)
@@ -68,7 +70,7 @@ class IDF_Scm_Monotone_Stdio
*
* @return string
*/
public function _getAuthOptions()
private function _getAuthOptions()
{
$prjconf = $this->project->getConf();
$name = $prjconf->getVal('mtn_client_key_name', false);

View File

@@ -45,7 +45,7 @@ class IDF_Scm_Monotone_ZipRender extends Pluf_HTTP_Response
private $stdio = null;
private $revision = null;
function __construct($stdio, $revision)
function __construct(IDF_Scm_Monotone_IStdio $stdio, $revision)
{
parent::__construct($revision, 'application/x-zip');
$this->stdio = $stdio;
@@ -60,6 +60,26 @@ class IDF_Scm_Monotone_ZipRender extends Pluf_HTTP_Response
$this->outputHeaders();
if ($output_body) {
$certs = $this->stdio->exec(array('certs', $this->revision));
$stanzas = IDF_Scm_Monotone_BasicIO::parse($certs);
// use the revision's date (if there is one) as timestamp
// for all file entries
$timestamp = time();
foreach ($stanzas as $stanza) {
$next_is_date = false;
foreach ($stanza as $line) {
if ($line['key'] == 'name' && $line['values'][0] == 'date') {
$next_is_date = true;
continue;
}
if ($next_is_date && $line['key'] == 'value') {
$timestamp = strtotime($line['values'][0]);
break;
}
}
}
$manifest = $this->stdio->exec(array('get_manifest_of', $this->revision));
$stanzas = IDF_Scm_Monotone_BasicIO::parse($manifest);
@@ -69,7 +89,11 @@ class IDF_Scm_Monotone_ZipRender extends Pluf_HTTP_Response
if ($stanza[0]['key'] != 'file')
continue;
$content = $this->stdio->exec(array('get_file', $stanza[1]['hash']));
$zip->add_file($stanza[0]['values'][0], $content);
$zip->add_file(
$stanza[0]['values'][0],
$content,
array('time' => $timestamp)
);
}
$zip->finish();

View File

@@ -31,6 +31,25 @@ Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel');
*/
class IDF_Views_Project
{
/**
* Home page of a project.
*/
public $logo_precond = array('IDF_Precondition::baseAccess');
public function logo($request, $match)
{
$prj = $request->project;
$logo = $prj->getConf()->getVal('logo');
if (empty($logo)) {
$url = Pluf::f('url_media') . '/idf/img/no_logo.png';
return new Pluf_HTTP_Response_Redirect($url);
}
$info = IDF_FileUtil::getMimeType($logo);
return new Pluf_HTTP_Response_File(Pluf::f('upload_path') . '/' . $prj->shortname . $logo,
$info[0]);
}
/**
* Home page of a project.
*/
@@ -62,20 +81,26 @@ class IDF_Views_Project
}
/**
* Returns an associative array with available model filters
* Returns an associative array with all accessible model filters
*
* @return array
*/
private static function getAvailableModelFilters()
private static function getAccessibleModelFilters($request)
{
return array(
'all' => __('All Updates'),
'commits' => __('Commits'),
'issues' => __('Issues and Comments'),
'downloads' => __('Downloads'),
'documents' => __('Documents'),
'reviews' => __('Reviews and Patches'),
);
$filters = array('all' => __('All Updates'));
if (true === IDF_Precondition::accessSource($request))
$filters['commits'] = __('Commits');
if (true === IDF_Precondition::accessIssues($request))
$filters['issues'] = __('Issues and Comments');
if (true === IDF_Precondition::accessDownloads($request))
$filters['downloads'] = __('Downloads');
if (true === IDF_Precondition::accessWiki($request))
$filters['documents'] = __('Documents');
if (true === IDF_Precondition::accessReview($request))
$filters['reviews'] = __('Reviews and Patches');
return $filters;
}
/**
@@ -141,11 +166,11 @@ class IDF_Views_Project
$prj = $request->project;
$model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters();
if (!array_key_exists($model_filter, $all_model_filters)) {
$accessible_model_filters = self::getAccessibleModelFilters($request);
if (!array_key_exists($model_filter, $accessible_model_filters)) {
$model_filter = 'all';
}
$title = (string)$prj . ' ' . $all_model_filters[$model_filter];
$title = (string)$prj . ' ' . $accessible_model_filters[$model_filter];
$pag = new IDF_Timeline_Paginator(new IDF_Timeline());
$pag->class = 'recent-issues';
@@ -183,7 +208,7 @@ class IDF_Views_Project
'feedurl' => $feedurl,
'timeline' => $pag,
'model_filter' => $model_filter,
'all_model_filters' => $all_model_filters,
'accessible_model_filters' => $accessible_model_filters,
),
$request);
@@ -214,11 +239,11 @@ class IDF_Views_Project
$prj = $request->project;
$model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters();
if (!array_key_exists($model_filter, $all_model_filters)) {
$accessible_model_filters = self::getAccessibleModelFilters($request);
if (!array_key_exists($model_filter, $accessible_model_filters)) {
$model_filter = 'all';
}
$title = $all_model_filters[$model_filter];
$title = $accessible_model_filters[$model_filter];
$classes = self::determineModelClasses($request, $model_filter);
$sqls = sprintf('model_class IN (%s)', implode(', ', $classes));
@@ -267,29 +292,29 @@ class IDF_Views_Project
{
$prj = $request->project;
$title = sprintf(__('%s Project Summary'), (string) $prj);
$form_fields = array('fields'=> array('name', 'shortdesc',
'description'));
$extra = array('project' => $prj);
if ($request->method == 'POST') {
$form = Pluf_Shortcuts_GetFormForModel($prj, $request->POST,
$form_fields);
$form = new IDF_Form_ProjectConf(array_merge($request->POST,
$request->FILES),
$extra);
if ($form->isValid()) {
$prj = $form->save();
$form->save();
$request->user->setMessage(__('The project has been updated.'));
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::admin',
array($prj->shortname));
return new Pluf_HTTP_Response_Redirect($url);
}
} else {
$form = Pluf_Shortcuts_GetFormForModel($prj, $prj->getData(),
$form_fields);
$form = new IDF_Form_ProjectConf($prj->getData(), $extra);
}
$form->fields['description']->widget->attrs['cols'] = 68;
$form->fields['description']->widget->attrs['rows'] = 26;
$form->fields['shortdesc']->widget->attrs['size'] = 67;
$logo = $prj->getConf()->getVal('logo');
return Pluf_Shortcuts_RenderToResponse('idf/admin/summary.html',
array(
'page_title' => $title,
'form' => $form,
'project' => $prj,
'logo' => $logo,
),
$request);
}

View File

@@ -74,6 +74,11 @@ $ctl[] = array('regex' => '#^/p/([\-\w]+)/$#',
'model' => 'IDF_Views_Project',
'method' => 'home');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/logo/$#',
'base' => $base,
'model' => 'IDF_Views_Project',
'method' => 'logo');
$ctl[] = array('regex' => '#^/p/([\-\w]+)/timeline/(\w+)/$#',
'base' => $base,
'model' => 'IDF_Views_Project',

File diff suppressed because it is too large Load Diff

View File

@@ -7,10 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: Indefero\n"
"Report-Msgid-Bugs-To: http://projects.ceondo.com/p/indefero/issues/\n"
"POT-Creation-Date: 2011-03-18 23:30+0100\n"
"PO-Revision-Date: 2011-03-19 11:00+0000\n"
"POT-Creation-Date: 2011-03-28 01:13+0200\n"
"PO-Revision-Date: 2011-03-28 14:19+0000\n"
"Last-Translator: Mika <mikados.mikados@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language-Team: Mika <mikados.mikados@gmail.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -751,7 +751,9 @@ msgstr "Saber más sobre <a href=\"%s\">WebHooks post-commit</a>."
#: IDF/Form/TabsConf.php:38 IDF/gettexttemplates/idf/admin/base.html.php:4
#: IDF/gettexttemplates/idf/base-full.html.php:5
#: IDF/gettexttemplates/idf/base-full.html~.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/gadmin/projects/delete.html.php:14
#: IDF/Views/Project.php:75
@@ -759,24 +761,32 @@ msgid "Downloads"
msgstr "Descargas"
#: 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.php:9
#: IDF/gettexttemplates/idf/base.html~.php:9
msgid "Code Review"
msgstr "Revisión del Código"
#: IDF/Form/TabsConf.php:40 IDF/gettexttemplates/idf/admin/base.html.php:5
#: IDF/gettexttemplates/idf/base-full.html.php:6
#: IDF/gettexttemplates/idf/base-full.html~.php:6
#: IDF/gettexttemplates/idf/base.html.php:6
#: IDF/gettexttemplates/idf/base.html~.php:6
msgid "Documentation"
msgstr "Documentación"
#: IDF/Form/TabsConf.php:41 IDF/gettexttemplates/idf/admin/base.html.php:7
#: IDF/gettexttemplates/idf/base-full.html.php:8
#: IDF/gettexttemplates/idf/base-full.html~.php:8
#: IDF/gettexttemplates/idf/base.html.php:8
#: IDF/gettexttemplates/idf/base.html~.php:8
msgid "Source"
msgstr "Fuentes"
#: 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.php:7
#: IDF/gettexttemplates/idf/base.html~.php:7
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:17
msgid "Issues"
msgstr "Tickets"
@@ -1248,7 +1258,9 @@ msgid "Instructions:"
msgstr "Instrucciones:"
#: IDF/gettexttemplates/idf/base-full.html.php:3
#: IDF/gettexttemplates/idf/base-full.html~.php:3
#: IDF/gettexttemplates/idf/base.html.php:3
#: IDF/gettexttemplates/idf/base.html~.php:3
#, php-format
msgid ""
"<a href=\"%%url%%\">Sign in or create your account</a> to create issues or "
@@ -1258,12 +1270,16 @@ msgstr ""
"añadir comentarios"
#: IDF/gettexttemplates/idf/base-full.html.php:4
#: IDF/gettexttemplates/idf/base-full.html~.php:4
#: IDF/gettexttemplates/idf/base.html.php:4
#: IDF/gettexttemplates/idf/base.html~.php:4
msgid "Project Home"
msgstr "Inicio del Proyecto"
#: IDF/gettexttemplates/idf/base-full.html.php:10
#: IDF/gettexttemplates/idf/base-full.html~.php:10
#: IDF/gettexttemplates/idf/base.html.php:10
#: IDF/gettexttemplates/idf/base.html~.php:10
msgid "Project Management"
msgstr "Gestión de Proyecto"
@@ -1296,6 +1312,7 @@ msgstr ""
#: IDF/gettexttemplates/idf/downloads/delete.html.php:5
#: IDF/gettexttemplates/idf/downloads/view.html.php:4
#: IDF/gettexttemplates/idf/issues/attachment.html.php:4
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:7
#: IDF/gettexttemplates/idf/issues/view.html.php:7
#: IDF/gettexttemplates/idf/wiki/delete.html.php:7
#: IDF/gettexttemplates/idf/wiki/delete.html.php:8
@@ -1319,9 +1336,11 @@ msgstr "Eliminar archivo"
#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:5
#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:14
#: IDF/gettexttemplates/idf/issues/create.html.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:25
#: IDF/gettexttemplates/idf/issues/view.html.php:25
#: IDF/gettexttemplates/idf/register/confirmation.html.php:7
#: IDF/gettexttemplates/idf/register/index.html.php:7
#: IDF/gettexttemplates/idf/register/index.html.php:8
#: IDF/gettexttemplates/idf/register/index.html~.php:7
#: IDF/gettexttemplates/idf/register/inputkey.html.php:5
#: IDF/gettexttemplates/idf/review/create.html.php:12
#: IDF/gettexttemplates/idf/review/view.html.php:43
@@ -1344,6 +1363,7 @@ msgstr "Subido por:"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:9
#: IDF/gettexttemplates/idf/downloads/view.html.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:27
#: IDF/gettexttemplates/idf/issues/view.html.php:27
#: IDF/gettexttemplates/idf/review/view.html.php:26
#: IDF/gettexttemplates/idf/wiki/delete.html.php:12
@@ -1366,6 +1386,8 @@ msgstr "Descargas:"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:9
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:10
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:15
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:20
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:31
#: IDF/gettexttemplates/idf/issues/view.html.php:20
#: IDF/gettexttemplates/idf/issues/view.html.php:31
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:6
@@ -1515,6 +1537,7 @@ msgstr "Aquí estamos, para ayudarte."
#: IDF/gettexttemplates/idf/faq-api.html.php:4
#: 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/Views.php:47
msgid "Projects"
@@ -1639,10 +1662,12 @@ msgid "<kbd>Alt+4</kbd>: Search (when available)."
msgstr "<kbd>Alt+4</kbd>: Búsqueda (cuando esté disponible)."
#: IDF/gettexttemplates/idf/gadmin/base.html.php:4
#: IDF/gettexttemplates/idf/gadmin/base.html~.php:4
msgid "People"
msgstr "Personas"
#: IDF/gettexttemplates/idf/gadmin/base.html.php:5
#: IDF/gettexttemplates/idf/gadmin/base.html~.php:5
msgid "Usher"
msgstr "Usher"
@@ -2097,6 +2122,7 @@ msgstr "Archivo adjunto al ticket <a href=\"%%url%%\">%%issue.id%%</a>"
#: IDF/gettexttemplates/idf/issues/attachment.html.php:5
#: IDF/gettexttemplates/idf/review/view.html.php:34
#: IDF/gettexttemplates/idf/source/commit.html.php:22
#: IDF/gettexttemplates/idf/source/commit.html~.php:22
#: IDF/gettexttemplates/idf/source/git/file.html.php:6
#: IDF/gettexttemplates/idf/source/git/tree.html.php:11
#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:6
@@ -2116,6 +2142,7 @@ msgid "Download this file"
msgstr "Descargar este archivo"
#: IDF/gettexttemplates/idf/issues/attachment.html.php:7
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:26
#: IDF/gettexttemplates/idf/issues/view.html.php:26
#: IDF/gettexttemplates/idf/review/view.html.php:25
#: IDF/gettexttemplates/idf/wiki/delete.html.php:11
@@ -2198,6 +2225,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/issues/create.html.php:11
#: IDF/gettexttemplates/idf/issues/create.html.php:13
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:22
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:24
#: IDF/gettexttemplates/idf/issues/view.html.php:22
#: IDF/gettexttemplates/idf/issues/view.html.php:24
#: IDF/gettexttemplates/idf/wiki/create.html.php:5
@@ -2210,12 +2239,15 @@ msgid "Submit Issue"
msgstr "Enviar Ticket"
#: IDF/gettexttemplates/idf/issues/create.html.php:15
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:32
#: IDF/gettexttemplates/idf/issues/view.html.php:32
msgid "Attach file"
msgstr "Adjuntar archivo"
#: IDF/gettexttemplates/idf/issues/create.html.php:16
#: IDF/gettexttemplates/idf/issues/create.html.php:17
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:33
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:34
#: IDF/gettexttemplates/idf/issues/view.html.php:33
#: IDF/gettexttemplates/idf/issues/view.html.php:34
msgid "Attach another file"
@@ -2223,6 +2255,7 @@ msgstr "Adjuntar otro archivo"
#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:12
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:17
#: IDF/gettexttemplates/idf/issues/view.html.php:17
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/review/view.html.php:40
@@ -2236,6 +2269,8 @@ msgstr "Resumen:"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:7
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:7
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:13
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:18
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:28
#: IDF/gettexttemplates/idf/issues/view.html.php:18
#: IDF/gettexttemplates/idf/issues/view.html.php:28
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:4
@@ -2247,6 +2282,8 @@ msgstr "Estado:"
#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:5
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:19
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:29
#: IDF/gettexttemplates/idf/issues/view.html.php:19
#: IDF/gettexttemplates/idf/issues/view.html.php:29
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:5
@@ -2339,11 +2376,13 @@ msgstr "Tickets en curso:"
msgid "Found issues:"
msgstr "Tickets encontrados:"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:3
#: IDF/gettexttemplates/idf/issues/view.html.php:3
#, php-format
msgid "Reported by %%submitter%%, %%c.creation_dtime%%"
msgstr "Reportado por %%submitter%%, %%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:4
#: IDF/gettexttemplates/idf/issues/view.html.php:4
#: IDF/gettexttemplates/idf/review/view.html.php:22
#, php-format
@@ -2353,11 +2392,13 @@ msgstr ""
"Comentario <a href=\"%%url%%\">%%i%%</a> por %%submitter%%, "
"%%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:5
#: IDF/gettexttemplates/idf/issues/view.html.php:5
#, php-format
msgid "<a href=\"%%url%%\">Sign in</a> to reply to this comment."
msgstr "<a href=\"%%url%%\">Accede</a> para contestar a este comentario."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:6
#: IDF/gettexttemplates/idf/issues/view.html.php:6
msgid ""
"This issue is marked as closed, add a comment only if you think this issue "
@@ -2367,6 +2408,7 @@ msgstr ""
"este problema sigue activo y se necesita más trabajo hasta su completa "
"revisión."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:8
#: IDF/gettexttemplates/idf/issues/view.html.php:8
#, php-format
msgid "%%interested%% person"
@@ -2374,38 +2416,55 @@ msgid_plural "%%interested%% persons"
msgstr[0] "%%interested%% persona"
msgstr[1] "%%interested%% personas"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:9
#: IDF/gettexttemplates/idf/issues/view.html.php:9
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:3
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:7
msgid "Remove this issue from your watch list"
msgstr "Eliminar este ticket de mi lista de seguimiento"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:10
#: IDF/gettexttemplates/idf/issues/view.html.php:10
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:4
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:8
msgid "Add this issue to your watch list"
msgstr "Añadir este ticket a mi lista de seguimiento"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:11
#: IDF/gettexttemplates/idf/issues/view.html.php:11
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:5
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:9
msgid "Click here to view the previous closed issue"
msgstr "Haga clic aquí para ver el anterior ticket cerrado"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:12
#: IDF/gettexttemplates/idf/issues/view.html.php:12
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:6
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:10
msgid "Click here to view the previous open issue"
msgstr "Haga clic aquí para ver el anterior ticket abierto"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:13
#: IDF/gettexttemplates/idf/issues/view.html.php:13
msgid "Click here to view the next closed issue"
msgstr "Haga clic aquí para ver la siguiente ticket cerrado"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:14
#: IDF/gettexttemplates/idf/issues/view.html.php:14
msgid "Click here to view the next open issue"
msgstr "Haga clic aquí para ver la siguiente ticket abierto"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:15
#: IDF/gettexttemplates/idf/issues/view.html.php:15
msgid "download"
msgstr "descarga"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:16
#: IDF/gettexttemplates/idf/issues/view.html.php:16
msgid "view"
msgstr "ver"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:21
#: IDF/gettexttemplates/idf/issues/view.html.php:21
msgid ""
"The form contains some errors. Please correct them to change the issue."
@@ -2413,10 +2472,12 @@ msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para "
"actualizar el ticket."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:23
#: IDF/gettexttemplates/idf/issues/view.html.php:23
msgid "Submit Changes"
msgstr "Enviar cambios"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:30
#: IDF/gettexttemplates/idf/issues/view.html.php:30
msgid "Followed by:"
msgstr "Seguido por:"
@@ -2614,6 +2675,7 @@ msgstr ""
"activadas</strong> para identificarte."
#: IDF/gettexttemplates/idf/register/index.html.php:3
#: IDF/gettexttemplates/idf/register/index.html~.php:3
msgid ""
"Read the <a id=\"showterms\" href=\"#theterms\">terms and conditions</a> "
"&ndash; basically <em>\"Please be nice, we respect you\"</em>."
@@ -2624,6 +2686,18 @@ msgstr ""
#: IDF/gettexttemplates/idf/register/index.html.php:4
#, php-format
msgid ""
"If you have just forgotten your login information, then there is no need to "
"create a new account. Just go <a href=\"%%url%%\">here</a> to recover your "
"login name and password."
msgstr ""
"Si ha olvidado los datos de acceso, entonces no tiene porque crear una nueva"
" cuenta. Simplemente haga click <a href=\"%%url%%\">aquí</a> para recuperar "
"su nombre de usuario y contraseña."
#: IDF/gettexttemplates/idf/register/index.html.php:5
#: IDF/gettexttemplates/idf/register/index.html~.php:4
#, php-format
msgid ""
"With your account, you will able to participate in the life of all the "
"projects hosted here. Participating in a software project must be fun, so if"
" you have troubles, you can <a href=\"%%url%%\">let us know about your "
@@ -2635,17 +2709,20 @@ msgstr ""
"href=\"%%url%%\">¡hacernos saber cuáles son sus inquietudes en cualquier "
"momento</a>!"
#: IDF/gettexttemplates/idf/register/index.html.php:5
#: IDF/gettexttemplates/idf/register/index.html.php:6
#: IDF/gettexttemplates/idf/register/index.html~.php:5
msgid "Oops, please check the provided login and email address to register."
msgstr ""
"Oups, por favor comprueba el nombre de usuario y dirección de correo "
"electrónico de registro."
#: IDF/gettexttemplates/idf/register/index.html.php:6 IDF/Views.php:90
#: IDF/gettexttemplates/idf/register/index.html.php:7
#: IDF/gettexttemplates/idf/register/index.html~.php:6 IDF/Views.php:90
msgid "Create Your Account"
msgstr "Crea tu cuenta"
#: IDF/gettexttemplates/idf/register/index.html.php:8
#: IDF/gettexttemplates/idf/register/index.html.php:9
#: IDF/gettexttemplates/idf/register/index.html~.php:8
msgid ""
"Be sure to provide a valid email address, as we are sending a validation "
"link by email."
@@ -2653,7 +2730,8 @@ msgstr ""
"Asegúrese de proporcionar una dirección válida de correo electrónico, ya que"
" se enviará un enlace de confirmación por correo electrónico."
#: IDF/gettexttemplates/idf/register/index.html.php:9
#: IDF/gettexttemplates/idf/register/index.html.php:10
#: IDF/gettexttemplates/idf/register/index.html~.php:9
msgid "Did you know?"
msgstr "¿Sabía que?"
@@ -2760,6 +2838,7 @@ msgstr "Comentarios detallados del archivo (más reciente primero):"
#: IDF/gettexttemplates/idf/review/view.html.php:3
#: IDF/gettexttemplates/idf/source/commit.html.php:3
#: IDF/gettexttemplates/idf/source/commit.html~.php:3
#, php-format
msgid "%%ndiff%% diff"
msgid_plural "%%ndiff%% diffs"
@@ -2835,17 +2914,20 @@ msgstr ""
#: IDF/gettexttemplates/idf/review/view.html.php:27
#: IDF/gettexttemplates/idf/source/commit.html.php:5
#: IDF/gettexttemplates/idf/source/commit.html~.php:5
msgid "Author:"
msgstr "Autor:"
#: IDF/gettexttemplates/idf/review/view.html.php:28
#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:5
#: IDF/gettexttemplates/idf/source/commit.html.php:7
#: IDF/gettexttemplates/idf/source/commit.html~.php:7
msgid "Commit:"
msgstr "Commit:"
#: IDF/gettexttemplates/idf/review/view.html.php:29
#: IDF/gettexttemplates/idf/source/commit.html.php:8
#: IDF/gettexttemplates/idf/source/commit.html~.php:8
msgid "View corresponding source tree"
msgstr "Ver código fuente correspondiente"
@@ -2863,6 +2945,7 @@ msgstr "Archivos:"
#: IDF/gettexttemplates/idf/review/view.html.php:35
#: IDF/gettexttemplates/idf/source/commit.html.php:23
#: IDF/gettexttemplates/idf/source/commit.html~.php:23
msgid "Download the corresponding diff file"
msgstr "Descargue el correspondiente archivo diff"
@@ -2921,6 +3004,7 @@ msgstr "Padres:"
#: IDF/gettexttemplates/idf/source/changelog.html.php:6
#: IDF/gettexttemplates/idf/source/commit.html.php:10
#: IDF/gettexttemplates/idf/source/commit.html~.php:10
msgid "View corresponding commit"
msgstr "Ver commit correspondiente"
@@ -2952,57 +3036,71 @@ msgid "Commit details:"
msgstr "Detalles del commit:"
#: IDF/gettexttemplates/idf/source/commit.html.php:4
#: IDF/gettexttemplates/idf/source/commit.html~.php:4
msgid "Date:"
msgstr "Fecha:"
#: IDF/gettexttemplates/idf/source/commit.html.php:6
#: IDF/gettexttemplates/idf/source/commit.html~.php:6
msgid "Branch:"
msgstr "Branch:"
#: IDF/gettexttemplates/idf/source/commit.html.php:9
#: IDF/gettexttemplates/idf/source/commit.html~.php:9
msgid "Parents:"
msgstr "Padres:"
#: IDF/gettexttemplates/idf/source/commit.html.php:11
#: IDF/gettexttemplates/idf/source/commit.html~.php:11
msgid "Message:"
msgstr "Mensaje:"
#: IDF/gettexttemplates/idf/source/commit.html.php:12
#: IDF/gettexttemplates/idf/source/commit.html~.php:12
#: IDF/gettexttemplates/idf/wiki/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:10
msgid "Changes:"
msgstr "Cambios:"
#: IDF/gettexttemplates/idf/source/commit.html.php:13
#: IDF/gettexttemplates/idf/source/commit.html~.php:13
msgid "deleted"
msgstr "eliminado"
#: IDF/gettexttemplates/idf/source/commit.html.php:14
#: IDF/gettexttemplates/idf/source/commit.html.php:17
#: IDF/gettexttemplates/idf/source/commit.html~.php:14
#: IDF/gettexttemplates/idf/source/commit.html~.php:17
msgid "full"
msgstr "completo"
#: IDF/gettexttemplates/idf/source/commit.html.php:15
#: IDF/gettexttemplates/idf/source/commit.html~.php:15
msgid "renamed"
msgstr "renombrado"
#: IDF/gettexttemplates/idf/source/commit.html.php:16
#: IDF/gettexttemplates/idf/source/commit.html~.php:16
msgid "added"
msgstr "añadido"
#: IDF/gettexttemplates/idf/source/commit.html.php:18
#: IDF/gettexttemplates/idf/source/commit.html~.php:18
msgid "modified"
msgstr "modificado"
#: IDF/gettexttemplates/idf/source/commit.html.php:19
#: IDF/gettexttemplates/idf/source/commit.html~.php:19
msgid "properies changed"
msgstr "propiedades modificadas"
#: IDF/gettexttemplates/idf/source/commit.html.php:20
#: IDF/gettexttemplates/idf/source/commit.html~.php:20
msgid "removed"
msgstr "eliminado"
#: IDF/gettexttemplates/idf/source/commit.html.php:21
#: IDF/gettexttemplates/idf/source/commit.html~.php:21
msgid "File differences"
msgstr "Diferencias de archivos"
@@ -4102,7 +4200,7 @@ msgstr "lcname"
msgid "Lower case version of the name for fast searching."
msgstr "Versión del nombre en minúscula para búsqueda rápida."
#: IDF/Template/Markdown.php:81
#: IDF/Template/Markdown.php:75
msgid "Create this documentation page"
msgstr "Crear esta página de documentación"

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Indefero\n"
"Report-Msgid-Bugs-To: http://projects.ceondo.com/p/indefero/issues/\n"
"POT-Creation-Date: 2011-03-18 23:30+0100\n"
"PO-Revision-Date: 2011-03-19 07:43+0000\n"
"POT-Creation-Date: 2011-03-28 01:13+0200\n"
"PO-Revision-Date: 2011-03-28 07:33+0000\n"
"Last-Translator: Delkia <wysman@gmail.com>\n"
"Language-Team: French <>\n"
"MIME-Version: 1.0\n"
@@ -765,7 +765,9 @@ 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/gettexttemplates/idf/base-full.html.php:5
#: IDF/gettexttemplates/idf/base-full.html~.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/gadmin/projects/delete.html.php:14
#: IDF/Views/Project.php:75
@@ -773,24 +775,32 @@ msgid "Downloads"
msgstr "Téléchargements"
#: 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.php:9
#: IDF/gettexttemplates/idf/base.html~.php:9
msgid "Code Review"
msgstr "Revue de code"
#: IDF/Form/TabsConf.php:40 IDF/gettexttemplates/idf/admin/base.html.php:5
#: IDF/gettexttemplates/idf/base-full.html.php:6
#: IDF/gettexttemplates/idf/base-full.html~.php:6
#: IDF/gettexttemplates/idf/base.html.php:6
#: IDF/gettexttemplates/idf/base.html~.php:6
msgid "Documentation"
msgstr "Documentation"
#: IDF/Form/TabsConf.php:41 IDF/gettexttemplates/idf/admin/base.html.php:7
#: IDF/gettexttemplates/idf/base-full.html.php:8
#: IDF/gettexttemplates/idf/base-full.html~.php:8
#: IDF/gettexttemplates/idf/base.html.php:8
#: IDF/gettexttemplates/idf/base.html~.php:8
msgid "Source"
msgstr "Source"
#: 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.php:7
#: IDF/gettexttemplates/idf/base.html~.php:7
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:17
msgid "Issues"
msgstr "Tickets"
@@ -1260,7 +1270,9 @@ msgid "Instructions:"
msgstr "Instructions :"
#: IDF/gettexttemplates/idf/base-full.html.php:3
#: IDF/gettexttemplates/idf/base-full.html~.php:3
#: IDF/gettexttemplates/idf/base.html.php:3
#: IDF/gettexttemplates/idf/base.html~.php:3
#, php-format
msgid ""
"<a href=\"%%url%%\">Sign in or create your account</a> to create issues or "
@@ -1270,12 +1282,16 @@ msgstr ""
"des tickets ou ajouter des commentaires"
#: IDF/gettexttemplates/idf/base-full.html.php:4
#: IDF/gettexttemplates/idf/base-full.html~.php:4
#: IDF/gettexttemplates/idf/base.html.php:4
#: IDF/gettexttemplates/idf/base.html~.php:4
msgid "Project Home"
msgstr "Page d'Accueil"
#: IDF/gettexttemplates/idf/base-full.html.php:10
#: IDF/gettexttemplates/idf/base-full.html~.php:10
#: IDF/gettexttemplates/idf/base.html.php:10
#: IDF/gettexttemplates/idf/base.html~.php:10
msgid "Project Management"
msgstr "Administration du projet"
@@ -1308,6 +1324,7 @@ msgstr ""
#: IDF/gettexttemplates/idf/downloads/delete.html.php:5
#: IDF/gettexttemplates/idf/downloads/view.html.php:4
#: IDF/gettexttemplates/idf/issues/attachment.html.php:4
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:7
#: IDF/gettexttemplates/idf/issues/view.html.php:7
#: IDF/gettexttemplates/idf/wiki/delete.html.php:7
#: IDF/gettexttemplates/idf/wiki/delete.html.php:8
@@ -1331,9 +1348,11 @@ msgstr "Supprimer le fichier"
#: IDF/gettexttemplates/idf/gadmin/users/create.html.php:5
#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:14
#: IDF/gettexttemplates/idf/issues/create.html.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:25
#: IDF/gettexttemplates/idf/issues/view.html.php:25
#: IDF/gettexttemplates/idf/register/confirmation.html.php:7
#: IDF/gettexttemplates/idf/register/index.html.php:7
#: IDF/gettexttemplates/idf/register/index.html.php:8
#: IDF/gettexttemplates/idf/register/index.html~.php:7
#: IDF/gettexttemplates/idf/register/inputkey.html.php:5
#: IDF/gettexttemplates/idf/review/create.html.php:12
#: IDF/gettexttemplates/idf/review/view.html.php:43
@@ -1356,6 +1375,7 @@ msgstr "Mis en ligne :"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:9
#: IDF/gettexttemplates/idf/downloads/view.html.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:27
#: IDF/gettexttemplates/idf/issues/view.html.php:27
#: IDF/gettexttemplates/idf/review/view.html.php:26
#: IDF/gettexttemplates/idf/wiki/delete.html.php:12
@@ -1378,6 +1398,8 @@ msgstr "Téléchargements :"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:9
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:10
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:15
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:20
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:31
#: IDF/gettexttemplates/idf/issues/view.html.php:20
#: IDF/gettexttemplates/idf/issues/view.html.php:31
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:6
@@ -1528,6 +1550,7 @@ msgstr "Nous sommes là, juste pour vous aider."
#: IDF/gettexttemplates/idf/faq-api.html.php:4
#: 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/Views.php:47
msgid "Projects"
@@ -1652,10 +1675,12 @@ msgid "<kbd>Alt+4</kbd>: Search (when available)."
msgstr "<kbd>Alt+4</kbd> : Chercher (si disponible)."
#: IDF/gettexttemplates/idf/gadmin/base.html.php:4
#: IDF/gettexttemplates/idf/gadmin/base.html~.php:4
msgid "People"
msgstr "Utilisateurs"
#: IDF/gettexttemplates/idf/gadmin/base.html.php:5
#: IDF/gettexttemplates/idf/gadmin/base.html~.php:5
msgid "Usher"
msgstr "Usher"
@@ -2106,6 +2131,7 @@ msgstr "Pièce jointe au ticket <a href=\"%%url%%\">%%issue.id%%</a>"
#: IDF/gettexttemplates/idf/issues/attachment.html.php:5
#: IDF/gettexttemplates/idf/review/view.html.php:34
#: IDF/gettexttemplates/idf/source/commit.html.php:22
#: IDF/gettexttemplates/idf/source/commit.html~.php:22
#: IDF/gettexttemplates/idf/source/git/file.html.php:6
#: IDF/gettexttemplates/idf/source/git/tree.html.php:11
#: IDF/gettexttemplates/idf/source/mercurial/file.html.php:6
@@ -2125,6 +2151,7 @@ msgid "Download this file"
msgstr "Télécharger ce fichier"
#: IDF/gettexttemplates/idf/issues/attachment.html.php:7
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:26
#: IDF/gettexttemplates/idf/issues/view.html.php:26
#: IDF/gettexttemplates/idf/review/view.html.php:25
#: IDF/gettexttemplates/idf/wiki/delete.html.php:11
@@ -2207,6 +2234,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/issues/create.html.php:11
#: IDF/gettexttemplates/idf/issues/create.html.php:13
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:22
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:24
#: IDF/gettexttemplates/idf/issues/view.html.php:22
#: IDF/gettexttemplates/idf/issues/view.html.php:24
#: IDF/gettexttemplates/idf/wiki/create.html.php:5
@@ -2219,12 +2248,15 @@ msgid "Submit Issue"
msgstr "Soumettre le ticket"
#: IDF/gettexttemplates/idf/issues/create.html.php:15
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:32
#: IDF/gettexttemplates/idf/issues/view.html.php:32
msgid "Attach file"
msgstr "Attacher un fichier"
#: IDF/gettexttemplates/idf/issues/create.html.php:16
#: IDF/gettexttemplates/idf/issues/create.html.php:17
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:33
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:34
#: IDF/gettexttemplates/idf/issues/view.html.php:33
#: IDF/gettexttemplates/idf/issues/view.html.php:34
msgid "Attach another file"
@@ -2232,6 +2264,7 @@ msgstr "Attacher un autre fichier"
#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:12
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:17
#: IDF/gettexttemplates/idf/issues/view.html.php:17
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/review/view.html.php:40
@@ -2245,6 +2278,8 @@ msgstr "Résumé :"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:7
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:7
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:13
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:18
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:28
#: IDF/gettexttemplates/idf/issues/view.html.php:18
#: IDF/gettexttemplates/idf/issues/view.html.php:28
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:4
@@ -2256,6 +2291,8 @@ msgstr "Statut :"
#: IDF/gettexttemplates/idf/issues/feedfragment.xml.php:5
#: IDF/gettexttemplates/idf/issues/issue-updated-email.txt.php:14
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:19
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:29
#: IDF/gettexttemplates/idf/issues/view.html.php:19
#: IDF/gettexttemplates/idf/issues/view.html.php:29
#: IDF/gettexttemplates/idf/review/feedfragment.xml.php:5
@@ -2343,11 +2380,13 @@ msgstr "Tickets en cours:"
msgid "Found issues:"
msgstr "Tickets trouvés:"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:3
#: IDF/gettexttemplates/idf/issues/view.html.php:3
#, php-format
msgid "Reported by %%submitter%%, %%c.creation_dtime%%"
msgstr "Soumis par %%submitter%%, %%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:4
#: IDF/gettexttemplates/idf/issues/view.html.php:4
#: IDF/gettexttemplates/idf/review/view.html.php:22
#, php-format
@@ -2357,11 +2396,13 @@ msgstr ""
"Commentaire <a href=\"%%url%%\">%%i%%</a> par %%submitter%%, "
"%%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:5
#: IDF/gettexttemplates/idf/issues/view.html.php:5
#, php-format
msgid "<a href=\"%%url%%\">Sign in</a> to reply to this comment."
msgstr "<a href=\"%%url%%\">Connectez-vous</a> pour répondre à ce commentaire."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:6
#: IDF/gettexttemplates/idf/issues/view.html.php:6
msgid ""
"This issue is marked as closed, add a comment only if you think this issue "
@@ -2371,6 +2412,7 @@ msgstr ""
"pensez que ce ticket est toujours valide et qu'un travail supplémentaire est"
" nécessaire pour corriger le problème."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:8
#: IDF/gettexttemplates/idf/issues/view.html.php:8
#, php-format
msgid "%%interested%% person"
@@ -2378,38 +2420,55 @@ msgid_plural "%%interested%% persons"
msgstr[0] "%%interested%% personne"
msgstr[1] "%%interested%% personnes"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:9
#: IDF/gettexttemplates/idf/issues/view.html.php:9
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:3
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:7
msgid "Remove this issue from your watch list"
msgstr "Supprimer ce ticket de votre liste de surveillance"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:10
#: IDF/gettexttemplates/idf/issues/view.html.php:10
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:4
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:8
msgid "Add this issue to your watch list"
msgstr "Ajouter ce ticket à votre liste de surveillance."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:11
#: IDF/gettexttemplates/idf/issues/view.html.php:11
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:5
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:9
msgid "Click here to view the previous closed issue"
msgstr "Cliquez ici pour voir le précédent ticket fermé"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:12
#: IDF/gettexttemplates/idf/issues/view.html.php:12
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:6
#: IDF/gettexttemplates/idf/issues/view.html.rej.php:10
msgid "Click here to view the previous open issue"
msgstr "Cliquez ici pour voir le précédent ticket ouvert"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:13
#: IDF/gettexttemplates/idf/issues/view.html.php:13
msgid "Click here to view the next closed issue"
msgstr "Cliquez ici pour voir le prochain ticket fermé"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:14
#: IDF/gettexttemplates/idf/issues/view.html.php:14
msgid "Click here to view the next open issue"
msgstr "Cliquez ici pour voir le ticket suivant ouvert"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:15
#: IDF/gettexttemplates/idf/issues/view.html.php:15
msgid "download"
msgstr "télécharger"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:16
#: IDF/gettexttemplates/idf/issues/view.html.php:16
msgid "view"
msgstr "vue"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:21
#: IDF/gettexttemplates/idf/issues/view.html.php:21
msgid ""
"The form contains some errors. Please correct them to change the issue."
@@ -2417,10 +2476,12 @@ msgstr ""
"Le formulaire contient des erreurs. Merci de les corriger pour mettre à jour"
" ce ticket."
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:23
#: IDF/gettexttemplates/idf/issues/view.html.php:23
msgid "Submit Changes"
msgstr "Soumettre les changements"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:30
#: IDF/gettexttemplates/idf/issues/view.html.php:30
msgid "Followed by:"
msgstr "Suivi par :"
@@ -2617,6 +2678,7 @@ msgstr ""
"activés dans votre navigateur</strong> pour vous connecter par la suite."
#: IDF/gettexttemplates/idf/register/index.html.php:3
#: IDF/gettexttemplates/idf/register/index.html~.php:3
msgid ""
"Read the <a id=\"showterms\" href=\"#theterms\">terms and conditions</a> "
"&ndash; basically <em>\"Please be nice, we respect you\"</em>."
@@ -2627,6 +2689,18 @@ msgstr ""
#: IDF/gettexttemplates/idf/register/index.html.php:4
#, php-format
msgid ""
"If you have just forgotten your login information, then there is no need to "
"create a new account. Just go <a href=\"%%url%%\">here</a> to recover your "
"login name and password."
msgstr ""
"Si vous avez perdu votre mot de passe, il n'est pas nécessaire de créer un "
"nouveau compte. Cette <a href=\"%%url%%>page</a> vous permet de retrouver "
"vos identifiants."
#: IDF/gettexttemplates/idf/register/index.html.php:5
#: IDF/gettexttemplates/idf/register/index.html~.php:4
#, php-format
msgid ""
"With your account, you will able to participate in the life of all the "
"projects hosted here. Participating in a software project must be fun, so if"
" you have troubles, you can <a href=\"%%url%%\">let us know about your "
@@ -2637,17 +2711,20 @@ msgstr ""
" vous rencontrez des problèmes, vous pouvez <a href=\"%%url%%\">nous le "
"faire savoir à tout instant</a> !"
#: IDF/gettexttemplates/idf/register/index.html.php:5
#: IDF/gettexttemplates/idf/register/index.html.php:6
#: IDF/gettexttemplates/idf/register/index.html~.php:5
msgid "Oops, please check the provided login and email address to register."
msgstr ""
"Oups, veuillez vérifier l'identifiant et l'adresse email pour vous "
"enregistrer."
#: IDF/gettexttemplates/idf/register/index.html.php:6 IDF/Views.php:90
#: IDF/gettexttemplates/idf/register/index.html.php:7
#: IDF/gettexttemplates/idf/register/index.html~.php:6 IDF/Views.php:90
msgid "Create Your Account"
msgstr "Créez votre compte"
#: IDF/gettexttemplates/idf/register/index.html.php:8
#: IDF/gettexttemplates/idf/register/index.html.php:9
#: IDF/gettexttemplates/idf/register/index.html~.php:8
msgid ""
"Be sure to provide a valid email address, as we are sending a validation "
"link by email."
@@ -2655,7 +2732,8 @@ msgstr ""
"Faites attention de bien fournir une adresse email valide car nous vous "
"enverrons un email de confirmation."
#: IDF/gettexttemplates/idf/register/index.html.php:9
#: IDF/gettexttemplates/idf/register/index.html.php:10
#: IDF/gettexttemplates/idf/register/index.html~.php:9
msgid "Did you know?"
msgstr "Le saviez-vous ?"
@@ -2762,6 +2840,7 @@ msgstr "Commentaires des fichiers (le dernier en premier) :"
#: IDF/gettexttemplates/idf/review/view.html.php:3
#: IDF/gettexttemplates/idf/source/commit.html.php:3
#: IDF/gettexttemplates/idf/source/commit.html~.php:3
#, php-format
msgid "%%ndiff%% diff"
msgid_plural "%%ndiff%% diffs"
@@ -2834,17 +2913,20 @@ msgstr ""
#: IDF/gettexttemplates/idf/review/view.html.php:27
#: IDF/gettexttemplates/idf/source/commit.html.php:5
#: IDF/gettexttemplates/idf/source/commit.html~.php:5
msgid "Author:"
msgstr "Auteur :"
#: IDF/gettexttemplates/idf/review/view.html.php:28
#: IDF/gettexttemplates/idf/source/commit-created-email.txt.php:5
#: IDF/gettexttemplates/idf/source/commit.html.php:7
#: IDF/gettexttemplates/idf/source/commit.html~.php:7
msgid "Commit:"
msgstr "Commit :"
#: IDF/gettexttemplates/idf/review/view.html.php:29
#: IDF/gettexttemplates/idf/source/commit.html.php:8
#: IDF/gettexttemplates/idf/source/commit.html~.php:8
msgid "View corresponding source tree"
msgstr "Voir l'arbre des sources correspondant"
@@ -2862,6 +2944,7 @@ msgstr "Fichiers :"
#: IDF/gettexttemplates/idf/review/view.html.php:35
#: IDF/gettexttemplates/idf/source/commit.html.php:23
#: IDF/gettexttemplates/idf/source/commit.html~.php:23
msgid "Download the corresponding diff file"
msgstr "Télécharger le fichier diff correspondant"
@@ -2920,6 +3003,7 @@ msgstr "Parent : "
#: IDF/gettexttemplates/idf/source/changelog.html.php:6
#: IDF/gettexttemplates/idf/source/commit.html.php:10
#: IDF/gettexttemplates/idf/source/commit.html~.php:10
msgid "View corresponding commit"
msgstr "Voir le commit correspondant"
@@ -2951,57 +3035,71 @@ msgid "Commit details:"
msgstr "Détails de la révision :"
#: IDF/gettexttemplates/idf/source/commit.html.php:4
#: IDF/gettexttemplates/idf/source/commit.html~.php:4
msgid "Date:"
msgstr "Date :"
#: IDF/gettexttemplates/idf/source/commit.html.php:6
#: IDF/gettexttemplates/idf/source/commit.html~.php:6
msgid "Branch:"
msgstr "Branche :"
#: IDF/gettexttemplates/idf/source/commit.html.php:9
#: IDF/gettexttemplates/idf/source/commit.html~.php:9
msgid "Parents:"
msgstr "Parents :"
#: IDF/gettexttemplates/idf/source/commit.html.php:11
#: IDF/gettexttemplates/idf/source/commit.html~.php:11
msgid "Message:"
msgstr "Message :"
#: IDF/gettexttemplates/idf/source/commit.html.php:12
#: IDF/gettexttemplates/idf/source/commit.html~.php:12
#: IDF/gettexttemplates/idf/wiki/feedfragment.xml.php:3
#: IDF/gettexttemplates/idf/wiki/wiki-updated-email.txt.php:10
msgid "Changes:"
msgstr "Changements :"
#: IDF/gettexttemplates/idf/source/commit.html.php:13
#: IDF/gettexttemplates/idf/source/commit.html~.php:13
msgid "deleted"
msgstr "supprimé"
#: IDF/gettexttemplates/idf/source/commit.html.php:14
#: IDF/gettexttemplates/idf/source/commit.html.php:17
#: IDF/gettexttemplates/idf/source/commit.html~.php:14
#: IDF/gettexttemplates/idf/source/commit.html~.php:17
msgid "full"
msgstr "complet"
#: IDF/gettexttemplates/idf/source/commit.html.php:15
#: IDF/gettexttemplates/idf/source/commit.html~.php:15
msgid "renamed"
msgstr "renommé"
#: IDF/gettexttemplates/idf/source/commit.html.php:16
#: IDF/gettexttemplates/idf/source/commit.html~.php:16
msgid "added"
msgstr "ajouté"
#: IDF/gettexttemplates/idf/source/commit.html.php:18
#: IDF/gettexttemplates/idf/source/commit.html~.php:18
msgid "modified"
msgstr "modifié"
#: IDF/gettexttemplates/idf/source/commit.html.php:19
#: IDF/gettexttemplates/idf/source/commit.html~.php:19
msgid "properies changed"
msgstr "propriétés changées"
#: IDF/gettexttemplates/idf/source/commit.html.php:20
#: IDF/gettexttemplates/idf/source/commit.html~.php:20
msgid "removed"
msgstr "supprimé"
#: IDF/gettexttemplates/idf/source/commit.html.php:21
#: IDF/gettexttemplates/idf/source/commit.html~.php:21
msgid "File differences"
msgstr "Différences entre fichiers"
@@ -4092,7 +4190,7 @@ msgstr "lcname"
msgid "Lower case version of the name for fast searching."
msgstr "Version minuscule du nom pour chercher rapidement."
#: IDF/Template/Markdown.php:81
#: IDF/Template/Markdown.php:75
msgid "Create this documentation page"
msgstr "Créer cette page de documentation"

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
{/if}
</div>
{/if}
<form method="post" action=".">
<form method="post" enctype="multipart/form-data" action=".">
<table class="form" summary="">
<tr>
<th><strong>{$form.f.name.labelTag}:</strong></th>
@@ -30,6 +30,30 @@
{$form.f.description|unsafe}
</td>
</tr>
<tr>
<th><strong>{trans 'Current logo'}:</strong></th>
<td>
{if $logo}
<img src="{url 'IDF_Views_Project::logo', array($project.shortname)}" alt="{trans 'Project logo'}" />
{else}
{trans 'Your project does not have a logo configured yet.'}
{/if}
</td>
</tr>
<tr>
<th><strong>{$form.f.logo.labelTag}:</strong></th>
<td>{if $form.f.logo.errors}{$form.f.logo.fieldErrors}{/if}
{$form.f.logo|unsafe}
</td>
</tr>
{if $logo}
<tr>
<th><strong>{$form.f.logo_remove.labelTag}:</strong></th>
<td>{if $form.f.logo_remove.errors}{$form.f.logo_remove.fieldErrors}{/if}
{$form.f.logo_remove|unsafe}
</td>
</tr>
{/if}
<tr><td>&nbsp;</td>
<td>
<input type="submit" name="submit" value="{trans 'Save Changes'}" />

View File

@@ -37,7 +37,7 @@
<body>
<div id="{block docid}doc3{/block}">
<div id="hd">
{if $project}<h1 class="project-title">{$project}</h1>{/if}
{if $project}<h1 class="project-title">{$project}<img class="logo" src="{url 'IDF_Views_Project::logo', array($project.shortname)}" alt="{trans 'Project logo'}" />{if $project.private}<img class="lock" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" />{/if}{$p}</h1>{/if}
{include 'idf/main-menu.html'}
<div id="header">
<div id="main-tabs">

View File

@@ -37,7 +37,7 @@
<body>
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">
<div id="hd">
{if $project}<h1 class="project-title">{$project}</h1>{/if}
{if $project}<h1 class="project-title">{$project}<img class="logo" src="{url 'IDF_Views_Project::logo', array($project.shortname)}" alt="{trans 'Project logo'}" />{if $project.private}<img class="lock" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" />{/if}{$p}</h1>{/if}
{include 'idf/main-menu.html'}
<div id="header">
<div id="main-tabs">

View File

@@ -9,9 +9,28 @@
{aurl 'url', 'IDF_Views_Admin::projectCreate'}
<p><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/add.png'}" alt="+" align="bottom" /></a> <a href="{$url}">{trans 'Create Project'}</a></p>{/if}
{else}
<ul>{foreach $projects as $p}
<li>{if $p.private}<img style="vertical-align: text-bottom;" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" /> {/if}<a href="{url 'IDF_Views_Project::home', array($p.shortname)}">{$p}</a>{if $p.shortdesc}, {$p.shortdesc}{/if}</li>
{/foreach}</ul>
{foreach $projects as $p}
<div class="p-list-img">
<a href="{url 'IDF_Views_Project::home', array($p.shortname)}">
<img src="{url 'IDF_Views_Project::logo', array($p.shortname)}" alt="{trans 'Project logo'}" />
</a>
{if $p.private}
<div class="p-list-private">
<a href="{url 'IDF_Views_Project::home', array($p.shortname)}">
<img style="float:right" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" />
</a>
</div>
{/if}
</div>
<div class="p-list-prj">
<p>
<a href="{url 'IDF_Views_Project::home', array($p.shortname)}"><strong>{$p}</strong></a>
{if $p.private} - {trans 'Private project'}{/if}
</p>
<p>{$p.shortdesc}</p>
</div>
<div style="clear: both"></div>
{/foreach}
{/if}
{/block}
{block context}

View File

@@ -8,8 +8,7 @@
{/if}<li id="project-list"><a href="{url 'IDF_Views::index'}">{trans 'Project List'} &#x25be;</a>
{if $allProjects.count() != 0}
<ul>{foreach $allProjects as $p}
<li>{if $p.private}<img style="vertical-align: text-bottom;" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" /> {/if}
<a href="{url 'IDF_Views_Project::home', array($p.shortname)}">{$p}</a></li>
<li><a href="{url 'IDF_Views_Project::home', array($p.shortname)}"><img class="logo" src="{url 'IDF_Views_Project::logo', array($p.shortname)}" alt="{trans 'Project logo'}" />{if $p.private}<img class="lock" src="{media '/idf/img/lock.png'}" alt="{trans 'Private project'}" />{/if}{$p}</a></li>
{/foreach}</ul>
{/if}</li>{if $isAdmin}<li><a href="{url 'IDF_Views_Admin::projects'}">{trans 'Forge Management'}</a></li>{/if}<li>
<a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a></li>

View File

@@ -15,7 +15,7 @@
{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 />
{foreach $all_model_filters as $filter_key => $filter_name}
{foreach $accessible_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 />
{/if}

View File

@@ -48,7 +48,8 @@
{block context}
<div class="issue-submit-info">
<p>{trans 'Be sure to provide a valid email address, as we are sending a validation link by email.'}</p>
{aurl 'url', 'IDF_Views::passwordRecoveryAsk'}
<p>{blocktrans}If you have just forgotten your login information, then there is no need to create a new account. Just go <a href="{$url}">here</a> to recover your login name and password.{/blocktrans}</p>
<p><strong>{trans 'Did you know?'}</strong><br />
{aurl 'url', 'IDF_Views::faq'}
{blocktrans}With your account, you will able to participate in the life of all the projects hosted here. Participating in a software project must be fun, so if you have troubles, you can <a href="{$url}">let us know about your issues at anytime</a>!{/blocktrans}</p>

View File

@@ -38,8 +38,7 @@
<tr><td><span class="scm-action added" title="{trans 'added'}">A</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>{if !empty($diff.files[$filename])} (<a href="#diff-{$filename|md5}">{trans 'full'}</a>){/if}</td></tr>
{/foreach}
{foreach $changes.patches as $filename}
{assign $ndiff = count($diff.files[$filename]['chunks'])}
<tr><td><span class="scm-action patched" title="{trans 'modified'}">M</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>{if !empty($diff.files[$filename])} (<a href="#diff-{$filename|md5}">{blocktrans $ndiff}{$ndiff} diff{plural}{$ndiff} diffs{/blocktrans}</a>){/if}</td></tr>
<tr><td><span class="scm-action patched" title="{trans 'modified'}">M</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>{if !empty($diff.files[$filename])}{assign $ndiff = count($diff.files[$filename]['chunks'])} (<a href="#diff-{$filename|md5}">{blocktrans $ndiff}{$ndiff} diff{plural}{$ndiff} diffs{/blocktrans}</a>){/if}</td></tr>
{/foreach}
{foreach $changes.properties as $filename => $properties}
<tr><td><span class="scm-action property-changed" title="{trans 'properies changed'}">P</span></td><td><a href="{url 'IDF_Views_Source::tree', array($project.shortname, $commit, $filename)}">{$filename}</a>

View File

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

View File

@@ -1,4 +1,25 @@
<?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 ***** */
include 'IDF/Diff.php';

View File

@@ -0,0 +1,176 @@
<?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 ***** */
include 'IDF/Scm/Monotone/BasicIO.php';
class IDF_Scm_Monotone_BasicIOTest extends PHPUnit_Framework_TestCase
{
public function testParse()
{
$stanzas = IDF_Scm_Monotone_BasicIO::parse(null);
$this->assertTrue(is_array($stanzas) && count($stanzas) == 0);
// single stanza, single line, only key
$stanzas = IDF_Scm_Monotone_BasicIO::parse('foo');
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertTrue(!array_key_exists('values', $entry));
// single stanza, single line, key with hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
$this->assertTrue(!array_key_exists('values', $entry));
// single stanza, single line, key with two values
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\n\nbaz\" \"bla\"");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar\n\nbaz", "bla"), $entry['values']);
// single stanza, single line, key with a value and a hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\n\nbaz\" [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar\n\nbaz", "0123456789012345678901234567890123456789"), $entry['values']);
// single stanza, two lines, keys with single value / hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\"\nbaz [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(2, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar"), $entry['values']);
$entry = $stanza[1];
$this->assertEquals('baz', $entry['key']);
$this->assertTrue(!array_key_exists('values', $entry));
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
// two stanza, one two liner, one one liner
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\"\nbaz [0123456789012345678901234567890123456789]\n\nbla \"blub\"");
$this->assertEquals(2, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(2, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar"), $entry['values']);
$entry = $stanza[1];
$this->assertEquals('baz', $entry['key']);
$this->assertTrue(!array_key_exists('values', $entry));
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
$stanza = $stanzas[1];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('bla', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("blub"), $entry['values']);
// (un)escaping tests
$stanzas = IDF_Scm_Monotone_BasicIO::parse('foo "bar\\baz" "bla\"blub"');
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array('bar\baz', 'bla"blub'), $entry['values']);
}
public function testCompile()
{
$stanzas = array(
array(
array('key' => 'foo'),
array('key' => 'bar', 'values' => array('one', "two\nthree")),
),
array(
array('key' => 'baz', 'hash' => '0123456789012345678901234567890123456789'),
array('key' => 'blablub', 'values' => array('one"two', 'three\four')),
),
);
$ex =<<<END
foo
bar "one" "two
three"
baz [0123456789012345678901234567890123456789]
blablub "one\"two" "three\\\\four"
END;
$this->assertEquals($ex, IDF_Scm_Monotone_BasicIO::compile($stanzas));
// keys must not be null
$stanzas = array(
array(
array('key' => null, 'values' => array('foo')),
),
);
$thrown = false;
try {
IDF_Scm_Monotone_BasicIO::compile($stanzas);
} catch (IDF_Scm_Exception $e) {
$this->assertRegExp('/^"key" not found in basicio stanza/', $e->getMessage());
$thrown = true;
}
$this->assertTrue($thrown);
// ...nor completly non-existing
$stanzas = array(
array(
array('values' => array('foo')),
),
);
$thrown = false;
try {
IDF_Scm_Monotone_BasicIO::compile($stanzas);
} catch (IDF_Scm_Exception $e) {
$this->assertRegExp('/^"key" not found in basicio stanza/', $e->getMessage());
$thrown = true;
}
$this->assertTrue($thrown);
}
}

View File

@@ -0,0 +1,161 @@
<?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 ***** */
require_once 'IDF/Scm/Monotone/ZipRender.php';
require_once 'IDF/Scm/Monotone/IStdio.php';
class ZipRenderStdioMock implements IDF_Scm_Monotone_IStdio
{
// unused
public function __construct(IDF_Project $project) {}
// unused
public function start() {}
// unused
public function stop() {}
public function exec(array $args, array $options = array())
{
if ($args[0] == 'certs') {
$basicio =<<<END
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "author"
value "joe@home"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "branch"
value "foo"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "changelog"
value "test"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "date"
value "2009-07-06T22:06:27"
trust "trusted"
END;
return $basicio;
}
if ($args[0] == 'get_manifest_of') {
$basicio =<<<END
format_version "1"
dir ""
file "foo"
content [6fcf9dfbd479ed82697fee719b9f8c610a11ff2a]
dir "bar"
file "bar/baz"
content [9063a9f0e032b6239403b719cbbba56ac4e4e45f]
END;
return $basicio;
}
if ($args[0] == 'get_file') {
if ($args[1] == '6fcf9dfbd479ed82697fee719b9f8c610a11ff2a') {
return 'This is foo.';
}
if ($args[1] == '9063a9f0e032b6239403b719cbbba56ac4e4e45f') {
return 'This is baz.';
}
throw new Exception('unexpected id ' . $args[1]);
}
throw new Exception('unexpected command ' . $args[0]);
}
// unused
public function getLastOutOfBandOutput() {}
}
class IDF_Scm_Monotone_ZipRenderTest extends PHPUnit_Framework_TestCase
{
// we can not test header sending with PHP-CLI, as header() is ignored
// in this environment
public function testRender()
{
$mock = new ZipRenderStdioMock(new IDF_Project());
$renderer = new IDF_Scm_Monotone_ZipRender($mock, '97fee719b9f8c610a11ff2a9063a9f0e032b6');
ob_start();
$renderer->render(true);
$zipcontents = ob_get_contents();
ob_end_clean();
// for this version php needs to be compiled with --enable-zip
if (function_exists('zip_open')) {
// yes, I'd rather have used php://memory here, but ZipArchive::open()
// complained that it could not open the stream in question
$filename = tempnam(Pluf::f('tmp_folder', '/tmp'), __CLASS__.'.');
file_put_contents($filename, $zipcontents);
$za = new ZipArchive();
$za->open($filename);
$this->assertEquals(2, $za->numFiles);
// 2009-07-06T22:06:27 - one second
// (don't ask me why, seems to be some quirk in zipstream)
$mtime = 1246910787 - 1;
// foo
$data = $za->statIndex(0);
$this->assertEquals('foo', $data['name']);
$this->assertEquals(12, $data['size']);
$this->assertEquals($mtime, $data['mtime']);
// bar/baz
$data = $za->statIndex(1);
$this->assertEquals('bar/baz', $data['name']);
$this->assertEquals(12, $data['size']);
$this->assertEquals($mtime, $data['mtime']);
$za->close();
unlink($filename);
}
else {
$wrapped_act = wordwrap(
base64_encode($zipcontents),
32, "\n", true
);
$wrapped_exp = wordwrap(
base64_encode(file_get_contents(DATADIR . '/' . __CLASS__ . '/data.zip')),
32, "\n", true
);
$this->assertEquals($wrapped_exp, $wrapped_act);
}
}
}

View File

@@ -1,7 +1,27 @@
<?php
$config_file = dirname(__FILE__) . '/config.php';
if (!file_exists($config_file)) {
die("'test/config.php' does not exist\n");
}
echo ">>> setting paths...\n";
define('SRCDIR', realpath(dirname(__FILE__) . '/../src'));
define('TESTDIR', dirname(__FILE__));
define('DATADIR', TESTDIR . '/data');
set_include_path(get_include_path() . PATH_SEPARATOR . SRCDIR);
$testconfig = require_once $config_file;
if (file_exists($testconfig['db_database'])) {
echo ">>> removing any existing database\n";
unlink($testconfig['db_database']);
}
echo ">>> creating empty test database...\n";
passthru('php ' . PLUF_PATH . '/migrate.php --conf=' . TESTDIR . '/config.php -a -i');
echo ">>> setting up web application...\n";
require 'Pluf.php';
// for PHPUnit 3.5 and beyond this is needed, since it comes with its own class loader
spl_autoload_register('__autoload');
Pluf::start(TESTDIR . '/config.php');

95
test/config.php-dist Normal file
View File

@@ -0,0 +1,95 @@
<?php
/**
* This is a basic test configuration file for unit tests. It mimics most of
* the defaults from IDF/conf/idf.php-dist, but sets up a local sqlite database
* which is purged before each test run and uses a different temporary file
* directory.
*
* You can keep most of these settings as is, but ensure that you set up
* 'pear_path' at least, otherwise you'll get strange errors.
*/
require_once dirname(__FILE__).'/../src/IDF/conf/path.php';
$cfg = array();
$cfg['debug'] = true;
$cfg['debug_scm'] = true;
$cfg['git_repositories'] = '/home/git/repositories/%s.git';
$cfg['git_remote_url'] = 'git://localhost/%s.git';
$cfg['git_write_remote_url'] = 'git@localhost:%s.git';
$cfg['svn_repositories'] = 'file:///home/svn/repositories/%s';
$cfg['svn_remote_url'] = 'http://localhost/svn/%s';
$cfg['mtn_path'] = 'mtn';
$cfg['mtn_opts'] = array('--no-workspace', '--no-standard-rcfiles');
$cfg['mtn_repositories'] = '/home/mtn/repositories/%s.mtn';
$cfg['mtn_remote_url'] = 'mtn://my-host.biz/%s';
$cfg['mtn_db_access'] = 'local';
#$cfg['mtn_confdir'] = '/path/to/dir/tree/';
#$cfg['mtn_confdir_extra'] = array('hooks.d/something.lua')
#$cfg['mtn_usher_conf'] = '/path/to/usher.conf';
$cfg['mercurial_repositories'] = '/home/mercurial/repositories/%s';
#$cfg['mercurial_remote_url'] = 'http://projects.ceondo.com/hg/%s';
$cfg['admins'] = array(array('Admin', 'you@example.com'),);
$cfg['send_emails'] = true;
$cfg['mail_backend'] = 'smtp';
$cfg['mail_host'] = 'localhost';
$cfg['mail_port'] = 25;
$cfg['idf_base'] = '/index.php';
$cfg['url_base'] = 'http://localhost';
$cfg['url_media'] = 'http://localhost/media';
$cfg['url_upload'] = 'http://localhost/media/upload';
$cfg['upload_path'] = '/home/www/indefero/www/media/upload';
$cfg['upload_issue_path'] = '/home/www/indefero/attachments';
$cfg['secret_key'] = '';
$cfg['from_email'] = 'sender@example.com';
$cfg['bounce_email'] = 'no-reply@example.com';
$cfg['tmp_folder'] = dirname(__FILE__) . '/tmp';
$cfg['db_login'] = 'www';
$cfg['db_password'] = '';
$cfg['db_server'] = '';
$cfg['db_version'] = '5.1';
$cfg['db_table_prefix'] = 'indefero_';
$cfg['db_engine'] = 'SQLite';
$cfg['db_database'] = dirname(__FILE__).'/test.db';
# $cfg['idf_extra_upload_ext'] = 'ext1 ext2';
# $cfg['max_upload_size'] = 2097152;
# $cfg['time_zone'] = 'Europe/Berlin';
$cfg['pear_path'] = '/usr/share/php';
$cfg['login_success_url'] = $cfg['url_base'].$cfg['idf_base'];
$cfg['after_logout_page'] = $cfg['url_base'].$cfg['idf_base'];
$cfg['cache_engine'] = 'Pluf_Cache_File';
$cfg['cache_timeout'] = 300;
$cfg['cache_file_folder'] = $cfg['tmp_folder'].'/cache';
$cfg['template_folders'] = array(dirname(__FILE__).'/../src/IDF/templates');
$cfg['installed_apps'] = array('Pluf', 'IDF');
$cfg['pluf_use_rowpermission'] = true;
$cfg['middleware_classes'] = array(
'Pluf_Middleware_Csrf',
'Pluf_Middleware_Session',
'IDF_Middleware',
'Pluf_Middleware_Translation',
);
$cfg['template_context_processors'] = array('IDF_Middleware_ContextPreProcessor');
$cfg['idf_views'] = dirname(__FILE__).'/../src/IDF/conf/urls.php';
$cfg['languages'] = array('en', 'fr', 'de', 'es_ES');
$cfg['allowed_scm'] = array(
'git' => 'IDF_Scm_Git',
'svn' => 'IDF_Scm_Svn',
'mercurial' => 'IDF_Scm_Mercurial',
'mtn' => 'IDF_Scm_Monotone',
);
# $cfg['git_core_quotepath'] = false;
# $cfg['idf_strong_key_check'] = false;
# $cfg['idf_mimetypes_db'] = '/etc/mime.types';
# $cfg['idf_extra_text_ext'] = 'ext1 ext2 ext3';
# $cfg['idf_exec_cmd_prefix'] = '/usr/bin/env -i ';
# $cfg['svn_path'] = 'svn';
# $cfg['svnlook_path'] = 'svnlook';
# $cfg['svnadmin_path'] = 'svnadmin';
# $cfg['hg_path'] = 'hg';
# $cfg['git_path'] = 'git';
# $cfg['idf_no_size_check'] = false;
return $cfg;

Binary file not shown.

View File

@@ -327,12 +327,27 @@ h1.title {
}
h1.project-title {
font-weight: normal;
float: right;
z-index: 100;
text-align: right;
padding-right: 5px;
font-weight: normal;
margin-top: 0.5em;
margin-bottom: 0;
text-align: right;
z-index: 100;
position: relative;
padding-right: 3px;
}
h1.project-title img.logo {
max-height: 22px;
vertical-align: text-bottom;
padding-left: 7px;
}
h1.project-title img.lock {
width: 12px;
position: absolute;
right: 1px;
top: 12px;
}
.note {
@@ -871,8 +886,21 @@ ol > li {
margin: 7px;
white-space: nowrap;
font-size: 0.95em;
list-style-type: square;
list-style-position: inside;
list-style-type: none;
position: relative;
}
#project-list ul li img.logo {
max-height: 16px;
vertical-align: text-bottom;
padding-right: 5px;
}
#project-list ul li img.lock {
position: absolute;
width: 9px;
left: 9px;
top: 9px;
}
#project-list ul li:first-child {
@@ -1043,3 +1071,27 @@ span.scm-action.property-changed {
#stats td {
padding: .2em;
}
/*
* Project list on index
*/
div.p-list-img {
float: left;
height: 32px;
margin-top: .5em;
}
div.p-list-prj {
float: left;
margin: .5em 0 .5em .8em;
}
div.p-list-prj p {
margin: 0px;
}
div.p-list-private {
bottom: 16px;
right: -3px;
position: relative;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB