14 Commits

Author SHA1 Message Date
Thomas Keller
6f4af6b68d Start 1.3.4 development 2012-11-18 23:58:18 +01:00
Thomas Keller
ebb8d46420 Release 1.3.3 2012-11-18 23:55:17 +01:00
Thomas Keller
6c5406dd99 Fix a problem in jquery.hotkeys that triggered global hotkeys when one was
in a password text field. Upstream should know of this problem for a long
time already, but hasn't released a fixed version yet, so we're applying
our own patch here (fixes issue 821).
2012-11-18 00:58:27 +01:00
Thomas Keller
4aa4100532 Update French translation from Transifex. 2012-11-18 00:28:30 +01:00
Thomas Keller
d90c1a2c23 $prj wasn't defined, so use the project reference that the page has instead (fixes issue 808) 2012-07-20 15:03:57 +02:00
Thomas Keller
22c1f92b2b Use git's "find copies harder" algorithm to - well - find copies in changesets
and render them as such.
2012-07-11 00:17:23 +02:00
Thomas Keller
d17098e703 Ensure that PHP doesn't interpret read ini file values and therefor
scrambles the output of hgrc files (issue 523).
2012-06-05 20:55:21 +02:00
Thomas Keller
64c6674762 Copy over all project properties, except a few scm settings and very
project-specific ones, when a new project is based on another one.
2012-05-21 23:33:38 +02:00
Thomas Keller
839444cc8a Use Pluf's new migration capabilities to prevent problems with the
circular dependency between project and project activity during
new db installations (issue 800).
ATTENTION: IDF now needs Pluf a45dc195 or newer!
2012-05-15 22:43:15 +02:00
Thomas Keller
831439120c Make the current_activity field in IDF_Project nullable and fix
a problem in the migration 25's down method (issue 800)
2012-05-15 22:38:27 +02:00
Thomas Keller
6bb886b92a If ssh public key data contain forward slashes, the SyncGit cron job
did not properly find and update the region which it should have
under its control (thanks to Simon Gareste for the fix!)
2012-05-14 19:38:07 +02:00
Thomas Keller
dd3474c06c Add two more targets to dump and restore application backups. 2012-05-12 02:25:33 +02:00
Thomas Keller
bcd515eed5 Do not display all project to a user if he has no rights for
_any_ project of the forge, but actually hide all... thanks
to René Klomp for this finding!
2012-05-11 23:26:42 +02:00
Thomas Keller
0826dab575 Start 1.3.3 development. 2012-05-09 22:10:24 +02:00
20 changed files with 1260 additions and 378 deletions

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@
.settings
.tx/config
attachments
backups
indefero-*.zip
src/IDF/conf/idf.php
src/IDF/conf/idf.test.php

View File

@@ -7,6 +7,7 @@ Much appreciated contributors (in alphabetical order):
Andrew Nguyen <andrew-git-indefero@na-consulting.net>
Baptiste Durand-Bret <bathizte@ozazar.org>
Baptiste Michaud <bactisme@gmail.com> - Subversion sync
Benjamin Danon <benjamin@sphax3d.org> - French translation
Benjamin Jorand <benjamin.jorand@gmail.com> - Mercurial support
Brenda Wallace <shiny@cpan.org>
Brian Armstrong <brianar>

View File

@@ -37,10 +37,11 @@ help:
@printf "\tpo-push - Send the all PO files to the transifex server.\n"
@printf "\tpo-pull - Get all PO files from the transifex server.\n"
@printf "\tpo-stats - Show translation statistics of all PO files.\n"
@printf "\nMisc Rules :\n";
@printf "\tdb-install - Install the database schema.\n"
@printf "\tdb-update - Update the database schema.\n"
@printf "\nRules for managing the database :\n";
@printf "\tdb-install - Install the database schema.\n"
@printf "\tdb-update - Update the database schema.\n"
@printf "\tdb-backup-foo - Create a named backup 'foo' with data from the current database.\n"
@printf "\tdb-restore-foo - Restore schema and the data from a named backup 'foo' to an empty database.\n"
#
# Internationalization rule, POT & PO file manipulation
@@ -139,8 +140,8 @@ po-stats:
# make develop_zipfile
#
%-zipfile:
@git archive --format=zip --prefix="indefero/" $(@:-zipfile=) \
> indefero-$(@:-zipfile=)-`git log $(@:-zipfile=) -n 1 \
@git archive --format=zip --prefix="indefero/" $* \
> indefero-$*-`git log $* -n 1 \
--pretty=format:%h`.zip
db-install:
@@ -148,3 +149,13 @@ db-install:
db-update:
@cd src && php "$(PLUF_PATH)/migrate.php" --conf=IDF/conf/idf.php -a -d
db-backup-%:
@[ -e backups ] || mkdir backups
@cd src && php "$(PLUF_PATH)/migrate.php" --conf=IDF/conf/idf.php -a -b ../backups $*
@echo Files for named backup $* have been saved into backups/ directory.
db-restore-%:
@cd src && php "$(PLUF_PATH)/migrate.php" --conf=IDF/conf/idf.php -a -r ../backups $*
@echo Files for named backup $* have been restored from the backups/ directory.

View File

@@ -1,3 +1,48 @@
# InDefero 1.3.4 - xxx xxx xx xx:xx:xx UTC 201X
## Bugfixes
...
# InDefero 1.3.3 - Sun Nov 18 22:54:00 UTC 2012
**ATTENTION**: InDefero needs Pluf [a45dc195](http://projects.ceondo.com/p/pluf/source/commit/a45dc195)
or newer to run properly!
## Bugfixes
- A long standing bug in the Mercurial plugin that lead to corruption
of boolean configuration values in the `hgrc` of the served repository
has been fixed (issue 523).
- If an anonymous or authenticated user had no access to any project in a
forge, all projects were listed for him (but still no one was actually
accessible). This has been fixed.
- Fixed a problem where the SyncGit plugin doesn't properly updates the
authorized_keys file when the public key data contained slashes (thanks
to Simon Gareste for the fix!)
- Under PostgreSQL indefero could not be set up because of a circular
foreign key dependency. This has been fixed (issue 800).
- Under PostgreSQL new projects could not be created due to a failing
foreign key relation. Adding project tags was not possible for a similar
reason. This has been fixed (issue 800, continued).
- If a project was created based on the settings of an existing project,
not all settings, like for example the new notification settings, have
been copied. This has been changed insofar that now all properties except
the project's URL, logo and individual SCM settings are copied by default.
- Wiki pages couldn't be properly saved with E_NOTICE enabled because
of a syntax error (fixes issue 808).
- Indefero now shows detected copies in git changesets.
- A user is no longer redirected to the Help page if he enters 'H' in the
password text field on the login page (fixes issue 821).
# InDefero 1.3.2 - Wed May 09 20:05 2012 UTC
## Bugfixes

View File

@@ -84,7 +84,7 @@ class IDF_Conf extends Pluf_Model
function initCache()
{
$this->datacache = new ArrayObject();
$this->datacache = array();
$sql = new Pluf_SQL('project=%s', $this->_project->id);
foreach ($this->getList(array('filter' => $sql->gen())) as $val) {
$this->datacache[$val->vkey] = $val->vdesc;
@@ -129,4 +129,12 @@ class IDF_Conf extends Pluf_Model
$this->initCache();
}
}
function getKeys()
{
if ($this->datacache === null) {
$this->initCache();
}
return array_keys($this->datacache);
}
}

View File

@@ -360,45 +360,35 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form
$conf = new IDF_Conf();
$conf->setProject($project);
$keys = array('scm', 'svn_remote_url', 'svn_username',
'svn_password', 'mtn_master_branch', 'external_project_url');
foreach ($keys as $key) {
$this->cleaned_data[$key] = (!empty($this->cleaned_data[$key])) ?
$this->cleaned_data[$key] : '';
$conf->setVal($key, $this->cleaned_data[$key]);
}
if ($this->cleaned_data['template'] != '--') {
$tmplconf = new IDF_Conf();
$tmplconf->setProject($tmpl);
// We need to get all the configuration variables we want from
// the old project and put them into the new project.
$props = array(
'labels_download_predefined' => IDF_Form_UploadConf::init_predefined,
'labels_download_one_max' => IDF_Form_UploadConf::init_one_max,
'labels_wiki_predefined' => IDF_Form_WikiConf::init_predefined,
'labels_wiki_one_max' => IDF_Form_WikiConf::init_one_max,
'labels_issue_template' => IDF_Form_IssueTrackingConf::init_template,
'labels_issue_open' => IDF_Form_IssueTrackingConf::init_open,
'labels_issue_closed' => IDF_Form_IssueTrackingConf::init_closed,
'labels_issue_predefined' => IDF_Form_IssueTrackingConf::init_predefined,
'labels_issue_one_max' => IDF_Form_IssueTrackingConf::init_one_max,
'issue_relations' => IDF_Form_IssueTrackingConf::init_relations,
'webhook_url' => '',
'downloads_access_rights' => 'all',
'review_access_rights' => 'all',
'wiki_access_rights' => 'all',
'source_access_rights' => 'all',
'issues_access_rights' => 'all',
'downloads_notification_email' => '',
'review_notification_email' => '',
'wiki_notification_email' => '',
'source_notification_email' => '',
'issues_notification_email' => '',
);
foreach ($props as $prop => $def) {
$conf->setVal($prop, $tmplconf->getVal($prop, $def));
$allKeys = $tmplconf->getKeys();
$scm = $this->cleaned_data['scm'];
$ignoreKeys = array('scm', 'external_project_url', 'logo');
// copy over all existing variables, except scm-related data and
// the project url / logo
foreach ($allKeys as $key) {
if (in_array($key, $ignoreKeys) || strpos($key, $scm.'_') === 0) {
continue;
}
$conf->setVal($key, $tmplconf->getVal($key));
}
}
$keys = array(
'scm', 'svn_remote_url', 'svn_username',
'svn_password', 'mtn_master_branch',
'external_project_url'
);
foreach ($keys as $key) {
$this->cleaned_data[$key] = !empty($this->cleaned_data[$key]) ?
$this->cleaned_data[$key] : '';
$conf->setVal($key, $this->cleaned_data[$key]);
}
$project->created();
if ($this->cleaned_data['template'] == '--') {

View File

@@ -37,6 +37,7 @@ function IDF_Migrations_25NullableProjectInTag_up($params=null)
function IDF_Migrations_25NullableProjectInTag_down($params=null)
{
$engine = Pluf::f('db_engine');
$db = Pluf::db();
if ($engine === 'PostgreSQL') {
$db->execute('ALTER TABLE '.$db->pfx.'idf_tags ALTER COLUMN project SET NOT NULL');

View File

@@ -0,0 +1,46 @@
<?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-2012 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 ***** */
function IDF_Migrations_26NullableActivityInProject_up($params=null)
{
$engine = Pluf::f('db_engine');
$db = Pluf::db();
if ($engine === 'PostgreSQL') {
$db->execute('ALTER TABLE '.$db->pfx.'idf_projects ALTER COLUMN current_activity DROP NOT NULL');
} else if ($engine === 'MySQL') {
$db->execute('ALTER TABLE '.$db->pfx.'idf_projects MODIFY current_activity MEDIUMINT NULL');
// this is only needed for non-transactional setups where MySQL set 0 as default value
$db->execute('UPDATE '.$db->pfx.'idf_projects SET current_activity=NULL WHERE current_activity=0');
}
}
function IDF_Migrations_26NullableActivityInProject_down($params=null)
{
$engine = Pluf::f('db_engine');
$db = Pluf::db();
if ($engine === 'PostgreSQL') {
$db->execute('ALTER TABLE '.$db->pfx.'idf_projects ALTER COLUMN current_activity SET NOT NULL');
} else if ($engine === 'MySQL') {
$db->execute('ALTER TABLE '.$db->pfx.'idf_projects MODIFY current_activity MEDIUMINT NOT NULL');
}
}

View File

@@ -119,5 +119,9 @@ function IDF_Migrations_Backup_restore($folder, $name)
foreach ($full_data as $model => $data) {
Pluf_Test_Fixture::load($data, false);
}
foreach ($models as $model) {
$schema->model = new $model();
$schema->createConstraints();
}
return true;
}

View File

@@ -62,6 +62,10 @@ function IDF_Migrations_Install_setup($params=null)
$schema->model = new $model();
$schema->createTables();
}
foreach ($models as $model) {
$schema->model = new $model();
$schema->createConstraints();
}
// Install the permissions
$perm = new Pluf_Permission();
$perm->name = 'Project membership';
@@ -120,6 +124,10 @@ function IDF_Migrations_Install_teardown($params=null)
);
$db = Pluf::db();
$schema = new Pluf_DB_Schema($db);
foreach ($models as $model) {
$schema->model = new $model();
$schema->dropConstraints();
}
foreach ($models as $model) {
$schema->model = new $model();
$schema->dropTables();

View File

@@ -64,7 +64,7 @@ class IDF_Plugin_SyncGit_Cron
// We update only the part of the file between IDF_START / IDF_END comment
$original_keys = file_get_contents($authorized_keys);
if (strstr($original_keys, "# indefero start") && strstr($original_keys, "# indefero end")) {
$out = preg_replace('/(#\sindefero\sstart).+(#\sindefero\send\s\s?)/isU',
$out = preg_replace('%(#\sindefero\sstart).+(#\sindefero\send\s\s?)%isU',
$out, $original_keys);
} else {
$out .= $original_keys;

View File

@@ -178,7 +178,10 @@ class IDF_Plugin_SyncMercurial
// Generate hgrc content
if (is_file($hgrc_file)) {
$tmp_content = parse_ini_file($hgrc_file, true);
$tmp_content = @parse_ini_file($hgrc_file, true, INI_SCANNER_RAW);
if ($tmp_content === false) {
throw new Exception('could not parse "'.$hgrc_file.'" because of syntax problems');
}
$tmp_content['web']['allow_push'] = $allow_push;
}
else {

View File

@@ -105,6 +105,8 @@ class IDF_Project extends Pluf_Model
'type' => 'Pluf_DB_Field_Foreignkey',
'model' => 'IDF_ProjectActivity',
'blank' => true,
'is_null' => true,
'default' => null,
'verbose' => __('current project activity'),
),
);

View File

@@ -52,11 +52,11 @@ class IDF_Scm_Git extends IDF_Scm
* A doc/Guide utilisateur/images/ftp-nautilus.png
* M doc/Guide utilisateur/textes/log_boot_PEGASE.txt
*
* Status letters mean : Added (A), Deleted (D), Modified (M), Renamed (R)
* Status letters mean : Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R)
*/
public function getChanges($commit)
{
$cmd = sprintf('GIT_DIR=%s '.Pluf::f('git_path', 'git').' show %s --name-status --pretty="format:" --diff-filter="[A|D|M|R]" -M',
$cmd = sprintf('GIT_DIR=%s '.Pluf::f('git_path', 'git').' show %s --name-status --pretty="format:" --diff-filter="[A|C|D|M|R]" -C -C',
escapeshellarg($this->repo),
escapeshellarg($commit));
$out = array();
@@ -89,6 +89,9 @@ class IDF_Scm_Git extends IDF_Scm
} else if ($action == 'R') {
$matches = preg_split("/\t/", $line);
$return->renames[$matches[1]] = $matches[2];
} else if ($action == 'C') {
$matches = preg_split("/\t/", $line);
$return->copies[$matches[1]] = $matches[2];
}
}
}

View File

@@ -50,6 +50,7 @@ class IDF_Tag extends Pluf_Model
'model' => 'IDF_Project',
'blank' => true,
'is_null' => true,
'default' => null,
'verbose' => __('project'),
),
'class' =>

View File

@@ -443,10 +443,12 @@ class IDF_Views
}
$projectIds = self::getUserVisibleProjectIds($user);
if (count($projectIds) > 0) {
$sql->SAnd(new Pluf_SQL(sprintf($db->pfx.'idf_projects.id IN (%s)', implode(', ', $projectIds))));
if (count($projectIds) == 0) {
return new ArrayObject();
}
$sql->SAnd(new Pluf_SQL(sprintf($db->pfx.'idf_projects.id IN (%s)', implode(', ', $projectIds))));
$orderTypes = array(
'name' => 'name ASC',
'activity' => 'value DESC, name ASC',
@@ -470,10 +472,12 @@ class IDF_Views
$sql = new Pluf_SQL('project IS NULL');
$projectIds = self::getUserVisibleProjectIds($user);
if (count($projectIds) > 0) {
$sql->SAnd(new Pluf_SQL(sprintf('idf_project_id IN (%s)', implode(', ', $projectIds))));
if (count($projectIds) == 0) {
return new ArrayObject();
}
$sql->SAnd(new Pluf_SQL(sprintf('idf_project_id IN (%s)', implode(', ', $projectIds))));
$tagList = Pluf::factory('IDF_Tag')->getList(array(
'filter' => $sql->gen(),
'view' => 'join_projects',

View File

@@ -167,7 +167,7 @@ class IDF_Wiki_PageRevision extends Pluf_Model
if (count($matches) > 1 && count($matches[1]) > 0) {
foreach ($matches[1] as $resourceName) {
$sql = new Pluf_SQL('project=%s AND title=%s',
array($prj->id, $resourceName));
array($page->get_project()->id, $resourceName));
$resources = Pluf::factory('IDF_Wiki_Resource')->getList(array('filter'=>$sql->gen()));
if ($resources->count() == 0)
continue;

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -44,7 +44,7 @@
handleObj.handler = function( event ) {
// Don't fire in text-accepting inputs that we didn't directly bind to
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
if ( this !== event.target && (/textarea|select|input/i.test( event.target.nodeName ) ||
event.target.type === "text" || $(event.target).prop('contenteditable') == 'true' )) {
return;
}