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
.tx/config
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>
Samuel Suther <info@suther.de> - German translation
Sindre R. Myren <sindrero@stud.ntnu.no>
Stewart Platt <stew@futurete.ch>
Thomas Keller <me@thomaskeller.biz> - Monotone support
Vladimir Solomatin <slash>
William Martin <william.martin@lcpc.fr>

View File

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

View File

@@ -1,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
- Fix tags extraction from git repository (issue 675)
- Fix SSH validation method (issue 671)
- Fix malformed URL in the RSS (issue 666)
- Fix validateRevision call for Mercurial Scm (issue 657)
- monotone zip archive entries now all carry the revision date as mtime (issue 645)
- Timeline only displays filter options for items a user has actually access to (issue 655)
## Documentation
## Translations
- Missing word in French translation (issue 672)
- Update Spanish translation
# InDefero 1.1.1 - Mon Mar 28 15:52 2011 UTC
## 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>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/IDF</directory>
<exclude>
<directory suffix=".php">src/IDF/Tests</directory>
<directory suffix=".php">src/IDF/conf</directory>
<file>src/IDF/version.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>

14
run-tests Executable file
View File

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

View File

@@ -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)) {
return array('mtn', $m[1], $m[2]);
}
else if (preg_match('#^ssh\-[a-z]{3}\s(\S+)(?:\s(\S*))?$#', $this->content, $m)) {
if (!isset($m[2])) {
$m[2] = "";
}
else if (preg_match('#^ssh\-[a-z]{3}\s(\S+)(?:\s(\S+))?$#', $this->content, $m)) {
return array('ssh', $m[2], $m[1]);
}

View File

@@ -209,7 +209,7 @@ class IDF_Scm_Git extends IDF_Scm
return $this->cache['tags'];
}
$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),
Pluf::f('git_path', 'git'));
self::exec('IDF_Scm_Git::getTags', $cmd, $out, $return);
@@ -221,12 +221,15 @@ class IDF_Scm_Git extends IDF_Scm
rsort($out);
$res = array();
foreach ($out as $b) {
$elts = explode(' ', $b, 2);
$tag = substr(trim($elts[1]), 10); // Remove refs/tags/ prefix
$elts = explode(' ', $b, 5);
$tag = substr(trim($elts[4]), 10);
if (false !== strpos($tag, '/')) {
$res[$elts[3]] = $b;
} else {
$res[$tag] = '';
}
}
$this->cache['tags'] = $res;
return $res;
}

View File

@@ -94,7 +94,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
escapeshellarg($this->repo),
escapeshellarg($rev));
$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 -
// handle this case here sometime
@@ -336,7 +336,7 @@ class IDF_Scm_Mercurial extends IDF_Scm
*/
public function getCommit($commit, $getdiff=false)
{
if ($this->validateRevision($commit) != IDF_Scm::REVISION_VALID) {
if (!$this->isValidRevision($commit)) {
return false;
}
$tmpl = ($getdiff)

View File

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

View File

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

View File

@@ -0,0 +1,66 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
/**
* Monotone stdio interface
*
* @author Thomas Keller <me@thomaskeller.biz>
*/
interface IDF_Scm_Monotone_IStdio
{
/**
* Constructor
*/
public function __construct(IDF_Project $project);
/**
* Starts the stdio process and resets the command counter
*/
public function start();
/**
* Stops the stdio process and closes all pipes
*/
public function stop();
/**
* Executes a command over stdio and returns its result
*
* @param array Array of arguments
* @param array Array of options as key-value pairs. Multiple options
* can be defined in sub-arrays, like
* "r" => array("123...", "456...")
* @return string
*/
public function exec(array $args, array $options = array());
/**
* Returns the last out-of-band output for a previously executed
* command as associative array with 'e' (error), 'w' (warning),
* 'p' (progress) and 't' (ticker, unparsed) as keys
*
* @return array
*/
public function getLastOutOfBandOutput();
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -11,10 +11,10 @@ msgstr ""
"PO-Revision-Date: 2011-03-28 14:19+0000\n"
"Last-Translator: Mika <mikados.mikados@gmail.com>\n"
"Language-Team: Mika <mikados.mikados@gmail.com>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_ES\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
@@ -144,8 +144,8 @@ msgid ""
"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."
msgstr ""
"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."
"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."
#: IDF/Form/Admin/ProjectCreate.php:114 IDF/Form/Admin/ProjectUpdate.php:68
#: IDF/Form/MembersConf.php:46 IDF/Form/TabsConf.php:53
@@ -279,8 +279,8 @@ msgstr "Iniciar sesión"
#: IDF/Form/Admin/UserCreate.php:60
msgid ""
"The login must be between 3 and 15 characters long and contains only letters "
"and digits."
"The login must be between 3 and 15 characters long and contains only letters"
" and digits."
msgstr ""
"El nombre de usuario debe tener entre 3 y 15 caracteres de largo y contener "
"solamente letras y dígitos."
@@ -421,8 +421,8 @@ msgstr "--- No es un nombre válido."
msgid ""
"A user with this email already exists, please provide another email address."
msgstr ""
"Ya existe un usuario con este correo electrónico , por favor, introduce otro "
"email."
"Ya existe un usuario con este correo electrónico , por favor, introduce otro"
" email."
#: IDF/Form/Admin/UserUpdate.php:301 IDF/Form/UserAccount.php:389
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/ReviewCreate.php:83
msgid "The \"upload_issue_path\" configuration variable was not set."
msgstr ""
"La variable de configuración \"upload_issue_path\" no se ha establecido."
msgstr "La variable de configuración \"upload_issue_path\" no se ha establecido."
#: IDF/Form/IssueCreate.php:82 IDF/Form/IssueUpdate.php:75
msgid "Attach a file"
@@ -479,8 +478,7 @@ msgstr "Etiquetas"
#: IDF/Form/IssueCreate.php:192
msgid "You cannot add a label with the \"Status\" prefix to an issue."
msgstr ""
"No se puede agregar una etiqueta con el prefijo \"Status\" a un ticket."
msgstr "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/UpdateUpload.php:110 IDF/Form/Upload.php:120
@@ -492,7 +490,8 @@ msgstr "Proporcionaste una etiqueta no válida."
#: IDF/Form/Upload.php:119
#, php-format
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
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 "
"try again."
msgstr ""
"Lo sentimos, no hemos encontrado ningún usuario con esta dirección de correo "
"electrónico o nombre de usuario. Vuelva a intentarlo."
"Lo sentimos, no hemos encontrado ningún usuario con esta dirección de correo"
" electrónico o nombre de usuario. Vuelva a intentarlo."
#: IDF/Form/Password.php:100
msgid "Password Recovery - InDefero"
@@ -580,11 +579,11 @@ msgstr "Tu clave de verificación"
#: IDF/Form/PasswordInputKey.php:50 IDF/Form/PasswordReset.php:89
msgid ""
"We are sorry but this validation key is not valid. Maybe you should directly "
"copy/paste it from your validation email."
"We are sorry but this validation key is not valid. Maybe you should directly"
" copy/paste it from your validation email."
msgstr ""
"Lo sentimos, pero esta clave de validación no es válida. Intente copiar/"
"pegar desde el email de validación."
"Lo sentimos, pero esta clave de validación no es válida. Intente "
"copiar/pegar desde el email de validación."
#: IDF/Form/PasswordInputKey.php:61 IDF/Form/PasswordReset.php:100
msgid ""
@@ -640,8 +639,8 @@ msgid ""
"The login must be between 3 and 15 characters long and contain only letters "
"and digits."
msgstr ""
"El nombre de usuario debe tener entre 3 y 15 caracteres y contener solamente "
"letras y dígitos."
"El nombre de usuario debe tener entre 3 y 15 caracteres y contener solamente"
" letras y dígitos."
#: IDF/Form/Register.php:53
msgid "Your email"
@@ -659,7 +658,8 @@ msgstr "Estoy de acuerdo con los términos y condiciones."
#: IDF/Form/Register.php:88
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 ""
"Lo sabemos, esto es aburrido, pero es necesario aceptar los términos y "
"condiciones."
@@ -686,16 +686,16 @@ msgid ""
"Your password must be hard for other people to guess, but easy for you to "
"remember."
msgstr ""
"Su contraseña debe ser difícil de averiguar para otras personas, pero que le "
"sea fácil de recordar."
"Su contraseña debe ser difícil de averiguar para otras personas, pero que le"
" sea fácil de recordar."
#: IDF/Form/RegisterConfirmation.php:99 IDF/Form/RegisterInputKey.php:50
msgid ""
"We are sorry but this confirmation key is not valid. Maybe you should "
"directly copy/paste it from your confirmation email."
msgstr ""
"Lo sentimos, pero esta clave de confirmación no es válida. Pruebe a copiar y "
"pegar directamente desde el email de confirmación."
"Lo sentimos, pero esta clave de confirmación no es válida. Pruebe a copiar y"
" pegar directamente desde el email de confirmación."
#: IDF/Form/RegisterConfirmation.php:110
msgid ""
@@ -886,7 +886,8 @@ msgstr ""
#: IDF/Form/UserAccount.php:354
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 ""
"Por favor, compruebe la clave, ya que parece no ser una clave pública "
"monotone válida ."
@@ -903,11 +904,11 @@ msgstr "Ya has subido esta clave."
#: IDF/Form/UserChangeEmail.php:63
msgid ""
"The validation key is not valid. Please copy/paste it from your confirmation "
"email."
"The validation key is not valid. Please copy/paste it from your confirmation"
" email."
msgstr ""
"La clave de validación no es válido. Por favor, copia/pega desde su email de "
"confirmación."
"La clave de validación no es válido. Por favor, copia/pega desde su email de"
" confirmación."
#: IDF/Form/WikiConf.php:49
msgid "Predefined documentation page labels"
@@ -915,7 +916,8 @@ msgstr "Etiquetas predefinidas para página de documentación"
#: IDF/Form/WikiConf.php:58
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 ""
"Cada página de documentación podrá tener más de una etiqueta para cada una "
"de estas clases"
@@ -1032,14 +1034,12 @@ msgid ""
"\n"
"<p><strong>Instructions:</strong></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 "
"value.</p>\n"
"<p>Optionally, use an equals-sign to document the meaning of each status value.</p>\n"
msgstr ""
"\n"
"<p><strong>Instrucciones:</strong></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 "
"cada estado.</p>\n"
"<p>Si lo desea, puede utilizar un signo de igual para documentar el valor de cada estado.</p>\n"
#: IDF/gettexttemplates/idf/admin/downloads.html.php:8
#: IDF/gettexttemplates/idf/admin/issue-tracking.html.php:8
@@ -1056,14 +1056,12 @@ msgstr "Guardar cambios"
msgid ""
"\n"
"<p><strong>Instructions:</strong></p>\n"
"<p>Specify each person by its login. Each person must have already "
"registered with the given login.</p>\n"
"<p>Specify each person by its login. Each person must have already registered with the given login.</p>\n"
"<p>Separate the logins with commas and/or new lines.</p>\n"
msgstr ""
"\n"
"<p><strong>Instrucciones:</strong></p>\n"
"<p>Especifique cada persona por su nombre de usuaro. Cada persona debe "
"haberse registrado con el nombre de usuario dado.</p>\n"
"<p>Especifique cada persona por su nombre de usuaro. Cada persona debe 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"
#: IDF/gettexttemplates/idf/admin/members.html.php:8
@@ -1072,22 +1070,17 @@ msgstr ""
msgid ""
"\n"
"<p><strong>Notes:</strong></p>\n"
"<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"
"<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>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"
"<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 ""
"\n"
"<p><strong>Notas:</strong></p>\n"
"<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"
"<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"
"<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"
"<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
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 ""
"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"
"notifications are disabled.</p>\n"
"\n"
"<p>Only properly-escaped <strong>HTTP</strong> URLs are supported, for "
"example:</p>\n"
"<p>Only properly-escaped <strong>HTTP</strong> URLs are supported, for example:</p>\n"
"\n"
"<ul>\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"
"http://mydomain.com/my-project/123.</p>"
msgstr ""
"<p>La configuración URL WebHook especifica una URL con una solicitud HTTP "
"POST\n"
"que se envía después de cada commit del repositorio. Si este campo está "
"vacío,\n"
"<p>La configuración URL WebHook especifica una URL con una solicitud HTTP POST\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"
"\n"
"<p>Únicamente las URLs <strong>HTTP</strong>, \n"
@@ -1132,16 +1122,14 @@ msgstr ""
"</ul>\n"
"\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:</"
"p>\n"
"será reemplazada por los valores específicos del proyecto para cada commit:</p>\n"
"\n"
"<ul>\n"
"<li>%p - nombre del proyecto</li>\n"
"<li>%r - número de revisión</li>\n"
"</ul>\n"
"\n"
"<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"
"<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"
"http://midominio.com/mi-proyecto/123.</p>"
#: IDF/gettexttemplates/idf/admin/source.html.php:26
@@ -1173,13 +1161,11 @@ msgstr "Clave de autenticación Post-commit:"
msgid ""
"\n"
"<p><strong>Instructions:</strong></p>\n"
"<p>The description of the project can be improved using the <a href=\"%%url%%"
"\">Markdown syntax</a>.</p>\n"
"<p>The description of the project can be improved using the <a href=\"%%url%%\">Markdown syntax</a>.</p>\n"
msgstr ""
"\n"
"<p><strong>Instrucciones:</strong></p>\n"
"<p>La descripción del proyecto puede ser mejorada mediante la <a href=\"%%url"
"%%\">Sintaxis de Marcado</a>.</p>\n"
"<p>La descripción del proyecto puede ser mejorada mediante la <a href=\"%%url%%\">Sintaxis de Marcado</a>.</p>\n"
#: IDF/gettexttemplates/idf/admin/summary.html.php:7
msgid ""
@@ -1197,8 +1183,7 @@ msgid ""
"password or SSH key."
msgstr ""
"\n"
"Solo los miembros del proyecto y los administradores tienen acceso de "
"escritura sobre las fuentes.<br />\n"
"Solo los miembros del proyecto y los administradores tienen acceso de escritura sobre las fuentes.<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"
"contraseña o clave SSH."
@@ -1217,12 +1202,12 @@ msgid ""
"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 "
"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, "
"simply leave the corresponding field empty."
"commas (','). If you do not want to send emails for a given type of changes,"
" simply leave the corresponding field empty."
msgstr ""
"Las notificaciones de mensajes se enviarán desde la dirección <strong>"
"%%from_email%%</strong>, si envía el mensaje a una lista de correo, puede "
"que tenga que registrar esta dirección de correo electrónico. Varias "
"Las notificaciones de mensajes se enviarán desde la dirección "
"<strong>%%from_email%%</strong>, si envía el mensaje a una lista de correo, "
"puede que tenga que registrar esta dirección de correo electrónico. Varias "
"direcciones de correo electrónico deben separarse por comas (','). Si no "
"desea enviar mensajes de correo electrónico para un determinado tipo de "
"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 "
"administrators, together with the extra authorized users you provide will "
"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"
"\" will default to authorized users only."
"rights for the different tabs but the \"Open to all\" and \"Signed in "
"users\" will default to authorized users only."
msgstr ""
"Si marca un proyecto como privado, sólo los miembros del proyecto y los "
"administradores, junto con los usuarios adicionales autorizados tendrán "
@@ -1306,14 +1291,14 @@ msgstr "Nueva descarga"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:3
msgid ""
"<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 "
"<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 "
"systems. Are you sure, you will not affect anybody when removing this file?"
msgstr ""
"<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 "
"ejecutarlo en su sistema. ¿Estás seguro de que no afectará a nadie cuando se "
"elimine este archivo?"
"ejecutarlo en su sistema. ¿Estás seguro de que no afectará a nadie cuando se"
" elimine este archivo?"
#: IDF/gettexttemplates/idf/downloads/delete.html.php:4
#, php-format
@@ -1479,8 +1464,7 @@ msgid ""
"name."
msgstr ""
"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 "
"el nombre de cada\n"
"no se puede cambiar, así que asegúrese de incluir los números de versión en el nombre de cada\n"
"archivo."
#: IDF/gettexttemplates/idf/downloads/submit.html.php:6
@@ -1563,27 +1547,27 @@ msgstr "Proyectos"
msgid ""
"<p>This is simple:</p>\n"
"<ol>\n"
"<li>Write in the comments \"This is a duplicate of issue 123\", change 123 "
"with the corresponding issue number.</li>\n"
"<li>Write in the comments \"This is a duplicate of issue 123\", change 123 with the corresponding issue number.</li>\n"
"<li>Change the status of the current issue to <em>Duplicate</em>.</li>\n"
"<li>Submit the changes.</li>\n"
"</ol>"
msgstr ""
"<p>Es simple:</p>\n"
"<ol>\n"
"<li>Escribe en los comentarios \"Esto es una duplicado del ticket 123\", "
"cambia 123 por el número de ticket correspondiente.</li>\n"
"<li>Escribe en los comentarios \"Esto es una duplicado del ticket 123\", 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>Envíe los cambios.</li>\n"
"</ol>"
#: IDF/gettexttemplates/idf/faq.html.php:9
msgid ""
"You need to create an account on <a href=\"http://en.gravatar.com/"
"\">Gravatar</a>, this takes about 5 minutes and is free."
"You need to create an account on <a "
"href=\"http://en.gravatar.com/\">Gravatar</a>, this takes about 5 minutes "
"and is free."
msgstr ""
"Necesitas crear una cuenta en <a href=\"http://en.gravatar.com/\">Gravatar</"
"a> , tardarás 5 minutos y es gratuito."
"Necesitas crear una cuenta en <a "
"href=\"http://en.gravatar.com/\">Gravatar</a> , tardarás 5 minutos y es "
"gratuito."
#: IDF/gettexttemplates/idf/faq.html.php:10
msgid ""
@@ -1724,8 +1708,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:4
msgid ""
"<strong>Once you have defined the repository type, you cannot change it</"
"strong>."
"<strong>Once you have defined the repository type, you cannot change "
"it</strong>."
msgstr ""
"<strong>Una vez que haya definido el tipo de repositorio, no se puede "
"modificar</strong>."
@@ -1733,13 +1717,11 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:5
msgid ""
"\n"
"<p>Specify each person by its login. Each person must have already "
"registered with the given login.</p>\n"
"<p>Specify each person by its login. Each person must have already registered with the given login.</p>\n"
"<p>Separate the logins with commas and/or new lines.</p>\n"
msgstr ""
"\n"
"<p>Especifique cada persona por su nombre de usuario. Cada persona debe "
"estar registrada con el nombre de usuario proporcionado.</p>\n"
"<p>Especifique cada persona por su nombre de usuario. Cada persona debe 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"
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:14
@@ -1752,7 +1734,8 @@ msgstr ""
#: IDF/gettexttemplates/idf/gadmin/projects/create.html.php:15
msgid "Provide at least one owner for the project or use a template."
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
#, php-format
@@ -1772,8 +1755,7 @@ msgid ""
msgstr ""
"\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 "
"proyecto.\n"
"que tiene como resultado <strong>borrar todos los datos</strong> del proyecto.\n"
#: IDF/gettexttemplates/idf/gadmin/projects/delete.html.php:10
msgid ""
@@ -1929,8 +1911,8 @@ msgstr "Ver <a href=\"%%url%%\">usuarios sin validar</a>."
#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:4
msgid "<p>You have here an overview of the users registered in the forge.</p>"
msgstr ""
"<p>Tiene aquí una visión general de los usuarios registrados en la forja. </"
"p>"
"<p>Tiene aquí una visión general de los usuarios registrados en la forja. "
"</p>"
#: IDF/gettexttemplates/idf/gadmin/users/index.html.php:5
msgid "Number of users:"
@@ -1952,8 +1934,7 @@ msgid ""
"able to create new projects and update other non staff users.\n"
msgstr ""
"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 "
"Staff.\n"
"de crear nuevos proyectos y actualizar a otros usuarios que no sean del Staff.\n"
#: IDF/gettexttemplates/idf/gadmin/users/update.html.php:9
msgid "The form contains some errors. Please correct them to update the user."
@@ -2204,13 +2185,10 @@ msgstr "Volver al ticket"
#, php-format
msgid ""
"<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>\n"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>\n"
msgstr ""
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></"
"p>\n"
"<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>\n"
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</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
msgid "Label:"
@@ -2222,32 +2200,28 @@ msgstr "Finalizados:"
#: IDF/gettexttemplates/idf/issues/create.html.php:3
msgid ""
"<p>When you submit the issue do not forget to provide the following "
"information:</p>\n"
"<p>When you submit the issue do not forget to provide the following information:</p>\n"
"<ul>\n"
"<li>The steps to reproduce the problem.</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><strong>Do not provide any password or confidential information!</"
"strong></li>\n"
"<li><strong>Do not provide any password or confidential information!</strong></li>\n"
"</ul>"
msgstr ""
"<p>Cuando envío el ticket, no se olvide proporcionar la siguiente "
"información:</p>\n"
"<p>Cuando envío el ticket, no se olvide proporcionar la siguiente información:</p>\n"
"<ul>\n"
"<li>Los pasos para reproducir el problema.</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 "
"resolver la incidencia.</li>\n"
"<li><strong>¡No proporcione ninguna contraseña o información confidencial!</"
"strong></li>\n"
"<li>Cualquier información que pueda ayudar a los desarrolladores para resolver la incidencia.</li>\n"
"<li><strong>¡No proporcione ninguna contraseña o información confidencial!</strong></li>\n"
"</ul>"
#: 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 ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar el "
"ticket."
"El formulario contiene algunos errores. Por favor, corríjalos para enviar el"
" ticket."
#: IDF/gettexttemplates/idf/issues/create.html.php:11
#: IDF/gettexttemplates/idf/issues/create.html.php:13
@@ -2323,13 +2297,10 @@ msgstr "Propietario:"
#, php-format
msgid ""
"<p><strong>Open issues:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>"
"<p><strong>Closed issues:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>"
msgstr ""
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></"
"p>\n"
"<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</"
"a></p>"
"<p><strong>Tickets abiertos:</strong> <a href=\"%%open_url%%\">%%open%%</a></p>\n"
"<p><strong>Tickets cerrados:</strong> <a href=\"%%closed_url%%\">%%closed%%</a></p>"
#: IDF/gettexttemplates/idf/issues/issue-created-email.txt.php:3
msgid ""
@@ -2373,26 +2344,23 @@ msgstr "Comentarios (más reciente primero):"
#: IDF/gettexttemplates/idf/issues/my-issues.html.php:3
#, php-format
msgid ""
"See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
msgid "See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
msgid_plural ""
"See the <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% closed</a>."
msgstr[0] ""
"Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% tickets cerrado</"
"a>."
msgstr[1] ""
"Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% cerrado</a>."
"Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% tickets "
"cerrado</a>."
msgstr[1] "Ver <a href=\"%%submit_closed_url%%\">%%nb_submit_closed%% cerrado</a>."
#: IDF/gettexttemplates/idf/issues/my-issues.html.php:4
#, php-format
msgid ""
"See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
msgid "See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
msgid_plural ""
"See the <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% closed</a>."
msgstr[0] ""
"Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% tickets cerrado</a>."
msgstr[1] ""
"Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% cerrado</a>."
"Ver <a href=\"%%owner_closed_url%%\">%%nb_owner_closed%% tickets "
"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/user/dashboard.html.php:7
@@ -2421,8 +2389,8 @@ msgstr "Reportado por %%submitter%%, %%c.creation_dtime%%"
msgid ""
"Comment <a href=\"%%url%%\">%%i%%</a> by %%submitter%%, %%c.creation_dtime%%"
msgstr ""
"Comentario <a href=\"%%url%%\">%%i%%</a> por %%submitter%%, %%c."
"creation_dtime%%"
"Comentario <a href=\"%%url%%\">%%i%%</a> por %%submitter%%, "
"%%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:5
#: IDF/gettexttemplates/idf/issues/view.html.php:5
@@ -2498,7 +2466,8 @@ msgstr "ver"
#: IDF/gettexttemplates/idf/issues/view.html.orig.php:21
#: IDF/gettexttemplates/idf/issues/view.html.php:21
msgid "The form contains some errors. Please correct them to change the issue."
msgid ""
"The form contains some errors. Please correct them to change the issue."
msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para "
"actualizar el ticket."
@@ -2516,8 +2485,8 @@ msgstr "Seguido por:"
#: IDF/gettexttemplates/idf/login_form.html.php:3
#, php-format
msgid ""
"If you don't have an account yet, you can create one <a href=\"%%url%%"
"\">here</a>."
"If you don't have an account yet, you can create one <a "
"href=\"%%url%%\">here</a>."
msgstr ""
"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
#, php-format
msgid ""
"Welcome, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></strong>."
msgid "Welcome, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></strong>."
msgstr ""
"Bienvenido, <strong><a class=\"userw\" href=\"%%url%%\">%%user%%</a></"
"strong>."
"Bienvenido, <strong><a class=\"userw\" "
"href=\"%%url%%\">%%user%%</a></strong>."
#: IDF/gettexttemplates/idf/main-menu.html.php:4
msgid "Sign Out"
@@ -2700,8 +2668,8 @@ msgstr "Activar tu cuenta"
#: IDF/gettexttemplates/idf/register/confirmation.html.php:8
#: IDF/gettexttemplates/idf/user/passrecovery.html.php:8
msgid ""
"This is the last step, but just <strong>be sure to have the cookies enabled</"
"strong> to log in afterwards."
"This is the last step, but just <strong>be sure to have the cookies "
"enabled</strong> to log in afterwards."
msgstr ""
"Este es el último paso, pero <strong>asegúrese de tener las cookies "
"activadas</strong> para identificarte."
@@ -2722,8 +2690,8 @@ msgid ""
"create a new account. Just go <a href=\"%%url%%\">here</a> to recover your "
"login name and password."
msgstr ""
"Si ha olvidado los datos de acceso, entonces no tiene porque crear una nueva "
"cuenta. Simplemente haga click <a href=\"%%url%%\">aquí</a> para recuperar "
"Si ha olvidado los datos de acceso, entonces no tiene porque crear una nueva"
" cuenta. Simplemente haga click <a href=\"%%url%%\">aquí</a> para recuperar "
"su nombre de usuario y contraseña."
#: IDF/gettexttemplates/idf/register/index.html.php:5
@@ -2731,15 +2699,15 @@ msgstr ""
#, php-format
msgid ""
"With your account, you will able to participate in the life of all the "
"projects hosted here. Participating in a software project must be fun, so if "
"you have troubles, you can <a href=\"%%url%%\">let us know about your issues "
"at anytime</a>!"
"projects hosted here. Participating in a software project must be fun, so if"
" you have troubles, you can <a href=\"%%url%%\">let us know about your "
"issues at anytime</a>!"
msgstr ""
"Con su cuenta, será capaz de participar en el desarrollo de todos los "
"proyectos alojados aquí. Participar en un proyecto software tiene que ser "
"algo divertido e interesante, así que si tiene problemas, puede <a href="
"\"%%url%%\">¡hacernos saber cuáles son sus inquietudes en cualquier momento</"
"a>!"
"algo divertido e interesante, así que si tiene problemas, puede <a "
"href=\"%%url%%\">¡hacernos saber cuáles son sus inquietudes en cualquier "
"momento</a>!"
#: IDF/gettexttemplates/idf/register/index.html.php:6
#: 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 "
"link by email."
msgstr ""
"Asegúrese de proporcionar una dirección válida de correo electrónico, ya que "
"se enviará un enlace de confirmación por correo electrónico."
"Asegúrese de proporcionar una dirección válida de correo electrónico, ya que"
" se enviará un enlace de confirmación por correo electrónico."
#: IDF/gettexttemplates/idf/register/index.html.php:10
#: IDF/gettexttemplates/idf/register/index.html~.php:9
@@ -2810,35 +2778,30 @@ msgstr "Iniciar revisión del Código"
msgid ""
"<p>To start a code review, you need to provide:</p>\n"
"<ul>\n"
"<li>A commit or revision of the current code in the repository from which "
"you started your work.</li>\n"
"<li>A patch describing your changes with respect to the reference commit.</"
"li>\n"
"<li><strong>Check your patch does not provide any password or confidential "
"information!</strong></li>\n"
"<li>A commit or revision of the current code in the repository from which you started your work.</li>\n"
"<li>A patch describing your changes with respect to the reference commit.</li>\n"
"<li><strong>Check your patch does not provide any password or confidential information!</strong></li>\n"
"</ul>"
msgstr ""
"<p>Para iniciar una revisión de código, debe proporcionar:</p>\n"
"<ul>\n"
"<li>Un commit o revisión del actual código del repositorio, desde el que ha "
"comenzado su trabajo.</li>\n"
"<li>Un parche que describa los cambios con respecto al commit referenciado.</"
"li>\n"
"<li><strong>¡Asegúrese de que el parche no contiene ninguna contraseña o "
"información confidencial!</strong></li>\n"
"<li>Un commit o revisión del actual código del repositorio, desde el que ha comenzado su trabajo.</li>\n"
"<li>Un parche que describa los cambios con respecto al commit referenciado.</li>\n"
"<li><strong>¡Asegúrese de que el parche no contiene ninguna contraseña o información confidencial!</strong></li>\n"
"</ul>"
#: IDF/gettexttemplates/idf/review/create.html.php:9
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 ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar la "
"revisión de código."
"El formulario contiene algunos errores. Por favor, corríjalos para enviar la"
" revisión de código."
#: IDF/gettexttemplates/idf/review/create.html.php:10
msgid ""
"Select the commit against which you created your patch to be sure it applies "
"correctly."
"Select the commit against which you created your patch to be sure it applies"
" correctly."
msgstr ""
"Seleccione el commit contra el que creó el parche para asegurarse de que se "
"aplica correctamente."
@@ -2901,14 +2864,11 @@ msgid ""
msgstr ""
"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"
"diferentes personas discuten sobre los cambios en el código. El objetivo "
"es \n"
"diferentes personas discuten sobre los cambios en el código. El objetivo es \n"
"<strong>mejorar la calidad del código y las\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 "
"antiguo como en el \n"
"nuevo código) y trata de mantener un buen equilibrio entre seriedad y "
"diversión\n"
"sus comentarios. Menciona correctamente los números de línea (tanto en el antiguo como en el \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
msgid ""
@@ -2920,23 +2880,20 @@ msgid ""
"to propose more contributions</strong>.\n"
msgstr ""
"\n"
"<strong>La propuesta para revisar código es intimidante</strong>, debes "
"saber \n"
"que recibirás críticas, así que por favor, como revisor, <strong>haz que "
"este \n"
"proceso sea divertido</strong>, úsalo para para ayudar al colaborador a "
"aprender tus \n"
"<strong>La propuesta para revisar código es intimidante</strong>, debes saber \n"
"que recibirás críticas, así que por favor, como revisor, <strong>haz que 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"
"quieran proponer más contribuciones</strong>.\n"
#: IDF/gettexttemplates/idf/review/view.html.php:20
#, php-format
msgid ""
"Comment <a href=\"%%url%%\">%%i%%</a> by <a href=\"%%whourl%%\">%%who%%</a>, "
"%%c.creation_dtime%%"
"Comment <a href=\"%%url%%\">%%i%%</a> by <a href=\"%%whourl%%\">%%who%%</a>,"
" %%c.creation_dtime%%"
msgstr ""
"Comentario <a href=\"%%url%%\">%%i%%</a> por <a href=\"%%whourl%%\">%%who%%</"
"a>, %%c.creation_dtime%%"
"Comentario <a href=\"%%url%%\">%%i%%</a> por <a "
"href=\"%%whourl%%\">%%who%%</a>, %%c.creation_dtime%%"
#: IDF/gettexttemplates/idf/review/view.html.php:21
#, php-format
@@ -2952,8 +2909,8 @@ msgstr "<a href=\"%%url%%\">Accede</a> para participar en la revisión."
msgid ""
"The form contains some errors. Please correct them to submit your review."
msgstr ""
"El formulario contiene algunos errores. Por favor, corríjalos para enviar su "
"revisión."
"El formulario contiene algunos errores. Por favor, corríjalos para enviar su"
" revisión."
#: IDF/gettexttemplates/idf/review/view.html.php:27
#: IDF/gettexttemplates/idf/source/commit.html.php:5
@@ -3260,13 +3217,15 @@ msgstr ""
msgid ""
"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 "
"more about <a href=\"http://www.google.com/search?q=public+ssh+key"
"+authentication\">SSH key authentication</a>."
"more about <a "
"href=\"http://www.google.com/search?q=public+ssh+key+authentication\">SSH "
"key authentication</a>."
msgstr ""
"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 "
"más acerca de <a href=\"http://www.google.com/search?q=public+ssh+key"
"+authentication\">autenticación de claves SSH</a>."
"más acerca de <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/mtn/help.html.php:6
@@ -3346,8 +3305,7 @@ msgid ""
msgstr ""
"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"
"En este caso, por favor eche un vistazo a la <a href=\"%%url%%\">Página de "
"Ayuda</a>\n"
"En este caso, por favor eche un vistazo a la <a href=\"%%url%%\">Página de Ayuda</a>\n"
"sobre cómo tener acceso a su repositorio."
#: IDF/gettexttemplates/idf/source/mercurial/help.html.php:3
@@ -3540,7 +3498,8 @@ msgstr "Clave de API"
msgid ""
"Your API key will be regenerated automatically if you change your password."
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
msgid "Update Your Account"
@@ -3576,8 +3535,8 @@ msgid ""
"API key is used to interact with this website using a program."
msgstr ""
"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 "
"utilizando un programa."
"externos y la clave de la API se utiliza para interactuar con este sitio web"
" utilizando un programa."
#: IDF/gettexttemplates/idf/user/myaccount.html.php:20
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
msgid ""
"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 "
"your password."
"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"
" your password."
msgstr ""
"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 "
"los detalles sobre cómo restablecer su contraseña."
"correspondiente se encuentra en la base de datos, le enviaremos un email con"
" los detalles sobre cómo restablecer su contraseña."
#: IDF/gettexttemplates/idf/user/passrecovery-email.txt.php:3
#, php-format
@@ -3729,15 +3688,12 @@ msgstr "Crear Página"
#: IDF/gettexttemplates/idf/wiki/delete.html.php:3
#, php-format
msgid ""
"You are looking at an old revision (<em>%%oldrev.summary%%</em>) of the "
"page \n"
"You are looking at an old revision (<em>%%oldrev.summary%%</em>) of the page \n"
"<a href=\"%%url%%\">%%page.title%%</a>. This revision was created\n"
"by %%submitter%%."
msgstr ""
"Está viendo una revisión antigua (<em>%%oldrev.summary%%</em>) de la "
"página \n"
"<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por "
"%%submitter%%."
"Está viendo una revisión antigua (<em>%%oldrev.summary%%</em>) de la página \n"
"<a href=\"%%url%%\">%%page.title%%</a>. Esta revisión fue creada por %%submitter%%."
#: IDF/gettexttemplates/idf/wiki/delete.html.php:6
msgid ""
@@ -3764,8 +3720,8 @@ msgid ""
"recover it</strong>."
msgstr ""
"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."
"</strong>"
"con todas las revisiones relacionadas y <strong>no será capaz de "
"recuperarla.</strong>"
#: IDF/gettexttemplates/idf/wiki/deletepage.html.php:6
msgid "Delete Page"
@@ -3776,23 +3732,15 @@ msgstr "Eliminar página"
msgid ""
"\n"
"<p><strong>Instructions:</strong></p>\n"
"<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"
"<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>To directly include a file content from the repository, embrace its path "
"with triple square brackets: [[[path/to/file.txt]]].</p>\n"
"<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"
"<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>To directly include a file content from the repository, embrace its path with triple square brackets: [[[path/to/file.txt]]].</p>\n"
msgstr ""
"\n"
"<p><strong>Instrucciones:</strong></p>\n"
"<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"
"<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>Para incluir directamente el contenido de un fichero del repositorio, "
"rodee la ruta con corchetes triples como: [[[ruta/al/fichero.txt]]].</p>\n"
"<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"
"<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>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
#, php-format
@@ -3829,8 +3777,7 @@ msgid ""
"use it as reference only if you are sure you need these specific information."
msgstr ""
"<strong>¡Atención!</strong> Esta página está marcada como obsoleta,\n"
"úsala como referencia solamente si está seguro de que usted necesita "
"específicamente esta información ."
"úsala como referencia solamente si está seguro de que usted necesita específicamente esta información ."
#: IDF/gettexttemplates/idf/wiki/view.html.php:5
#, php-format
@@ -3840,8 +3787,7 @@ msgid ""
"by %%submitter%%."
msgstr ""
"Está viendo una revisión antigua de la 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/view.html.php:10
msgid "Table of Content"
@@ -3899,10 +3845,8 @@ msgstr "fecha de modificación"
#: IDF/Issue.php:194 IDF/IssueComment.php:143
#, php-format
msgid ""
"<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"
msgid "<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"
#: IDF/Issue.php:196
#, php-format
@@ -4057,8 +4001,8 @@ msgstr "No se puede examinar la configuración usher en \"%s\": %s"
#, php-format
msgid "usher configuration already contains a server entry named \"%s\""
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
#, 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
#, php-format
msgid "Could not write write-permissions file for project \"%s\""
msgstr ""
"No se pudo escribir el fichero write-permissions para el proyecto \"%s\""
msgstr "No se pudo escribir el fichero write-permissions para el proyecto \"%s\""
#: IDF/Plugin/SyncMonotone.php:790
#, php-format
@@ -4163,17 +4106,13 @@ msgstr "voto"
#: IDF/Review/Comment.php:139 IDF/Review/Patch.php:151
#, php-format
msgid ""
"<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"
msgid "<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"
#: IDF/Review/Comment.php:141
#, php-format
msgid "Update of <a href=\"%s\" class=\"%s\">review&nbsp;%d</a>, by %s"
msgstr ""
"Actualización de <a href=\"%s\" class=\"%s\">revisión&nbsp;%d</a>, por %s"
msgstr "Actualización de <a href=\"%s\" class=\"%s\">revisión&nbsp;%d</a>, por %s"
#: IDF/Review/Comment.php:151
#, php-format
@@ -4528,8 +4467,8 @@ msgstr "Lista de mantenimiento: Tickets Cerrados por %s"
#, php-format
msgid "This table shows the closed issues in your watch list for %s project."
msgstr ""
"Esta tabla muestra los tickets cerrados en su lista de mantenimiento para el "
"proyecto %s."
"Esta tabla muestra los tickets cerrados en su lista de mantenimiento para el"
" proyecto %s."
#: IDF/Views/Issue.php:118
#, php-format
@@ -4540,8 +4479,8 @@ msgstr "Lista mantenimiento: Tickets Abiertos por %s"
#, php-format
msgid "This table shows the open issues in your watch list for %s project."
msgstr ""
"Esta tabla muestra los tickets abiertos en su lista de mantenimiento para el "
"proyecto %s."
"Esta tabla muestra los tickets abiertos en su lista de mantenimiento para el"
" proyecto %s."
#: IDF/Views/Issue.php:195
msgid "Watch List: Closed Issues"
@@ -4917,7 +4856,8 @@ msgid "Confirm Your Account Creation"
msgstr "Confirma la creación de tu cuenta"
#: 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."
#: 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}
</div>
{/if}
<form method="post" action=".">
<form method="post" enctype="multipart/form-data" action=".">
<table class="form" summary="">
<tr>
<th><strong>{$form.f.name.labelTag}:</strong></th>
@@ -30,6 +30,30 @@
{$form.f.description|unsafe}
</td>
</tr>
<tr>
<th><strong>{trans 'Current logo'}:</strong></th>
<td>
{if $logo}
<img src="{url 'IDF_Views_Project::logo', array($project.shortname)}" alt="{trans 'Project logo'}" />
{else}
{trans 'Your project does not have a logo configured yet.'}
{/if}
</td>
</tr>
<tr>
<th><strong>{$form.f.logo.labelTag}:</strong></th>
<td>{if $form.f.logo.errors}{$form.f.logo.fieldErrors}{/if}
{$form.f.logo|unsafe}
</td>
</tr>
{if $logo}
<tr>
<th><strong>{$form.f.logo_remove.labelTag}:</strong></th>
<td>{if $form.f.logo_remove.errors}{$form.f.logo_remove.fieldErrors}{/if}
{$form.f.logo_remove|unsafe}
</td>
</tr>
{/if}
<tr><td>&nbsp;</td>
<td>
<input type="submit" name="submit" value="{trans 'Save Changes'}" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,25 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
include 'IDF/Diff.php';

View File

@@ -0,0 +1,176 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
include 'IDF/Scm/Monotone/BasicIO.php';
class IDF_Scm_Monotone_BasicIOTest extends PHPUnit_Framework_TestCase
{
public function testParse()
{
$stanzas = IDF_Scm_Monotone_BasicIO::parse(null);
$this->assertTrue(is_array($stanzas) && count($stanzas) == 0);
// single stanza, single line, only key
$stanzas = IDF_Scm_Monotone_BasicIO::parse('foo');
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertTrue(!array_key_exists('values', $entry));
// single stanza, single line, key with hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
$this->assertTrue(!array_key_exists('values', $entry));
// single stanza, single line, key with two values
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\n\nbaz\" \"bla\"");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar\n\nbaz", "bla"), $entry['values']);
// single stanza, single line, key with a value and a hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\n\nbaz\" [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar\n\nbaz", "0123456789012345678901234567890123456789"), $entry['values']);
// single stanza, two lines, keys with single value / hash
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\"\nbaz [0123456789012345678901234567890123456789]");
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(2, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar"), $entry['values']);
$entry = $stanza[1];
$this->assertEquals('baz', $entry['key']);
$this->assertTrue(!array_key_exists('values', $entry));
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
// two stanza, one two liner, one one liner
$stanzas = IDF_Scm_Monotone_BasicIO::parse("foo \"bar\"\nbaz [0123456789012345678901234567890123456789]\n\nbla \"blub\"");
$this->assertEquals(2, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(2, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("bar"), $entry['values']);
$entry = $stanza[1];
$this->assertEquals('baz', $entry['key']);
$this->assertTrue(!array_key_exists('values', $entry));
$this->assertEquals("0123456789012345678901234567890123456789", $entry['hash']);
$stanza = $stanzas[1];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('bla', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array("blub"), $entry['values']);
// (un)escaping tests
$stanzas = IDF_Scm_Monotone_BasicIO::parse('foo "bar\\baz" "bla\"blub"');
$this->assertEquals(1, count($stanzas));
$stanza = $stanzas[0];
$this->assertEquals(1, count($stanza));
$entry = $stanza[0];
$this->assertEquals('foo', $entry['key']);
$this->assertTrue(!array_key_exists('hash', $entry));
$this->assertEquals(array('bar\baz', 'bla"blub'), $entry['values']);
}
public function testCompile()
{
$stanzas = array(
array(
array('key' => 'foo'),
array('key' => 'bar', 'values' => array('one', "two\nthree")),
),
array(
array('key' => 'baz', 'hash' => '0123456789012345678901234567890123456789'),
array('key' => 'blablub', 'values' => array('one"two', 'three\four')),
),
);
$ex =<<<END
foo
bar "one" "two
three"
baz [0123456789012345678901234567890123456789]
blablub "one\"two" "three\\\\four"
END;
$this->assertEquals($ex, IDF_Scm_Monotone_BasicIO::compile($stanzas));
// keys must not be null
$stanzas = array(
array(
array('key' => null, 'values' => array('foo')),
),
);
$thrown = false;
try {
IDF_Scm_Monotone_BasicIO::compile($stanzas);
} catch (IDF_Scm_Exception $e) {
$this->assertRegExp('/^"key" not found in basicio stanza/', $e->getMessage());
$thrown = true;
}
$this->assertTrue($thrown);
// ...nor completly non-existing
$stanzas = array(
array(
array('values' => array('foo')),
),
);
$thrown = false;
try {
IDF_Scm_Monotone_BasicIO::compile($stanzas);
} catch (IDF_Scm_Exception $e) {
$this->assertRegExp('/^"key" not found in basicio stanza/', $e->getMessage());
$thrown = true;
}
$this->assertTrue($thrown);
}
}

View File

@@ -0,0 +1,161 @@
<?php
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
# ***** BEGIN LICENSE BLOCK *****
# This file is part of InDefero, an open source project management application.
# Copyright (C) 2011 Céondo Ltd and contributors.
#
# InDefero is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# InDefero is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ***** END LICENSE BLOCK ***** */
require_once 'IDF/Scm/Monotone/ZipRender.php';
require_once 'IDF/Scm/Monotone/IStdio.php';
class ZipRenderStdioMock implements IDF_Scm_Monotone_IStdio
{
// unused
public function __construct(IDF_Project $project) {}
// unused
public function start() {}
// unused
public function stop() {}
public function exec(array $args, array $options = array())
{
if ($args[0] == 'certs') {
$basicio =<<<END
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "author"
value "joe@home"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "branch"
value "foo"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "changelog"
value "test"
trust "trusted"
key [0504aea5d3716d31281171aaecf3a7c227e5545b]
signature "ok"
name "date"
value "2009-07-06T22:06:27"
trust "trusted"
END;
return $basicio;
}
if ($args[0] == 'get_manifest_of') {
$basicio =<<<END
format_version "1"
dir ""
file "foo"
content [6fcf9dfbd479ed82697fee719b9f8c610a11ff2a]
dir "bar"
file "bar/baz"
content [9063a9f0e032b6239403b719cbbba56ac4e4e45f]
END;
return $basicio;
}
if ($args[0] == 'get_file') {
if ($args[1] == '6fcf9dfbd479ed82697fee719b9f8c610a11ff2a') {
return 'This is foo.';
}
if ($args[1] == '9063a9f0e032b6239403b719cbbba56ac4e4e45f') {
return 'This is baz.';
}
throw new Exception('unexpected id ' . $args[1]);
}
throw new Exception('unexpected command ' . $args[0]);
}
// unused
public function getLastOutOfBandOutput() {}
}
class IDF_Scm_Monotone_ZipRenderTest extends PHPUnit_Framework_TestCase
{
// we can not test header sending with PHP-CLI, as header() is ignored
// in this environment
public function testRender()
{
$mock = new ZipRenderStdioMock(new IDF_Project());
$renderer = new IDF_Scm_Monotone_ZipRender($mock, '97fee719b9f8c610a11ff2a9063a9f0e032b6');
ob_start();
$renderer->render(true);
$zipcontents = ob_get_contents();
ob_end_clean();
// for this version php needs to be compiled with --enable-zip
if (function_exists('zip_open')) {
// yes, I'd rather have used php://memory here, but ZipArchive::open()
// complained that it could not open the stream in question
$filename = tempnam(Pluf::f('tmp_folder', '/tmp'), __CLASS__.'.');
file_put_contents($filename, $zipcontents);
$za = new ZipArchive();
$za->open($filename);
$this->assertEquals(2, $za->numFiles);
// 2009-07-06T22:06:27 - one second
// (don't ask me why, seems to be some quirk in zipstream)
$mtime = 1246910787 - 1;
// foo
$data = $za->statIndex(0);
$this->assertEquals('foo', $data['name']);
$this->assertEquals(12, $data['size']);
$this->assertEquals($mtime, $data['mtime']);
// bar/baz
$data = $za->statIndex(1);
$this->assertEquals('bar/baz', $data['name']);
$this->assertEquals(12, $data['size']);
$this->assertEquals($mtime, $data['mtime']);
$za->close();
unlink($filename);
}
else {
$wrapped_act = wordwrap(
base64_encode($zipcontents),
32, "\n", true
);
$wrapped_exp = wordwrap(
base64_encode(file_get_contents(DATADIR . '/' . __CLASS__ . '/data.zip')),
32, "\n", true
);
$this->assertEquals($wrapped_exp, $wrapped_act);
}
}
}

View File

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

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

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

Binary file not shown.

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB