29 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
1d89cec2cf Merge branch 'release-1.1' into develop 2011-03-28 01:26:20 +02: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
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
36 changed files with 1582 additions and 658 deletions

3
.gitignore vendored
View File

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

View File

@@ -31,6 +31,7 @@ Much appreciated contributors (in alphabetical order):
Raphaël Emourgeon <raphael> Raphaël Emourgeon <raphael>
Samuel Suther <info@suther.de> - German translation Samuel Suther <info@suther.de> - German translation
Sindre R. Myren <sindrero@stud.ntnu.no> Sindre R. Myren <sindrero@stud.ntnu.no>
Stewart Platt <stew@futurete.ch>
Thomas Keller <me@thomaskeller.biz> - Monotone support Thomas Keller <me@thomaskeller.biz> - Monotone support
Vladimir Solomatin <slash> Vladimir Solomatin <slash>
William Martin <william.martin@lcpc.fr> William Martin <william.martin@lcpc.fr>

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, installation of the [Pluf framework](http://www.pluf.org) and second,
the installation of InDefero by itself. 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 ## Recommended Layout of the Files
If your server document root is in `/var/www` a good thing is to keep 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`. * Subversion: `doc/syncsvn.mdtext`.
* Mercurial: `doc/syncmercurial.mdtext`. * Mercurial: `doc/syncmercurial.mdtext`.
* Git: `doc/syncgit.mdtext`. * Git: `doc/syncgit.mdtext`.
* Monotone: `doc/syncmonotone.mdtext`
## For the Apache Webserver Users ## For the Apache Webserver Users

View File

@@ -1,17 +1,16 @@
# InDefero 1.1.2 - Thu May 26 07:42:25 2011 UTC # InDefero 1.2 - xxx xxx xx xx:xx 2011 UTC
## New Features
## Bugfixes ## Bugfixes
- Fix tags extraction from git repository (issue 675) - monotone zip archive entries now all carry the revision date as mtime (issue 645)
- Fix SSH validation method (issue 671) - Timeline only displays filter options for items a user has actually access to (issue 655)
- Fix malformed URL in the RSS (issue 666)
- Fix validateRevision call for Mercurial Scm (issue 657) ## Documentation
## Translations ## Translations
- Missing word in French translation (issue 672)
- Update Spanish translation
# InDefero 1.1.1 - Mon Mar 28 15:52 2011 UTC # InDefero 1.1.1 - Mon Mar 28 15:52 2011 UTC
## Bugfixes ## Bugfixes

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> <directory>test/IDF/</directory>
</testsuite> </testsuite>
</testsuites> </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> </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

@@ -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

@@ -80,10 +80,7 @@ class IDF_Key extends Pluf_Model
if (preg_match('#^\[pubkey ([^\]]+)\]\s*(\S+)\s*\[end\]$#', $this->content, $m)) { if (preg_match('#^\[pubkey ([^\]]+)\]\s*(\S+)\s*\[end\]$#', $this->content, $m)) {
return array('mtn', $m[1], $m[2]); return array('mtn', $m[1], $m[2]);
} }
else if (preg_match('#^ssh\-[a-z]{3}\s(\S+)(?:\s(\S*))?$#', $this->content, $m)) { else if (preg_match('#^ssh\-[a-z]{3}\s(\S+)(?:\s(\S+))?$#', $this->content, $m)) {
if (!isset($m[2])) {
$m[2] = "";
}
return array('ssh', $m[2], $m[1]); return array('ssh', $m[2], $m[1]);
} }

View File

@@ -209,7 +209,7 @@ class IDF_Scm_Git extends IDF_Scm
return $this->cache['tags']; return $this->cache['tags'];
} }
$cmd = Pluf::f('idf_exec_cmd_prefix', '') $cmd = Pluf::f('idf_exec_cmd_prefix', '')
.sprintf('GIT_DIR=%s %s for-each-ref --format="%%(objectname) %%(refname)" refs/tags', .sprintf('GIT_DIR=%s %s for-each-ref --format="%%(taggerdate:iso)%%(committerdate:iso) %%(objectname) %%(refname)" refs/tags',
escapeshellarg($this->repo), escapeshellarg($this->repo),
Pluf::f('git_path', 'git')); Pluf::f('git_path', 'git'));
self::exec('IDF_Scm_Git::getTags', $cmd, $out, $return); self::exec('IDF_Scm_Git::getTags', $cmd, $out, $return);
@@ -221,12 +221,15 @@ class IDF_Scm_Git extends IDF_Scm
rsort($out); rsort($out);
$res = array(); $res = array();
foreach ($out as $b) { foreach ($out as $b) {
$elts = explode(' ', $b, 2); $elts = explode(' ', $b, 5);
$tag = substr(trim($elts[1]), 10); // Remove refs/tags/ prefix $tag = substr(trim($elts[4]), 10);
if (false !== strpos($tag, '/')) {
$res[$elts[3]] = $b;
} else {
$res[$tag] = ''; $res[$tag] = '';
} }
}
$this->cache['tags'] = $res; $this->cache['tags'] = $res;
return $res; return $res;
} }

View File

@@ -94,7 +94,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
escapeshellarg($this->repo), escapeshellarg($this->repo),
escapeshellarg($rev)); escapeshellarg($rev));
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
self::exec('IDF_Scm_Mercurial::validateRevision', $cmd, $out, $ret); self::exec('IDF_Scm_Mercurial::isValidRevision', $cmd, $out, $ret);
// FIXME: apparently a given hg revision can also be ambigious - // FIXME: apparently a given hg revision can also be ambigious -
// handle this case here sometime // handle this case here sometime
@@ -336,7 +336,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
*/ */
public function getCommit($commit, $getdiff=false) public function getCommit($commit, $getdiff=false)
{ {
if ($this->validateRevision($commit) != IDF_Scm::REVISION_VALID) { if (!$this->isValidRevision($commit)) {
return false; return false;
} }
$tmpl = ($getdiff) $tmpl = ($getdiff)

View File

@@ -36,12 +36,12 @@ class IDF_Scm_Monotone extends IDF_Scm
private static $instances = array(); 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->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) public static function factory($project)
{ {
if (!array_key_exists($project->shortname, self::$instances)) { if (!array_key_exists($project->shortname, self::$instances)) {
$stdio = new IDF_Scm_Monotone_Stdio($project);
self::$instances[$project->shortname] = self::$instances[$project->shortname] =
new IDF_Scm_Monotone($project); new IDF_Scm_Monotone($project, $stdio);
} }
return self::$instances[$project->shortname]; return self::$instances[$project->shortname];
} }

View File

@@ -21,6 +21,8 @@
# #
# ***** END LICENSE BLOCK ***** */ # ***** END LICENSE BLOCK ***** */
require_once 'IDF/Scm/Exception.php';
/** /**
* Utility class to parse and compile basic_io stanzas * Utility class to parse and compile basic_io stanzas
* *
@@ -31,6 +33,11 @@ class IDF_Scm_Monotone_BasicIO
/** /**
* Parses monotone's basic_io format * 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 * @param string $in
* @return array of arrays * @return array of arrays
*/ */
@@ -54,14 +61,19 @@ class IDF_Scm_Monotone_BasicIO
$stanzaLine['key'] .= $ch; $stanzaLine['key'] .= $ch;
} }
// symbol w/o a value list // ensure we don't look at a symbol w/o a value list
if ($pos >= $length || $in[$pos] == "\n") break; if ($pos >= $length || $in[$pos] == "\n") {
unset($stanzaLine['values']);
unset($stanzaLine['hash']);
}
else {
if ($in[$pos] == '[') { if ($in[$pos] == '[') {
unset($stanzaLine['values']); unset($stanzaLine['values']);
++$pos; // opening square bracket ++$pos; // opening square bracket
$stanzaLine['hash'] = substr($in, $pos, 40); while ($pos < $length && $in[$pos] != ']') {
$pos += 40; $stanzaLine['hash'] .= $in[$pos];
++$pos;
}
++$pos; // closing square bracket ++$pos; // closing square bracket
} }
else else
@@ -101,6 +113,7 @@ class IDF_Scm_Monotone_BasicIO
} }
} }
} }
}
$stanza[] = $stanzaLine; $stanza[] = $stanzaLine;
++$pos; // newline ++$pos; // newline
@@ -114,6 +127,12 @@ class IDF_Scm_Monotone_BasicIO
/** /**
* Compiles monotone's basicio format * 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 * @param array $in Array of arrays
* @return string * @return string
*/ */
@@ -129,7 +148,7 @@ class IDF_Scm_Monotone_BasicIO
$maxkeylength = 0; $maxkeylength = 0;
foreach ((array)$stanza as $lx => $line) { 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( throw new IDF_Scm_Exception(
'"key" not found in basicio stanza '.$sx.', line '.$lx '"key" not found in basicio stanza '.$sx.', line '.$lx
); );
@@ -157,13 +176,6 @@ class IDF_Scm_Monotone_BasicIO
$value).'"'; $value).'"';
} }
} }
else
{
throw new IDF_Scm_Exception(
'neither "hash" nor "values" found in basicio '.
'stanza '.$sx.', line '.$lx
);
}
$out .= "\n"; $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 ***** */ # ***** END LICENSE BLOCK ***** */
require_once 'IDF/Scm/Monotone/IStdio.php';
/** /**
* Monotone stdio class * Monotone stdio class
* *
@@ -29,7 +31,7 @@
* *
* @author Thomas Keller <me@thomaskeller.biz> * @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 /** this is the most recent STDIO version. The number is output
at the protocol start. Older versions of monotone (prior 0.47) at the protocol start. Older versions of monotone (prior 0.47)
@@ -68,7 +70,7 @@ class IDF_Scm_Monotone_Stdio
* *
* @return string * @return string
*/ */
public function _getAuthOptions() private function _getAuthOptions()
{ {
$prjconf = $this->project->getConf(); $prjconf = $this->project->getConf();
$name = $prjconf->getVal('mtn_client_key_name', false); $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 $stdio = null;
private $revision = null; private $revision = null;
function __construct($stdio, $revision) function __construct(IDF_Scm_Monotone_IStdio $stdio, $revision)
{ {
parent::__construct($revision, 'application/x-zip'); parent::__construct($revision, 'application/x-zip');
$this->stdio = $stdio; $this->stdio = $stdio;
@@ -60,6 +60,26 @@ class IDF_Scm_Monotone_ZipRender extends Pluf_HTTP_Response
$this->outputHeaders(); $this->outputHeaders();
if ($output_body) { 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)); $manifest = $this->stdio->exec(array('get_manifest_of', $this->revision));
$stanzas = IDF_Scm_Monotone_BasicIO::parse($manifest); $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') if ($stanza[0]['key'] != 'file')
continue; continue;
$content = $this->stdio->exec(array('get_file', $stanza[1]['hash'])); $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(); $zip->finish();

View File

@@ -31,6 +31,25 @@ Pluf::loadFunction('Pluf_Shortcuts_GetFormForModel');
*/ */
class IDF_Views_Project 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. * 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 * @return array
*/ */
private static function getAvailableModelFilters() private static function getAccessibleModelFilters($request)
{ {
return array( $filters = array('all' => __('All Updates'));
'all' => __('All Updates'),
'commits' => __('Commits'), if (true === IDF_Precondition::accessSource($request))
'issues' => __('Issues and Comments'), $filters['commits'] = __('Commits');
'downloads' => __('Downloads'), if (true === IDF_Precondition::accessIssues($request))
'documents' => __('Documents'), $filters['issues'] = __('Issues and Comments');
'reviews' => __('Reviews and Patches'), 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; $prj = $request->project;
$model_filter = @$match[2]; $model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters(); $accessible_model_filters = self::getAccessibleModelFilters($request);
if (!array_key_exists($model_filter, $all_model_filters)) { if (!array_key_exists($model_filter, $accessible_model_filters)) {
$model_filter = 'all'; $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 = new IDF_Timeline_Paginator(new IDF_Timeline());
$pag->class = 'recent-issues'; $pag->class = 'recent-issues';
@@ -183,7 +208,7 @@ class IDF_Views_Project
'feedurl' => $feedurl, 'feedurl' => $feedurl,
'timeline' => $pag, 'timeline' => $pag,
'model_filter' => $model_filter, 'model_filter' => $model_filter,
'all_model_filters' => $all_model_filters, 'accessible_model_filters' => $accessible_model_filters,
), ),
$request); $request);
@@ -214,11 +239,11 @@ class IDF_Views_Project
$prj = $request->project; $prj = $request->project;
$model_filter = @$match[2]; $model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters(); $accessible_model_filters = self::getAccessibleModelFilters($request);
if (!array_key_exists($model_filter, $all_model_filters)) { if (!array_key_exists($model_filter, $accessible_model_filters)) {
$model_filter = 'all'; $model_filter = 'all';
} }
$title = $all_model_filters[$model_filter]; $title = $accessible_model_filters[$model_filter];
$classes = self::determineModelClasses($request, $model_filter); $classes = self::determineModelClasses($request, $model_filter);
$sqls = sprintf('model_class IN (%s)', implode(', ', $classes)); $sqls = sprintf('model_class IN (%s)', implode(', ', $classes));
@@ -246,7 +271,7 @@ class IDF_Views_Project
$tmpl = new Pluf_Template('idf/index.atom'); $tmpl = new Pluf_Template('idf/index.atom');
$feedurl = Pluf::f('url_base').Pluf::f('idf_base').$request->query; $feedurl = Pluf::f('url_base').Pluf::f('idf_base').$request->query;
$viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline', $viewurl = Pluf_HTTP_URL_urlForView('IDF_Views_Project::timeline',
array($prj->shortname, $model_filter)); array($prj->shortname));
$context = new Pluf_Template_Context_Request($request, $context = new Pluf_Template_Context_Request($request,
array('body' => $out, array('body' => $out,
'date' => $date, 'date' => $date,
@@ -267,29 +292,29 @@ class IDF_Views_Project
{ {
$prj = $request->project; $prj = $request->project;
$title = sprintf(__('%s Project Summary'), (string) $prj); $title = sprintf(__('%s Project Summary'), (string) $prj);
$form_fields = array('fields'=> array('name', 'shortdesc', $extra = array('project' => $prj);
'description'));
if ($request->method == 'POST') { if ($request->method == 'POST') {
$form = Pluf_Shortcuts_GetFormForModel($prj, $request->POST, $form = new IDF_Form_ProjectConf(array_merge($request->POST,
$form_fields); $request->FILES),
$extra);
if ($form->isValid()) { if ($form->isValid()) {
$prj = $form->save(); $form->save();
$request->user->setMessage(__('The project has been updated.')); $request->user->setMessage(__('The project has been updated.'));
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::admin', $url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::admin',
array($prj->shortname)); array($prj->shortname));
return new Pluf_HTTP_Response_Redirect($url); return new Pluf_HTTP_Response_Redirect($url);
} }
} else { } else {
$form = Pluf_Shortcuts_GetFormForModel($prj, $prj->getData(), $form = new IDF_Form_ProjectConf($prj->getData(), $extra);
$form_fields);
} }
$form->fields['description']->widget->attrs['cols'] = 68;
$form->fields['description']->widget->attrs['rows'] = 26; $logo = $prj->getConf()->getVal('logo');
$form->fields['shortdesc']->widget->attrs['size'] = 67;
return Pluf_Shortcuts_RenderToResponse('idf/admin/summary.html', return Pluf_Shortcuts_RenderToResponse('idf/admin/summary.html',
array( array(
'page_title' => $title, 'page_title' => $title,
'form' => $form, 'form' => $form,
'project' => $prj,
'logo' => $logo,
), ),
$request); $request);
} }

View File

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

View File

@@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2011-03-28 14:19+0000\n" "PO-Revision-Date: 2011-03-28 14:19+0000\n"
"Last-Translator: Mika <mikados.mikados@gmail.com>\n" "Last-Translator: Mika <mikados.mikados@gmail.com>\n"
"Language-Team: Mika <mikados.mikados@gmail.com>\n" "Language-Team: Mika <mikados.mikados@gmail.com>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: es_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: IDF/Commit.php:55 IDF/Conf.php:54 IDF/Issue.php:52 IDF/Review.php:65 #: IDF/Commit.php:55 IDF/Conf.php:54 IDF/Issue.php:52 IDF/Review.php:65
@@ -144,8 +144,8 @@ msgid ""
"This should be a world-wide unique identifier for your project. A reverse " "This should be a world-wide unique identifier for your project. A reverse "
"DNS notation like \"com.my-domain.my-project\" is a good idea." "DNS notation like \"com.my-domain.my-project\" is a good idea."
msgstr "" msgstr ""
"Este debe ser un identificador único para su proyecto. Una notación tipo DNS " "Este debe ser un identificador único para su proyecto. Una notación tipo DNS"
"inversa como \"com.mi-dominio.mi-proyecto\" es una buena elección." " inversa como \"com.mi-dominio.mi-proyecto\" es una buena elección."
#: IDF/Form/Admin/ProjectCreate.php:114 IDF/Form/Admin/ProjectUpdate.php:68 #: IDF/Form/Admin/ProjectCreate.php:114 IDF/Form/Admin/ProjectUpdate.php:68
#: IDF/Form/MembersConf.php:46 IDF/Form/TabsConf.php:53 #: IDF/Form/MembersConf.php:46 IDF/Form/TabsConf.php:53
@@ -279,8 +279,8 @@ msgstr "Iniciar sesión"
#: IDF/Form/Admin/UserCreate.php:60 #: IDF/Form/Admin/UserCreate.php:60
msgid "" msgid ""
"The login must be between 3 and 15 characters long and contains only letters " "The login must be between 3 and 15 characters long and contains only letters"
"and digits." " and digits."
msgstr "" msgstr ""
"El nombre de usuario debe tener entre 3 y 15 caracteres de largo y contener " "El nombre de usuario debe tener entre 3 y 15 caracteres de largo y contener "
"solamente letras y dígitos." "solamente letras y dígitos."
@@ -421,8 +421,8 @@ msgstr "--- No es un nombre válido."
msgid "" msgid ""
"A user with this email already exists, please provide another email address." "A user with this email already exists, please provide another email address."
msgstr "" msgstr ""
"Ya existe un usuario con este correo electrónico , por favor, introduce otro " "Ya existe un usuario con este correo electrónico , por favor, introduce otro"
"email." " email."
#: IDF/Form/Admin/UserUpdate.php:301 IDF/Form/UserAccount.php:389 #: IDF/Form/Admin/UserUpdate.php:301 IDF/Form/UserAccount.php:389
msgid "For security reason, you cannot upload a file with this extension." msgid "For security reason, you cannot upload a file with this extension."
@@ -452,8 +452,7 @@ msgstr "Resumen"
#: IDF/Form/IssueCreate.php:72 IDF/Form/IssueUpdate.php:65 #: IDF/Form/IssueCreate.php:72 IDF/Form/IssueUpdate.php:65
#: IDF/Form/ReviewCreate.php:83 #: IDF/Form/ReviewCreate.php:83
msgid "The \"upload_issue_path\" configuration variable was not set." msgid "The \"upload_issue_path\" configuration variable was not set."
msgstr "" msgstr "La variable de configuración \"upload_issue_path\" no se ha establecido."
"La variable de configuración \"upload_issue_path\" no se ha establecido."
#: IDF/Form/IssueCreate.php:82 IDF/Form/IssueUpdate.php:75 #: IDF/Form/IssueCreate.php:82 IDF/Form/IssueUpdate.php:75
msgid "Attach a file" msgid "Attach a file"
@@ -479,8 +478,7 @@ msgstr "Etiquetas"
#: IDF/Form/IssueCreate.php:192 #: IDF/Form/IssueCreate.php:192
msgid "You cannot add a label with the \"Status\" prefix to an issue." msgid "You cannot add a label with the \"Status\" prefix to an issue."
msgstr "" msgstr "No se puede agregar una etiqueta con el prefijo \"Status\" a un ticket."
"No se puede agregar una etiqueta con el prefijo \"Status\" a un ticket."
#: IDF/Form/IssueCreate.php:193 IDF/Form/IssueCreate.php:200 #: IDF/Form/IssueCreate.php:193 IDF/Form/IssueCreate.php:200
#: IDF/Form/UpdateUpload.php:110 IDF/Form/Upload.php:120 #: IDF/Form/UpdateUpload.php:110 IDF/Form/Upload.php:120
@@ -492,7 +490,8 @@ msgstr "Proporcionaste una etiqueta no válida."
#: IDF/Form/Upload.php:119 #: IDF/Form/Upload.php:119
#, php-format #, php-format
msgid "You cannot provide more than label from the %s class to an issue." msgid "You cannot provide more than label from the %s class to an issue."
msgstr "No puede proporcionar más de una etiqueta de la clase %s en un ticket." msgstr ""
"No puede proporcionar más de una etiqueta de la clase %s en un ticket."
#: IDF/Form/IssueCreate.php:210 IDF/Form/IssueUpdate.php:147 #: IDF/Form/IssueCreate.php:210 IDF/Form/IssueUpdate.php:147
msgid "You need to provide a description of the issue." msgid "You need to provide a description of the issue."
@@ -566,8 +565,8 @@ msgid ""
"Sorry, we cannot find a user with this email address or login. Feel free to " "Sorry, we cannot find a user with this email address or login. Feel free to "
"try again." "try again."
msgstr "" msgstr ""
"Lo sentimos, no hemos encontrado ningún usuario con esta dirección de correo " "Lo sentimos, no hemos encontrado ningún usuario con esta dirección de correo"
"electrónico o nombre de usuario. Vuelva a intentarlo." " electrónico o nombre de usuario. Vuelva a intentarlo."
#: IDF/Form/Password.php:100 #: IDF/Form/Password.php:100
msgid "Password Recovery - InDefero" msgid "Password Recovery - InDefero"
@@ -580,11 +579,11 @@ msgstr "Tu clave de verificación"
#: IDF/Form/PasswordInputKey.php:50 IDF/Form/PasswordReset.php:89 #: IDF/Form/PasswordInputKey.php:50 IDF/Form/PasswordReset.php:89
msgid "" msgid ""
"We are sorry but this validation key is not valid. Maybe you should directly " "We are sorry but this validation key is not valid. Maybe you should directly"
"copy/paste it from your validation email." " copy/paste it from your validation email."
msgstr "" msgstr ""
"Lo sentimos, pero esta clave de validación no es válida. Intente copiar/" "Lo sentimos, pero esta clave de validación no es válida. Intente "
"pegar desde el email de validación." "copiar/pegar desde el email de validación."
#: IDF/Form/PasswordInputKey.php:61 IDF/Form/PasswordReset.php:100 #: IDF/Form/PasswordInputKey.php:61 IDF/Form/PasswordReset.php:100
msgid "" msgid ""
@@ -640,8 +639,8 @@ msgid ""
"The login must be between 3 and 15 characters long and contain only letters " "The login must be between 3 and 15 characters long and contain only letters "
"and digits." "and digits."
msgstr "" msgstr ""
"El nombre de usuario debe tener entre 3 y 15 caracteres y contener solamente " "El nombre de usuario debe tener entre 3 y 15 caracteres y contener solamente"
"letras y dígitos." " letras y dígitos."
#: IDF/Form/Register.php:53 #: IDF/Form/Register.php:53
msgid "Your email" msgid "Your email"
@@ -659,7 +658,8 @@ msgstr "Estoy de acuerdo con los términos y condiciones."
#: IDF/Form/Register.php:88 #: IDF/Form/Register.php:88
msgid "" msgid ""
"We know, this is boring, but you need to agree with the terms and conditions." "We know, this is boring, but you need to agree with the terms and "
"conditions."
msgstr "" msgstr ""
"Lo sabemos, esto es aburrido, pero es necesario aceptar los términos y " "Lo sabemos, esto es aburrido, pero es necesario aceptar los términos y "
"condiciones." "condiciones."
@@ -686,16 +686,16 @@ msgid ""
"Your password must be hard for other people to guess, but easy for you to " "Your password must be hard for other people to guess, but easy for you to "
"remember." "remember."
msgstr "" msgstr ""
"Su contraseña debe ser difícil de averiguar para otras personas, pero que le " "Su contraseña debe ser difícil de averiguar para otras personas, pero que le"
"sea fácil de recordar." " sea fácil de recordar."
#: IDF/Form/RegisterConfirmation.php:99 IDF/Form/RegisterInputKey.php:50 #: IDF/Form/RegisterConfirmation.php:99 IDF/Form/RegisterInputKey.php:50
msgid "" msgid ""
"We are sorry but this confirmation key is not valid. Maybe you should " "We are sorry but this confirmation key is not valid. Maybe you should "
"directly copy/paste it from your confirmation email." "directly copy/paste it from your confirmation email."
msgstr "" msgstr ""
"Lo sentimos, pero esta clave de confirmación no es válida. Pruebe a copiar y " "Lo sentimos, pero esta clave de confirmación no es válida. Pruebe a copiar y"
"pegar directamente desde el email de confirmación." " pegar directamente desde el email de confirmación."
#: IDF/Form/RegisterConfirmation.php:110 #: IDF/Form/RegisterConfirmation.php:110
msgid "" msgid ""
@@ -886,7 +886,8 @@ msgstr ""
#: IDF/Form/UserAccount.php:354 #: IDF/Form/UserAccount.php:354
msgid "" msgid ""
"Please check the key as it does not appear to be a valid monotone public key." "Please check the key as it does not appear to be a valid monotone public "
"key."
msgstr "" msgstr ""
"Por favor, compruebe la clave, ya que parece no ser una clave pública " "Por favor, compruebe la clave, ya que parece no ser una clave pública "
"monotone válida ." "monotone válida ."
@@ -903,11 +904,11 @@ msgstr "Ya has subido esta clave."
#: IDF/Form/UserChangeEmail.php:63 #: IDF/Form/UserChangeEmail.php:63
msgid "" msgid ""
"The validation key is not valid. Please copy/paste it from your confirmation " "The validation key is not valid. Please copy/paste it from your confirmation"
"email." " email."
msgstr "" msgstr ""
"La clave de validación no es válido. Por favor, copia/pega desde su email de " "La clave de validación no es válido. Por favor, copia/pega desde su email de"
"confirmación." " confirmación."
#: IDF/Form/WikiConf.php:49 #: IDF/Form/WikiConf.php:49
msgid "Predefined documentation page labels" msgid "Predefined documentation page labels"
@@ -915,7 +916,8 @@ msgstr "Etiquetas predefinidas para página de documentación"
#: IDF/Form/WikiConf.php:58 #: IDF/Form/WikiConf.php:58
msgid "" msgid ""
"Each documentation page may have at most one label with each of these classes" "Each documentation page may have at most one label with each of these "
"classes"
msgstr "" msgstr ""
"Cada página de documentación podrá tener más de una etiqueta para cada una " "Cada página de documentación podrá tener más de una etiqueta para cada una "
"de estas clases" "de estas clases"
@@ -1032,14 +1034,12 @@ msgid ""
"\n" "\n"
"<p><strong>Instructions:</strong></p>\n" "<p><strong>Instructions:</strong></p>\n"
"<p>List one status value per line in desired sort-order.</p>\n" "<p>List one status value per line in desired sort-order.</p>\n"
"<p>Optionally, use an equals-sign to document the meaning of each status " "<p>Optionally, use an equals-sign to document the meaning of each status value.</p>\n"
"value.</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p><strong>Instrucciones:</strong></p>\n" "<p><strong>Instrucciones:</strong></p>\n"
"<p>Lista un valor por línea en el orden deseado.</p>\n" "<p>Lista un valor por línea en el orden deseado.</p>\n"
"<p>Si lo desea, puede utilizar un signo de igual para documentar el valor de " "<p>Si lo desea, puede utilizar un signo de igual para documentar el valor de cada estado.</p>\n"
"cada estado.</p>\n"
#: IDF/gettexttemplates/idf/admin/downloads.html.php:8 #: IDF/gettexttemplates/idf/admin/downloads.html.php:8
#: IDF/gettexttemplates/idf/admin/issue-tracking.html.php:8 #: IDF/gettexttemplates/idf/admin/issue-tracking.html.php:8
@@ -1056,14 +1056,12 @@ msgstr "Guardar cambios"
msgid "" msgid ""
"\n" "\n"
"<p><strong>Instructions:</strong></p>\n" "<p><strong>Instructions:</strong></p>\n"
"<p>Specify each person by its login. Each person must have already " "<p>Specify each person by its login. Each person must have already registered with the given login.</p>\n"
"registered with the given login.</p>\n"
"<p>Separate the logins with commas and/or new lines.</p>\n" "<p>Separate the logins with commas and/or new lines.</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p><strong>Instrucciones:</strong></p>\n" "<p><strong>Instrucciones:</strong></p>\n"
"<p>Especifique cada persona por su nombre de usuaro. Cada persona debe " "<p>Especifique cada persona por su nombre de usuaro. Cada persona debe haberse registrado con el nombre de usuario dado.</p>\n"
"haberse registrado con el nombre de usuario dado.</p>\n"
"<p>Separe los nombres de usuarios con comas y/o nuevas líneas.</p>\n" "<p>Separe los nombres de usuarios con comas y/o nuevas líneas.</p>\n"
#: IDF/gettexttemplates/idf/admin/members.html.php:8 #: IDF/gettexttemplates/idf/admin/members.html.php:8
@@ -1072,22 +1070,17 @@ msgstr ""
msgid "" msgid ""
"\n" "\n"
"<p><strong>Notes:</strong></p>\n" "<p><strong>Notes:</strong></p>\n"
"<p>A project owner may make any change to this project, including removing " "<p>A project owner may make any change to this project, including removing other project owners. You need to be carefull when you give owner rights.</p>\n"
"other project owners. You need to be carefull when you give owner rights.</" "<p>A project member will not have access to the administration area but will have more options available in the use of the project.</p>\n"
"p>\n"
"<p>A project member will not have access to the administration area but will "
"have more options available in the use of the project.</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p><strong>Notas:</strong></p>\n" "<p><strong>Notas:</strong></p>\n"
"<p>El propietario de un proyecto puede hacer cualquier cambio a este " "<p>El propietario de un proyecto puede hacer cualquier cambio a este proyecto, incluyendo la eliminación de otros propietarios del proyecto. ¡Tienes que tener cuidado cuando das permisos de propietario!.</p>\n"
"proyecto, incluyendo la eliminación de otros propietarios del proyecto. " "<p>Un miembro del proyecto no tendrá acceso al área de administración, pero tendrá más opciones disponibles para usar en el proyecto.</p>\n"
"¡Tienes que tener cuidado cuando das permisos de propietario!.</p>\n"
"<p>Un miembro del proyecto no tendrá acceso al área de administración, pero "
"tendrá más opciones disponibles para usar en el proyecto.</p>\n"
#: IDF/gettexttemplates/idf/admin/source.html.php:3 #: IDF/gettexttemplates/idf/admin/source.html.php:3
msgid "You can find here the current repository configuration of your project." msgid ""
"You can find here the current repository configuration of your project."
msgstr "" msgstr ""
"Puede encontrar aquí la configuración actual del repositorio de su proyecto." "Puede encontrar aquí la configuración actual del repositorio de su proyecto."
@@ -1097,8 +1090,7 @@ msgid ""
"request is sent after each repository commit. If this field is empty,\n" "request is sent after each repository commit. If this field is empty,\n"
"notifications are disabled.</p>\n" "notifications are disabled.</p>\n"
"\n" "\n"
"<p>Only properly-escaped <strong>HTTP</strong> URLs are supported, for " "<p>Only properly-escaped <strong>HTTP</strong> URLs are supported, for example:</p>\n"
"example:</p>\n"
"\n" "\n"
"<ul>\n" "<ul>\n"
"<li>http://domain.com/commit</li>\n" "<li>http://domain.com/commit</li>\n"
@@ -1117,10 +1109,8 @@ msgid ""
"post-commit URL http://mydomain.com/%p/%r would send a request to\n" "post-commit URL http://mydomain.com/%p/%r would send a request to\n"
"http://mydomain.com/my-project/123.</p>" "http://mydomain.com/my-project/123.</p>"
msgstr "" msgstr ""
"<p>La configuración URL WebHook especifica una URL con una solicitud HTTP " "<p>La configuración URL WebHook especifica una URL con una solicitud HTTP POST\n"
"POST\n" "que se envía después de cada commit del repositorio. Si este campo está vacío,\n"
"que se envía después de cada commit del repositorio. Si este campo está "
"vacío,\n"
"las notificaciones están desactivadas.</p>\n" "las notificaciones están desactivadas.</p>\n"
"\n" "\n"
"<p>Únicamente las URLs <strong>HTTP</strong>, \n" "<p>Únicamente las URLs <strong>HTTP</strong>, \n"
@@ -1132,16 +1122,14 @@ msgstr ""
"</ul>\n" "</ul>\n"
"\n" "\n"
"<p>Además, la URL puede contener la siguiente notación: \"%\", que\n" "<p>Además, la URL puede contener la siguiente notación: \"%\", que\n"
"será reemplazada por los valores específicos del proyecto para cada commit:</" "será reemplazada por los valores específicos del proyecto para cada commit:</p>\n"
"p>\n"
"\n" "\n"
"<ul>\n" "<ul>\n"
"<li>%p - nombre del proyecto</li>\n" "<li>%p - nombre del proyecto</li>\n"
"<li>%r - número de revisión</li>\n" "<li>%r - número de revisión</li>\n"
"</ul>\n" "</ul>\n"
"\n" "\n"
"<p>Por ejemplo, el commit de la revisión 123 del proyecto 'mi-proyecto' con " "<p>Por ejemplo, el commit de la revisión 123 del proyecto 'mi-proyecto' con URL de post-commit http://midominio.com/%p/%r enviaría la solicitud\n"
"URL de post-commit http://midominio.com/%p/%r enviaría la solicitud\n"
"http://midominio.com/mi-proyecto/123.</p>" "http://midominio.com/mi-proyecto/123.</p>"
#: IDF/gettexttemplates/idf/admin/source.html.php:26 #: IDF/gettexttemplates/idf/admin/source.html.php:26
@@ -1173,13 +1161,11 @@ msgstr "Clave de autenticación Post-commit:"
msgid "" msgid ""
"\n" "\n"
"<p><strong>Instructions:</strong></p>\n" "<p><strong>Instructions:</strong></p>\n"
"<p>The description of the project can be improved using the <a href=\"%%url%%" "<p>The description of the project can be improved using the <a href=\"%%url%%\">Markdown syntax</a>.</p>\n"
"\">Markdown syntax</a>.</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p><strong>Instrucciones:</strong></p>\n" "<p><strong>Instrucciones:</strong></p>\n"
"<p>La descripción del proyecto puede ser mejorada mediante la <a href=\"%%url" "<p>La descripción del proyecto puede ser mejorada mediante la <a href=\"%%url%%\">Sintaxis de Marcado</a>.</p>\n"
"%%\">Sintaxis de Marcado</a>.</p>\n"
#: IDF/gettexttemplates/idf/admin/summary.html.php:7 #: IDF/gettexttemplates/idf/admin/summary.html.php:7
msgid "" msgid ""
@@ -1197,8 +1183,7 @@ msgid ""
"password or SSH key." "password or SSH key."
msgstr "" msgstr ""
"\n" "\n"
"Solo los miembros del proyecto y los administradores tienen acceso de " "Solo los miembros del proyecto y los administradores tienen acceso de escritura sobre las fuentes.<br />\n"
"escritura sobre las fuentes.<br />\n"
"Si restringe el acceso a las fuentes, el acceso anónimo,<br />\n" "Si restringe el acceso a las fuentes, el acceso anónimo,<br />\n"
"no estará habilitado y los usuarios deberán autentificarse con su<br />\n" "no estará habilitado y los usuarios deberán autentificarse con su<br />\n"
"contraseña o clave SSH." "contraseña o clave SSH."
@@ -1217,12 +1202,12 @@ msgid ""
"Notification emails will be sent from the <strong>%%from_email%%</strong> " "Notification emails will be sent from the <strong>%%from_email%%</strong> "
"address, if you send the email to a mailing list, you may need to register " "address, if you send the email to a mailing list, you may need to register "
"this email address. Multiple email addresses must be separated through " "this email address. Multiple email addresses must be separated through "
"commas (','). If you do not want to send emails for a given type of changes, " "commas (','). If you do not want to send emails for a given type of changes,"
"simply leave the corresponding field empty." " simply leave the corresponding field empty."
msgstr "" msgstr ""
"Las notificaciones de mensajes se enviarán desde la dirección <strong>" "Las notificaciones de mensajes se enviarán desde la dirección "
"%%from_email%%</strong>, si envía el mensaje a una lista de correo, puede " "<strong>%%from_email%%</strong>, si envía el mensaje a una lista de correo, "
"que tenga que registrar esta dirección de correo electrónico. Varias " "puede que tenga que registrar esta dirección de correo electrónico. Varias "
"direcciones de correo electrónico deben separarse por comas (','). Si no " "direcciones de correo electrónico deben separarse por comas (','). Si no "
"desea enviar mensajes de correo electrónico para un determinado tipo de " "desea enviar mensajes de correo electrónico para un determinado tipo de "
"cambio, simplemente deje el correspondiente campo vacío." "cambio, simplemente deje el correspondiente campo vacío."
@@ -1232,8 +1217,8 @@ msgid ""
"If you mark a project as private, only the project members and " "If you mark a project as private, only the project members and "
"administrators, together with the extra authorized users you provide will " "administrators, together with the extra authorized users you provide will "
"have access to the project. You will still be able to define further access " "have access to the project. You will still be able to define further access "
"rights for the different tabs but the \"Open to all\" and \"Signed in users" "rights for the different tabs but the \"Open to all\" and \"Signed in "
"\" will default to authorized users only." "users\" will default to authorized users only."
msgstr "" msgstr ""
"Si marca un proyecto como privado, sólo los miembros del proyecto y los " "Si marca un proyecto como privado, sólo los miembros del proyecto y los "
"administradores, junto con los usuarios adicionales autorizados tendrán " "administradores, junto con los usuarios adicionales autorizados tendrán "
@@ -1306,14 +1291,14 @@ msgstr "Nueva descarga"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:3 #: IDF/gettexttemplates/idf/downloads/delete.html.php:3
msgid "" msgid ""
"<strong>Attention!</strong> If you want to delete a specific version of your " "<strong>Attention!</strong> If you want to delete a specific version of your"
"software, maybe, someone is depending on this specific version to run his " " software, maybe, someone is depending on this specific version to run his "
"systems. Are you sure, you will not affect anybody when removing this file?" "systems. Are you sure, you will not affect anybody when removing this file?"
msgstr "" msgstr ""
"<strong>¡Atención!</strong> Si desea eliminar una versión específica del " "<strong>¡Atención!</strong> Si desea eliminar una versión específica del "
"software, tal vez, alguien está utilizando esta versión específica para " "software, tal vez, alguien está utilizando esta versión específica para "
"ejecutarlo en su sistema. ¿Estás seguro de que no afectará a nadie cuando se " "ejecutarlo en su sistema. ¿Estás seguro de que no afectará a nadie cuando se"
"elimine este archivo?" " elimine este archivo?"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:4 #: IDF/gettexttemplates/idf/downloads/delete.html.php:4
#, php-format #, php-format
@@ -1479,8 +1464,7 @@ msgid ""
"name." "name."
msgstr "" msgstr ""
"Cada archivo debe tener un nombre distinto y el contenido del archivo\n" "Cada archivo debe tener un nombre distinto y el contenido del archivo\n"
"no se puede cambiar, así que asegúrese de incluir los números de versión en " "no se puede cambiar, así que asegúrese de incluir los números de versión en el nombre de cada\n"
"el nombre de cada\n"
"archivo." "archivo."
#: IDF/gettexttemplates/idf/downloads/submit.html.php:6 #: IDF/gettexttemplates/idf/downloads/submit.html.php:6
@@ -1563,27 +1547,27 @@ msgstr "Proyectos"
msgid "" msgid ""
"<p>This is simple:</p>\n" "<p>This is simple:</p>\n"
"<ol>\n" "<ol>\n"
"<li>Write in the comments \"This is a duplicate of issue 123\", change 123 " "<li>Write in the comments \"This is a duplicate of issue 123\", change 123 with the corresponding issue number.</li>\n"
"with the corresponding issue number.</li>\n"
"<li>Change the status of the current issue to <em>Duplicate</em>.</li>\n" "<li>Change the status of the current issue to <em>Duplicate</em>.</li>\n"
"<li>Submit the changes.</li>\n" "<li>Submit the changes.</li>\n"
"</ol>" "</ol>"
msgstr "" msgstr ""
"<p>Es simple:</p>\n" "<p>Es simple:</p>\n"
"<ol>\n" "<ol>\n"
"<li>Escribe en los comentarios \"Esto es una duplicado del ticket 123\", " "<li>Escribe en los comentarios \"Esto es una duplicado del ticket 123\", cambia 123 por el número de ticket correspondiente.</li>\n"
"cambia 123 por el número de ticket correspondiente.</li>\n"
"<li>Cambia el estado del ticket actual a <em>Duplicado</em>.</li>\n" "<li>Cambia el estado del ticket actual a <em>Duplicado</em>.</li>\n"
"<li>Envíe los cambios.</li>\n" "<li>Envíe los cambios.</li>\n"
"</ol>" "</ol>"
#: IDF/gettexttemplates/idf/faq.html.php:9 #: IDF/gettexttemplates/idf/faq.html.php:9
msgid "" msgid ""
"You need to create an account on <a href=\"http://en.gravatar.com/" "You need to create an account on <a "
"\">Gravatar</a>, this takes about 5 minutes and is free." "href=\"http://en.gravatar.com/\">Gravatar</a>, this takes about 5 minutes "
"and is free."
msgstr "" msgstr ""
"Necesitas crear una cuenta en <a href=\"http://en.gravatar.com/\">Gravatar</" "Necesitas crear una cuenta en <a "
"a> , tardarás 5 minutos y es gratuito." "href=\"http://en.gravatar.com/\">Gravatar</a> , tardarás 5 minutos y es "
"gratuito."
#: IDF/gettexttemplates/idf/faq.html.php:10 #: IDF/gettexttemplates/idf/faq.html.php:10
msgid "" msgid ""
@@ -1724,8 +1708,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:4 #: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:4
msgid "" msgid ""
"<strong>Once you have defined the repository type, you cannot change it</" "<strong>Once you have defined the repository type, you cannot change "
"strong>." "it</strong>."
msgstr "" msgstr ""
"<strong>Una vez que haya definido el tipo de repositorio, no se puede " "<strong>Una vez que haya definido el tipo de repositorio, no se puede "
"modificar</strong>." "modificar</strong>."
@@ -1733,13 +1717,11 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:5 #: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:5
msgid "" msgid ""
"\n" "\n"
"<p>Specify each person by its login. Each person must have already " "<p>Specify each person by its login. Each person must have already registered with the given login.</p>\n"
"registered with the given login.</p>\n"
"<p>Separate the logins with commas and/or new lines.</p>\n" "<p>Separate the logins with commas and/or new lines.</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p>Especifique cada persona por su nombre de usuario. Cada persona debe " "<p>Especifique cada persona por su nombre de usuario. Cada persona debe estar registrada con el nombre de usuario proporcionado.</p>\n"
"estar registrada con el nombre de usuario proporcionado.</p>\n"
"<p>Separe los nombres de usuario con comas y / o saltos de líneas.</p>\n" "<p>Separe los nombres de usuario con comas y / o saltos de líneas.</p>\n"
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:14 #: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:14
@@ -1752,7 +1734,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:15 #: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:15
msgid "Provide at least one owner for the project or use a template." msgid "Provide at least one owner for the project or use a template."
msgstr "" msgstr ""
"Proporcione al menos un propietario para el proyecto o utilice una plantilla." "Proporcione al menos un propietario para el proyecto o utilice una "
"plantilla."
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:3 #: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:3
#, php-format #, php-format
@@ -1772,8 +1755,7 @@ msgid ""
msgstr "" msgstr ""
"\n" "\n"
"<strong>¡Atención!</strong> Eliminar un proyecto es una operación delicada,\n" "<strong>¡Atención!</strong> Eliminar un proyecto es una operación delicada,\n"
"que tiene como resultado <strong>borrar todos los datos</strong> del " "que tiene como resultado <strong>borrar todos los datos</strong> del proyecto.\n"
"proyecto.\n"
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:10 #: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:10
msgid "" msgid ""
@@ -1929,8 +1911,8 @@ msgstr "Ver <a href=\"%%url%%\">usuarios sin validar</a>."
#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:4 #: IDF/gettexttemplates/idf/gadmin/users/index.html.php:4
msgid "<p>You have here an overview of the users registered in the forge.</p>" msgid "<p>You have here an overview of the users registered in the forge.</p>"
msgstr "" msgstr ""
"<p>Tiene aquí una visión general de los usuarios registrados en la forja. </" "<p>Tiene aquí una visión general de los usuarios registrados en la forja. "
"p>" "</p>"
#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:5 #: IDF/gettexttemplates/idf/gadmin/users/index.html.php:5
msgid "Number of users:" msgid "Number of users:"
@@ -1952,8 +1934,7 @@ msgid ""
"able to create new projects and update other non staff users.\n" "able to create new projects and update other non staff users.\n"
msgstr "" msgstr ""
"Si da permisos de acceso tipo Staff, el usuario será capaz \n" "Si da permisos de acceso tipo Staff, el usuario será capaz \n"
"de crear nuevos proyectos y actualizar a otros usuarios que no sean del " "de crear nuevos proyectos y actualizar a otros usuarios que no sean del Staff.\n"
"Staff.\n"
#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:9 #: IDF/gettexttemplates/idf/gadmin/users/update.html.php:9
msgid "The form contains some errors. Please correct them to update the user." msgid "The form contains some errors. Please correct them to update the user."
@@ -2204,13 +2185,10 @@ msgstr "Volver al ticket"
#, php-format #, php-format
msgid "" msgid ""
"<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n" "<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</" "<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>\n"
"a></p>\n"
msgstr "" msgstr ""
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></" "<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"p>\n" "<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>\n"
"<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>\n"
#: IDF/gettexttemplates/idf/issues/by-label.html.php:7 #: IDF/gettexttemplates/idf/issues/by-label.html.php:7
msgid "Label:" msgid "Label:"
@@ -2222,32 +2200,28 @@ msgstr "Finalizados:"
#: IDF/gettexttemplates/idf/issues/create.html.php:3 #: IDF/gettexttemplates/idf/issues/create.html.php:3
msgid "" msgid ""
"<p>When you submit the issue do not forget to provide the following " "<p>When you submit the issue do not forget to provide the following information:</p>\n"
"information:</p>\n"
"<ul>\n" "<ul>\n"
"<li>The steps to reproduce the problem.</li>\n" "<li>The steps to reproduce the problem.</li>\n"
"<li>The version of the software and your operating system.</li>\n" "<li>The version of the software and your operating system.</li>\n"
"<li>Any information that can help the developers to solve the issue.</li>\n" "<li>Any information that can help the developers to solve the issue.</li>\n"
"<li><strong>Do not provide any password or confidential information!</" "<li><strong>Do not provide any password or confidential information!</strong></li>\n"
"strong></li>\n"
"</ul>" "</ul>"
msgstr "" msgstr ""
"<p>Cuando envío el ticket, no se olvide proporcionar la siguiente " "<p>Cuando envío el ticket, no se olvide proporcionar la siguiente información:</p>\n"
"información:</p>\n"
"<ul>\n" "<ul>\n"
"<li>Los pasos para reproducir el problema.</li>\n" "<li>Los pasos para reproducir el problema.</li>\n"
"<li>La versión del software y tu sistema operativo.</li>\n" "<li>La versión del software y tu sistema operativo.</li>\n"
"<li>Cualquier información que pueda ayudar a los desarrolladores para " "<li>Cualquier información que pueda ayudar a los desarrolladores para resolver la incidencia.</li>\n"
"resolver la incidencia.</li>\n" "<li><strong>¡No proporcione ninguna contraseña o información confidencial!</strong></li>\n"
"<li><strong>¡No proporcione ninguna contraseña o información confidencial!</"
"strong></li>\n"
"</ul>" "</ul>"
#: IDF/gettexttemplates/idf/issues/create.html.php:10 #: IDF/gettexttemplates/idf/issues/create.html.php:10
msgid "The form contains some errors. Please correct them to submit the issue." msgid ""
"The form contains some errors. Please correct them to submit the issue."
msgstr "" msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar el " "El formulario contiene algunos errores. Por favor, corríjalos para enviar el"
"ticket." " ticket."
#: IDF/gettexttemplates/idf/issues/create.html.php:11 #: IDF/gettexttemplates/idf/issues/create.html.php:11
#: IDF/gettexttemplates/idf/issues/create.html.php:13 #: IDF/gettexttemplates/idf/issues/create.html.php:13
@@ -2323,13 +2297,10 @@ msgstr "Propietario:"
#, php-format #, php-format
msgid "" msgid ""
"<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n" "<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</" "<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>"
"a></p>"
msgstr "" msgstr ""
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></" "<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"p>\n" "<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>"
"<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:3 #: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:3
msgid "" msgid ""
@@ -2373,26 +2344,23 @@ msgstr "Comentarios (más reciente primero):"
#: IDF/gettexttemplates/idf/issues/my-issues.html.php:3 #: IDF/gettexttemplates/idf/issues/my-issues.html.php:3
#, php-format #, php-format
msgid "" msgid "See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
"See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
msgid_plural "" msgid_plural ""
"See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>." "See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
msgstr[0] "" msgstr[0] ""
"Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% tickets cerrado</" "Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% tickets "
"a>." "cerrado</a>."
msgstr[1] "" msgstr[1] "Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% cerrado</a>."
"Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% cerrado</a>."
#: IDF/gettexttemplates/idf/issues/my-issues.html.php:4 #: IDF/gettexttemplates/idf/issues/my-issues.html.php:4
#, php-format #, php-format
msgid "" msgid "See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
"See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
msgid_plural "" msgid_plural ""
"See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>." "See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
msgstr[0] "" msgstr[0] ""
"Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% tickets cerrado</a>." "Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% tickets "
msgstr[1] "" "cerrado</a>."
"Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% cerrado</a>." msgstr[1] "Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% cerrado</a>."
#: IDF/gettexttemplates/idf/issues/my-issues.html.php:6 #: IDF/gettexttemplates/idf/issues/my-issues.html.php:6
#: IDF/gettexttemplates/idf/user/dashboard.html.php:7 #: IDF/gettexttemplates/idf/user/dashboard.html.php:7
@@ -2421,8 +2389,8 @@ msgstr "Reportado por %%submitter%%, %%c.creation_dtime%%"
msgid "" msgid ""
"Comment <a href=\"%%url%%\">%%i%%</a> by %%submitter%%, %%c.creation_dtime%%" "Comment <a href=\"%%url%%\">%%i%%</a> by %%submitter%%, %%c.creation_dtime%%"
msgstr "" msgstr ""
"Comentario <a href=\"%%url%%\">%%i%%</a> por %%submitter%%, %%c." "Comentario <a href=\"%%url%%\">%%i%%</a> por %%submitter%%, "
"creation_dtime%%" "%%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:5 #: IDF/gettexttemplates/idf/issues/view.html.orig.php:5
#: IDF/gettexttemplates/idf/issues/view.html.php:5 #: IDF/gettexttemplates/idf/issues/view.html.php:5
@@ -2498,7 +2466,8 @@ msgstr "ver"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:21 #: IDF/gettexttemplates/idf/issues/view.html.orig.php:21
#: IDF/gettexttemplates/idf/issues/view.html.php:21 #: IDF/gettexttemplates/idf/issues/view.html.php:21
msgid "The form contains some errors. Please correct them to change the issue." msgid ""
"The form contains some errors. Please correct them to change the issue."
msgstr "" msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para " "El formulario contiene algunos errores. Por favor, corríjalos para "
"actualizar el ticket." "actualizar el ticket."
@@ -2516,8 +2485,8 @@ msgstr "Seguido por:"
#: IDF/gettexttemplates/idf/login_form.html.php:3 #: IDF/gettexttemplates/idf/login_form.html.php:3
#, php-format #, php-format
msgid "" msgid ""
"If you don't have an account yet, you can create one <a href=\"%%url%%" "If you don't have an account yet, you can create one <a "
"\">here</a>." "href=\"%%url%%\">here</a>."
msgstr "" msgstr ""
"Si aún no tienes una cuenta, puedes crear una <a href=\"%%url%%\">aquí</a>." "Si aún no tienes una cuenta, puedes crear una <a href=\"%%url%%\">aquí</a>."
@@ -2551,11 +2520,10 @@ msgstr "Se tarda menos de un minuto en crearte una cuenta."
#: IDF/gettexttemplates/idf/main-menu.html.php:3 #: IDF/gettexttemplates/idf/main-menu.html.php:3
#, php-format #, php-format
msgid "" msgid "Welcome, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></strong>."
"Welcome, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></strong>."
msgstr "" msgstr ""
"Bienvenido, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></" "Bienvenido, <strong><a class=\"userw\" "
"strong>." "href=\"%%url%%\">%%user%%</a></strong>."
#: IDF/gettexttemplates/idf/main-menu.html.php:4 #: IDF/gettexttemplates/idf/main-menu.html.php:4
msgid "Sign Out" msgid "Sign Out"
@@ -2700,8 +2668,8 @@ msgstr "Activar tu cuenta"
#: IDF/gettexttemplates/idf/register/confirmation.html.php:8 #: IDF/gettexttemplates/idf/register/confirmation.html.php:8
#: IDF/gettexttemplates/idf/user/passrecovery.html.php:8 #: IDF/gettexttemplates/idf/user/passrecovery.html.php:8
msgid "" msgid ""
"This is the last step, but just <strong>be sure to have the cookies enabled</" "This is the last step, but just <strong>be sure to have the cookies "
"strong> to log in afterwards." "enabled</strong> to log in afterwards."
msgstr "" msgstr ""
"Este es el último paso, pero <strong>asegúrese de tener las cookies " "Este es el último paso, pero <strong>asegúrese de tener las cookies "
"activadas</strong> para identificarte." "activadas</strong> para identificarte."
@@ -2722,8 +2690,8 @@ msgid ""
"create a new account. Just go <a href=\"%%url%%\">here</a> to recover your " "create a new account. Just go <a href=\"%%url%%\">here</a> to recover your "
"login name and password." "login name and password."
msgstr "" msgstr ""
"Si ha olvidado los datos de acceso, entonces no tiene porque crear una nueva " "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 " " cuenta. Simplemente haga click <a href=\"%%url%%\">aquí</a> para recuperar "
"su nombre de usuario y contraseña." "su nombre de usuario y contraseña."
#: IDF/gettexttemplates/idf/register/index.html.php:5 #: IDF/gettexttemplates/idf/register/index.html.php:5
@@ -2731,15 +2699,15 @@ msgstr ""
#, php-format #, php-format
msgid "" msgid ""
"With your account, you will able to participate in the life of all the " "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 " "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 " " you have troubles, you can <a href=\"%%url%%\">let us know about your "
"at anytime</a>!" "issues at anytime</a>!"
msgstr "" msgstr ""
"Con su cuenta, será capaz de participar en el desarrollo de todos los " "Con su cuenta, será capaz de participar en el desarrollo de todos los "
"proyectos alojados aquí. Participar en un proyecto software tiene que ser " "proyectos alojados aquí. Participar en un proyecto software tiene que ser "
"algo divertido e interesante, así que si tiene problemas, puede <a href=" "algo divertido e interesante, así que si tiene problemas, puede <a "
"\"%%url%%\">¡hacernos saber cuáles son sus inquietudes en cualquier momento</" "href=\"%%url%%\">¡hacernos saber cuáles son sus inquietudes en cualquier "
"a>!" "momento</a>!"
#: IDF/gettexttemplates/idf/register/index.html.php:6 #: IDF/gettexttemplates/idf/register/index.html.php:6
#: IDF/gettexttemplates/idf/register/index.html~.php:5 #: IDF/gettexttemplates/idf/register/index.html~.php:5
@@ -2759,8 +2727,8 @@ msgid ""
"Be sure to provide a valid email address, as we are sending a validation " "Be sure to provide a valid email address, as we are sending a validation "
"link by email." "link by email."
msgstr "" msgstr ""
"Asegúrese de proporcionar una dirección válida de correo electrónico, ya que " "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." " se enviará un enlace de confirmación por correo electrónico."
#: IDF/gettexttemplates/idf/register/index.html.php:10 #: IDF/gettexttemplates/idf/register/index.html.php:10
#: IDF/gettexttemplates/idf/register/index.html~.php:9 #: IDF/gettexttemplates/idf/register/index.html~.php:9
@@ -2810,35 +2778,30 @@ msgstr "Iniciar revisión del Código"
msgid "" msgid ""
"<p>To start a code review, you need to provide:</p>\n" "<p>To start a code review, you need to provide:</p>\n"
"<ul>\n" "<ul>\n"
"<li>A commit or revision of the current code in the repository from which " "<li>A commit or revision of the current code in the repository from which you started your work.</li>\n"
"you started your work.</li>\n" "<li>A patch describing your changes with respect to the reference commit.</li>\n"
"<li>A patch describing your changes with respect to the reference commit.</" "<li><strong>Check your patch does not provide any password or confidential information!</strong></li>\n"
"li>\n"
"<li><strong>Check your patch does not provide any password or confidential "
"information!</strong></li>\n"
"</ul>" "</ul>"
msgstr "" msgstr ""
"<p>Para iniciar una revisión de código, debe proporcionar:</p>\n" "<p>Para iniciar una revisión de código, debe proporcionar:</p>\n"
"<ul>\n" "<ul>\n"
"<li>Un commit o revisión del actual código del repositorio, desde el que ha " "<li>Un commit o revisión del actual código del repositorio, desde el que ha comenzado su trabajo.</li>\n"
"comenzado su trabajo.</li>\n" "<li>Un parche que describa los cambios con respecto al commit referenciado.</li>\n"
"<li>Un parche que describa los cambios con respecto al commit referenciado.</" "<li><strong>¡Asegúrese de que el parche no contiene ninguna contraseña o información confidencial!</strong></li>\n"
"li>\n"
"<li><strong>¡Asegúrese de que el parche no contiene ninguna contraseña o "
"información confidencial!</strong></li>\n"
"</ul>" "</ul>"
#: IDF/gettexttemplates/idf/review/create.html.php:9 #: IDF/gettexttemplates/idf/review/create.html.php:9
msgid "" msgid ""
"The form contains some errors. Please correct them to submit the code review." "The form contains some errors. Please correct them to submit the code "
"review."
msgstr "" msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar la " "El formulario contiene algunos errores. Por favor, corríjalos para enviar la"
"revisión de código." " revisión de código."
#: IDF/gettexttemplates/idf/review/create.html.php:10 #: IDF/gettexttemplates/idf/review/create.html.php:10
msgid "" msgid ""
"Select the commit against which you created your patch to be sure it applies " "Select the commit against which you created your patch to be sure it applies"
"correctly." " correctly."
msgstr "" msgstr ""
"Seleccione el commit contra el que creó el parche para asegurarse de que se " "Seleccione el commit contra el que creó el parche para asegurarse de que se "
"aplica correctamente." "aplica correctamente."
@@ -2901,14 +2864,11 @@ msgid ""
msgstr "" msgstr ""
"La revisión de código es una proceso en el que\n" "La revisión de código es una proceso en el que\n"
"antes o después los cambios son commited en el código del repositorio,\n" "antes o después los cambios son commited en el código del repositorio,\n"
"diferentes personas discuten sobre los cambios en el código. El objetivo " "diferentes personas discuten sobre los cambios en el código. El objetivo es \n"
"es \n"
"<strong>mejorar la calidad del código y las\n" "<strong>mejorar la calidad del código y las\n"
"contribuciones</strong>, por esto, debe ser pragmático cuando escriba \n" "contribuciones</strong>, por esto, debe ser pragmático cuando escriba \n"
"sus comentarios. Menciona correctamente los números de línea (tanto en el " "sus comentarios. Menciona correctamente los números de línea (tanto en el antiguo como en el \n"
"antiguo como en el \n" "nuevo código) y trata de mantener un buen equilibrio entre seriedad y diversión\n"
"nuevo código) y trata de mantener un buen equilibrio entre seriedad y "
"diversión\n"
#: IDF/gettexttemplates/idf/review/view.html.php:13 #: IDF/gettexttemplates/idf/review/view.html.php:13
msgid "" msgid ""
@@ -2920,23 +2880,20 @@ msgid ""
"to propose more contributions</strong>.\n" "to propose more contributions</strong>.\n"
msgstr "" msgstr ""
"\n" "\n"
"<strong>La propuesta para revisar código es intimidante</strong>, debes " "<strong>La propuesta para revisar código es intimidante</strong>, debes saber \n"
"saber \n" "que recibirás críticas, así que por favor, como revisor, <strong>haz que este \n"
"que recibirás críticas, así que por favor, como revisor, <strong>haz que " "proceso sea divertido</strong>, úsalo para para ayudar al colaborador a aprender tus \n"
"este \n"
"proceso sea divertido</strong>, úsalo para para ayudar al colaborador a "
"aprender tus \n"
"normas de codificación y a estructurar el código y <strong>hacer que \n" "normas de codificación y a estructurar el código y <strong>hacer que \n"
"quieran proponer más contribuciones</strong>.\n" "quieran proponer más contribuciones</strong>.\n"
#: IDF/gettexttemplates/idf/review/view.html.php:20 #: IDF/gettexttemplates/idf/review/view.html.php:20
#, php-format #, php-format
msgid "" msgid ""
"Comment <a href=\"%%url%%\">%%i%%</a> by <a href=\"%%whourl%%\">%%who%%</a>, " "Comment <a href=\"%%url%%\">%%i%%</a> by <a href=\"%%whourl%%\">%%who%%</a>,"
"%%c.creation_dtime%%" " %%c.creation_dtime%%"
msgstr "" msgstr ""
"Comentario <a href=\"%%url%%\">%%i%%</a> por <a href=\"%%whourl%%\">%%who%%</" "Comentario <a href=\"%%url%%\">%%i%%</a> por <a "
"a>, %%c.creation_dtime%%" "href=\"%%whourl%%\">%%who%%</a>, %%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/review/view.html.php:21 #: IDF/gettexttemplates/idf/review/view.html.php:21
#, php-format #, php-format
@@ -2952,8 +2909,8 @@ msgstr "<a href=\"%%url%%\">Accede</a> para participar en la revisión."
msgid "" msgid ""
"The form contains some errors. Please correct them to submit your review." "The form contains some errors. Please correct them to submit your review."
msgstr "" msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar su " "El formulario contiene algunos errores. Por favor, corríjalos para enviar su"
"revisión." " revisión."
#: IDF/gettexttemplates/idf/review/view.html.php:27 #: IDF/gettexttemplates/idf/review/view.html.php:27
#: IDF/gettexttemplates/idf/source/commit.html.php:5 #: IDF/gettexttemplates/idf/source/commit.html.php:5
@@ -3260,13 +3217,15 @@ msgstr ""
msgid "" msgid ""
"You may need to <a href=\"%%url%%\">provide your SSH key</a>. The " "You may need to <a href=\"%%url%%\">provide your SSH key</a>. The "
"synchronization of your SSH key can take a couple of minutes. You can learn " "synchronization of your SSH key can take a couple of minutes. You can learn "
"more about <a href=\"http://www.google.com/search?q=public+ssh+key" "more about <a "
"+authentication\">SSH key authentication</a>." "href=\"http://www.google.com/search?q=public+ssh+key+authentication\">SSH "
"key authentication</a>."
msgstr "" msgstr ""
"Puede que tenga que <a href=\"%%url%%\">proporcionar su clave SSH</a>. La " "Puede que tenga que <a href=\"%%url%%\">proporcionar su clave SSH</a>. La "
"sincronización de la clave SSH puede tomar un par de minutos. Puede saber " "sincronización de la clave SSH puede tomar un par de minutos. Puede saber "
"más acerca de <a href=\"http://www.google.com/search?q=public+ssh+key" "más acerca de <a "
"+authentication\">autenticación de claves SSH</a>." "href=\"http://www.google.com/search?q=public+ssh+key+authentication\">autenticación"
" de claves SSH</a>."
#: IDF/gettexttemplates/idf/source/git/help.html.php:7 #: IDF/gettexttemplates/idf/source/git/help.html.php:7
#: IDF/gettexttemplates/idf/source/mtn/help.html.php:6 #: IDF/gettexttemplates/idf/source/mtn/help.html.php:6
@@ -3346,8 +3305,7 @@ msgid ""
msgstr "" msgstr ""
"Si se trata de un nuevo repositorio, la razón de este error\n" "Si se trata de un nuevo repositorio, la razón de este error\n"
"podría ser que no ha realizado ningún commit y / o push hasta el momento.\n" "podría ser que no ha realizado ningún commit y / o push hasta el momento.\n"
"En este caso, por favor eche un vistazo a la <a href=\"%%url%%\">Página de " "En este caso, por favor eche un vistazo a la <a href=\"%%url%%\">Página de Ayuda</a>\n"
"Ayuda</a>\n"
"sobre cómo tener acceso a su repositorio." "sobre cómo tener acceso a su repositorio."
#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:3 #: IDF/gettexttemplates/idf/source/mercurial/help.html.php:3
@@ -3540,7 +3498,8 @@ msgstr "Clave de API"
msgid "" msgid ""
"Your API key will be regenerated automatically if you change your password." "Your API key will be regenerated automatically if you change your password."
msgstr "" msgstr ""
"La clave de la API se regenera automáticamente si usted cambia su contraseña." "La clave de la API se regenera automáticamente si usted cambia su "
"contraseña."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:12 #: IDF/gettexttemplates/idf/user/myaccount.html.php:12
msgid "Update Your Account" msgid "Update Your Account"
@@ -3576,8 +3535,8 @@ msgid ""
"API key is used to interact with this website using a program." "API key is used to interact with this website using a program."
msgstr "" msgstr ""
"La contraseña adicional se utiliza para acceder a algunos de los sistemas " "La contraseña adicional se utiliza para acceder a algunos de los sistemas "
"externos y la clave de la API se utiliza para interactuar con este sitio web " "externos y la clave de la API se utiliza para interactuar con este sitio web"
"utilizando un programa." " utilizando un programa."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:20 #: IDF/gettexttemplates/idf/user/myaccount.html.php:20
msgid "Show API key and extra password" msgid "Show API key and extra password"
@@ -3597,13 +3556,13 @@ msgstr "Recuperar mi contraseña"
#: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:6 #: IDF/gettexttemplates/idf/user/passrecovery-ask.html.php:6
msgid "" msgid ""
"Provide either your login or email address, if a corresponding user is found " "Provide either your login or email address, if a corresponding user is found"
"in the database, we will send you an email with the details on how to reset " " in the database, we will send you an email with the details on how to reset"
"your password." " your password."
msgstr "" msgstr ""
"Proporcione un usuario o dirección de correo electrónico, si el usuario " "Proporcione un usuario o dirección de correo electrónico, si el usuario "
"correspondiente se encuentra en la base de datos, le enviaremos un email con " "correspondiente se encuentra en la base de datos, le enviaremos un email con"
"los detalles sobre cómo restablecer su contraseña." " los detalles sobre cómo restablecer su contraseña."
#: IDF/gettexttemplates/idf/user/passrecovery-email.txt.php:3 #: IDF/gettexttemplates/idf/user/passrecovery-email.txt.php:3
#, php-format #, php-format
@@ -3729,15 +3688,12 @@ msgstr "Crear Página"
#: IDF/gettexttemplates/idf/wiki/delete.html.php:3 #: IDF/gettexttemplates/idf/wiki/delete.html.php:3
#, php-format #, php-format
msgid "" msgid ""
"You are looking at an old revision (<em>%%oldrev.summary%%</em>) of the " "You are looking at an old revision (<em>%%oldrev.summary%%</em>) of the page \n"
"page \n"
"<a href=\"%%url%%\">%%page.title%%</a>. This revision was created\n" "<a href=\"%%url%%\">%%page.title%%</a>. This revision was created\n"
"by %%submitter%%." "by %%submitter%%."
msgstr "" msgstr ""
"Está viendo una revisión antigua (<em>%%oldrev.summary%%</em>) de la " "Está viendo una revisión antigua (<em>%%oldrev.summary%%</em>) de la página \n"
"página \n" "<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por %%submitter%%."
"<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por "
"%%submitter%%."
#: IDF/gettexttemplates/idf/wiki/delete.html.php:6 #: IDF/gettexttemplates/idf/wiki/delete.html.php:6
msgid "" msgid ""
@@ -3764,8 +3720,8 @@ msgid ""
"recover it</strong>." "recover it</strong>."
msgstr "" msgstr ""
"Si elimina esta página de documentación, será eliminada de la base de datos " "Si elimina esta página de documentación, será eliminada de la base de datos "
"con todas las revisiones relacionadas y <strong>no será capaz de recuperarla." "con todas las revisiones relacionadas y <strong>no será capaz de "
"</strong>" "recuperarla.</strong>"
#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:6 #: IDF/gettexttemplates/idf/wiki/deletepage.html.php:6
msgid "Delete Page" msgid "Delete Page"
@@ -3776,23 +3732,15 @@ msgstr "Eliminar página"
msgid "" msgid ""
"\n" "\n"
"<p><strong>Instructions:</strong></p>\n" "<p><strong>Instructions:</strong></p>\n"
"<p>The content of the page can use the <a href=\"%%burl%%\">Markdown syntax</" "<p>The content of the page can use the <a href=\"%%burl%%\">Markdown syntax</a> with the <a href=\"%%eurl%%\"><em>Extra</em> extension</a>.</p>\n"
"a> with the <a href=\"%%eurl%%\"><em>Extra</em> extension</a>.</p>\n" "<p>Website addresses are automatically linked and you can link to another page in the documentation using double square brackets like that [[AnotherPage]].</p>\n"
"<p>Website addresses are automatically linked and you can link to another " "<p>To directly include a file content from the repository, embrace its path with triple square brackets: [[[path/to/file.txt]]].</p>\n"
"page in the documentation using double square brackets like that "
"[[AnotherPage]].</p>\n"
"<p>To directly include a file content from the repository, embrace its path "
"with triple square brackets: [[[path/to/file.txt]]].</p>\n"
msgstr "" msgstr ""
"\n" "\n"
"<p><strong>Instrucciones:</strong></p>\n" "<p><strong>Instrucciones:</strong></p>\n"
"<p>El contenido de la página puede usar <a href=\"%%burl%%\">sintaxis de " "<p>El contenido de la página puede usar <a href=\"%%burl%%\">sintaxis de Marcado</a> con la extensión <a href=\"%%eurl%%\"><em>Extra</em></a>.</p>\n"
"Marcado</a> con la extensión <a href=\"%%eurl%%\"><em>Extra</em></a>.</p>\n" "<p>Las direcciones Web se enlazan automáticamente y se puede vincular con otras páginas de la documentación usando corchetes dobles como: [[OtraPágina]].</p>\n"
"<p>Las direcciones Web se enlazan automáticamente y se puede vincular con " "<p>Para incluir directamente el contenido de un fichero del repositorio, rodee la ruta con corchetes triples como: [[[ruta/al/fichero.txt]]].</p>\n"
"otras páginas de la documentación usando corchetes dobles como: "
"[[OtraPágina]].</p>\n"
"<p>Para incluir directamente el contenido de un fichero del repositorio, "
"rodee la ruta con corchetes triples como: [[[ruta/al/fichero.txt]]].</p>\n"
#: IDF/gettexttemplates/idf/wiki/index.html.php:3 #: IDF/gettexttemplates/idf/wiki/index.html.php:3
#, php-format #, php-format
@@ -3829,8 +3777,7 @@ msgid ""
"use it as reference only if you are sure you need these specific information." "use it as reference only if you are sure you need these specific information."
msgstr "" msgstr ""
"<strong>¡Atención!</strong> Esta página está marcada como obsoleta,\n" "<strong>¡Atención!</strong> Esta página está marcada como obsoleta,\n"
"úsala como referencia solamente si está seguro de que usted necesita " "úsala como referencia solamente si está seguro de que usted necesita específicamente esta información ."
"específicamente esta información ."
#: IDF/gettexttemplates/idf/wiki/view.html.php:5 #: IDF/gettexttemplates/idf/wiki/view.html.php:5
#, php-format #, php-format
@@ -3840,8 +3787,7 @@ msgid ""
"by %%submitter%%." "by %%submitter%%."
msgstr "" msgstr ""
"Está viendo una revisión antigua de la página \n" "Está viendo una revisión antigua de la página \n"
"<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por " "<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por %%submitter%%."
"%%submitter%%."
#: IDF/gettexttemplates/idf/wiki/view.html.php:10 #: IDF/gettexttemplates/idf/wiki/view.html.php:10
msgid "Table of Content" msgid "Table of Content"
@@ -3899,10 +3845,8 @@ msgstr "fecha de modificación"
#: IDF/Issue.php:194 IDF/IssueComment.php:143 #: IDF/Issue.php:194 IDF/IssueComment.php:143
#, php-format #, php-format
msgid "" msgid "<a href=\"%1$s\" class=\"%2$s\" title=\"View issue\">Issue %3$d</a>, %4$s"
"<a href=\"%1$s\" class=\"%2$s\" title=\"View issue\">Issue %3$d</a>, %4$s" msgstr "<a href=\"%1$s\" class=\"%2$s\" title=\"Ver ticket\">Ticket %3$d</a>, %4$s"
msgstr ""
"<a href=\"%1$s\" class=\"%2$s\" title=\"Ver ticket\">Ticket %3$d</a>, %4$s"
#: IDF/Issue.php:196 #: IDF/Issue.php:196
#, php-format #, php-format
@@ -4057,8 +4001,8 @@ msgstr "No se puede examinar la configuración usher en \"%s\": %s"
#, php-format #, php-format
msgid "usher configuration already contains a server entry named \"%s\"" msgid "usher configuration already contains a server entry named \"%s\""
msgstr "" msgstr ""
"La configuración usher ya contiene una entrada para el servidor llamada \"%s" "La configuración usher ya contiene una entrada para el servidor llamada "
"\"" "\"%s\""
#: IDF/Plugin/SyncMonotone.php:320 IDF/Plugin/SyncMonotone.php:510 #: IDF/Plugin/SyncMonotone.php:320 IDF/Plugin/SyncMonotone.php:510
#, php-format #, php-format
@@ -4103,8 +4047,7 @@ msgstr "No se pudo escribir read-permissions para el proyecto \"%s\""
#: IDF/Plugin/SyncMonotone.php:617 IDF/Plugin/SyncMonotone.php:717 #: IDF/Plugin/SyncMonotone.php:617 IDF/Plugin/SyncMonotone.php:717
#, php-format #, php-format
msgid "Could not write write-permissions file for project \"%s\"" msgid "Could not write write-permissions file for project \"%s\""
msgstr "" msgstr "No se pudo escribir el fichero write-permissions para el proyecto \"%s\""
"No se pudo escribir el fichero write-permissions para el proyecto \"%s\""
#: IDF/Plugin/SyncMonotone.php:790 #: IDF/Plugin/SyncMonotone.php:790
#, php-format #, php-format
@@ -4163,17 +4106,13 @@ msgstr "voto"
#: IDF/Review/Comment.php:139 IDF/Review/Patch.php:151 #: IDF/Review/Comment.php:139 IDF/Review/Patch.php:151
#, php-format #, php-format
msgid "" msgid "<a href=\"%1$s\" class=\"%2$s\" title=\"View review\">Review %3$d</a>, %4$s"
"<a href=\"%1$s\" class=\"%2$s\" title=\"View review\">Review %3$d</a>, %4$s" msgstr "<a href=\"%1$s\" class=\"%2$s\" title=\"Ver revisión\">Revisión %3$d</a>, %4$s"
msgstr ""
"<a href=\"%1$s\" class=\"%2$s\" title=\"Ver revisión\">Revisión %3$d</a>, "
"%4$s"
#: IDF/Review/Comment.php:141 #: IDF/Review/Comment.php:141
#, php-format #, php-format
msgid "Update of <a href=\"%s\" class=\"%s\">review&nbsp;%d</a>, by %s" msgid "Update of <a href=\"%s\" class=\"%s\">review&nbsp;%d</a>, by %s"
msgstr "" msgstr "Actualización de <a href=\"%s\" class=\"%s\">revisión&nbsp;%d</a>, por %s"
"Actualización de <a href=\"%s\" class=\"%s\">revisión&nbsp;%d</a>, por %s"
#: IDF/Review/Comment.php:151 #: IDF/Review/Comment.php:151
#, php-format #, php-format
@@ -4528,8 +4467,8 @@ msgstr "Lista de mantenimiento: Tickets Cerrados por %s"
#, php-format #, php-format
msgid "This table shows the closed issues in your watch list for %s project." msgid "This table shows the closed issues in your watch list for %s project."
msgstr "" msgstr ""
"Esta tabla muestra los tickets cerrados en su lista de mantenimiento para el " "Esta tabla muestra los tickets cerrados en su lista de mantenimiento para el"
"proyecto %s." " proyecto %s."
#: IDF/Views/Issue.php:118 #: IDF/Views/Issue.php:118
#, php-format #, php-format
@@ -4540,8 +4479,8 @@ msgstr "Lista mantenimiento: Tickets Abiertos por %s"
#, php-format #, php-format
msgid "This table shows the open issues in your watch list for %s project." msgid "This table shows the open issues in your watch list for %s project."
msgstr "" msgstr ""
"Esta tabla muestra los tickets abiertos en su lista de mantenimiento para el " "Esta tabla muestra los tickets abiertos en su lista de mantenimiento para el"
"proyecto %s." " proyecto %s."
#: IDF/Views/Issue.php:195 #: IDF/Views/Issue.php:195
msgid "Watch List: Closed Issues" msgid "Watch List: Closed Issues"
@@ -4917,7 +4856,8 @@ msgid "Confirm Your Account Creation"
msgstr "Confirma la creación de tu cuenta" msgstr "Confirma la creación de tu cuenta"
#: IDF/Views.php:172 #: IDF/Views.php:172
msgid "Welcome! You can now participate in the life of your project of choice." msgid ""
"Welcome! You can now participate in the life of your project of choice."
msgstr "¡Bienvenido! Ahora puedes participar en el proyecto elegido." msgstr "¡Bienvenido! Ahora puedes participar en el proyecto elegido."
#: IDF/Views.php:198 IDF/Views.php:222 IDF/Views.php:263 #: IDF/Views.php:198 IDF/Views.php:222 IDF/Views.php:263

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
{/if} {/if}
</div> </div>
{/if} {/if}
<form method="post" action="."> <form method="post" enctype="multipart/form-data" action=".">
<table class="form" summary=""> <table class="form" summary="">
<tr> <tr>
<th><strong>{$form.f.name.labelTag}:</strong></th> <th><strong>{$form.f.name.labelTag}:</strong></th>
@@ -30,6 +30,30 @@
{$form.f.description|unsafe} {$form.f.description|unsafe}
</td> </td>
</tr> </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> <tr><td>&nbsp;</td>
<td> <td>
<input type="submit" name="submit" value="{trans 'Save Changes'}" /> <input type="submit" name="submit" value="{trans 'Save Changes'}" />

View File

@@ -37,7 +37,7 @@
<body> <body>
<div id="{block docid}doc3{/block}"> <div id="{block docid}doc3{/block}">
<div id="hd"> <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'} {include 'idf/main-menu.html'}
<div id="header"> <div id="header">
<div id="main-tabs"> <div id="main-tabs">

View File

@@ -37,7 +37,7 @@
<body> <body>
<div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}"> <div id="{block docid}doc3{/block}" class="{block docclass}yui-t3{/block}">
<div id="hd"> <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'} {include 'idf/main-menu.html'}
<div id="header"> <div id="header">
<div id="main-tabs"> <div id="main-tabs">

View File

@@ -9,9 +9,28 @@
{aurl 'url', 'IDF_Views_Admin::projectCreate'} {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} <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} {else}
<ul>{foreach $projects as $p} {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> <div class="p-list-img">
{/foreach}</ul> <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} {/if}
{/block} {/block}
{block context} {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}<li id="project-list"><a href="{url 'IDF_Views::index'}">{trans 'Project List'} &#x25be;</a>
{if $allProjects.count() != 0} {if $allProjects.count() != 0}
<ul>{foreach $allProjects as $p} <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} <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>
<a href="{url 'IDF_Views_Project::home', array($p.shortname)}">{$p}</a></li>
{/foreach}</ul> {/foreach}</ul>
{/if}</li>{if $isAdmin}<li><a href="{url 'IDF_Views_Admin::projects'}">{trans 'Forge Management'}</a></li>{/if}<li> {/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> <a href="{url 'IDF_Views::faq'}" title="{trans 'Help and accessibility features'}">{trans 'Help'}</a></li>

View File

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

View File

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

View File

@@ -1,4 +1,25 @@
<?php <?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'; 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 <?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('SRCDIR', realpath(dirname(__FILE__) . '/../src'));
define('TESTDIR', dirname(__FILE__)); define('TESTDIR', dirname(__FILE__));
define('DATADIR', TESTDIR . '/data'); define('DATADIR', TESTDIR . '/data');
set_include_path(get_include_path() . PATH_SEPARATOR . SRCDIR); 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 { h1.project-title {
font-weight: normal;
float: right; float: right;
z-index: 100; font-weight: normal;
text-align: right; margin-top: 0.5em;
padding-right: 5px;
margin-bottom: 0; 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 { .note {
@@ -871,8 +886,21 @@ ol > li {
margin: 7px; margin: 7px;
white-space: nowrap; white-space: nowrap;
font-size: 0.95em; font-size: 0.95em;
list-style-type: square; list-style-type: none;
list-style-position: inside; 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 { #project-list ul li:first-child {
@@ -1043,3 +1071,27 @@ span.scm-action.property-changed {
#stats td { #stats td {
padding: .2em; 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