##// END OF EJS Templates
Replaces the repositories management SOAP API with a simple REST API....
Jean-Philippe Lang -
r2374:8cf3d7a4929e
parent child
Show More
@@ -0,0 +1,55
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require File.dirname(__FILE__) + '/../test_helper'
19 require 'sys_controller'
20
21 # Re-raise errors caught by the controller.
22 class SysController; def rescue_action(e) raise e end; end
23
24 class SysControllerTest < Test::Unit::TestCase
25 fixtures :projects, :repositories
26
27 def setup
28 @controller = SysController.new
29 @request = ActionController::TestRequest.new
30 @response = ActionController::TestResponse.new
31 Setting.sys_api_enabled = '1'
32 end
33
34 def test_projects_with_repository_enabled
35 get :projects
36 assert_response :success
37 assert_equal 'application/xml', @response.content_type
38 with_options :tag => 'projects' do |test|
39 test.assert_tag :children => { :count => Project.active.has_module(:repository).count }
40 end
41 end
42
43 def test_create_project_repository
44 assert_nil Project.find(4).repository
45
46 post :create_project_repository, :id => 4,
47 :vendor => 'Subversion',
48 :repository => { :url => 'file:///create/project/repository/subproject2'}
49 assert_response :created
50
51 r = Project.find(4).repository
52 assert r.is_a?(Repository::Subversion)
53 assert_equal 'file:///create/project/repository/subproject2', r.url
54 end
55 end
@@ -1,5 +1,5
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
@@ -16,31 +16,35
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class SysController < ActionController::Base
19 wsdl_service_name 'Sys'
20 web_service_api SysApi
21 web_service_scaffold :invoke
19 before_filter :check_enabled
22 20
23 before_invocation :check_enabled
24
25 # Returns the projects list, with their repositories
26 def projects_with_repository_enabled
27 Project.has_module(:repository).find(:all, :include => :repository, :order => 'identifier')
21 def projects
22 p = Project.active.has_module(:repository).find(:all, :include => :repository, :order => 'identifier')
23 render :xml => p.to_xml(:include => :repository)
28 24 end
29
30 # Registers a repository for the given project identifier
31 def repository_created(identifier, vendor, url)
32 project = Project.find_by_identifier(identifier)
33 # Do not create the repository if the project has already one
34 return 0 unless project && project.repository.nil?
35 logger.debug "Repository for #{project.name} was created"
36 repository = Repository.factory(vendor, :project => project, :url => url)
37 repository.save
38 repository.id || 0
25
26 def create_project_repository
27 project = Project.find(params[:id])
28 if project.repository
29 render :nothing => true, :status => 409
30 else
31 logger.info "Repository for #{project.name} was reported to be created by #{request.remote_ip}."
32 project.repository = Repository.factory(params[:vendor], params[:repository])
33 if project.repository && project.repository.save
34 render :xml => project.repository, :status => 201
35 else
36 render :nothing => true, :status => 422
37 end
38 end
39 39 end
40 40
41 protected
41 protected
42 42
43 def check_enabled(name, args)
44 Setting.sys_api_enabled?
43 def check_enabled
44 User.current = nil
45 unless Setting.sys_api_enabled?
46 render :nothing => 'Access denied. Repository management WS is disabled.', :status => 403
47 return false
48 end
45 49 end
46 50 end
@@ -246,10 +246,11 ActionController::Routing::Routes.draw do |map|
246 246 omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate'
247 247 omap.connect 'repositories/revision/:id/:rev', :action => 'revision'
248 248 end
249
250 # Allow downloading Web Service WSDL as a file with an extension
251 # instead of a file named 'wsdl'
252 map.connect ':controller/service.wsdl', :action => 'wsdl'
249
250 map.with_options :controller => 'sys' do |sys|
251 sys.connect 'sys/projects.:format', :action => 'projects', :conditions => {:method => :get}
252 sys.connect 'sys/projects/:id/repository.:format', :action => 'create_project_repository', :conditions => {:method => :post}
253 end
253 254
254 255 # Install the default route as the lowest priority.
255 256 map.connect ':controller/:action/:id'
@@ -57,11 +57,10
57 57
58 58 require 'getoptlong'
59 59 require 'rdoc/usage'
60 require 'soap/wsdlDriver'
61 60 require 'find'
62 61 require 'etc'
63 62
64 Version = "1.1"
63 Version = "1.2"
65 64 SUPPORTED_SCM = %w( Subversion Darcs Mercurial Bazaar Git Filesystem )
66 65
67 66 opts = GetoptLong.new(
@@ -164,21 +163,28 unless File.directory?($repos_base)
164 163 log("directory '#{$repos_base}' doesn't exists", :exit => true)
165 164 end
166 165
166 begin
167 require 'activeresource'
168 rescue LoadError
169 log("This script requires activeresource.\nRun 'gem install activeresource' to install it.", :exit => true)
170 end
171
172 class Project < ActiveResource::Base; end
173
167 174 log("querying Redmine for projects...", :level => 1);
168 175
169 176 $redmine_host.gsub!(/^/, "http://") unless $redmine_host.match("^https?://")
170 177 $redmine_host.gsub!(/\/$/, '')
171 178
172 wsdl_url = "#{$redmine_host}/sys/service.wsdl";
179 Project.site = "#{$redmine_host}/sys";
173 180
174 181 begin
175 soap = SOAP::WSDLDriverFactory.new(wsdl_url).create_rpc_driver
182 # Get all active projects that have the Repository module enabled
183 projects = Project.find(:all)
176 184 rescue => e
177 log("Unable to connect to #{wsdl_url} : #{e}", :exit => true)
185 log("Unable to connect to #{Project.site}: #{e}", :exit => true)
178 186 end
179 187
180 projects = soap.ProjectsWithRepositoryEnabled
181
182 188 if projects.nil?
183 189 log('no project found, perhaps you forgot to "Enable WS for repository management"', :exit => true)
184 190 end
@@ -247,7 +253,7 projects.each do |project|
247 253 else
248 254 # if repository is already declared in redmine, we don't create
249 255 # unless user use -f with reposman
250 if $force == false and not project.repository.nil?
256 if $force == false and project.respond_to?(:repository)
251 257 log("\trepository for project #{project.identifier} already exists in Redmine", :level => 1)
252 258 next
253 259 end
@@ -274,11 +280,11 projects.each do |project|
274 280 end
275 281
276 282 if $svn_url
277 ret = soap.RepositoryCreated project.identifier, $scm, "#{$svn_url}#{project.identifier}"
278 if ret > 0
283 begin
284 project.post(:repository, :vendor => $scm, :repository => {:url => "#{$svn_url}#{project.identifier}"})
279 285 log("\trepository #{repos_path} registered in Redmine with url #{$svn_url}#{project.identifier}");
280 else
281 log("\trepository #{repos_path} not registered in Redmine. Look in your log to find why.");
286 rescue => e
287 log("\trepository #{repos_path} not registered in Redmine: #{e.message}");
282 288 end
283 289 end
284 290
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (1379 lines changed) Show them Hide them
General Comments 0
You need to be logged in to leave comments. Login now