houcho 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d83d0e90621526a1a46014365dc3a97deb67f9a
4
- data.tar.gz: cc2c9dc65df3b0b5145d9c3f02769f2b2c555fb6
3
+ metadata.gz: 861b8e2a9dba584c7491cae19e5b89af5d344b3e
4
+ data.tar.gz: a002ee817dac79bc4df21a13fbf13e64cea1780a
5
5
  SHA512:
6
- metadata.gz: f6fa79952eacf76bc3ba07ce6b9b8007a51d4ca7b5fe9d3b679f7d909fa8844fe3c01acc95e213ba60fe06bdc74212d3223ff36d5551920c04337a7494f5b1ef
7
- data.tar.gz: 07aece03104359e42827386d89869fc6229cfeb283c45bf66cbea6de42db114151728bdca051593e41b5ba43d5ccf18f985ab899b08849fbdf8f21309ba6dd16
6
+ metadata.gz: 0b7f5057e97c73796f3bad5989ff922896954c64bddef2124e0b80c77893ea38e3dc69504a7e9779331fe945da73ca41c4cca1be6450fc661f08df5a13db609e
7
+ data.tar.gz: 9baa6c039dd5caeecac4d9198e53979ab017cb9c0248470435aceaae02b23148c2c72df0c1056dc72029a78449e2c7bb3009a76579f5c25732b0e906e8b0c669
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Houcho
2
2
  - wrapping to execute serverspec
3
- - depends on ruby 1.9 later(recommended: 2.0 later).
3
+ - depends on ruby 1.9.3 later(recommended: 2.0.0 later).
4
4
 
5
5
  ## Install and Initialize
6
6
  - install houcho from ruby gems
@@ -9,13 +9,14 @@
9
9
  $ gem install houcho
10
10
  ```
11
11
 
12
- - make working directory and initialize.
13
- - when `houcho init` then `git init`
12
+ - initialize working directory.
13
+ - set houcho repository on directory set environment variable `HOUCHO_ROOT`
14
+ - default: `/etc/houcho`
14
15
 
15
16
  ```sh
16
- $ mkdir houcho-repo
17
- $ cd houcho-repo
18
17
  $ houcho init
18
+ $ ls /etc/houcho
19
+ houcho.conf houcho.db log outerrole script spec
19
20
  ```
20
21
 
21
22
  ## Simple Usage
@@ -82,15 +83,15 @@ $ houcho role details studio3104::www
82
83
  ## Include CloudForecast's yaml file
83
84
  Houcho is able to load yaml of CloudForecast, and attach to the role defined.
84
85
 
85
- - install yaml of CloudForecast to `role/cloudforecast/` under working directory.
86
+ - install yaml of CloudForecast to `${HOUCHO_ROOT}/outerrole/cloudforecast/` under working directory.
86
87
  - extension have to be yaml.
87
88
 
88
89
  - load cloudforecast's yaml.
89
90
  - run each time you replace the yaml. do not need to run every time.
90
91
 
91
92
  ```sh
92
- $ houcho cf load
93
- $ houcho cf show
93
+ $ houcho outerrole load
94
+ $ houcho outerrole list
94
95
  houcho::author::studio3104
95
96
  $ houcho cf details houcho::author::studio3104
96
97
  [houcho::author::studio3104]
@@ -102,7 +103,7 @@ $ houcho cf details houcho::author::studio3104
102
103
  - attach to the original role defined, the role read from cloudforecast.
103
104
 
104
105
  ```sh
105
- $ houcho cf attach houcho::author::studio3104 --roles studio3104::www
106
+ $ houcho outerrole attach houcho::author::studio3104 --roles studio3104::www
106
107
  $ houcho role details studio3104::www
107
108
  [studio3104::www]
108
109
  host
@@ -113,25 +114,46 @@ $ houcho role details studio3104::www
113
114
  ├─ houcho_sample
114
115
  └─ houcho_sample2
115
116
 
116
- cf
117
+ outer role
117
118
  houcho::author::studio3104
118
119
  host
119
120
  ├─ studio3104.test
120
121
  └─ studio3105.test
121
122
  ```
123
+
124
+ ## Setting Attribute to Role, Outer Role, Host
125
+ - houcho is able to set individual attribute.
126
+ - For example, you have a spec file like this.
127
+
128
+ ```
129
+ require "spec_helper"
130
+
131
+ describe file(attr[:httpd_conf]) do
132
+ it { should contain "SSLCompression\soff" }
133
+ end
134
+ ```
122
135
 
136
+ - set variable `attr[:httpd_conf]` to be evaluated at runtime.
137
+
138
+ ```
139
+ $ houcho attr set --target role:studio3104::www --value httpd_conf:/etc/httpd/conf/httpd.conf
140
+ ```
141
+
142
+ - args of `--target`'s key can specify `host`, `role`, `outerrole`
143
+
144
+
123
145
  ## Applied Usage
124
146
  - at modified specs, run specs by sampling appropriately host.
125
- - `--sample-host-count` can specifies the number of samples(default: 5)
147
+ - `--samples` can specifies the number of samples(default: 5)
126
148
  - argument is able to specify exception of `_spec.rb`, and relative path from `spec/` under working directory same as simple usage.
127
149
 
128
150
  ```sh
129
151
  $ houcho spec check houcho_sample hogehogechan
130
- 7 examples, 7 failures studio3109.test, spec/houcho_sample_spec.rb
131
- 7 examples, 7 failures studio3110.test, spec/houcho_sample_spec.rb
132
- 7 examples, 7 failures www02.studio3104.com, spec/houcho_sample_spec.rb
133
- 7 examples, 7 failures studio3105.test, spec/houcho_sample_spec.rb
134
- 7 examples, 7 failures studio3104.test, spec/houcho_sample_spec.rb
152
+ 7 examples, 7 failures studio3109.test => houcho_sample
153
+ 7 examples, 7 failures studio3110.test => houcho_sample
154
+ 7 examples, 7 failures www02.studio3104.com => houcho_sample
155
+ 7 examples, 7 failures studio3105.test => houcho_sample
156
+ 7 examples, 7 failures studio3104.test => houcho_sample
135
157
  hogehogechan has not attached to any roles
136
158
  ```
137
159
 
@@ -143,7 +165,3 @@ $ houcho role exec studio3104::www --exclude-hosts studio3104.test
143
165
 
144
166
  ## TODO
145
167
  - write more tests
146
- - `Houcho::Logger`
147
- - LTSV
148
- - yaml -> sqlite ?
149
- - executable spec from relative path(current directory is any)
@@ -6,6 +6,7 @@ require "houcho/spec"
6
6
  require "houcho/spec/runner"
7
7
  require "houcho/outerrole"
8
8
  require "houcho/outerrole/cloudforecast"
9
+ require "houcho/outerrole/yabitz"
9
10
  require "houcho/repository"
10
11
  require "houcho/attribute"
11
12
 
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  require "thor"
2
3
  require "rainbow"
3
4
  require "houcho/repository"
@@ -1,6 +1,7 @@
1
1
  require 'thor'
2
2
  require 'houcho/outerrole'
3
3
  require 'houcho/outerrole/cloudforecast'
4
+ require 'houcho/outerrole/yabitz'
4
5
 
5
6
  module Houcho
6
7
  module CLI
@@ -47,6 +48,7 @@ module Houcho
47
48
  desc 'load', 'load role data from outer system'
48
49
  def load
49
50
  Houcho::OuterRole::CloudForecast.load
51
+ Houcho::OuterRole::Yabitz.load
50
52
  end
51
53
  end
52
54
  end
@@ -13,16 +13,6 @@ module Houcho
13
13
  LOGDIR = "#{APPROOT}/log"
14
14
  SPECLOG = "#{LOGDIR}/serverspec.log"
15
15
 
16
- FILE = "#{Houcho::Config::APPROOT}/houcho.conf"
17
- begin
18
- conf = YAML.load_file(FILE)
19
- rescue
20
- end
21
- if conf
22
- UKIGUMO = conf["ukigumo"]
23
- IKACHAN = conf["ikachan"]
24
- GIT = conf["git"]
25
- RSPEC = conf["rspec"]
26
- end
16
+ FILE = "#{APPROOT}/houcho.conf"
27
17
  end
28
18
  end
@@ -1,7 +1,9 @@
1
1
  require "houcho/config"
2
- require "houcho/database"
2
+ require "houcho/outerrole/save"
3
3
  require "yaml"
4
4
 
5
+ include Houcho::OuterRole::Save
6
+
5
7
  module Houcho
6
8
 
7
9
  class OuterRole
@@ -16,7 +18,7 @@ class OuterRole
16
18
  group = load_group(yaml)
17
19
  cfrole = create_cf_role(yaml, group)
18
20
 
19
- save_cf_role(cfrole)
21
+ save_outer_role(cfrole, "CloudForecast")
20
22
  end
21
23
  end
22
24
 
@@ -55,39 +57,6 @@ class OuterRole
55
57
 
56
58
  cfrole
57
59
  end
58
-
59
-
60
- def save_cf_role(cfrole)
61
- db = Houcho::Database.new.handle
62
- db.transaction do
63
-
64
- cfrole.each do |outerrole, hosts|
65
- begin
66
- db.execute("INSERT INTO outerrole(name, data_source) VALUES(?,?)", outerrole, "CloudForecast")
67
- rescue SQLite3::ConstraintException, "column name is not unique"
68
- ensure
69
- outerrole_id = db.execute("SELECT id FROM outerrole WHERE name = ?", outerrole).flatten.first
70
- end
71
-
72
- hosts.each do |host|
73
- begin
74
- db.execute("INSERT INTO host(name) VALUES(?)", host)
75
- rescue SQLite3::ConstraintException, "column name is not unique"
76
- ensure
77
- begin
78
- db.execute(
79
- "INSERT INTO outerrole_host(outerrole_id, host_id) VALUES(?,?)",
80
- outerrole_id,
81
- db.execute("SELECT id FROM host WHERE name = ?", host).flatten.first
82
- )
83
- rescue SQLite3::ConstraintException, "column name is not unique"
84
- end
85
- end
86
- end
87
- end
88
-
89
- end #end of transaction
90
- end
91
60
  end
92
61
  end
93
62
 
@@ -0,0 +1,50 @@
1
+ require "houcho/database"
2
+
3
+ module Houcho
4
+
5
+ class OuterRole
6
+ module Save
7
+ def save_outer_role(outerrole, datasource)
8
+ db = Houcho::Database.new.handle
9
+ db.transaction do
10
+
11
+ delete_ids = db.execute("SELECT id FROM outerrole WHERE data_source = ?", datasource).flatten
12
+
13
+ outerrole.each do |outerrole, hosts|
14
+ begin
15
+ db.execute("INSERT INTO outerrole(name, data_source) VALUES(?,?)", outerrole, datasource)
16
+ rescue SQLite3::ConstraintException, "column name is not unique"
17
+ ensure
18
+ outerrole_id = db.execute("SELECT id FROM outerrole WHERE name = ?", outerrole).flatten.first
19
+ end
20
+
21
+ delete_ids.delete(outerrole_id)
22
+ db.execute("DELETE FROM outerrole_host WHERE outerrole_id = ?", outerrole_id)
23
+
24
+ hosts.each do |host|
25
+ begin
26
+ db.execute("INSERT INTO host(name) VALUES(?)", host)
27
+ rescue SQLite3::ConstraintException, "column name is not unique"
28
+ ensure
29
+ begin
30
+ db.execute(
31
+ "INSERT INTO outerrole_host(outerrole_id, host_id) VALUES(?,?)",
32
+ outerrole_id,
33
+ db.execute("SELECT id FROM host WHERE name = ?", host).flatten.first
34
+ )
35
+ rescue SQLite3::ConstraintException, "column name is not unique"
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ delete_ids.each do |id|
42
+ db.execute("DELETE FROM outerrole_host WHERE outerrole_id = ?", id)
43
+ end
44
+
45
+ end #end of transaction
46
+ end
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,82 @@
1
+ require "houcho/config"
2
+ require "houcho/outerrole/save"
3
+ require "net/http"
4
+ require "cgi"
5
+ require "json"
6
+
7
+ include Houcho::OuterRole::Save
8
+
9
+ module Houcho
10
+
11
+ class OuterRole
12
+ class Yabitz; end
13
+ class << Yabitz
14
+ def load
15
+ begin
16
+ yabitz = YAML.load_file(Houcho::Config::FILE)["yabitz"]
17
+ rescue
18
+ end
19
+
20
+ if yabitz
21
+ yabitzrole = create_yabitz_role(yabitz["host"], yabitz["port"])
22
+ save_outer_role(yabitzrole, "Yabitz")
23
+ end
24
+ end
25
+
26
+
27
+ private
28
+ def http_get(host, port, path, params)
29
+ Net::HTTP.get(
30
+ host,
31
+ "#{path}?".concat(
32
+ params.collect do |k,v|
33
+ "#{k}=#{CGI::escape(v.to_s)}"
34
+ end.join("&")
35
+ ),
36
+ port
37
+ )
38
+ end
39
+
40
+ def download_json(host, port)
41
+ JSON.load(
42
+ http_get(
43
+ host, port, "/ybz/search.json",
44
+ {
45
+ andor: "AND",
46
+ cond0: 0,
47
+ field0: "os",
48
+ value0: " ",
49
+ status: "IN_SERVICE",
50
+ ex_andor: "AND",
51
+ ex_cond0: 0,
52
+ ex_field0: "not_selected",
53
+ ex_value0: nil,
54
+ },
55
+ )
56
+ )
57
+ end
58
+
59
+ def create_yabitz_role(host, port)
60
+ data = {}
61
+
62
+ download_json(host, port).each do |instance|
63
+ host = instance["display"]
64
+ type = instance["content"]["type"]
65
+ hw = instance["content"]["hwinfo"]
66
+ os = instance["content"]["os"]
67
+
68
+ type = type ? type.gsub(/\s+/, "") : "NOTYPEINFO"
69
+ hw = hw ? hw.gsub(/\s+/, "") : "NOHWINFO"
70
+ os = os ? os.gsub(/\s+/, "") : "NOOSINFO"
71
+
72
+ role = "#{type}::#{hw}::#{os}"
73
+ data[role] ||= []
74
+ data[role].concat([instance["display"]]).uniq
75
+ end
76
+
77
+ data
78
+ end
79
+ end
80
+ end
81
+
82
+ end
@@ -19,7 +19,6 @@ module Houcho
19
19
  "ukigumo" => { "host" => "", "port" => "" },
20
20
  "ikachan" => { "host" => "", "port" => "", "channel" => [] },
21
21
  "git" => { "uri" => "" },
22
- "rspec" => [],
23
22
  }.to_yaml) unless File.exist?("#{Houcho::Config::FILE}")
24
23
 
25
24
  File.write("#{Houcho::Config::SPECDIR}/spec_helper.rb", <<EOD
@@ -66,13 +66,11 @@ class Spec
66
66
  rv = {}
67
67
  rv["host"] = []
68
68
  rv["spec"] = []
69
- rv["outer role"] = []
70
69
 
71
70
  rv["spec"].concat(value["spec"]).uniq
72
71
  rv["host"].concat(value["host"]).uniq if value["host"]
73
72
 
74
73
  if value["outer role"]
75
- rv["outer role"].concat(value["outer role"].keys).uniq
76
74
  value["outer role"].each do |outerrolename, v|
77
75
  rv["host"].concat(v["host"]).uniq if v["host"]
78
76
  end
@@ -108,20 +106,23 @@ class Spec
108
106
  attr_role = @role.get_attr(role)
109
107
  attr_host = @host.get_attr(host)
110
108
  attr_outerrole = {}
109
+ outerrole = []
110
+
111
+ @host.details(host).each do |h, v|
112
+ outerrole = outerrole.concat((v["outer role"] || [])).uniq
113
+ end
111
114
 
112
- if v["outer role"]
113
- v["outer role"].each do |o|
114
- attr_outerrole.merge!(@outerrole.get_attr(o))
115
- end
115
+ outerrole.each do |o|
116
+ attr_outerrole.merge!(@outerrole.get_attr(o))
116
117
  end
117
118
 
118
119
  attr = attr_role.merge(attr_outerrole)
119
120
  attr = attr.merge(attr_host)
120
121
 
121
122
  logmesg = ""
122
- if attr != {} && attr_host == {} && v["outer role"].size > 1
123
- logmsg = "might not be given the appropriate attribute value, because #{host} have no attributes and belongs to more than one outer role - #{v["outer role"].join(", ")}"
124
- @logger.warn(host) { message }
123
+ if attr != {} && attr_host == {} && outerrole.size > 1
124
+ logmsg = "might not be given the appropriate attribute value, because #{host} have no attributes and belongs to more than one outer role - #{outerrole.join(", ")}"
125
+ @logger.warn(host) { logmsg }
125
126
  logmsg += "\n"
126
127
  end
127
128
 
@@ -160,24 +161,24 @@ class Spec
160
161
  def post_result(result, role, host, spec, command, message)
161
162
  result_status = result[0] == 0 ? 1 : 2
162
163
 
163
- ukigumo = Houcho::Config::UKIGUMO
164
- ikachan = Houcho::Config::IKACHAN
165
- git = Houcho::Config::GIT
164
+ conf = YAML.load_file(Houcho::Config::FILE)
165
+ ukigumo = conf["ukigumo"]
166
+ ikachan = conf["ikachan"]
166
167
 
167
- if ukigumo["host"] != "" && ukigumo["port"] != "" && git["uri"]
168
+ if ukigumo && ukigumo["host"] != "" && ukigumo["port"] != ""
168
169
  u = CI::UkigumoClient.new(ukigumo["host"], ukigumo["port"])
169
170
  ukigumo_report = u.post({
170
171
  :status => result_status,
171
172
  :project => host.gsub(/\./, "-"),
172
173
  :branch => role,
173
- :repo => git["uri"],
174
+ :repo => "_",
174
175
  :revision => spec.join(", "),
175
176
  :vc_log => command,
176
177
  :body => ( message || "" ) + result[1],
177
178
  })
178
179
  end
179
180
 
180
- if ikachan["host"] != "" && ikachan["port"] != "" && result_status != 1
181
+ if ikachan && ikachan["host"] != "" && ikachan["port"] != "" && result_status != 1
181
182
  message = "[serverspec fail] #{host} => #{spec.join(", ")}"
182
183
  message += " (#{JSON.parse(ukigumo_report)["report"]["url"]})" if ukigumo_report
183
184
 
@@ -1,3 +1,3 @@
1
1
  module Houcho
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -36,6 +36,7 @@ YAML
36
36
  @role.create(["studio3104", "studio3105"])
37
37
 
38
38
  Houcho::OuterRole::CloudForecast.load
39
+ Houcho::OuterRole::Yabitz.load
39
40
 
40
41
  @host.attach("hostA", "studio3104")
41
42
  @outerrole.attach("houcho::rspec::studio3104", "studio3104")
@@ -361,16 +362,16 @@ YAML
361
362
  context "run role" do
362
363
  it do
363
364
  expect(@specrunner.execute_role("studio3104", [], true)).to eq([
364
- "TARGET_HOST=hostA parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
365
- "TARGET_HOST=test1.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
366
- "TARGET_HOST=test2.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
365
+ "TARGET_HOST=hostA rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb",
366
+ "TARGET_HOST=test1.studio3104.com rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb",
367
+ "TARGET_HOST=test2.studio3104.com rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb"
367
368
  ])
368
369
  end
369
370
 
370
371
  it "with exclude host" do
371
372
  expect(@specrunner.execute_role("studio3104", "test1.studio3104.com", true)).to eq([
372
- "TARGET_HOST=hostA parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
373
- "TARGET_HOST=test2.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
373
+ "TARGET_HOST=hostA rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb",
374
+ "TARGET_HOST=test2.studio3104.com rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb"
374
375
  ])
375
376
  end
376
377
  end
@@ -382,8 +383,8 @@ YAML
382
383
  "specA",
383
384
  true
384
385
  )).to eq([
385
- "TARGET_HOST=test3.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb",
386
- "TARGET_HOST=test4.studio3104.com parallel_rspec #{Houcho::Config::SPECDIR}/specA_spec.rb"
386
+ "TARGET_HOST=test3.studio3104.com rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb",
387
+ "TARGET_HOST=test4.studio3104.com rspec --format documentation #{Houcho::Config::SPECDIR}/specA_spec.rb"
387
388
  ])
388
389
  end
389
390
 
@@ -0,0 +1,88 @@
1
+ diff --git a/lib/Ukigumo/Server/Command/Report.pm b/lib/Ukigumo/Server/Command/Report.pm
2
+ index 831110c..415770a 100644
3
+ --- a/lib/Ukigumo/Server/Command/Report.pm
4
+ +++ b/lib/Ukigumo/Server/Command/Report.pm
5
+ @@ -63,6 +63,39 @@ sub recent_list {
6
+ return wantarray ? ($reports, $pager) : $reports;
7
+ }
8
+
9
+ +sub failure_list {
10
+ + my $class = shift;
11
+ + state $rule = Data::Validator->new(
12
+ + limit => { isa => 'Int', default => 50 },
13
+ + page => { isa => 'Int', default => 1 },
14
+ + );
15
+ + my $args = $rule->validate(@_);
16
+ +
17
+ + my $reports = c->dbh->selectall_arrayref(
18
+ + q{SELECT branch.project, branch.branch, report.report_id, report.revision, report.status, report.ctime
19
+ + FROM report INNER JOIN branch ON (branch.branch_id=report.branch_id)
20
+ + WHERE NOT report.status = 1
21
+ + ORDER BY report_id DESC
22
+ + LIMIT } . ($args->{limit} + 1) . " OFFSET " . $args->{limit}*($args->{page}-1),
23
+ + { Slice => +{} },
24
+ + );
25
+ + my $has_next = do {
26
+ + if (@$reports == $args->{limit}+1) {
27
+ + pop @$reports;
28
+ + 1;
29
+ + } else {
30
+ + 0;
31
+ + }
32
+ + };
33
+ + my $pager = Data::Page::NoTotalEntries->new(
34
+ + has_next => $has_next,
35
+ + entries_per_page => $args->{limit},
36
+ + current_page => $args->{page},
37
+ + entries_on_this_page => @$reports,
38
+ + );
39
+ + return wantarray ? ($reports, $pager) : $reports;
40
+ +}
41
+ +
42
+ sub list {
43
+ my $class = shift;
44
+ state $rule = Data::Validator->new(
45
+ diff --git a/lib/Ukigumo/Server/Web/Dispatcher.pm b/lib/Ukigumo/Server/Web/Dispatcher.pm
46
+ index dbea5f7..7c0796b 100644
47
+ --- a/lib/Ukigumo/Server/Web/Dispatcher.pm
48
+ +++ b/lib/Ukigumo/Server/Web/Dispatcher.pm
49
+ @@ -70,6 +70,25 @@ get '/recent' => sub {
50
+ );
51
+ };
52
+
53
+ +get '/failure' => sub {
54
+ + my ($c, $args) = @_;
55
+ +
56
+ + my $page = $c->req->param('page') || 1;
57
+ + my $limit = 50;
58
+ +
59
+ + my ($reports, $pager) = Ukigumo::Server::Command::Report->failure_list(
60
+ + page => $page,
61
+ + limit => $limit,
62
+ + );
63
+ + return $c->render(
64
+ + 'recent.tt' => {
65
+ + reports => $reports,
66
+ + pager => $pager,
67
+ + now => time(),
68
+ + }
69
+ + );
70
+ +};
71
+ +
72
+ get '/project/{project}' => sub {
73
+ my ($c, $args) = @_;
74
+
75
+ diff --git a/tmpl/include/layout.tt b/tmpl/include/layout.tt
76
+ index be22ba0..78c1246 100644
77
+ --- a/tmpl/include/layout.tt
78
+ +++ b/tmpl/include/layout.tt
79
+ @@ -27,6 +27,9 @@
80
+ <li>
81
+ <a href="[% uri_for('/recent') %]">Recent</a>
82
+ </li>
83
+ + <li>
84
+ + <a href="[% uri_for('/failure') %]">Failure</a>
85
+ + </li>
86
+ </ul>
87
+ </div>
88
+ </div>
@@ -0,0 +1,67 @@
1
+ diff --git a/tmpl/include/layout.tt b/tmpl/include/layout.tt
2
+ index be22ba0..911c695 100644
3
+ --- a/tmpl/include/layout.tt
4
+ +++ b/tmpl/include/layout.tt
5
+ @@ -2,7 +2,7 @@
6
+ <html>
7
+ <head>
8
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
9
+ - <title>[% IF subtitle %][% subtitle %] - [% END %][% title || l('Ukigumo') %]</title>
10
+ + <title>[% IF subtitle %][% subtitle %] - [% END %][% title || l('Houcho') %]</title>
11
+ <meta http-equiv="Content-Style-Type" content="text/css" />
12
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
13
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"]]>
14
+ @@ -22,7 +22,7 @@
15
+ <div class="topbar">
16
+ <div class="topbar-inner">
17
+ <div class="container">
18
+ - <h3><a href="[% uri_for('/') %]">[% l('Ukigumo') %]</a></h3>
19
+ + <h3><a href="[% uri_for('/') %]">[% l('Houcho') %]</a></h3>
20
+ <ul class="nav">
21
+ <li>
22
+ <a href="[% uri_for('/recent') %]">Recent</a>
23
+ diff --git a/tmpl/include/table/project.tt b/tmpl/include/table/project.tt
24
+ index 1c94b7d..7e76746 100644
25
+ --- a/tmpl/include/table/project.tt
26
+ +++ b/tmpl/include/table/project.tt
27
+ @@ -1,8 +1,8 @@
28
+ <h2><a href="[% uri_for('/project/' _ uri(project_name)) %]">[% project_name %]</a></h2>
29
+ <table>
30
+ <tr>
31
+ - <th>[% l('Branch') %]</th>
32
+ - <th>[% l('Revision') %]</th>
33
+ + <th>[% l('Role') %]</th>
34
+ + <th>[% l('Spec') %]</th>
35
+ <th>[% l('Status') %]</th>
36
+ <th>[% l('Date') %]</th>
37
+ </tr>
38
+ diff --git a/tmpl/recent.tt b/tmpl/recent.tt
39
+ index f856497..6a6c92c 100644
40
+ --- a/tmpl/recent.tt
41
+ +++ b/tmpl/recent.tt
42
+ @@ -9,9 +9,9 @@
43
+
44
+ <table>
45
+ <tr>
46
+ - <th>[% l('Project') %]</th>
47
+ - <th>[% l('Branch') %]</th>
48
+ - <th>[% l('Revision') %]</th>
49
+ + <th>[% l('Host') %]</th>
50
+ + <th>[% l('Role') %]</th>
51
+ + <th>[% l('Spec') %]</th>
52
+ <th>[% l('Status') %]</th>
53
+ <th>[% l('Date') %]</th>
54
+ </tr>
55
+ diff --git a/tmpl/report_list.tt b/tmpl/report_list.tt
56
+ index bbdb022..0e3481a 100644
57
+ --- a/tmpl/report_list.tt
58
+ +++ b/tmpl/report_list.tt
59
+ @@ -9,7 +9,7 @@
60
+
61
+ <table>
62
+ <tr>
63
+ - <th>[% l('Revision') %]</th>
64
+ + <th>[% l('Spec') %]</th>
65
+ <th>[% l('Status') %]</th>
66
+ <th>[% l('Date') %]</th>
67
+ </tr>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: houcho
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Satoshi SUZUKI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-12 00:00:00.000000000 Z
11
+ date: 2013-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -181,6 +181,7 @@ files:
181
181
  - lib/houcho/host.rb
182
182
  - lib/houcho/outerrole.rb
183
183
  - lib/houcho/outerrole/cloudforecast.rb
184
+ - lib/houcho/outerrole/save.rb
184
185
  - lib/houcho/outerrole/yabitz.rb
185
186
  - lib/houcho/repository.rb
186
187
  - lib/houcho/role.rb
@@ -188,6 +189,8 @@ files:
188
189
  - lib/houcho/spec/runner.rb
189
190
  - lib/houcho/version.rb
190
191
  - spec/houcho_spec.rb
192
+ - ukigumo_failurepage.patch
193
+ - ukigumo_tmpl.patch
191
194
  homepage: https://github.com/studio3104/houcho
192
195
  licenses:
193
196
  - MIT