polisher 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +84 -14
- data/Rakefile +21 -19
- data/TODO +5 -4
- data/bin/server +1 -0
- data/config/polisher.yml +0 -15
- data/db/connection.rb +13 -10
- data/db/migrations/{002_create_managed_gems.rb → 001_create_projects.rb} +4 -5
- data/db/migrations/{001_create_sources.rb → 002_create_sources.rb} +1 -3
- data/db/migrations/003_create_project_source_versions.rb +28 -0
- data/db/migrations/{003_create_events.rb → 004_create_events.rb} +2 -2
- data/db/migrations/005_create_project_dependencies.rb +28 -0
- data/db/models/event.rb +47 -21
- data/db/models/project.rb +110 -0
- data/db/models/project_dependency.rb +27 -0
- data/db/models/project_source_version.rb +31 -0
- data/db/models/source.rb +82 -16
- data/lib/common.rb +37 -5
- data/lib/dsl.rb +292 -0
- data/lib/event_handlers.rb +139 -73
- data/lib/gem_adapter.rb +94 -0
- data/polisher.rb +302 -50
- data/public/stylesheets/style.css +15 -31
- data/spec/common_spec.rb +28 -0
- data/spec/dsl_spec.rb +357 -0
- data/spec/event_handlers_spec.rb +166 -30
- data/spec/gem_adapter_spec.rb +89 -0
- data/spec/models_spec.rb +635 -107
- data/spec/polisher_spec.rb +496 -56
- data/views/layout.haml +3 -5
- data/views/projects/index.haml +42 -0
- data/views/projects/index.html.haml +38 -0
- data/views/result.haml +9 -0
- data/views/sources/index.haml +24 -41
- data/views/sources/index.html.haml +26 -0
- metadata +131 -12
- data/db/models/managed_gem.rb +0 -111
- data/public/javascripts/jquery-1.2.6.min.js +0 -32
- data/public/javascripts/polisher.js +0 -15
- data/views/gems/index.haml +0 -106
data/lib/event_handlers.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# Gem event handler callbacks,
|
2
2
|
# A method should exist here for every process supported by the system.
|
3
|
-
#
|
3
|
+
# Once added to this module it will automatically appear in
|
4
|
+
# db/models/Event::processes for subsequent use.
|
5
|
+
#
|
6
|
+
# Each method should take three parameters
|
7
|
+
# * the event being run
|
8
|
+
# * the version of the project being released
|
9
|
+
# * any additional event-specific arguments in an optional hash
|
4
10
|
#
|
5
11
|
# Copyright (C) 2010 Red Hat, Inc.
|
6
12
|
# Written by Mohammed Morsi <mmorsi@redhat.com>
|
@@ -9,92 +15,152 @@
|
|
9
15
|
# it under the terms of the GNU Affero General Public License
|
10
16
|
# as published by the Free Software Foundation, either version 3
|
11
17
|
# of the License, or (at your option) any later version.
|
12
|
-
#
|
18
|
+
#
|
13
19
|
# You should have received a copy of the the GNU Affero
|
14
|
-
# General Public License, along with Polisher. If not, see
|
20
|
+
# General Public License, along with Polisher. If not, see
|
15
21
|
# <http://www.gnu.org/licenses/>
|
16
22
|
|
23
|
+
require 'erb'
|
17
24
|
require 'gem2rpm'
|
18
25
|
require 'net/smtp'
|
19
26
|
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
def create_package(gem, template_file = '')
|
24
|
-
# d/l gem into artifacts/gems dir, link it into the artifacts/SOURCES dir
|
25
|
-
gem_file_path = gem.download_to :dir => ARTIFACTS_DIR + "/gems"
|
26
|
-
gem_file = gem_file_path.split('/').last
|
27
|
-
File.symlink gem_file_path, ARTIFACTS_DIR + "/SOURCES/" + gem_file
|
28
|
-
|
29
|
-
# spec we are writing
|
30
|
-
spec_file = ARTIFACTS_DIR + "/SPECS/rubygem-#{gem.name}.spec"
|
31
|
-
sfh = File.open(spec_file, "wb")
|
32
|
-
|
33
|
-
# coversion template to use, if not specified use gem2rpm default
|
34
|
-
template = Gem2Rpm::TEMPLATE
|
35
|
-
File.open(ARTIFACTS_DIR + "/templates/#{template_file}", "rb") { |file|
|
36
|
-
template = file.read
|
37
|
-
} unless template_file == '' || template_file.nil?
|
38
|
-
|
39
|
-
# create rpm spec w/ gem2rpm
|
40
|
-
Gem2Rpm::convert gem_file_path, template, sfh
|
41
|
-
sfh.close
|
27
|
+
# TODO raise some exceptions of our own here (though not neccessary as event.run will rescue everything raised, it might help w/ debugging)
|
28
|
+
|
29
|
+
module EventHandlers
|
42
30
|
|
43
|
-
|
44
|
-
|
31
|
+
# Download project sources
|
32
|
+
def download_sources(event, version, args = {})
|
33
|
+
project = event.project
|
34
|
+
args.merge!({ :dir => ARTIFACTS_DIR + "/SOURCES", :version => version })
|
35
|
+
args = event.process_options.to_h.merge(args) unless event.process_options.nil?
|
36
|
+
|
37
|
+
# if we've already d/l'd the sources, skip the rest of the event execution (incorporate md5sums in the future)
|
38
|
+
downloaded = false
|
39
|
+
project.sources_for_version(version).each { |src|
|
40
|
+
src.format_uri! args
|
41
|
+
downloaded = true if File.exists?(ARTIFACTS_DIR + "/SOURCES/#{src.filename}")
|
42
|
+
}
|
43
|
+
return if downloaded
|
44
|
+
|
45
|
+
# d/l projects sources into artifacts/SOURCES dir
|
46
|
+
project.download_to args
|
45
47
|
end
|
46
48
|
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
# Convert project into rpm package format.
|
50
|
+
def create_rpm_package(event, version, args = {})
|
51
|
+
project = event.project
|
52
|
+
args.merge!({ :version => version })
|
53
|
+
template_file = nil
|
54
|
+
mock_target = nil
|
55
|
+
|
56
|
+
unless event.process_options.nil?
|
57
|
+
poh = event.process_options.to_h
|
58
|
+
template_file = poh["spec"]
|
59
|
+
mock_target = poh["mock"]
|
60
|
+
end
|
61
|
+
|
62
|
+
# if the rpm is built, skip the rest of the event execution (really need to check if the sources changed)
|
63
|
+
return if !Dir[ARTIFACTS_DIR + "/RPMS/*/#{project.name}-#{version}*.rpm"].empty?
|
64
|
+
|
65
|
+
# open a handle to the spec file to write
|
66
|
+
spec_file = ARTIFACTS_DIR + "/SPECS/#{project.name}.spec"
|
67
|
+
sfh = File.open(spec_file, "wb")
|
68
|
+
|
69
|
+
# read template if specified
|
70
|
+
template = (template_file == '' || template_file.nil?) ? nil : File.read_all(template_file)
|
71
|
+
|
72
|
+
# if primary project source is a gem, process template w/ gem2rpm
|
73
|
+
primary_source = project.primary_source_for_version(version)
|
74
|
+
if !primary_source.nil? && primary_source.source_type == "gem"
|
75
|
+
gem_file_path = ARTIFACTS_DIR + '/SOURCES/' + primary_source.filename
|
76
|
+
template = Gem2Rpm::TEMPLATE if template.nil?
|
77
|
+
Gem2Rpm::convert gem_file_path, template, sfh
|
78
|
+
|
79
|
+
# otherwise just process it w/ erb
|
80
|
+
else
|
81
|
+
# setting local variables to be pulled into erb via binding below
|
82
|
+
params_s = ''
|
83
|
+
args.each { |k,v| params_s += "#{k} = '#{v}' ; " }
|
84
|
+
eval params_s
|
85
|
+
|
86
|
+
# setting other local variables
|
87
|
+
name = project.name
|
88
|
+
# version is already set from above
|
89
|
+
|
90
|
+
# take specified template_file and process it w/ erb,
|
91
|
+
# TODO raise exception if we don't have a template
|
92
|
+
template = File.read_all(template_file)
|
93
|
+
template = ERB.new(template, 0, '<>').result(binding)
|
94
|
+
|
95
|
+
# write to spec_file
|
96
|
+
sfh.write template
|
97
|
+
|
98
|
+
end
|
54
99
|
|
55
|
-
|
56
|
-
# FIXME need to incorporate version
|
57
|
-
gem_file = Dir[ARTIFACTS_DIR + "/RPMS/*/rubygem-#{gem.name}-*.rpm"].
|
58
|
-
collect { |fn| File.new(fn) }.
|
59
|
-
sort { |f1,f2| file1.mtime <=> file2.mtime }.last
|
100
|
+
sfh.close
|
60
101
|
|
61
|
-
#
|
62
|
-
|
63
|
-
arch = arch[arch.size-2]
|
102
|
+
# run rpmbuild on spec to build srpm
|
103
|
+
system("rpmbuild --define '_topdir #{ARTIFACTS_DIR}' -bs #{spec_file}")
|
64
104
|
|
65
|
-
#
|
66
|
-
|
67
|
-
Dir.mkdir arch_dir unless File.directory? arch_dir
|
68
|
-
File.open(arch_dir + "/rubygem-#{gem.name}.rpm", 'wb') { |ofile| ofile.write gem_file.read }
|
105
|
+
# run mock on srpm to build rpm
|
106
|
+
system("mock -r #{mock_target} rebuild #{ARTIFACTS_DIR}/SRPMS/#{project.name}-#{version}-*.src.rpm")
|
69
107
|
|
70
|
-
#
|
71
|
-
|
108
|
+
# copy generated rpms from /var/lib/mock/[mock_root] to ARTIFACTS/RPMS/[arches]
|
109
|
+
Dir["/var/lib/mock/#{mock_target}/root/builddir/build/RPMS/*.rpm"].each { |rpm|
|
110
|
+
arch = rpm.split(".")
|
111
|
+
arch = arch[arch.size-2]
|
112
|
+
FileUtils.mkdir_p "#{ARTIFACTS_DIR}/RPMS/#{arch}" unless File.directory? "#{ARTIFACTS_DIR}/RPMS/#{arch}"
|
113
|
+
FileUtils.cp rpm, "#{ARTIFACTS_DIR}/RPMS/#{arch}"
|
114
|
+
}
|
72
115
|
end
|
73
116
|
|
74
|
-
#
|
75
|
-
def
|
76
|
-
|
117
|
+
# Update specified yum repository w/ latest project artifact for specified version
|
118
|
+
def update_yum_repo(event, version, args = {})
|
119
|
+
project = event.project
|
120
|
+
repository = event.process_options
|
77
121
|
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
122
|
+
# create the repository dir if it doesn't exist
|
123
|
+
Dir.mkdir repository unless File.directory? repository
|
124
|
+
|
125
|
+
packages = [project.name + "-" + version]
|
126
|
+
|
127
|
+
# XXX real hacky way of getting all the packages corresponding to the project
|
128
|
+
# FIXME need a better solution here as any macros in the package names won't get executed properly
|
129
|
+
spec_file = ARTIFACTS_DIR + "/SPECS/#{project.name}.spec"
|
130
|
+
packages += File.read_all(spec_file).scan(/%package.*/).collect { |p|
|
131
|
+
ps = p.split
|
132
|
+
prefix = ps[ps.size-2] == "-n" ? "" : (project.name + "-")
|
133
|
+
prefix + p.split.last + "-" + version
|
134
|
+
}
|
135
|
+
|
136
|
+
# do not actually generate the repo unless a rpm is copied over
|
137
|
+
updated_repo = false
|
138
|
+
|
139
|
+
# copy the latest built rpms that match the packages
|
140
|
+
packages.each { |pkg|
|
141
|
+
pkg_file = Dir[ARTIFACTS_DIR + "/RPMS/*/#{pkg}*.rpm"].
|
142
|
+
collect { |fn| File.new(fn) }.
|
143
|
+
sort { |f1,f2| f1.mtime <=> f2.mtime }.last
|
144
|
+
|
145
|
+
unless pkg_file.nil?
|
146
|
+
# grab the architecture from the directory the src file resides in
|
147
|
+
arch = pkg_file.path.split('.')
|
148
|
+
arch = arch[arch.size-2]
|
149
|
+
|
150
|
+
pkg_file_name = pkg_file.path.split('/').last
|
151
|
+
|
152
|
+
# copy project into repo/arch dir, creating it if it doesn't exist
|
153
|
+
arch_dir = repository + "/#{arch}"
|
154
|
+
Dir.mkdir arch_dir unless File.directory? arch_dir
|
155
|
+
unless File.exists?(arch_dir + "/#{pkg_file_name}") # TODO need to incorporate a md5sum comparison here
|
156
|
+
updated_repo = true
|
157
|
+
File.write(arch_dir + "/#{pkg_file_name}", File.read_all(pkg_file.path))
|
158
|
+
end
|
159
|
+
end
|
160
|
+
}
|
161
|
+
|
162
|
+
# run createrepo to finalize the repository
|
163
|
+
system("createrepo #{repository}") if updated_repo
|
100
164
|
end
|
165
|
+
|
166
|
+
end #module EventHandlers
|
data/lib/gem_adapter.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
# Gem adapter, provides interface to many gem routines
|
2
|
+
#
|
3
|
+
# Copyright (C) 2010 Red Hat, Inc.
|
4
|
+
# Written by Mohammed Morsi <mmorsi@redhat.com>
|
5
|
+
#
|
6
|
+
# This program is free software, you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License
|
8
|
+
# as published by the Free Software Foundation, either version 3
|
9
|
+
# of the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# You should have received a copy of the the GNU Affero
|
12
|
+
# General Public License, along with Polisher. If not, see
|
13
|
+
# <http://www.gnu.org/licenses/>
|
14
|
+
|
15
|
+
module Polisher
|
16
|
+
module GemAdapter
|
17
|
+
|
18
|
+
# Subscribe callback_url to gem updates from the specified source.
|
19
|
+
def subscribe(source, callback_url, gem_api_key)
|
20
|
+
raise ArgumentError, "must specify valid source, callback url, and api key" if source.nil? || callback_url.class != String || gem_api_key.class != String
|
21
|
+
|
22
|
+
subscribe_path = '/api/v1/web_hooks'
|
23
|
+
headers = { 'Authorization' => gem_api_key }
|
24
|
+
data = "gem_name=#{source.name}&url=#{callback_url}"
|
25
|
+
|
26
|
+
begin
|
27
|
+
http = Net::HTTP.new(URI.parse(source.uri).host, 80)
|
28
|
+
res = http.post(subscribe_path, data, headers)
|
29
|
+
raise RuntimeError unless res.is_a?(Net::HTTPSuccess)
|
30
|
+
rescue Exception => e
|
31
|
+
raise RuntimeError, "could not subscribe to gem #{source.name} at #{source.uri}#{subscribe_path}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
module_function :subscribe
|
35
|
+
|
36
|
+
# Determine if we are subscribed to gem specified by source with the specified gem_api_key
|
37
|
+
def subscribed?(source, gem_api_key)
|
38
|
+
raise ArgumentError, "must specify valid source and api key" if source.nil? || gem_api_key.class != String
|
39
|
+
|
40
|
+
subscribe_path = '/api/v1/web_hooks.json'
|
41
|
+
headers = { 'Authorization' => gem_api_key }
|
42
|
+
|
43
|
+
begin
|
44
|
+
http = Net::HTTP.new(URI.parse(source.uri).host, 80)
|
45
|
+
res = http.get(subscribe_path, headers).body
|
46
|
+
raise RuntimeError if res.class == Net::HTTPNotFound
|
47
|
+
res = JSON.parse(res)
|
48
|
+
return res.has_key?(source.name)
|
49
|
+
|
50
|
+
rescue Exception => e
|
51
|
+
raise RuntimeError, "could not connect to gem source at #{source.uri}#{subscribe_path}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
module_function :subscribed?
|
55
|
+
|
56
|
+
# Unsubscribe to updates to the gem specified by source w/ the specified callback_url and api_key
|
57
|
+
def unsubscribe(source, callback_url, gem_api_key)
|
58
|
+
return unless subscribed?(source, gem_api_key)
|
59
|
+
raise ArgumentError, "must specify valid source, callback url, and api key" if source.nil? || callback_url.class != String || gem_api_key.class != String
|
60
|
+
|
61
|
+
subscribe_path = "/api/v1/web_hooks/remove?gem_name=#{source.name}&url=#{callback_url}"
|
62
|
+
headers = { 'Authorization' => gem_api_key }
|
63
|
+
|
64
|
+
begin
|
65
|
+
http = Net::HTTP.new(URI.parse(source.uri).host, 80)
|
66
|
+
res = http.delete(subscribe_path, headers)
|
67
|
+
raise RuntimeError if res.class == Net::HTTPNotFound
|
68
|
+
rescue Exception => e
|
69
|
+
raise RuntimeError, "could not delete gem #{source.name} via #{source.uri}#{subscribe_path}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
module_function :unsubscribe
|
73
|
+
|
74
|
+
# Return hash of gem attributes/values retreived from remote source
|
75
|
+
def get_info(source)
|
76
|
+
info = nil
|
77
|
+
source_uri = URI.parse(source.uri).host
|
78
|
+
get_path = "/api/v1/gems/#{source.name}.json"
|
79
|
+
begin
|
80
|
+
Net::HTTP.start(source_uri, 80) { |http|
|
81
|
+
res = http.get(get_path).body
|
82
|
+
raise RuntimeError if res.class == Net::HTTPNotFound
|
83
|
+
info = JSON.parse(res)
|
84
|
+
}
|
85
|
+
rescue Exception => e
|
86
|
+
raise RuntimeError, "could not get info for gem #{source.name} via #{source.uri}#{get_path}"
|
87
|
+
end
|
88
|
+
|
89
|
+
return info
|
90
|
+
end
|
91
|
+
module_function :get_info
|
92
|
+
|
93
|
+
end # module GemAdapter
|
94
|
+
end # module Polisher
|
data/polisher.rb
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
# it under the terms of the GNU Affero General Public License
|
8
8
|
# as published by the Free Software Foundation, either version 3
|
9
9
|
# of the License, or (at your option) any later version.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# You should have received a copy of the the GNU Affero
|
12
|
-
# General Public License, along with Polisher. If not, see
|
12
|
+
# General Public License, along with Polisher. If not, see
|
13
13
|
# <http://www.gnu.org/licenses/>
|
14
14
|
|
15
15
|
# ruby gems
|
@@ -20,7 +20,7 @@ require 'fileutils'
|
|
20
20
|
|
21
21
|
# lib/ modules
|
22
22
|
require 'common'
|
23
|
-
require '
|
23
|
+
require 'gem_adapter'
|
24
24
|
require 'sinatra/url_for'
|
25
25
|
|
26
26
|
# db modules
|
@@ -29,7 +29,7 @@ require 'db/connection'
|
|
29
29
|
##################################################################### Config
|
30
30
|
|
31
31
|
# dir which generated artifacts reside
|
32
|
-
ARTIFACTS_DIR = Sinatra::Application.artifacts_dir
|
32
|
+
ARTIFACTS_DIR = File.expand_path(Sinatra::Application.artifacts_dir)
|
33
33
|
|
34
34
|
create_missing_polisher_dirs(:artifacts_dir => ARTIFACTS_DIR, :db_data_dir => Sinatra::Application.db_data_dir, :log_dir => Sinatra::Application.log_dir)
|
35
35
|
|
@@ -42,79 +42,331 @@ module Polisher::DB
|
|
42
42
|
end
|
43
43
|
|
44
44
|
# get polisher config
|
45
|
-
POLISHER_CONFIG =
|
45
|
+
POLISHER_CONFIG = load_polisher_config(Sinatra::Application)
|
46
|
+
|
47
|
+
##################################################################### Projects
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
# Redirect to /gems
|
50
|
-
get '/' do redirect '/gems'; end
|
49
|
+
# Redirect to /projects
|
50
|
+
get '/' do redirect '/projects.html'; end
|
51
51
|
|
52
|
-
get '/
|
52
|
+
get '/projects.html' do
|
53
|
+
@projects = Project.find :all
|
53
54
|
@sources = Source.find :all
|
54
|
-
@
|
55
|
-
@processes = Event.processes
|
55
|
+
@processes = Event.processes
|
56
56
|
@version_qualifiers = Event::VERSION_QUALIFIERS
|
57
|
+
haml :"projects/index.html"
|
58
|
+
end
|
57
59
|
|
58
|
-
|
60
|
+
get '/projects' do
|
61
|
+
@projects = Project.find :all
|
62
|
+
haml :"projects/index", :layout => false
|
59
63
|
end
|
60
64
|
|
61
|
-
post '/
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
65
|
+
post '/projects/create' do
|
66
|
+
begin
|
67
|
+
if params[:name].nil? || params[:name] == ""
|
68
|
+
raise ArgumentError, "/projects/create received an invalid name(#{params[:name]})"
|
69
|
+
end
|
70
|
+
|
71
|
+
@project = Project.new :name => params[:name]
|
72
|
+
@project.save!
|
73
|
+
|
74
|
+
@result = {:success => true, :message => "successfully created project #{@project.name}", :errors => []}
|
75
|
+
|
76
|
+
rescue Exception => e
|
77
|
+
@result = {:success => false, :message => "failed to created project due to error #{e}", :errors => [e]}
|
78
|
+
@project.errors.each_full { |e| @result[:errors] << e } unless @project.nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
haml :"result", :layout => false
|
66
82
|
end
|
67
83
|
|
68
|
-
delete '/
|
69
|
-
|
70
|
-
|
84
|
+
delete '/projects/destroy/:id' do
|
85
|
+
begin
|
86
|
+
if params[:id].nil?
|
87
|
+
raise ArgumentError, "/projects/destroy/:id received an invalid id(#{params[:id]})"
|
88
|
+
end
|
89
|
+
|
90
|
+
project = Project.find(params[:id])
|
91
|
+
if project.nil?
|
92
|
+
raise ArgumentError, "/projects/destroy/#{params[:id]} could not find project"
|
93
|
+
end
|
94
|
+
|
95
|
+
project_name = project.name
|
96
|
+
Project.delete params[:id]
|
97
|
+
@result = {:success => true, :message => "successfully deleted project #{project_name}", :errors => []}
|
98
|
+
|
99
|
+
rescue Exception => e
|
100
|
+
@result = {:success => false, :message => "failed to delete project due to error #{e}", :errors => [e]}
|
101
|
+
end
|
102
|
+
|
103
|
+
haml :"result", :layout => false
|
71
104
|
end
|
72
105
|
|
73
|
-
post '/
|
74
|
-
|
75
|
-
|
76
|
-
|
106
|
+
post '/projects/released' do
|
107
|
+
begin
|
108
|
+
if params[:name].nil? || params[:version].nil?
|
109
|
+
raise ArgumentError, "/projects/released received an invalid name(#{params[:name]}) or version(#{params[:version]})"
|
110
|
+
end
|
111
|
+
|
112
|
+
name = params[:name]
|
113
|
+
version = params[:version]
|
114
|
+
project = Project.find(:first, :conditions => ["name = ?", name])
|
115
|
+
if project.nil?
|
116
|
+
raise ArgumentError, "/projects/released could not find project from name #{name}"
|
117
|
+
end
|
77
118
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
events.each { |event| event.run }
|
119
|
+
# process project
|
120
|
+
project.released_version(version, params)
|
121
|
+
@result = {:success => true, :message => "successfully released project #{project.name}", :errors => []}
|
82
122
|
|
83
|
-
|
123
|
+
rescue Exception => e
|
124
|
+
@result = {:success => false, :message => "failed to release project due to error #{e}", :errors => [e]}
|
125
|
+
end
|
126
|
+
|
127
|
+
haml :"result", :layout => false
|
84
128
|
end
|
85
129
|
|
86
130
|
##################################################################### Sources
|
87
131
|
|
132
|
+
get '/sources.html' do
|
133
|
+
@sources = Source.find :all
|
134
|
+
@projects = Project.find :all
|
135
|
+
haml :"sources/index.html"
|
136
|
+
end
|
137
|
+
|
88
138
|
get '/sources' do
|
89
139
|
@sources = Source.find :all
|
90
|
-
haml :"sources/index"
|
140
|
+
haml :"sources/index", :layout => false
|
91
141
|
end
|
92
142
|
|
93
143
|
post '/sources/create' do
|
94
|
-
|
95
|
-
|
96
|
-
|
144
|
+
begin
|
145
|
+
if params[:uri].nil? || params[:name].nil? || params[:source_type].nil?
|
146
|
+
raise ArgumentError, "/sources/create received an invalid uri(#{params[:uri]}), name(#{params[:name]}) or source_type(#{params[:source_type]})"
|
147
|
+
end
|
148
|
+
|
149
|
+
@source = Source.new(:uri => params[:uri], :name => params['name'], :source_type => params[:source_type])
|
150
|
+
@source.save!
|
151
|
+
|
152
|
+
@result = {:success => true, :message => "successfully created source #{@source.uri}", :errors => []}
|
153
|
+
|
154
|
+
rescue Exception => e
|
155
|
+
@result = {:success => false, :message => "failed to create source due to error #{e}", :errors => [e]}
|
156
|
+
@source.errors.each_full { |e| @result[:errors] << e } unless @source.nil?
|
157
|
+
end
|
158
|
+
|
159
|
+
haml :"result", :layout => false
|
160
|
+
end
|
161
|
+
|
162
|
+
delete '/sources/destroy/:id' do
|
163
|
+
begin
|
164
|
+
if params[:id].nil?
|
165
|
+
raise ArgumentError, "/sources/destroy/:id received an invalid id(#{params[:id]})"
|
166
|
+
end
|
167
|
+
|
168
|
+
source = Source.find(params[:id])
|
169
|
+
if source.nil?
|
170
|
+
raise ArgumentError, "/sources/destroy/#{params[:id]} could not find source"
|
171
|
+
end
|
172
|
+
|
173
|
+
source_uri = source.uri
|
174
|
+
Source.delete params[:id]
|
175
|
+
|
176
|
+
@result = {:success => true, :message => "successfully deleted source #{source_uri}", :errors => []}
|
177
|
+
|
178
|
+
rescue Exception => e
|
179
|
+
@result = {:success => false, :message => "failed to delete source due to error #{e}", :errors => [e]}
|
180
|
+
end
|
181
|
+
|
182
|
+
haml :"result", :layout => false
|
183
|
+
end
|
184
|
+
|
185
|
+
post '/sources/released' do
|
186
|
+
begin
|
187
|
+
if params[:name].nil? || params[:version].nil?
|
188
|
+
raise ArgumentError, "/sources/released received an invalid name(#{params[:name]}) or version(#{params[:version]})"
|
189
|
+
end
|
190
|
+
|
191
|
+
name = params[:name]
|
192
|
+
version = params[:version]
|
193
|
+
# we also have gem_uri for gem sources
|
194
|
+
|
195
|
+
source = Source.find(:first, :conditions => ["name = ?", name])
|
196
|
+
if source.nil?
|
197
|
+
raise ArgumentError, "/sources/released could not find source from name #{name}"
|
198
|
+
end
|
199
|
+
|
200
|
+
# find projects which include this source
|
201
|
+
source.project_source_versions_for_version(version).each { |ps|
|
202
|
+
# if we can't determine project version, use source version
|
203
|
+
project_version = ps.project_version.nil? ? version : ps.project_version
|
204
|
+
|
205
|
+
# invoke a release on the project
|
206
|
+
ps.project.released_version(version, params)
|
207
|
+
}
|
208
|
+
|
209
|
+
@result = {:success => true, :message => "successfully released source #{name}", :errors => []}
|
210
|
+
|
211
|
+
rescue Exception => e
|
212
|
+
@result = {:success => false, :message => "failed to release source due to error #{e}", :errors => [e]}
|
213
|
+
end
|
214
|
+
|
215
|
+
haml :"result", :layout => false
|
216
|
+
end
|
217
|
+
|
218
|
+
##################################################################### ProjectSourceVersions
|
219
|
+
|
220
|
+
post '/project_source_versions/create' do
|
221
|
+
begin
|
222
|
+
if params[:project_id].nil? || params[:source_id].nil?
|
223
|
+
raise ArgumentError, "/project_source_versions/create received an invalid project_id(#{params[:project_id]}) or source_id(#{params[:source_id]})"
|
224
|
+
end
|
225
|
+
|
226
|
+
project = Project.find(params[:project_id])
|
227
|
+
source = Source.find(params[:source_id])
|
228
|
+
if project.nil? || source.nil?
|
229
|
+
raise ArgumentError, "/project_source_versions/create could not find project or source from ids"
|
230
|
+
end
|
231
|
+
|
232
|
+
ps = ProjectSourceVersion.new :project => project, :source => source,
|
233
|
+
:project_version => params[:project_version],
|
234
|
+
:source_version => params[:source_version],
|
235
|
+
:source_uri_params => params[:source_uri_params],
|
236
|
+
:primary_source => params[:primary_source]
|
237
|
+
|
238
|
+
ps.save!
|
239
|
+
@result = {:success => true, :message => "successfully created project source", :errors => []}
|
240
|
+
|
241
|
+
rescue Exception => e
|
242
|
+
@result = {:success => false, :message => "failed to create project source due to error #{e}", :errors => [e]}
|
243
|
+
end
|
244
|
+
|
245
|
+
haml :"result", :layout => false
|
246
|
+
end
|
247
|
+
|
248
|
+
delete '/project_source_versions/destroy/:id' do
|
249
|
+
begin
|
250
|
+
if params[:id].nil?
|
251
|
+
raise ArgumentError, "/project_source_versions/destroy/:id received an invalid id(#{params[:id]})"
|
252
|
+
end
|
253
|
+
|
254
|
+
ps = ProjectSourceVersion.find(params[:id])
|
255
|
+
if ps.nil?
|
256
|
+
raise ArgumentError, "/project_source_versions/destroy/#{params[:id]} could not find project source"
|
257
|
+
end
|
258
|
+
|
259
|
+
ProjectSourceVersion.delete params[:id]
|
260
|
+
@result = {:success => true, :message => "successfully deleted project source", :errors => []}
|
261
|
+
|
262
|
+
rescue Exception => e
|
263
|
+
@result = {:success => false, :message => "failed to delete project source due to error #{e}", :errors => [e]}
|
264
|
+
end
|
265
|
+
|
266
|
+
haml :"result", :layout => false
|
267
|
+
end
|
268
|
+
|
269
|
+
##################################################################### ProjectDependencies
|
270
|
+
|
271
|
+
post '/project_dependencies/create' do
|
272
|
+
begin
|
273
|
+
if params[:project_id].nil? || params[:depends_on_project_id].nil?
|
274
|
+
raise ArgumentError, "/project_dependencies/create received an invalid project_id(#{params[:project_id]}) or depends_on_project_id(#{params[:depends_on_project_id]})"
|
275
|
+
end
|
276
|
+
|
277
|
+
project = Project.find(params[:project_id])
|
278
|
+
depends_on = Project.find(params[:depends_on_project_id])
|
279
|
+
if project.nil? || depends_on.nil?
|
280
|
+
raise ArgumentError, "/project_dependencies/create could not find projects w/ specified ids(#{params[:project_id]}/#{params[:depends_on_project_id]})"
|
281
|
+
end
|
282
|
+
|
283
|
+
project_version = (params[:project_version] != '*' ? params[:project_version] : nil)
|
284
|
+
depends_on_version = (params[:depends_on_project_version] != '*' ? params[:depends_on_project_version]: nil)
|
285
|
+
@pd = ProjectDependency.new :project => project, :depends_on_project => depends_on,
|
286
|
+
:project_version => project_version, :depends_on_project_version => depends_on_version,
|
287
|
+
:depends_on_project_params => params[:depends_on_project_params]
|
288
|
+
@pd.save!
|
289
|
+
|
290
|
+
@result = {:success => true, :message => "successfully created project dependency", :errors => []}
|
291
|
+
|
292
|
+
rescue Exception => e
|
293
|
+
@result = {:success => false, :message => "failed to created project dependency due to error #{e}", :errors => [e]}
|
294
|
+
@pd.errors.each_full { |e| @result[:errors] << e } unless @event.nil?
|
295
|
+
end
|
296
|
+
|
297
|
+
haml :"result", :layout => false
|
97
298
|
end
|
98
299
|
|
99
|
-
delete '/
|
100
|
-
|
101
|
-
|
300
|
+
delete '/project_dependencies/destroy/:id' do
|
301
|
+
begin
|
302
|
+
if params[:id].nil?
|
303
|
+
raise ArgumentError, "/project_dependencies/destroy/:id received an invalid id(#{params[:id]})"
|
304
|
+
end
|
305
|
+
|
306
|
+
pd = ProjectDependency.find(params[:id])
|
307
|
+
if pd.nil?
|
308
|
+
raise ArgumentError, "/project_dependencies/destroy/#{params[:id]} could not find project dependency"
|
309
|
+
end
|
310
|
+
|
311
|
+
ProjectDependency.delete params[:id]
|
312
|
+
@result = {:success => true, :message => "successfully deleted project dependency", :errors => []}
|
313
|
+
|
314
|
+
rescue Exception => e
|
315
|
+
@result = {:success => false, :message => "failed to delete project dependency due to error #{e}", :errors => [e]}
|
316
|
+
end
|
317
|
+
|
318
|
+
haml :"result", :layout => false
|
102
319
|
end
|
103
320
|
|
104
321
|
##################################################################### Events
|
105
322
|
|
106
323
|
post '/events/create' do
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
324
|
+
begin
|
325
|
+
if params[:project_id].nil? || params[:process].nil?
|
326
|
+
raise ArgumentError, "/events/create received an invalid project_id(#{params[:project_id]}) or process(#{params[:process]})"
|
327
|
+
end
|
328
|
+
|
329
|
+
project = Project.find(params[:project_id])
|
330
|
+
if project.nil?
|
331
|
+
raise ArgumentError, "/events/create could not find project w/ specified id(#{params[:project_id]})"
|
332
|
+
end
|
333
|
+
|
334
|
+
version = (params[:version] != '*' ? params[:version] : nil)
|
335
|
+
version_qualifier = (params[:version_qualifier] != '' ? params[:version_qualifier] : nil)
|
336
|
+
@event = Event.new :project => project,
|
337
|
+
:version => version,
|
338
|
+
:version_qualifier => version_qualifier,
|
339
|
+
:process => params[:process],
|
340
|
+
:process_options => params[:process_options]
|
341
|
+
@event.save!
|
342
|
+
|
343
|
+
@result = {:success => true, :message => "successfully created event", :errors => []}
|
344
|
+
|
345
|
+
rescue Exception => e
|
346
|
+
@result = {:success => false, :message => "failed to created event due to error #{e}", :errors => [e]}
|
347
|
+
@event.errors.each_full { |e| @result[:errors] << e } unless @event.nil?
|
348
|
+
end
|
349
|
+
|
350
|
+
haml :"result", :layout => false
|
351
|
+
end
|
352
|
+
|
353
|
+
delete '/events/destroy/:id' do
|
354
|
+
begin
|
355
|
+
if params[:id].nil?
|
356
|
+
raise ArgumentError, "/events/destroy/:id received an invalid id(#{params[:id]})"
|
357
|
+
end
|
358
|
+
|
359
|
+
event = Event.find(params[:id])
|
360
|
+
if event.nil?
|
361
|
+
raise ArgumentError, "/events/destroy/#{params[:id]} could not find event"
|
362
|
+
end
|
363
|
+
|
364
|
+
Event.delete params[:id]
|
365
|
+
@result = {:success => true, :message => "successfully deleted event", :errors => []}
|
366
|
+
|
367
|
+
rescue Exception => e
|
368
|
+
@result = {:success => false, :message => "failed to delete event due to error #{e}", :errors => [e]}
|
369
|
+
end
|
370
|
+
|
371
|
+
haml :"result", :layout => false
|
120
372
|
end
|