ginst 2.0.1 → 2009.11.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/Rakefile +20 -21
  2. data/VERSION +1 -1
  3. data/app/controllers/application_controller.rb +1 -1
  4. data/app/controllers/status_controller.rb +10 -0
  5. data/app/controllers/tasks_controller.rb +9 -7
  6. data/app/helpers/projects_helper.rb +9 -4
  7. data/app/models/project.rb +38 -15
  8. data/app/models/task.rb +15 -3
  9. data/app/views/grit/commits/_commit.html.erb +3 -12
  10. data/app/views/layouts/projects.html.erb +1 -1
  11. data/app/views/status/show.html.erb +6 -1
  12. data/app/views/tasks/_task.html.erb +43 -26
  13. data/app/views/tasks/_task_item.html.erb +22 -0
  14. data/app/views/tasks/index.html.erb +3 -2
  15. data/app/views/tasks/show.html.erb +1 -46
  16. data/config/database.yml +4 -1
  17. data/config/environment.rb +4 -4
  18. data/config/routes.rb +1 -5
  19. data/ginst.gemspec +17 -18
  20. data/lib/ginst.rb +5 -2
  21. data/lib/ginst/builder.rb +2 -0
  22. data/lib/ginst/cli.rb +21 -44
  23. data/lib/ginst/console.rb +9 -0
  24. data/lib/ginst/ginst_template/webserver.ymlt +2 -0
  25. data/lib/ginst/logger.rb +31 -0
  26. data/lib/ginst/template.rb +1 -0
  27. data/lib/ginst/web_server.rb +28 -6
  28. data/log/development.log +49 -0
  29. data/public/stylesheets/screen.css +73 -38
  30. data/script/builder.rb +6 -1
  31. data/{features/step_definitions/ginst_steps.rb → tmp/.gittouch} +0 -0
  32. data/tmp/cache/.gittouch +0 -0
  33. data/tmp/pids/.gittouch +0 -0
  34. data/tmp/sessions/.gittouch +0 -0
  35. data/tmp/sockets/.gittouch +0 -0
  36. metadata +19 -17
  37. data/features/ginst.feature +0 -9
  38. data/features/support/env.rb +0 -4
  39. data/spec/ginst_spec.rb +0 -7
  40. data/spec/spec.opts +0 -1
  41. data/spec/spec_helper.rb +0 -9
@@ -0,0 +1,22 @@
1
+ <% content_tag_for(:li, task_item, :class=> "#{task_item.status} ") do %>
2
+ <pre><%= link_to task_item.name, project_task_path(@project, task_item) %></pre>
3
+ <p><%= simple_format(h(truncate(task_item.output))) %></p>
4
+ <dl>
5
+ <dt>Command:</dt>
6
+ <dd><%= truncate(task_item.code,:length => 35) %></dd>
7
+
8
+ <dt>created_at</dt>
9
+ <dd><%= show_time(task_item.created_at) %></dd>
10
+ <dt>started_at</dt>
11
+ <dd><%= show_time(task_item.started_at) %></dd>
12
+
13
+ <dt>ended_At</dt>
14
+ <dd><%= show_time(task_item.ended_at) %></dd>
15
+
16
+ <dt>status</dt>
17
+ <dd><%= task_item.status %></dd>
18
+
19
+ </dl>
20
+
21
+ <% end %>
22
+
@@ -1,10 +1,11 @@
1
1
  <% content_for :submenu do %>
2
- <ul class="tabs">
2
+ <ul class="submenu">
3
3
  <li><%= link_to_unless params[:scope]=='prepared', 'Waiting', "?scope=prepared" %></li>
4
4
  <li><%= link_to_unless params[:scope]=='finished', 'Finished', "?scope=finished" %></li>
5
5
  <li><%= link_to_unless params[:scope]=='building', 'Building', "?scope=building" %></li>
6
6
  </ul>
7
7
  <% end %>
8
+
8
9
  <ul>
9
- <%= render :partial => 'task', :collection => @tasks %>
10
+ <%= render :partial => 'task_item', :collection => @tasks %>
10
11
  </ul>
@@ -10,49 +10,4 @@
10
10
  <% end %>
11
11
  <% end %>
12
12
 
13
- <% content_tag_for :div, @task, :class=> @task.status do %>
14
- <h1><%= @task.name %></h1>
15
- <p class="status <%= @task.status %>">Build status: <%= @task.status %></p>
16
-
17
- <div class='task_description'>
18
- <% if @task.prepared? %>
19
- <p>This tasks is prepared to be run. Please wait other tasks finish.</p>
20
- <pre id="output"><%= @task.parsed_output %></pre>
21
-
22
- <% else %>
23
- <dl>
24
- <dt>Started at:</dt>
25
- <dd><%= show_time(@task.started_at) %></dd>
26
-
27
- <% if @task.building? %>
28
- <dt>Elapsed time</dt>
29
- <dd class="elapsed_time"><%= show_elapsed(@task.build_duration) %></dd>
30
- <dt>Pid</dt>
31
- <dd><%= @task.pid %>
32
- <% form_for @task, :url => project_task_path(@project,@task) do |f| %>
33
- <%= hidden_field_tag :kill, 'INT' %>
34
- <%= f.submit 'INT' %>
35
- <% end %>
36
-
37
- <% form_for @task, :url => project_task_path(@project,@task) do |f| %>
38
- <%= hidden_field_tag :kill, 'QUIT' %>
39
- <%= f.submit 'QUIT' %>
40
- <% end %>
41
-
42
- <% form_for @task, :url => project_task_path(@project,@task) do |f| %>
43
- <%= hidden_field_tag :kill, 'KILL' %>
44
- <%= f.submit 'QUIT' %>
45
- <% end %>
46
-
47
- </dd>
48
- <% else %>
49
- <dt>Ended at:</dt>
50
- <dd><%= show_time(@task.ended_at) %>
51
- <span><%= show_elapsed(@task.build_duration) %></span></dd>
52
- <% end %>
53
- <%= link_to 'raw', project_task_path(@project,@task, 'text'), :class => 'raw_link' %>
54
- </dl>
55
- <pre id="output"><%= @task.parsed_output %></pre>
56
- <% end %>
57
- </div>
58
- <% end %>
13
+ <%= render :partial => 'tasks/task', :locals => {:task => @task} %>
@@ -10,7 +10,7 @@ development:
10
10
  # Warning: The database defined as "test" will be erased and
11
11
  # re-generated from your development database when you run "rake".
12
12
  # Do not set this db to the same as development or production.
13
- test:
13
+ test: &TEST
14
14
  adapter: mysql
15
15
  encoding: utf8
16
16
  database: ginst_test
@@ -27,3 +27,6 @@ production:
27
27
  username: root
28
28
  password:
29
29
  socket: /tmp/mysql.sock
30
+
31
+ cucumber:
32
+ <<: *TEST
@@ -21,15 +21,15 @@ Rails::Initializer.run do |config|
21
21
  config.gem 'daemons'
22
22
  config.gem 'templater'
23
23
 
24
- config.database_configuration_file = Ginst.data_dir+'/database.yml'
25
- config.log_path = Ginst.data_dir+'/log/ginst.rails.log'
26
- config.plugin_paths = [RAILS_ROOT+'/vendor/plugins', Ginst.data_dir+'/plugins']
24
+ config.database_configuration_file = Ginst.data_dir+'/database.yml' if Ginst.data_dir
25
+ config.log_path = Ginst.data_dir+'/log/ginst.rails.log' if Ginst.data_dir
26
+ config.plugin_paths = [RAILS_ROOT+'/vendor/plugins', Ginst.data_dir+'/plugins'] if Ginst.data_dir
27
27
 
28
28
  config.reload_plugins = true if RAILS_ENV == 'development'
29
29
 
30
30
  config.plugins = [ :authlogic, :grit, :slugify, :all ]
31
31
 
32
- config.load_paths += [Ginst.data_dir+'/lib']
32
+ config.load_paths += [Ginst.data_dir+'/lib'] if Ginst.data_dir
33
33
 
34
34
  config.time_zone = 'UTC'
35
35
 
@@ -12,11 +12,7 @@ ActionController::Routing::Routes.draw do |map|
12
12
 
13
13
 
14
14
  map.resource :status, :controller => :status
15
- map.resource :user_session
16
- map.root :controller => "user_sessions", :action => "new" # optional, this just sets the root route
17
- map.resource :account, :controller => "users"
18
- map.resources :users
19
-
15
+ map.root :controller => "projects", :action => "index"
20
16
 
21
17
  # The priority is based upon order of creation: first created -> highest priority.
22
18
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ginst}
8
- s.version = "2.0.1"
8
+ s.version = "2009.11.23"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Guillermo \303\201lvarez Fern\303\241ndez"]
12
- s.date = %q{2009-11-10}
12
+ s.date = %q{2009-11-24}
13
13
  s.default_executable = %q{ginst}
14
14
  s.description = %q{GINST is the new integration system}
15
15
  s.email = %q{guillermo@cientifico.net}
@@ -58,6 +58,7 @@ Gem::Specification.new do |s|
58
58
  "app/views/status/show.html.erb",
59
59
  "app/views/tasks/_task.html.erb",
60
60
  "app/views/tasks/_task_command.html.erb",
61
+ "app/views/tasks/_task_item.html.erb",
61
62
  "app/views/tasks/building.html.erb",
62
63
  "app/views/tasks/index.html.erb",
63
64
  "app/views/tasks/show.html.erb",
@@ -86,14 +87,12 @@ Gem::Specification.new do |s|
86
87
  "db/migrate/20091025165305_create_tasks.rb",
87
88
  "db/migrate/20091025165330_create_commands.rb",
88
89
  "db/schema.rb",
89
- "features/ginst.feature",
90
- "features/step_definitions/ginst_steps.rb",
91
- "features/support/env.rb",
92
90
  "ginst.gemspec",
93
91
  "lib/ginst.rb",
94
92
  "lib/ginst/builder.rb",
95
93
  "lib/ginst/cli.rb",
96
94
  "lib/ginst/configuration.rb",
95
+ "lib/ginst/console.rb",
97
96
  "lib/ginst/console_to_html.rb",
98
97
  "lib/ginst/ginst_template/database.ymlt",
99
98
  "lib/ginst/ginst_template/plugins/simple_build/app/controllers/simple_builds_controller.rb",
@@ -107,6 +106,8 @@ Gem::Specification.new do |s|
107
106
  "lib/ginst/ginst_template/plugins/simple_build/config/build.yml",
108
107
  "lib/ginst/ginst_template/plugins/simple_build/config/routes.rb",
109
108
  "lib/ginst/ginst_template/plugins/simple_build/init.rb",
109
+ "lib/ginst/ginst_template/webserver.ymlt",
110
+ "lib/ginst/logger.rb",
110
111
  "lib/ginst/plugin.rb",
111
112
  "lib/ginst/ssh.rb",
112
113
  "lib/ginst/template.rb",
@@ -162,9 +163,11 @@ Gem::Specification.new do |s|
162
163
  "script/process/spawner",
163
164
  "script/runner",
164
165
  "script/server",
165
- "spec/ginst_spec.rb",
166
- "spec/spec.opts",
167
- "spec/spec_helper.rb",
166
+ "tmp/.gittouch",
167
+ "tmp/cache/.gittouch",
168
+ "tmp/pids/.gittouch",
169
+ "tmp/sessions/.gittouch",
170
+ "tmp/sockets/.gittouch",
168
171
  "vendor/gems/daemons-1.0.10/.specification",
169
172
  "vendor/gems/daemons-1.0.10/LICENSE",
170
173
  "vendor/gems/daemons-1.0.10/README",
@@ -4225,28 +4228,24 @@ Gem::Specification.new do |s|
4225
4228
  s.rubyforge_project = %q{ginst}
4226
4229
  s.rubygems_version = %q{1.3.5}
4227
4230
  s.summary = %q{Git Integration System}
4228
- s.test_files = [
4229
- "spec/ginst_spec.rb",
4230
- "spec/spec_helper.rb"
4231
- ]
4232
4231
 
4233
4232
  if s.respond_to? :specification_version then
4234
4233
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
4235
4234
  s.specification_version = 3
4236
4235
 
4237
4236
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
4238
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
4239
- s.add_development_dependency(%q<cucumber>, [">= 0"])
4240
4237
  s.add_runtime_dependency(%q<sys-proctable>, [">= 0"])
4238
+ s.add_runtime_dependency(%q<mime-types>, [">= 0"])
4239
+ s.add_runtime_dependency(%q<mongrel>, [">= 0"])
4241
4240
  else
4242
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
4243
- s.add_dependency(%q<cucumber>, [">= 0"])
4244
4241
  s.add_dependency(%q<sys-proctable>, [">= 0"])
4242
+ s.add_dependency(%q<mime-types>, [">= 0"])
4243
+ s.add_dependency(%q<mongrel>, [">= 0"])
4245
4244
  end
4246
4245
  else
4247
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
4248
- s.add_dependency(%q<cucumber>, [">= 0"])
4249
4246
  s.add_dependency(%q<sys-proctable>, [">= 0"])
4247
+ s.add_dependency(%q<mime-types>, [">= 0"])
4248
+ s.add_dependency(%q<mongrel>, [">= 0"])
4250
4249
  end
4251
4250
  end
4252
4251
 
@@ -17,13 +17,16 @@ module Ginst
17
17
  autoload(:Configuration, 'ginst/configuration')
18
18
  autoload(:CLI, 'ginst/cli')
19
19
  autoload(:WebServer, 'ginst/web_server')
20
+ autoload(:Console, 'ginst/console')
21
+ autoload(:Logger, 'ginst/logger')
20
22
 
21
23
  def self.data_dir
22
24
  return @@data_dir if @@data_dir
23
25
  if ENV['GINST_DATA']
24
26
  @@data_dir = ENV['GINST_DATA']
25
27
  else
26
- raise "Ginst need a directory to work on!!!\nPlease define GINST_DATA environment variable"
28
+ $stderr << "Ginst need a directory to work on!!!\nPlease define GINST_DATA environment variable"
29
+ @@data_dir = nil
27
30
  end
28
31
  end
29
32
 
@@ -31,7 +34,7 @@ module Ginst
31
34
  @@root
32
35
  end
33
36
 
34
- VERSION = File.read(root+'/VERSION')
37
+ VERSION = File.read(root+'/VERSION').strip
35
38
  end
36
39
 
37
40
  # Add vendorized gems to load path
@@ -27,6 +27,8 @@ class Ginst::Builder
27
27
  private
28
28
 
29
29
  def self.execute(command)
30
+ ENV["RAILS_ENV"] = Rails.env rescue "production"
31
+
30
32
  script = Ginst.root+'/script/builder.rb'
31
33
 
32
34
  if command == 'status'
@@ -1,27 +1,13 @@
1
+ require('daemons')
1
2
 
2
- class Ginst::CLI
3
-
4
- require('daemons')
5
-
3
+ class Ginst::CLI
6
4
  def initialize(argv)
7
5
  parse_args(argv)
8
6
  end
9
7
 
10
8
  def run
11
-
12
9
  if @install
13
- puts("#{green('Installing ginst')} in: #{@dir}\n")
14
-
15
- ask_yes_or_exit("#{@dir} is a valid ginst install. Overwrite?") if(valid_dir?(@dir))
16
- launch_generator
17
- launch_migrations
18
- puts green("Ginst was installed")
19
- puts green("Starting the server")
20
- puts `#{$0} start -d #{@dir}`
21
- sleep 4
22
- `open http://localhost:3000 2> /dev/null`
23
- puts "Use '#{$0} start -d #{@dir}' to start ginst."
24
-
10
+ install
25
11
  elsif @daemon
26
12
  if valid_dir?(@dir)
27
13
  daemon(@daemon,@dir)
@@ -35,13 +21,13 @@ class Ginst::CLI
35
21
 
36
22
  def parse_args(argv)
37
23
  @action = nil
38
- @dir = ENV["GINST_DATA"] || Dir.pwd
24
+ @dir = File.expand_path(ENV["GINST_DATA"] || Dir.pwd)
39
25
  @daemon = false
40
26
  @install = false
41
27
  while(current_arg = ARGV.shift) do
42
28
  case current_arg
43
29
  when '-d'
44
- @dir = ARGV.shift
30
+ @dir = File.expand_path(ARGV.shift)
45
31
  when '-p'
46
32
  @port = ARGV.shift
47
33
  when '-a'
@@ -58,7 +44,7 @@ class Ginst::CLI
58
44
  @daemon = current_arg
59
45
  when 'install'
60
46
  @install = 'install'
61
- when '-h', '--help'
47
+ when '--help'
62
48
  show_help_and_exit
63
49
  else
64
50
  error_and_exit("Invalid argument: #{current_arg}")
@@ -83,38 +69,29 @@ class Ginst::CLI
83
69
  end
84
70
 
85
71
  def daemon(action,dir)
86
- script = Ginst.root+'/script/server'
87
- options = {
88
- :app_name => 'ginst',
89
- :dir_mode => :normal,
90
- :dir => File.expand_path(@dir+'/log'),
91
- :monitor => false,
92
- :log_output => true,
93
- :mode => :exec,
94
- :ARGV => [action]
95
- }
96
-
72
+ Dir.chdir @dir
97
73
  case action
98
74
  when 'development'
99
75
  ENV['RAILS_ENV'] = 'development'
100
- daemon('run',dir)
101
- when 'status'
102
- Daemons.run(script, options)
76
+ Ginst::WebServer.run
103
77
  when 'console'
104
78
  ENV['RAILS_ENV'] = 'development'
105
- exec(Ginst.root+'/script/console')
79
+ Ginst::Console.start
106
80
  else
107
- pid = fork do
108
- Daemons.run(script, options)
109
- exit
110
- end
111
- Process.waitpid2(pid)
112
- sleep 2
113
- daemon('status',dir)
114
- exit
81
+ Ginst::WebServer.send(action.to_sym)
115
82
  end
116
83
  end
117
84
 
85
+ def install
86
+ puts("#{green('Installing ginst')} in: #{@dir}\n")
87
+
88
+ ask_yes_or_exit("#{@dir} is a valid ginst install. Overwrite?") if(valid_dir?(@dir))
89
+ launch_generator
90
+ launch_migrations
91
+ puts green("Ginst was installed")
92
+ puts "run '#{File.basename($0)} start -d #{@dir}' to start ginst."
93
+ end
94
+
118
95
  def launch_migrations
119
96
  puts "#{green("Creating the database.")}"
120
97
  require 'open3'
@@ -147,7 +124,7 @@ class Ginst::CLI
147
124
  " run [-d dir] # Run ginst in foreground\n"+
148
125
  " development [-d dir] # Start ginst in developer mode\n"+
149
126
  " console [-d dir] # Start ginst console\n\n"+
150
- " -h, --help # Show this help\n\n")
127
+ " --help # Show this help\n\n")
151
128
  exit(-1)
152
129
  end
153
130
 
@@ -0,0 +1,9 @@
1
+
2
+ module Ginst
3
+ class Console
4
+
5
+ def self.start
6
+ exec(Ginst.root+'/script/console')
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ port: 9999
2
+ address: 0.0.0.0
@@ -0,0 +1,31 @@
1
+
2
+
3
+ class Ginst::Logger
4
+
5
+ def initialize(file)
6
+ @filename = file
7
+ @file = File.open(file,'a')
8
+ @file.sync = true
9
+
10
+ ObjectSpace.define_finalizer(self) do
11
+ puts self.class.to_s
12
+ puts 'Cerrando log file'
13
+ @file.close
14
+ end
15
+ end
16
+
17
+ def log(msg,acaller = nil)
18
+ acaller ||= caller
19
+ msg = format_msg(msg,acaller)
20
+ @file.write(msg)
21
+ msg
22
+ end
23
+
24
+
25
+ def format_msg(msg, caller)
26
+ call = File.basename(caller.first).split(":")[0..1].join(":")
27
+ "[%s %s] %s\n" % [Time.now.to_s, call, msg]
28
+ end
29
+ end
30
+
31
+
@@ -13,6 +13,7 @@ module Ginst::Template
13
13
  end
14
14
 
15
15
  template :database, 'database.yml'
16
+ template :config, 'webserver.yml'
16
17
 
17
18
  empty_directory :log, "log"
18
19
  empty_directory :projects, "projects"
@@ -1,7 +1,12 @@
1
1
  class Ginst::WebServer
2
2
 
3
3
  require('daemons')
4
+ require('yaml')
4
5
 
6
+ def self.development
7
+ execute('start')
8
+ end
9
+
5
10
  def self.start
6
11
  execute('start')
7
12
  end
@@ -15,7 +20,7 @@ class Ginst::WebServer
15
20
  end
16
21
 
17
22
  def self.status
18
- execute('status')
23
+ puts execute('status')
19
24
  end
20
25
 
21
26
  def self.run
@@ -25,8 +30,15 @@ class Ginst::WebServer
25
30
  private
26
31
 
27
32
  def self.execute(command)
28
- script = Ginst.root+'/script/server'
29
-
33
+ script =
34
+ if ['start','restart','run'].include? command
35
+ config = read_config
36
+ script = [Ginst.root+'/script/server', '-b',config["address"],'-p', config["port"].to_s].join(' ')
37
+ else
38
+ script = Ginst.root+'/script/server'
39
+ end
40
+
41
+
30
42
  if command == 'status'
31
43
  capture_output do
32
44
  Daemons.run(script, generate_options_for_command(command))
@@ -51,15 +63,25 @@ class Ginst::WebServer
51
63
  end
52
64
 
53
65
  def self.generate_options_for_command(command)
54
- options = {
66
+ argv = [command]
67
+
68
+ {
55
69
  :app_name => 'ginst',
56
70
  :dir_mode => :normal,
57
71
  :dir => File.expand_path((Ginst.data_dir || ENV['GINST_DIR'])+'/tmp'),
58
72
  :monitor => false,
59
73
  :mode => :exec,
60
74
  :log_output => true,
61
- :ARGV => [command]
62
- }
75
+ :ARGV => argv
76
+ }
77
+ end
78
+
79
+ def self.read_config
80
+ options = {"address" => '0.0.0.0', "port" => 3000}
81
+ config_file = Ginst.data_dir+"/webserver.yml"
82
+ config_options = YAML.load(File.read(config_file)) rescue {}
83
+ options.merge(config_options)
63
84
  end
85
+
64
86
  end
65
87