Compare commits
29 Commits
release-1.
...
feature.be
Author | SHA1 | Date | |
---|---|---|---|
|
b36b8e3afb | ||
|
dc31155de1 | ||
|
0bae69908b | ||
|
47a077bc82 | ||
|
836ff71364 | ||
|
576c06ffaf | ||
|
352dc3e179 | ||
|
aa164936f4 | ||
|
9a93acd1a5 | ||
|
587aa11cda | ||
|
d04ecd60c4 | ||
|
aa68fe3485 | ||
|
e408fe8733 | ||
|
836986462a | ||
|
51c6cdb20d | ||
|
766232f29b | ||
|
2ed021f30b | ||
|
899fe561df | ||
|
1d89cec2cf | ||
|
39ba5b37ef | ||
|
002fa05c7f | ||
|
30900f7196 | ||
|
b753cf0837 | ||
|
53ab5b6aff | ||
|
78a0402351 | ||
|
5b5705fe90 | ||
|
f08b5c5e3f | ||
|
aa87acd432 | ||
|
7af7ef8357 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -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
|
||||
|
1
AUTHORS
1
AUTHORS
@@ -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>
|
||||
|
@@ -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
|
||||
|
||||
|
15
NEWS.mdtext
15
NEWS.mdtext
@@ -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
173
logo/no_logo.svg
Normal 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 |
12
phpunit.xml
12
phpunit.xml
@@ -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
14
run-tests
Executable 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)
|
||||
);
|
||||
|
140
src/IDF/Form/ProjectConf.php
Normal file
140
src/IDF/Form/ProjectConf.php
Normal 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');
|
||||
}
|
||||
}
|
||||
}
|
@@ -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]);
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
$res[$tag] = '';
|
||||
$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;
|
||||
}
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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];
|
||||
}
|
||||
|
@@ -21,6 +21,8 @@
|
||||
#
|
||||
# ***** END LICENSE BLOCK ***** */
|
||||
|
||||
require_once 'IDF/Scm/Exception.php';
|
||||
|
||||
/**
|
||||
* Utility class to parse and compile basic_io stanzas
|
||||
*
|
||||
@@ -31,6 +33,11 @@ class IDF_Scm_Monotone_BasicIO
|
||||
/**
|
||||
* Parses monotone's basic_io format
|
||||
*
|
||||
* Known quirks:
|
||||
* - does not handle multi-values starting with a hash '[]' (no known output)
|
||||
* - does not validate hashes (should be /[0-9a-f]{40}/i)
|
||||
* - does not handle forbidden \0
|
||||
*
|
||||
* @param string $in
|
||||
* @return array of arrays
|
||||
*/
|
||||
@@ -54,50 +61,56 @@ class IDF_Scm_Monotone_BasicIO
|
||||
$stanzaLine['key'] .= $ch;
|
||||
}
|
||||
|
||||
// symbol w/o a value list
|
||||
if ($pos >= $length || $in[$pos] == "\n") break;
|
||||
|
||||
if ($in[$pos] == '[') {
|
||||
// ensure we don't look at a symbol w/o a value list
|
||||
if ($pos >= $length || $in[$pos] == "\n") {
|
||||
unset($stanzaLine['values']);
|
||||
++$pos; // opening square bracket
|
||||
$stanzaLine['hash'] = substr($in, $pos, 40);
|
||||
$pos += 40;
|
||||
++$pos; // closing square bracket
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($stanzaLine['hash']);
|
||||
$valCount = 0;
|
||||
// if hashs and plain values are encountered in the same
|
||||
// value list, we add the hash values as simple values as well
|
||||
while ($in[$pos] == '"' || $in[$pos] == '[') {
|
||||
$isHashValue = $in[$pos] == '[';
|
||||
++$pos; // opening quote / bracket
|
||||
$stanzaLine['values'][$valCount] = '';
|
||||
while ($pos < $length) {
|
||||
$ch = $in[$pos]; $pr = $in[$pos-1];
|
||||
if (($isHashValue && $ch == ']')
|
||||
||(!$isHashValue && $ch == '"' && $pr != '\\'))
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if ($in[$pos] == '[') {
|
||||
unset($stanzaLine['values']);
|
||||
++$pos; // opening square bracket
|
||||
while ($pos < $length && $in[$pos] != ']') {
|
||||
$stanzaLine['hash'] .= $in[$pos];
|
||||
++$pos;
|
||||
$stanzaLine['values'][$valCount] .= $ch;
|
||||
}
|
||||
++$pos; // closing quote
|
||||
++$pos; // closing square bracket
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($stanzaLine['hash']);
|
||||
$valCount = 0;
|
||||
// if hashs and plain values are encountered in the same
|
||||
// value list, we add the hash values as simple values as well
|
||||
while ($in[$pos] == '"' || $in[$pos] == '[') {
|
||||
$isHashValue = $in[$pos] == '[';
|
||||
++$pos; // opening quote / bracket
|
||||
$stanzaLine['values'][$valCount] = '';
|
||||
while ($pos < $length) {
|
||||
$ch = $in[$pos]; $pr = $in[$pos-1];
|
||||
if (($isHashValue && $ch == ']')
|
||||
||(!$isHashValue && $ch == '"' && $pr != '\\'))
|
||||
break;
|
||||
++$pos;
|
||||
$stanzaLine['values'][$valCount] .= $ch;
|
||||
}
|
||||
++$pos; // closing quote
|
||||
|
||||
if (!$isHashValue) {
|
||||
$stanzaLine['values'][$valCount] = str_replace(
|
||||
array("\\\\", "\\\""),
|
||||
array("\\", "\""),
|
||||
$stanzaLine['values'][$valCount]
|
||||
);
|
||||
}
|
||||
if (!$isHashValue) {
|
||||
$stanzaLine['values'][$valCount] = str_replace(
|
||||
array("\\\\", "\\\""),
|
||||
array("\\", "\""),
|
||||
$stanzaLine['values'][$valCount]
|
||||
);
|
||||
}
|
||||
|
||||
if ($pos >= $length)
|
||||
break;
|
||||
if ($pos >= $length)
|
||||
break;
|
||||
|
||||
if ($in[$pos] == ' ') {
|
||||
++$pos; // space
|
||||
++$valCount;
|
||||
if ($in[$pos] == ' ') {
|
||||
++$pos; // space
|
||||
++$valCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,6 +127,12 @@ class IDF_Scm_Monotone_BasicIO
|
||||
/**
|
||||
* Compiles monotone's basicio format
|
||||
*
|
||||
* Known quirks:
|
||||
* - does not validate keys for /[a-z_]+/
|
||||
* - does not validate hashes (should be /[0-9a-f]{40}/i)
|
||||
* - does not support intermixed value / hash formats
|
||||
* - does not handle forbidden \0
|
||||
*
|
||||
* @param array $in Array of arrays
|
||||
* @return string
|
||||
*/
|
||||
@@ -129,7 +148,7 @@ class IDF_Scm_Monotone_BasicIO
|
||||
|
||||
$maxkeylength = 0;
|
||||
foreach ((array)$stanza as $lx => $line) {
|
||||
if (!array_key_exists('key', $line)) {
|
||||
if (!array_key_exists('key', $line) || empty($line['key'])) {
|
||||
throw new IDF_Scm_Exception(
|
||||
'"key" not found in basicio stanza '.$sx.', line '.$lx
|
||||
);
|
||||
@@ -157,13 +176,6 @@ class IDF_Scm_Monotone_BasicIO
|
||||
$value).'"';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IDF_Scm_Exception(
|
||||
'neither "hash" nor "values" found in basicio '.
|
||||
'stanza '.$sx.', line '.$lx
|
||||
);
|
||||
}
|
||||
|
||||
$out .= "\n";
|
||||
}
|
||||
|
66
src/IDF/Scm/Monotone/IStdio.php
Normal file
66
src/IDF/Scm/Monotone/IStdio.php
Normal 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();
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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',
|
||||
|
@@ -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 %d</a>, by %s"
|
||||
msgstr ""
|
||||
"Actualización de <a href=\"%s\" class=\"%s\">revisión %d</a>, por %s"
|
||||
msgstr "Actualización de <a href=\"%s\" class=\"%s\">revisión %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
@@ -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> </td>
|
||||
<td>
|
||||
<input type="submit" name="submit" value="{trans 'Save Changes'}" />
|
||||
|
@@ -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">
|
||||
|
@@ -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">
|
||||
|
@@ -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}
|
||||
|
@@ -8,8 +8,7 @@
|
||||
{/if}<li id="project-list"><a href="{url 'IDF_Views::index'}">{trans 'Project List'} ▾</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>
|
||||
|
@@ -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}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
return array(
|
||||
'version' => '1.1.3-dev',
|
||||
'version' => '1.2-dev',
|
||||
'revision' => '$Format:%H$',
|
||||
);
|
||||
|
@@ -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';
|
||||
|
||||
|
176
test/IDF/Scm/Monotone/BasicIOTest.php
Normal file
176
test/IDF/Scm/Monotone/BasicIOTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
|
161
test/IDF/Scm/Monotone/ZipRenderTest.php
Normal file
161
test/IDF/Scm/Monotone/ZipRenderTest.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
95
test/config.php-dist
Normal 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;
|
||||
|
BIN
test/data/IDF_Scm_Monotone_ZipRenderTest/data.zip
Normal file
BIN
test/data/IDF_Scm_Monotone_ZipRenderTest/data.zip
Normal file
Binary file not shown.
@@ -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;
|
||||
}
|
||||
|
BIN
www/media/idf/img/no_logo.png
Normal file
BIN
www/media/idf/img/no_logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Reference in New Issue
Block a user