This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FusionForge".
The branch, feature/concurrent-ssh-http-for-scm-5.3 has been created
at 8d5d0d0adbedde00fbf378805dc75fbc32fe8cf5 (commit)
- Log -----------------------------------------------------------------
commit 8d5d0d0adbedde00fbf378805dc75fbc32fe8cf5
Author: Roland Mas <[email protected]>
Date: Mon May 5 15:24:43 2014 +0200
Added machinery for Subversion read/write over WebDAV using mpm-itk for
privilege separation
diff --git a/src/etc/httpd.conf.d/05-config-macros-scmsvn.conf
b/src/etc/httpd.conf.d/05-config-macros-scmsvn.conf
new file mode 100644
index 0000000..e07f375
--- /dev/null
+++ b/src/etc/httpd.conf.d/05-config-macros-scmsvn.conf
@@ -0,0 +1,35 @@
+<Macro ScmsvnProjectWithAnon $project>
+<LocationMatch "^/svn/$project/">
+ DAV svn
+ SVNPath {scmsvn/repos_path}/$project
+ # allow read-only browsing
+ <LimitExcept GET PROPFIND OPTIONS REPORT>
+ </LimitExcept>
+</LocationMatch>
+
+# Use ScmsvnProjectWithoutAnon $project
+</Macro>
+
+<Macro ScmsvnProjectWithoutAnon $project>
+# <LocationMatch "^/authsvn/[^/]+/$project/">
+# DAV svn
+# SVNPath {scmsvn/repos_path}/$project
+# AuthzSVNAccessFile {core/data_path}/svnroot-access
+# </LocationMatch>
+</Macro>
+
+<Macro ScmsvnUser $user>
+<Location /authsvn/$user>
+ DAV svn
+ SVNParentPath {scmsvn/repos_path}
+
+ # how to authenticate a user
+ AuthzSVNAccessFile {core/data_path}/svnroot-access
+ AuthType Basic
+ AuthName "SCM for {core/forge_name}"
+ AuthUserFile {core/data_path}/svnroot-authfile
+
+ # only authenticated users may access the repository
+ Require user $user
+</Location>
+</Macro>
diff --git a/src/etc/httpd.conf.d/plugin-scmsvn.inc
b/src/etc/httpd.conf.d/plugin-scmsvn.inc
index 18541b2..6b9cd5f 100644
--- a/src/etc/httpd.conf.d/plugin-scmsvn.inc
+++ b/src/etc/httpd.conf.d/plugin-scmsvn.inc
@@ -1,4 +1,4 @@
-<Location /svn>
+<Location /foosvn>
<IfModule mod_dav_svn.c>
DAV svn
SVNParentPath {scmsvn/repos_path}
@@ -20,3 +20,16 @@
</IfModule>
</IfModule>
</Location>
+
+<LocationMatch "^/authsvn/">
+ <IfModule mod_authz_svn.c>
+ # how to authenticate a user
+ AuthzSVNAccessFile {core/data_path}/svnroot-access
+ AuthType Basic
+ AuthName "SCM for {core/forge_name}"
+ AuthUserFile {core/data_path}/svnroot-authfile
+
+ # only authenticated users may access the repository
+ Require valid-user
+ </IfModule>
+</LocationMatch>
diff --git a/src/etc/httpd.conf.d/vhost-scm-plugin-scmsvn.inc
b/src/etc/httpd.conf.d/vhost-scm-plugin-scmsvn.inc
new file mode 100644
index 0000000..1925dd1
--- /dev/null
+++ b/src/etc/httpd.conf.d/vhost-scm-plugin-scmsvn.inc
@@ -0,0 +1,2 @@
+SetEnvIf Request_URI ^/authsvn/([^/]+)/ ITKUID=$1
+SetEnvIf Request_URI ^/authsvn/([^/]+)/([^/]+)/ ITKGID=$2
diff --git a/src/etc/httpd.conf.d/vhost-scm.inc
b/src/etc/httpd.conf.d/vhost-scm.inc
index 7d88c20..d8d5e09 100644
--- a/src/etc/httpd.conf.d/vhost-scm.inc
+++ b/src/etc/httpd.conf.d/vhost-scm.inc
@@ -6,12 +6,12 @@ SetEnvIf Request_URI . ITKGID=www-data
<IfVersion >= 2.3>
IncludeOptional {core/config_path}/httpd.conf.d/plugin-scm*.inc
IncludeOptional {core/config_path}/httpd.conf.d/vhost-scm-plugin-scm*.inc
- IncludeOptional {core/data_path}/scmgit-auth*.inc
+ IncludeOptional {core/data_path}/scm*-auth*.inc
</IfVersion>
<IfVersion < 2.3>
Include {core/config_path}/httpd.conf.d/plugin-scm*.inc
Include {core/config_path}/httpd.conf.d/vhost-scm-plugin-scm*.inc
- Include {core/data_path}/scmgit-auth*.inc
+ Include {core/data_path}/scm*-auth*.inc
</IfVersion>
AssignUserIDExpr %{reqenv:ITKUID}
diff --git a/src/plugins/scmgit/common/GitPlugin.class.php
b/src/plugins/scmgit/common/GitPlugin.class.php
index 7000fcb..c9fec44 100644
--- a/src/plugins/scmgit/common/GitPlugin.class.php
+++ b/src/plugins/scmgit/common/GitPlugin.class.php
@@ -733,8 +733,6 @@ class GitPlugin extends SCMPlugin {
$group_fname =
forge_get_config('data_path').'/scmgit-groupfile';
$group_f = fopen($group_fname.'.new', 'w');
- fwrite($config_f, '');
-
foreach ($groups as $project) {
if ( !$project->isActive()) {
continue;
diff --git a/src/plugins/scmsvn/common/SVNPlugin.class.php
b/src/plugins/scmsvn/common/SVNPlugin.class.php
index f67e06c..ec63674 100644
--- a/src/plugins/scmsvn/common/SVNPlugin.class.php
+++ b/src/plugins/scmsvn/common/SVNPlugin.class.php
@@ -153,7 +153,7 @@ class SVNPlugin extends SCMPlugin {
$b .= ' ';
$b .= _('Enter your site password when
prompted.');
$b .= '</p>';
- $b .= '<p><tt>svn checkout --username '.$d.'
http'.((forge_get_config('use_ssl', 'scmsvn')) ? 's' : '').'://'.
$this->getBoxForProject($project) . $this->svn_root_dav
.'/'.$project->getUnixName().$module.'</tt></p>' ;
+ $b .= '<p><tt>svn checkout --username '.$d.'
http'.((forge_get_config('use_ssl', 'scmsvn')) ? 's' : '').'://'.
forge_get_config('scm_host').
'/authsvn/'.$d.'/'.$project->getUnixName().$module.'</tt></p>' ;
}
} else {
if (forge_get_config('use_ssh', 'scmsvn')) {
@@ -337,6 +337,9 @@ class SVNPlugin extends SCMPlugin {
return true;
}
+ $config_fname =
forge_get_config('data_path').'/scmsvn-auth.inc';
+ $config_f = fopen($config_fname.'.new', 'w');
+
$access_data = '';
$password_data = '';
$engine = RBACEngine::getInstance() ;
@@ -371,10 +374,22 @@ class SVNPlugin extends SCMPlugin {
$access_data .= "\n";
$engine->invalidateRoleCaches(); // caching all roles
takes ~1GB RAM for 5K projects/15K users
+
+ if ($project->enableAnonSCM()) {
+ fwrite($config_f, 'Use ScmsvnProjectWithAnon
'.$project->getUnixName().'
+');
+ } else {
+ fwrite($config_f, 'Use ScmsvnProjectWithoutAnon
'.$project->getUnixName().'
+');
+ }
+
+ fwrite($config_f, "\n");
}
foreach ($svnusers as $user_id => $user) {
$password_data .=
$user->getUnixName().':'.$user->getUnixPasswd()."\n";
+ fwrite($config_f, 'Use ScmsvnUser
'.$user->getUnixName().'
+');
}
$password_data .= forge_get_config('anonsvn_login',
'scmsvn').":".htpasswd_apr1_md5(forge_get_config('anonsvn_password',
'scmsvn'))."\n";
@@ -391,6 +406,10 @@ class SVNPlugin extends SCMPlugin {
fclose($f);
chmod($fname.'.new', 0644);
rename($fname.'.new', $fname);
+
+ fclose($config_f);
+ chmod($config_fname.'.new', 0644);
+ rename($config_fname.'.new', $config_fname);
}
function gatherStats($params) {
diff --git a/tests/func/PluginsScmSvn/svnWebDAVTest.php
b/tests/func/PluginsScmSvn/svnWebDAVTest.php
new file mode 100644
index 0000000..b88373c
--- /dev/null
+++ b/tests/func/PluginsScmSvn/svnWebDAVTest.php
@@ -0,0 +1,90 @@
+<?php
+/*
+ * Copyright (C) 2012 Roland Mas
+ *
+ * This file is part of FusionForge.
+ *
+ * FusionForge 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.
+ *
+ * FusionForge 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+require_once dirname(dirname(__FILE__)).'/Testing/SeleniumGforge.php';
+
+class ScmSvnWebDAVTest extends FForge_SeleniumTestCase
+{
+ function testScmSvnWebDAV()
+ {
+ $this->activatePlugin('scmsvn');
+ $this->populateStandardTemplate('empty');
+ $this->init();
+
+ $this->open(ROOT);
+ $this->clickAndWait("link=ProjectA");
+ $this->clickAndWait("link=Admin");
+ $this->clickAndWait("link=Tools");
+ $this->clickAndWait("link=Source Code Admin");
+ $this->click("//input[@name='scmradio' and @value='scmsvn']");
+ $this->clickAndWait("submit");
+
+ // Run the cronjob to create repositories
+ $this->cron("create_scm_repos.php");
+ $this->cron("homedirs.php");
+ $this->reload_apache();
+ $this->reload_nscd();
+
+ // Get the address of the repo
+ $this->open(ROOT);
+ $this->clickAndWait("link=ProjectA");
+ $this->clickAndWait("link=SCM");
+ $p = $this->getText("//tt[contains(.,'svn checkout --username
".FORGE_ADMIN_USERNAME." http')]");
+ $p = preg_replace(",^svn checkout --username
".FORGE_ADMIN_USERNAME." ,", "", $p);
+
+ // Create a local clone, add stuff, push it to the repo
+ $t = exec("mktemp -d /tmp/svnTest.XXXXXX");
+ $auth = "--username ".FORGE_ADMIN_USERNAME." --password
".FORGE_ADMIN_PASSWORD;
+ system("cd $t && svn checkout $auth $p projecta", $ret);
+ $this->assertEquals($ret, 0);
+
+ system("echo 'this is a simple text' > $t/projecta/mytext.txt");
+ system("cd $t/projecta && svn add mytext.txt && svn commit
$auth -m'Adding file'", $ret);
+ system("echo 'another simple text' >> $t/projecta/mytext.txt");
+ system("cd $t/projecta && svn commit $auth -m'Modifying file'",
$ret);
+ $this->assertEquals($ret, 0);
+
+ // Check that the changes appear in svnweb
+ $this->open(ROOT);
+ $this->clickAndWait("link=ProjectA");
+ $this->clickAndWait("link=SCM");
+ $this->clickAndWait("link=Browse Subversion Repository");
+ $this->assertTextPresent("Modifying file");
+ $this->assertTextNotPresent("Adding file");
+
+ system("rm -fr $t");
+ }
+
+ /**
+ * Method that is called after Selenium actions.
+ *
+ * @param string $action
+ */
+ protected function defaultAssertions($action)
+ {
+ if ($action == 'waitForPageToLoad') {
+ $this->assertTrue($this->isElementPresent("//h1")
+ ||
$this->isElementPresent("//.[@class='page_footer']"));
+ }
+ }
+
+}
+?>
commit 90231352b099dedc898ad1490839d4365960e015
Author: Roland Mas <[email protected]>
Date: Fri Apr 25 13:04:11 2014 +0200
Testsuite for Git over smart HTTP
diff --git a/tests/func/PluginsScmGit/gitSmartHTTPTest.php
b/tests/func/PluginsScmGit/gitSmartHTTPTest.php
index b85458b..211e591 100644
--- a/tests/func/PluginsScmGit/gitSmartHTTPTest.php
+++ b/tests/func/PluginsScmGit/gitSmartHTTPTest.php
@@ -39,14 +39,17 @@ class ScmGitSmartHTTPTest extends FForge_SeleniumTestCase
// Run the cronjob to create repositories
$this->cron("create_scm_repos.php");
+ $this->cron("homedirs.php");
+ $this->reload_apache();
+ $this->reload_nscd();
// Get the address of the repo
$this->open(ROOT);
$this->clickAndWait("link=ProjectA");
$this->clickAndWait("link=SCM");
- $p = $this->getText("//tt[contains(.,'git clone http')]");
+ $p = $this->getText("//tt[contains(.,'git clone http') and
contains(.,'".FORGE_ADMIN_USERNAME."@')]");
$p = preg_replace(",^git clone ,", "", $p);
- $p = preg_replace(",://.*@,", "://root@", $p);
+ $p = preg_replace(",@,", ":".FORGE_ADMIN_PASSWORD."@", $p);
// Create a local clone, add stuff, push it to the repo
$t = exec("mktemp -d /tmp/gitTest.XXXXXX");
commit c71d718ca686afe159a5a76d0e1a21090a8ff357
Author: Roland Mas <[email protected]>
Date: Fri Apr 25 13:02:34 2014 +0200
New testsuite methods to reload Apache and (u)nscd
diff --git a/tests/func/PluginsScmGit/gitSSHTest.php
b/tests/func/PluginsScmGit/gitSSHTest.php
index 4dedac7..baca405 100644
--- a/tests/func/PluginsScmGit/gitSSHTest.php
+++ b/tests/func/PluginsScmGit/gitSSHTest.php
@@ -43,6 +43,7 @@ class ScmGitSSHTest extends FForge_SeleniumTestCase
$this->cron("create_scm_repos.php");
$this->cron("homedirs.php");
$this->cron("ssh_create.php");
+ $this->reload_nscd();
// Get the address of the repo
$this->open(ROOT);
commit 662be565ee047c4e65c67d9caba136cf87c965f5
Author: Roland Mas <[email protected]>
Date: Fri Apr 25 11:46:27 2014 +0200
Use user account rather than root for git+ssh:// tests
diff --git a/tests/func/PluginsScmGit/gitSSHTest.php
b/tests/func/PluginsScmGit/gitSSHTest.php
index ee976c6..4dedac7 100644
--- a/tests/func/PluginsScmGit/gitSSHTest.php
+++ b/tests/func/PluginsScmGit/gitSSHTest.php
@@ -36,9 +36,13 @@ class ScmGitSSHTest extends FForge_SeleniumTestCase
$this->clickAndWait("link=Source Code Admin");
$this->click("//input[@name='scmradio' and @value='scmgit']");
$this->clickAndWait("submit");
+
+ $this->uploadSshKey();
// Run the cronjob to create repositories
$this->cron("create_scm_repos.php");
+ $this->cron("homedirs.php");
+ $this->cron("ssh_create.php");
// Get the address of the repo
$this->open(ROOT);
@@ -46,7 +50,6 @@ class ScmGitSSHTest extends FForge_SeleniumTestCase
$this->clickAndWait("link=SCM");
$p = $this->getText("//tt[contains(.,'git clone git+ssh')]");
$p = preg_replace(",^git clone ,", "", $p);
- $p = preg_replace(",://.*@,", "://root@", $p);
// Create a local clone, add stuff, push it to the repo
$t = exec("mktemp -d /tmp/gitTest.XXXXXX");
commit 800667b48a4c22f4cec1460ba8fe13df0dfa86b7
Author: Roland Mas <[email protected]>
Date: Thu Apr 24 16:18:37 2014 +0200
Split scmgit testsuite into three parts
diff --git a/tests/func/PluginsScmGit/gitTest.php
b/tests/func/PluginsScmGit/gitSSHTest.php
similarity index 61%
copy from tests/func/PluginsScmGit/gitTest.php
copy to tests/func/PluginsScmGit/gitSSHTest.php
index 5656f6d..ee976c6 100644
--- a/tests/func/PluginsScmGit/gitTest.php
+++ b/tests/func/PluginsScmGit/gitSSHTest.php
@@ -21,9 +21,9 @@
require_once dirname(dirname(__FILE__)).'/Testing/SeleniumGforge.php';
-class ScmGitTest extends FForge_SeleniumTestCase
+class ScmGitSSHTest extends FForge_SeleniumTestCase
{
- function testScmGit()
+ function testScmGitSSH()
{
$this->activatePlugin('scmgit');
$this->populateStandardTemplate('empty');
@@ -37,51 +37,9 @@ class ScmGitTest extends FForge_SeleniumTestCase
$this->click("//input[@name='scmradio' and @value='scmgit']");
$this->clickAndWait("submit");
- $this->type("//input[@name='repo_name']", "other-repo");
- $this->type("//input[@name='description']", "Description for
second repository");
- $this->clickAndWait("//input[@value='Submit']");
- $this->assertTextPresent("New repository other-repo
registered");
-
- $this->open(ROOT);
- $this->clickAndWait("link=ProjectA");
- $this->clickAndWait("link=SCM");
- $this->assertTextPresent("other-repo");
-
- $this->assertTextPresent("Anonymous Access to the Git");
- $this->clickAndWait("link=Request a personal repository");
- $this->assertTextPresent("You have now requested a personal Git
repository");
-
- // Run the cronjob to create repositories
- $this->cron("create_scm_repos.php");
-
- $this->clickAndWait("link=SCM");
- $this->assertTextPresent("Access to your personal repository");
-
-
$this->open(ROOT.'/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=projecta');
- $this->waitForPageToLoad();
- $this->assertElementPresent("//.[@class='page_footer']");
- $this->assertTextPresent("projecta.git");
- $this->assertTextPresent("other-repo.git");
- $this->assertTextPresent("users/".FORGE_ADMIN_USERNAME.".git");
-
- $this->open(ROOT);
- $this->clickAndWait("link=ProjectA");
- $this->clickAndWait("link=Admin");
- $this->clickAndWait("link=Tools");
- $this->clickAndWait("link=Source Code Admin");
-
$this->clickAndWait("//form[@name='form_delete_repo_other-repo']/input[@value='Delete']");
- $this->assertTextPresent("Repository other-repo is marked for
deletion");
-
// Run the cronjob to create repositories
$this->cron("create_scm_repos.php");
-
$this->open(ROOT.'/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=projecta');
- $this->waitForPageToLoad();
- $this->assertElementPresent("//.[@class='page_footer']");
- $this->assertTextPresent("projecta.git");
- $this->assertTextNotPresent("other-repo.git");
- $this->assertTextPresent("users/".FORGE_ADMIN_USERNAME.".git");
-
// Get the address of the repo
$this->open(ROOT);
$this->clickAndWait("link=ProjectA");
diff --git a/tests/func/PluginsScmGit/gitTest.php
b/tests/func/PluginsScmGit/gitSmartHTTPTest.php
similarity index 60%
copy from tests/func/PluginsScmGit/gitTest.php
copy to tests/func/PluginsScmGit/gitSmartHTTPTest.php
index 5656f6d..b85458b 100644
--- a/tests/func/PluginsScmGit/gitTest.php
+++ b/tests/func/PluginsScmGit/gitSmartHTTPTest.php
@@ -21,9 +21,9 @@
require_once dirname(dirname(__FILE__)).'/Testing/SeleniumGforge.php';
-class ScmGitTest extends FForge_SeleniumTestCase
+class ScmGitSmartHTTPTest extends FForge_SeleniumTestCase
{
- function testScmGit()
+ function testScmGitSmartHTTP()
{
$this->activatePlugin('scmgit');
$this->populateStandardTemplate('empty');
@@ -37,56 +37,14 @@ class ScmGitTest extends FForge_SeleniumTestCase
$this->click("//input[@name='scmradio' and @value='scmgit']");
$this->clickAndWait("submit");
- $this->type("//input[@name='repo_name']", "other-repo");
- $this->type("//input[@name='description']", "Description for
second repository");
- $this->clickAndWait("//input[@value='Submit']");
- $this->assertTextPresent("New repository other-repo
registered");
-
- $this->open(ROOT);
- $this->clickAndWait("link=ProjectA");
- $this->clickAndWait("link=SCM");
- $this->assertTextPresent("other-repo");
-
- $this->assertTextPresent("Anonymous Access to the Git");
- $this->clickAndWait("link=Request a personal repository");
- $this->assertTextPresent("You have now requested a personal Git
repository");
-
- // Run the cronjob to create repositories
- $this->cron("create_scm_repos.php");
-
- $this->clickAndWait("link=SCM");
- $this->assertTextPresent("Access to your personal repository");
-
-
$this->open(ROOT.'/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=projecta');
- $this->waitForPageToLoad();
- $this->assertElementPresent("//.[@class='page_footer']");
- $this->assertTextPresent("projecta.git");
- $this->assertTextPresent("other-repo.git");
- $this->assertTextPresent("users/".FORGE_ADMIN_USERNAME.".git");
-
- $this->open(ROOT);
- $this->clickAndWait("link=ProjectA");
- $this->clickAndWait("link=Admin");
- $this->clickAndWait("link=Tools");
- $this->clickAndWait("link=Source Code Admin");
-
$this->clickAndWait("//form[@name='form_delete_repo_other-repo']/input[@value='Delete']");
- $this->assertTextPresent("Repository other-repo is marked for
deletion");
-
// Run the cronjob to create repositories
$this->cron("create_scm_repos.php");
-
$this->open(ROOT.'/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=projecta');
- $this->waitForPageToLoad();
- $this->assertElementPresent("//.[@class='page_footer']");
- $this->assertTextPresent("projecta.git");
- $this->assertTextNotPresent("other-repo.git");
- $this->assertTextPresent("users/".FORGE_ADMIN_USERNAME.".git");
-
// Get the address of the repo
$this->open(ROOT);
$this->clickAndWait("link=ProjectA");
$this->clickAndWait("link=SCM");
- $p = $this->getText("//tt[contains(.,'git clone git+ssh')]");
+ $p = $this->getText("//tt[contains(.,'git clone http')]");
$p = preg_replace(",^git clone ,", "", $p);
$p = preg_replace(",://.*@,", "://root@", $p);
diff --git a/tests/func/PluginsScmGit/gitTest.php
b/tests/func/PluginsScmGit/gitWUITest.php
similarity index 70%
rename from tests/func/PluginsScmGit/gitTest.php
rename to tests/func/PluginsScmGit/gitWUITest.php
index 5656f6d..704ef36 100644
--- a/tests/func/PluginsScmGit/gitTest.php
+++ b/tests/func/PluginsScmGit/gitWUITest.php
@@ -21,9 +21,9 @@
require_once dirname(dirname(__FILE__)).'/Testing/SeleniumGforge.php';
-class ScmGitTest extends FForge_SeleniumTestCase
+class ScmGitWUITest extends FForge_SeleniumTestCase
{
- function testScmGit()
+ function testScmGitWUI()
{
$this->activatePlugin('scmgit');
$this->populateStandardTemplate('empty');
@@ -81,40 +81,6 @@ class ScmGitTest extends FForge_SeleniumTestCase
$this->assertTextPresent("projecta.git");
$this->assertTextNotPresent("other-repo.git");
$this->assertTextPresent("users/".FORGE_ADMIN_USERNAME.".git");
-
- // Get the address of the repo
- $this->open(ROOT);
- $this->clickAndWait("link=ProjectA");
- $this->clickAndWait("link=SCM");
- $p = $this->getText("//tt[contains(.,'git clone git+ssh')]");
- $p = preg_replace(",^git clone ,", "", $p);
- $p = preg_replace(",://.*@,", "://root@", $p);
-
- // Create a local clone, add stuff, push it to the repo
- $t = exec("mktemp -d /tmp/gitTest.XXXXXX");
- system("cd $t && git clone --quiet $p", $ret);
- $this->assertEquals($ret, 0);
-
- system("echo 'this is a simple text' > $t/projecta/mytext.txt");
- system("cd $t/projecta && git add mytext.txt && git commit
--quiet -a -m'Adding file'", $ret);
- system("echo 'another simple text' >> $t/projecta/mytext.txt");
- system("cd $t/projecta && git commit --quiet -a -m'Modifying
file'", $ret);
- $this->assertEquals($ret, 0);
-
- system("cd $t/projecta && git push --quiet --all", $ret);
- $this->assertEquals($ret, 0);
-
- // Check that the changes appear in gitweb
-
$this->open(ROOT.'/plugins/scmgit/cgi-bin/gitweb.cgi?a=project_list;pf=projecta');
- $this->waitForPageToLoad();
- $this->assertElementPresent("//.[@class='page_footer']");
- $this->assertTextPresent("projecta.git");
- $this->click("link=projecta/projecta.git");
- $this->waitForPageToLoad();
- $this->assertTextPresent("Modifying file");
- $this->assertTextPresent("Adding file");
-
- system("rm -fr $t");
}
/**
commit 31ceaf4760b22b868cba29da5ea3c7346d952199
Author: Roland Mas <[email protected]>
Date: Fri Apr 18 06:43:52 2014 +0200
Added machinery for Git read/write access over the HTTP smart protocol
diff --git a/src/etc/httpd.conf.d/05-config-macros-scmgit.conf
b/src/etc/httpd.conf.d/05-config-macros-scmgit.conf
new file mode 100644
index 0000000..8d1c0ea
--- /dev/null
+++ b/src/etc/httpd.conf.d/05-config-macros-scmgit.conf
@@ -0,0 +1,31 @@
+<Macro ScmgitProjectWithAnon $project>
+<LocationMatch "^/git/$project/">
+ Require all granted
+</LocationMatch>
+
+<LocationMatch "^/authgit/[^/]+/$project/">
+ Require valid-user
+</LocationMatch>
+</Macro>
+
+<Macro ScmgitProjectWithoutAnon $project>
+<LocationMatch "^/authgit/[^/]+/$project/">
+ Require group scm_$project
+</LocationMatch>
+
+<LocationMatch "^/authgit/[^/]+/$project/.*/git-receive-pack$">
+ AuthMerging And
+ Require group scm_$project
+</LocationMatch>
+</Macro>
+
+<Macro ScmgitUser $user>
+<LocationMatch "^/authgit/$user/">
+ Require user $user
+</LocationMatch>
+
+<LocationMatch "^/authgit/[^/]/[^/]users/$user/git-receive-pack$">
+ AuthMerging And
+ Require user $user
+</LocationMatch>
+</Macro>
diff --git a/src/etc/httpd.conf.d/50-vhosts-scm.conf
b/src/etc/httpd.conf.d/20-vhosts-scm.conf
similarity index 100%
rename from src/etc/httpd.conf.d/50-vhosts-scm.conf
rename to src/etc/httpd.conf.d/20-vhosts-scm.conf
diff --git a/src/etc/httpd.conf.d/plugin-scmgit.inc
b/src/etc/httpd.conf.d/plugin-scmgit.inc
index cde6424..7b406fd 100644
--- a/src/etc/httpd.conf.d/plugin-scmgit.inc
+++ b/src/etc/httpd.conf.d/plugin-scmgit.inc
@@ -1,3 +1,16 @@
<Directory {core/source_path}/plugins/scmgit/cgi-bin>
SetEnv GITWEB_CONFIG {core/config_path}/plugins/scmgit/gitweb.conf
</Directory>
+
+SetEnv GIT_PROJECT_ROOT {scmgit/repos_path}
+SetEnv GIT_HTTP_EXPORT_ALL
+
+ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
+ScriptAliasMatch ^/authgit/[^/]+/(.*) /usr/lib/git-core/git-http-backend/$1
+
+<LocationMatch "^/authgit/">
+ AuthType Basic
+ AuthName "SCM for {core/forge_name}"
+ AuthUserFile {core/data_path}/scmgit-userfile
+ AuthGroupFile {core/data_path}/scmgit-groupfile
+</LocationMatch>
diff --git a/src/etc/httpd.conf.d/vhost-scm-plugin-scmgit.inc
b/src/etc/httpd.conf.d/vhost-scm-plugin-scmgit.inc
new file mode 100644
index 0000000..0b81fc4
--- /dev/null
+++ b/src/etc/httpd.conf.d/vhost-scm-plugin-scmgit.inc
@@ -0,0 +1,2 @@
+SetEnvIf Request_URI ^/authgit/([^/]+)/ ITKUID=$1
+SetEnvIf Request_URI ^/authgit/([^/]+)/([^/]+)/ ITKGID=$2
diff --git a/src/etc/httpd.conf.d/vhost-scm.inc
b/src/etc/httpd.conf.d/vhost-scm.inc
index 0d2064e..7d88c20 100644
--- a/src/etc/httpd.conf.d/vhost-scm.inc
+++ b/src/etc/httpd.conf.d/vhost-scm.inc
@@ -1,8 +1,18 @@
ServerName {core/scm_host}
+SetEnvIf Request_URI . ITKUID=www-data
+SetEnvIf Request_URI . ITKGID=www-data
+
<IfVersion >= 2.3>
IncludeOptional {core/config_path}/httpd.conf.d/plugin-scm*.inc
+ IncludeOptional {core/config_path}/httpd.conf.d/vhost-scm-plugin-scm*.inc
+ IncludeOptional {core/data_path}/scmgit-auth*.inc
</IfVersion>
<IfVersion < 2.3>
Include {core/config_path}/httpd.conf.d/plugin-scm*.inc
+ Include {core/config_path}/httpd.conf.d/vhost-scm-plugin-scm*.inc
+ Include {core/data_path}/scmgit-auth*.inc
</IfVersion>
+
+AssignUserIDExpr %{reqenv:ITKUID}
+AssignGroupIDExpr %{reqenv:ITKGID}
diff --git a/src/install/deps b/src/install/deps
index 4d155fa..cf76489 100644
--- a/src/install/deps
+++ b/src/install/deps
@@ -81,6 +81,7 @@ deps_debian() {
apt-get -y --force-yes install python-moinmoin python-psycopg2
python-pygments libapache2-mod-wsgi
apt-get -y --force-yes install mediawiki
apt-get -y --force-yes install git gitweb
+ apt-get -y --force-yes install libapache2-mpm-itk
a2enmod headers
a2enmod proxy
a2enmod ssl
diff --git a/src/install/install5_post b/src/install/install5_post
index d8ea1b4..9a62e39 100644
--- a/src/install/install5_post
+++ b/src/install/install5_post
@@ -31,7 +31,7 @@ install5_post_suse()
chkconfig -s postgresql on
# Apache settings: modules
- for m in dav dav_svn authz_svn ssl; do
+ for m in dav dav_svn authz_svn ssl macro authz_groupfile; do
a2enmod $m
a2enflag $m
done
@@ -73,7 +73,7 @@ install5_post_debian()
done
# Apache settings: modules
- for m in dav dav_svn authz_svn ssl; do
+ for m in dav dav_svn authz_svn ssl macro authz_groupfile; do
a2enmod $m
done
diff --git a/src/packaging/control/030web-apache2
b/src/packaging/control/030web-apache2
index 9ca1856..0ec7831 100644
--- a/src/packaging/control/030web-apache2
+++ b/src/packaging/control/030web-apache2
@@ -1,6 +1,6 @@
Package: @OLDPACKAGE@-web-apache2
Architecture: all
-Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
libapache2-mod-php5, php5-cgi, php5-pgsql, php5-gd, perl, libdbi-perl,
libdbd-pg-perl, debianutils (>= 1.7), debconf (>= 1.0.32) | debconf-2.0, ucf,
python, ssl-cert, libnusoap-php, libphp-simplepie, php-http,
php-http-webdav-server, libjs-jquery, libjs-jquery-tipsy, libjs-jquery-ui,
libjs-jquery-ui-theme-overcast, javascript-common, ${misc:Depends}
+Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
libapache2-mpm-itk | apache2-mpm-itk, libapache2-mod-php5, php5-cgi,
php5-pgsql, php5-gd, perl, libdbi-perl, libdbd-pg-perl, debianutils (>= 1.7),
debconf (>= 1.0.32) | debconf-2.0, ucf, python, ssl-cert, libnusoap-php,
libphp-simplepie, php-http, php-http-webdav-server, libjs-jquery,
libjs-jquery-tipsy, libjs-jquery-ui, libjs-jquery-ui-theme-overcast,
javascript-common, ${misc:Depends}
Recommends: locales | locales-all
Provides: @OLDPACKAGE@-web
Conflicts: @OLDPACKAGE@-web
diff --git a/src/plugins/scmgit/common/GitPlugin.class.php
b/src/plugins/scmgit/common/GitPlugin.class.php
index 93bee6a..7000fcb 100644
--- a/src/plugins/scmgit/common/GitPlugin.class.php
+++ b/src/plugins/scmgit/common/GitPlugin.class.php
@@ -97,6 +97,14 @@ class GitPlugin extends SCMPlugin {
for ($i=0; $i<$rows; $i++) {
$repo_list[] = db_result($result,$i,'repo_name');
}
+ $clone_commands = array();
+ foreach ($repo_list as $repo_name) {
+ $clone_commands[] = 'git clone
'.util_make_url('/anonscm/git/'.$project->getUnixName().'/'.$repo_name.'.git');
+ if (forge_get_config('use_smarthttp', 'scmgit')) {
+ $protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
+ $clone_commands[] = 'git clone
'.$protocol.'://'.forge_get_config('scm_host').'/git/'.$project->getUnixName().'/'.$repo_name.'.git';
+ }
+ }
$b = '<h2>' . ngettext('Anonymous Access to the Git repository',
'Anonymous Access to the Git
repositories',
@@ -109,9 +117,9 @@ class GitPlugin extends SCMPlugin {
$b .= '</p>';
- foreach ($repo_list as $repo_name) {
+ foreach ($clone_commands as $cmd) {
$b .= '<p>';
- $b .= '<tt>git clone
'.util_make_url('/anonscm/git/'.$project->getUnixName().'/'.$repo_name.'.git').'</tt><br
/>';
+ $b .= '<tt>'.$cmd.'</tt><br />';
$b .= '</p>';
}
@@ -157,12 +165,13 @@ class GitPlugin extends SCMPlugin {
$repo_list[] = db_result($result,$i,'repo_name');
}
+ $b = '';
if (session_loggedin()) {
$u = user_get_object(user_getid());
$d = $u->getUnixName();
if (forge_get_config('use_ssh', 'scmgit')) {
- $b = '<h2>';
- $b = ngettext('Developer Access to the Git
repository via SSH',
+ $b .= '<h2>';
+ $b .= ngettext('Developer Access to the Git
repository via SSH',
'Developer Access to the
Git repositories via SSH',
count($repo_list));
$b .= '</h2>';
@@ -178,10 +187,29 @@ class GitPlugin extends SCMPlugin {
foreach ($repo_list as $repo_name) {
$b .= '<p><tt>git clone
git+ssh://'.$d.'@' . $project->getSCMBox() . '/'.
forge_get_config('repos_path', 'scmgit') .'/'. $project->getUnixName() .'/'.
$repo_name .'.git</tt></p>';
}
- } elseif (forge_get_config('use_dav', 'scmgit')) {
+ }
+ if (forge_get_config('use_smarthttp', 'scmgit')) {
+ $b .= '<h2>';
+ $b .= ngettext('Developer Access to the Git
repository via “smart HTTP”',
+ 'Developer Access to the Git
repositories via “smart HTTP”',
+ count($repo_list));
+ $b .= '</h2>';
+ $b .= '<p>';
+ $b .= ngettext('Only project developers can
access the Git repository via this method.',
+ 'Only project developers can
access the Git repositories via this method.',
+ count($repo_list));
+ $b .= ' ';
+ $b .= _('Enter your site password when
prompted.');
+ $b .= '</p>';
+ $protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
+ foreach ($repo_list as $repo_name) {
+ $b .= '<p><tt>git clone
'.$protocol.'://'.$d.'@' .
forge_get_config('scm_host').'/authgit/'.$d.'/'.$project->getUnixName() .'/'.
$repo_name .'.git</tt></p>';
+ }
+ }
+ if (forge_get_config('use_dav', 'scmgit')) {
$protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
- $b = '<h2>';
- $b = ngettext('Developer Access to the Git
repository via HTTP',
+ $b .= '<h2>';
+ $b .= ngettext('Developer Access to the Git
repository via HTTP',
'Developer Access to the
Git repositories via HTTP',
count($repo_list));
$b .= '</h2>';
@@ -217,9 +245,28 @@ class GitPlugin extends SCMPlugin {
foreach ($repo_list as $repo_name) {
$b .= '<p><tt>git clone
git+ssh://<i>'._('developername').'</i>@' . $project->getSCMBox() . '/'.
forge_get_config('repos_path', 'scmgit') .'/'. $project->getUnixName() .'/'.
$repo_name .'.git</tt></p>';
}
- } elseif (forge_get_config('use_dav', 'scmgit')) {
- $protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
+ }
+ if (forge_get_config('use_smarthttp', 'scmgit')) {
$b = '<h2>';
+ $b = ngettext('Developer Access to the Git
repository via “smart HTTP”',
+ 'Developer Access to the Git
repositories via “smart HTTP”',
+ count($repo_list));
+ $b .= '</h2>';
+ $b .= '<p>';
+ $b .= ngettext('Only project developers can
access the Git repository via this method.',
+ 'Only project developers can
access the Git repositories via this method.',
+ count($repo_list));
+ $b .= ' ';
+ $b .= _('Enter your site password when
prompted.');
+ $b .= '</p>';
+ $protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
+ foreach ($repo_list as $repo_name) {
+ $b .= '<p><tt>git clone
'.$protocol.'://<i>'._('developername').'</i>@' .
forge_get_config('scm_host').'/authgit/<i>'._('developername').'</i>/'.$project->getUnixName()
.'/'. $repo_name .'.git</tt></p>';
+ }
+ }
+ if (forge_get_config('use_dav', 'scmgit')) {
+ $protocol = forge_get_config('use_ssl',
'scmgit')? 'https' : 'http';
+ $b .= '<h2>';
$b .= ngettext('Developer Access to the Git
repository via HTTP',
'Developer Access to the
Git repositories via HTTP',
count($repo_list));
@@ -237,8 +284,8 @@ class GitPlugin extends SCMPlugin {
}
}
- if (!isset($b)) {
- $b = '<h2>'._('Developer Git Access').'</h2>';
+ if ($b == '') {
+ $b .= '<h2>'._('Developer Git Access').'</h2>';
$b .= '<p class="error">Error: No access protocol has
been allowed for the Git plugin in scmgit.ini: : use_ssh and use_dav are
disabled</p>';
}
@@ -401,6 +448,7 @@ class GitPlugin extends SCMPlugin {
// 'cd $root' because git will abort if e.g. we're in a
0700 /root after setuid
system("cd $root;git clone --bare --quiet
--no-hardlinks $main_repo $repodir");
system("GIT_DIR=\"$repodir\" git update-server-info");
+ system("GIT_DIR=\"$repodir\" git config
http.receivepack true");
if (is_file("$repodir/hooks/post-update.sample")) {
rename("$repodir/hooks/post-update.sample",
"$repodir/hooks/post-update");
@@ -454,6 +502,7 @@ class GitPlugin extends SCMPlugin {
$output .= join("<br />", $result);
$result = '';
exec("GIT_DIR=\"$tmp_repo\" git update-server-info",
$result);
+ exec("GIT_DIR=\"$tmp_repo\" git config http.receivepack
true", $result);
$output .= join("<br />", $result);
if (is_file("$tmp_repo/hooks/post-update.sample")) {
rename("$tmp_repo/hooks/post-update.sample",
@@ -531,6 +580,7 @@ class GitPlugin extends SCMPlugin {
system("GIT_DIR=\"$repodir\" git init
--quiet --bare --shared=group");
}
system("GIT_DIR=\"$repodir\" git
update-server-info");
+ system("GIT_DIR=\"$repodir\" git config
http.receivepack true");
if
(is_file("$repodir/hooks/post-update.sample")) {
rename("$repodir/hooks/post-update.sample",
"$repodir/hooks/post-update");
@@ -628,26 +678,25 @@ class GitPlugin extends SCMPlugin {
mkdir($config_dir, 0755, true);
}
$fname = $config_dir . '/gitweb.conf';
- $config_f = fopen($fname.'.new', 'w');
+ $f = fopen($fname.'.new', 'w');
$rootdir = forge_get_config('repos_path', 'scmgit');
- fwrite($config_f, "\$projectroot = '$rootdir';\n");
- fwrite($config_f, "\$projects_list =
'$config_dir/gitweb.list';\n");
- fwrite($config_f, "@git_base_url_list = ('".
util_make_url('/anonscm/git') . "');\n");
- fwrite($config_f, "\$logo = '".
util_make_url('/plugins/scmgit/git-logo.png') . "';\n");
- fwrite($config_f, "\$favicon = '".
util_make_url('/plugins/scmgit/git-favicon.png')."';\n");
- fwrite($config_f, "\$stylesheet = '".
util_make_url('/plugins/scmgit/gitweb.css')."';\n");
- fwrite($config_f, "\$javascript = '".
util_make_url('/plugins/scmgit/gitweb.js')."';\n");
- fwrite($config_f, "\$prevent_xss = 'true';\n");
- fwrite($config_f, "\$feature{'actions'}{'default'} = [('project
home', '" .
- util_make_url('/plugins/scmgit/?func=grouppage/%n') .
- "', 'summary')];\n");
- fclose($config_f);
+ fwrite($f, "\$projectroot = '$rootdir';\n");
+ fwrite($f, "\$projects_list = '$config_dir/gitweb.list';\n");
+ fwrite($f, "@git_base_url_list = ('".
util_make_url('/anonscm/git') . "');\n");
+ fwrite($f, "\$logo = '".
util_make_url('/plugins/scmgit/git-logo.png') . "';\n");
+ fwrite($f, "\$favicon = '".
util_make_url('/plugins/scmgit/git-favicon.png')."';\n");
+ fwrite($f, "\$stylesheet = '".
util_make_url('/plugins/scmgit/gitweb.css')."';\n");
+ fwrite($f, "\$javascript = '".
util_make_url('/plugins/scmgit/gitweb.js')."';\n");
+ fwrite($f, "\$prevent_xss = 'true';\n");
+ fwrite($f, "\$feature{'actions'}{'default'} = [('project home',
'" .
+ util_make_url('/plugins/scmgit/?func=grouppage/%n') .
+ "', 'summary')];\n");
+ fclose($f);
chmod($fname.'.new', 0644);
rename($fname.'.new', $fname);
$fname = $config_dir . '/gitweb.list';
$f = fopen($fname.'.new', 'w');
-
$engine = RBACEngine::getInstance();
foreach ($list as $project) {
$repos = $this->getRepositories($rootdir . "/" .
$project->getUnixName());
@@ -671,6 +720,74 @@ class GitPlugin extends SCMPlugin {
fclose($f);
chmod($fname.'.new', 0644);
rename($fname.'.new', $fname);
+
+ if (forge_get_config('use_smarthttp', 'scmgit')) {
+ $gitusers = array();
+
+ $config_fname =
forge_get_config('data_path').'/scmgit-auth.inc';
+ $config_f = fopen($config_fname.'.new', 'w');
+
+ $user_fname =
forge_get_config('data_path').'/scmgit-userfile';
+ $user_f = fopen($user_fname.'.new', 'w');
+
+ $group_fname =
forge_get_config('data_path').'/scmgit-groupfile';
+ $group_f = fopen($group_fname.'.new', 'w');
+
+ fwrite($config_f, '');
+
+ foreach ($groups as $project) {
+ if ( !$project->isActive()) {
+ continue;
+ }
+ if ( !$project->usesSCM()) {
+ continue;
+ }
+ $rusers =
$engine->getUsersByAllowedAction('scm',$project->getID(),'read');
+ fwrite($group_f, $project->getUnixName().':');
+ foreach ($rusers as $user) {
+ $gitusers[$user->getID()] = $user;
+ fwrite($group_f, '
'.$user->getUnixName());
+ }
+ fwrite($group_f, "\n");
+
+ $wusers =
$engine->getUsersByAllowedAction('scm',$project->getID(),'write');
+ fwrite($group_f,
'scm_'.$project->getUnixName().':');
+ foreach ($wusers as $user) {
+ fwrite($group_f, '
'.$user->getUnixName());
+ }
+ fwrite($group_f, "\n");
+
+
+ if ($project->enableAnonSCM()) {
+ fwrite($config_f, 'Use
ScmgitProjectWithAnon '.$project->getUnixName().'
+');
+ } else {
+ fwrite($config_f, 'Use
ScmgitProjectWithoutAnon '.$project->getUnixName().'
+');
+ }
+
+ fwrite($config_f, "\n");
+ }
+ $password_data = '';
+ foreach ($gitusers as $user) {
+ $password_data .=
$user->getUnixName().':'.$user->getUnixPasswd()."\n";
+ fwrite($config_f, 'Use ScmgitUser
'.$user->getUnixName().'
+');
+ }
+ fwrite($user_f, $password_data);
+
+ fclose($config_f);
+ chmod($config_fname.'.new', 0644);
+ rename($config_fname.'.new', $config_fname);
+
+ fclose($group_f);
+ chmod($group_fname.'.new', 0644);
+ rename($group_fname.'.new', $group_fname);
+
+ fclose($user_f);
+ chmod($user_fname.'.new', 0644);
+ rename($user_fname.'.new', $user_fname);
+ }
}
function getRepositories($path) {
diff --git a/src/plugins/scmgit/etc/scmgit.ini
b/src/plugins/scmgit/etc/scmgit.ini
index 13db5cd..b27291f 100644
--- a/src/plugins/scmgit/etc/scmgit.ini
+++ b/src/plugins/scmgit/etc/scmgit.ini
@@ -22,4 +22,5 @@ httpd_reload_cmd = "service httpd reload"
; use_dav or use_ssh is exclusive. you cannot enable dav with ssh, or ssh with
dav
use_dav = yes
use_ssh = no
+use_smarthttp = yes
use_ssl = "$core/use_ssl"
diff --git a/src/plugins/scmgit/packaging/control/133plugin-scmgit
b/src/plugins/scmgit/packaging/control/133plugin-scmgit
index cf8a3c5..654f091 100644
--- a/src/plugins/scmgit/packaging/control/133plugin-scmgit
+++ b/src/plugins/scmgit/packaging/control/133plugin-scmgit
@@ -1,6 +1,6 @@
Package: @PACKAGE@-plugin-scmgit
Architecture: all
-Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
@OLDPACKAGE@-web-apache2 | @OLDPACKAGE@-web, @OLDPACKAGE@-shell-postgresql |
@OLDPACKAGE@-shell, git (>= 1:1.7) | git-core, gitweb (>= 1:1.7.4.1), php5-cli,
${misc:Depends}
+Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
@OLDPACKAGE@-web-apache2 | @OLDPACKAGE@-web, @OLDPACKAGE@-shell-postgresql |
@OLDPACKAGE@-shell, git (>= 1:1.7) | git-core, gitweb (>= 1:1.7.4.1), php5-cli,
acl, ${misc:Depends}
Provides: @PACKAGE@-plugin-scm, @OLDPACKAGE@-plugin-scmgit
Conflicts: @OLDPACKAGE@-plugin-scmgit (<< 5.0.51-2)
Replaces: @OLDPACKAGE@-plugin-scmgit (<< 5.0.51-2)
diff --git a/src/plugins/scmsvn/packaging/control/131plugin-scmsvn
b/src/plugins/scmsvn/packaging/control/131plugin-scmsvn
index 1f56f1e..18fa19b 100644
--- a/src/plugins/scmsvn/packaging/control/131plugin-scmsvn
+++ b/src/plugins/scmsvn/packaging/control/131plugin-scmsvn
@@ -1,6 +1,6 @@
Package: @PACKAGE@-plugin-scmsvn
Architecture: all
-Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
@OLDPACKAGE@-shell-postgresql | @OLDPACKAGE@-shell, subversion,
subversion-tools, python-subversion, python (>= 2.3), php5-cli, openbsd-inetd |
inet-superserver, update-inetd, ${misc:Depends}
+Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db,
@OLDPACKAGE@-shell-postgresql | @OLDPACKAGE@-shell, subversion,
subversion-tools, python-subversion, python (>= 2.3), php5-cli, openbsd-inetd |
inet-superserver, update-inetd, acl, ${misc:Depends}
Recommends: libapache2-svn, @OLDPACKAGE@-web-apache2 | @OLDPACKAGE@-web
Provides: @PACKAGE@-plugin-scm, @OLDPACKAGE@-plugin-scmsvn
Conflicts: @OLDPACKAGE@-plugin-scmsvn
-----------------------------------------------------------------------
hooks/post-receive
--
FusionForge
_______________________________________________
Fusionforge-commits mailing list
[email protected]
http://lists.fusionforge.org/cgi-bin/mailman/listinfo/fusionforge-commits