bard 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +115 -7
- data/VERSION +1 -1
- data/bard.gemspec +2 -2
- data/features/bard_check.feature +76 -0
- data/features/step_definitions/check_steps.rb +49 -4
- data/features/step_definitions/git_steps.rb +17 -0
- data/features/step_definitions/global_steps.rb +10 -3
- data/features/support/io.rb +1 -1
- data/lib/bard.rb +54 -13
- data/spec/bard_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -0
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -2,14 +2,122 @@
|
|
2
2
|
|
3
3
|
This immaculate work of engineering genius allows mere mortals to collaborate with beings of transcendent intelligence like Micah, Michael, and Nick.
|
4
4
|
|
5
|
-
|
6
|
-
gem install thor
|
7
|
-
gem install systemu
|
8
|
-
gem install term-ansicolor
|
9
|
-
gem install git_remote_branch
|
5
|
+
=== Requirements
|
10
6
|
git --version >= 1.6.0
|
11
7
|
|
12
|
-
|
8
|
+
=== Joining Bard
|
9
|
+
|
10
|
+
==== On any platform:
|
11
|
+
- gem install gemcutter
|
12
|
+
- gem tumble
|
13
|
+
- gem install bard
|
14
|
+
|
15
|
+
==== On Linux:
|
16
|
+
|
17
|
+
- Install RubyGems:
|
18
|
+
$> wget ...
|
19
|
+
$> ...
|
20
|
+
|
21
|
+
- Install Rake:
|
22
|
+
$> sudo gem install rake
|
23
|
+
( NOTE: the sudo )
|
24
|
+
|
25
|
+
- Install Apache
|
26
|
+
$> sudo apt-get install apache2
|
27
|
+
|
28
|
+
- Install Mysql
|
29
|
+
$> sudo apt-get install mysql-server
|
30
|
+
$> sudo /etc/init.d/mysql start
|
31
|
+
( No password for root, if it asks )
|
32
|
+
|
33
|
+
- Install Passenger
|
34
|
+
$> sudo gem install passenger
|
35
|
+
|
36
|
+
$> sudo apt-get install apache2-prefork-dev as root.
|
37
|
+
$> sudo apt-get install libapr1-dev as root.
|
38
|
+
$> sudo apt-get install libaprutil1
|
39
|
+
|
40
|
+
$> sudo passenger-install-apache2-module
|
41
|
+
|
42
|
+
- Setup rails environment:
|
43
|
+
Add line to /etc/apache2/apache2.conf:
|
44
|
+
RailsEnv development
|
45
|
+
$> apache2ctl restart
|
46
|
+
|
47
|
+
==== On Mac:
|
48
|
+
- ???Wtf ? I dunno. eff macs
|
49
|
+
|
50
|
+
== Todos
|
51
|
+
|
52
|
+
=== Adding Adva to an exising project
|
53
|
+
- Git clone latest tagged release from github
|
54
|
+
- Set up integration branch on staging
|
55
|
+
- Add as submodule
|
56
|
+
- Bard pull will "just work" (tm)
|
57
|
+
|
58
|
+
=== Joining an existing project
|
59
|
+
bard join will probably either do all these steps automatically, or help you do them:
|
60
|
+
This list summarizes the existing steps needed to join a project.
|
61
|
+
|
62
|
+
$> bard join <project-name>
|
63
|
+
|
64
|
+
- Clone the project
|
65
|
+
- (git clone staging@staging.botandrose.com:<project-name>)
|
66
|
+
- Init and update submodules
|
67
|
+
|
68
|
+
- Set up local environment:
|
69
|
+
- Apache
|
70
|
+
Put in /etc/apache2/sites-avaliable/<project-name>:
|
71
|
+
<VirtualHost *:80>
|
72
|
+
ServerName <project-name>.local
|
73
|
+
DocumentRoot $HOME/$BardRoot/<project-name>/public
|
74
|
+
</VirtualHost>
|
75
|
+
|
76
|
+
$> a2ensite <project-name>
|
77
|
+
$> apache2ctl restart
|
78
|
+
|
79
|
+
- Set up /etc/hosts:
|
80
|
+
append this line to /etc/hosts:
|
81
|
+
127.0.0.1 <project-name>.local
|
82
|
+
|
83
|
+
- Setup database yaml
|
84
|
+
- sensible default:
|
85
|
+
login: &login
|
86
|
+
adapter: mysql
|
87
|
+
database: <project-name>
|
88
|
+
username: root
|
89
|
+
password:
|
90
|
+
socket: /var/run/mysqld/mysqld.sock
|
91
|
+
|
92
|
+
development:
|
93
|
+
<<: *login
|
94
|
+
|
95
|
+
test: &TEST
|
96
|
+
<<: *login
|
97
|
+
database: <project-name>_test
|
98
|
+
|
99
|
+
cucumber:
|
100
|
+
<<: *TEST
|
101
|
+
|
102
|
+
|
103
|
+
- Set up gems:
|
104
|
+
$> rake gems:install
|
105
|
+
|
106
|
+
- Set up database
|
107
|
+
$> rake db:create
|
108
|
+
$> rake db:migrate
|
109
|
+
|
110
|
+
- Set up cap:
|
111
|
+
$> capify .
|
112
|
+
Add line to Capfile:
|
113
|
+
load '../cap.tasks'
|
114
|
+
Have cap.tasks.rb in your root work directory (eg. $HOME/work/bard )
|
115
|
+
|
116
|
+
- Seed database from staging
|
117
|
+
$> cap data:pull:staging
|
118
|
+
|
119
|
+
|
120
|
+
=== Note on Patches/Pull Requests
|
13
121
|
|
14
122
|
* Fork the project.
|
15
123
|
* Make your feature addition or bug fix.
|
@@ -22,4 +130,4 @@
|
|
22
130
|
|
23
131
|
== Copyright
|
24
132
|
|
25
|
-
Copyright (c) 2009 Micah Geisel. See LICENSE for details.
|
133
|
+
Copyright (c) 2009 Micah Geisel, Nick Hogle. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/bard.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bard}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Micah Geisel", "Nick Hogle"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-10-05}
|
13
13
|
s.default_executable = %q{bard}
|
14
14
|
s.description = %q{This immaculate work of engineering genius allows mere mortals to collaborate with beings of transcendent intelligence like Micah, Michael, and Nick.}
|
15
15
|
s.email = %q{info@botandrose.com}
|
data/features/bard_check.feature
CHANGED
@@ -6,3 +6,79 @@ Feature: Bard can check its environment for missing dependencies and potential p
|
|
6
6
|
And I should see the current version of git
|
7
7
|
And I should see the current version of rubygems
|
8
8
|
And I should see the current version of ruby
|
9
|
+
|
10
|
+
Scenario: Bard check examines a local project for problems
|
11
|
+
Given a shared rails project
|
12
|
+
When I type "bard check ."
|
13
|
+
Then I should see "No problems"
|
14
|
+
|
15
|
+
Scenario: Bard check detects missing database
|
16
|
+
Given a shared rails project
|
17
|
+
And the database is missing
|
18
|
+
When I type "bard check ."
|
19
|
+
Then I should see the fatal error "missing database"
|
20
|
+
|
21
|
+
Scenario: Bard check detects pending migrations
|
22
|
+
Given a shared rails project
|
23
|
+
And I have committed a set of changes that includes a new migration
|
24
|
+
When I type "bard check ."
|
25
|
+
Then I should see the fatal error "pending migrations"
|
26
|
+
|
27
|
+
Scenario: Bard check detects missing config/database.yml
|
28
|
+
Given a shared rails project
|
29
|
+
And "config/database.yml" is missing
|
30
|
+
When I type "bard check ."
|
31
|
+
Then I should see the fatal error "missing config/database.yml"
|
32
|
+
|
33
|
+
Scenario: Bard check detects missing submodules
|
34
|
+
Given a shared rails project
|
35
|
+
And a submodule
|
36
|
+
And the submodule is missing
|
37
|
+
When I type "bard check ."
|
38
|
+
Then I should see the fatal error "missing submodule"
|
39
|
+
|
40
|
+
Scenario: Bard check detects missing gems
|
41
|
+
Given a shared rails project
|
42
|
+
And I have committed a set of changes that adds the test gem as a dependency
|
43
|
+
And I dont have the test gem installed
|
44
|
+
When I type "bard check ."
|
45
|
+
Then I should see the fatal error "missing gems"
|
46
|
+
|
47
|
+
Scenario: Bard check detects master branch checked out
|
48
|
+
Given a shared rails project
|
49
|
+
And I am on the master branch
|
50
|
+
When I type "bard check ."
|
51
|
+
Then I should see the fatal error "master branch"
|
52
|
+
|
53
|
+
Scenario: Bard check detects missing integration branch
|
54
|
+
Given a shared rails project
|
55
|
+
And there is no integration branch
|
56
|
+
When I type "bard check ."
|
57
|
+
Then I should see the fatal error "missing integration branch"
|
58
|
+
|
59
|
+
Scenario: Bard check detects missing RAILS_ENV environment variable
|
60
|
+
Given a shared rails project
|
61
|
+
And my "RAILS_ENV" environment variable is ""
|
62
|
+
When I type "bard check ."
|
63
|
+
Then I should see the warning "RAILS_ENV is not set"
|
64
|
+
|
65
|
+
Scenario: Bard check detects missing staging hook
|
66
|
+
Given a shared rails project
|
67
|
+
And my "RAILS_ENV" environment variable is "staging"
|
68
|
+
And there is no git hook on the staging server
|
69
|
+
When I type "bard check ." on the staging server
|
70
|
+
Then I should see the fatal error "missing git hook"
|
71
|
+
|
72
|
+
Scenario: Bard check detects unexecutable staging hook
|
73
|
+
Given a shared rails project
|
74
|
+
And my "RAILS_ENV" environment variable is "staging"
|
75
|
+
And the git hook on the staging server is not executable
|
76
|
+
When I type "bard check ." on the staging server
|
77
|
+
Then I should see the fatal error "unexecutable git hook"
|
78
|
+
|
79
|
+
Scenario: Bard check detects improper staging hook
|
80
|
+
Given a shared rails project
|
81
|
+
And my "RAILS_ENV" environment variable is "staging"
|
82
|
+
And the git hook on the staging server is bad
|
83
|
+
When I type "bard check ." on the staging server
|
84
|
+
Then I should see the fatal error "improper git hook"
|
@@ -1,20 +1,65 @@
|
|
1
1
|
Then /^I should see the current version of bard$/ do
|
2
2
|
version = File.read("#{ROOT}/VERSION").chomp
|
3
|
-
@stdout.should
|
3
|
+
@stdout.should =~ /bard\s+\(#{Regexp.escape(version)}\)/
|
4
4
|
end
|
5
5
|
|
6
6
|
Then /^I should see the current version of git$/ do
|
7
7
|
version = `git --version`[/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/]
|
8
|
-
@stdout.should
|
8
|
+
@stdout.should =~ /git\s+\(#{Regexp.escape(version)}\)/
|
9
9
|
end
|
10
10
|
|
11
11
|
Then /^I should see the current version of rubygems$/ do
|
12
12
|
version = `gem --version`.chomp
|
13
|
-
@stdout.should
|
13
|
+
@stdout.should =~ /rubygems\s+\(#{Regexp.escape(version)}\)/
|
14
14
|
end
|
15
15
|
|
16
16
|
Then /^I should see the current version of ruby$/ do
|
17
17
|
version = `ruby --version`[/[0-9]+\.[0-9]+\.[0-9]+/]
|
18
|
-
@stdout.should
|
18
|
+
@stdout.should =~ /ruby\s+\(#{Regexp.escape(version)}\)/
|
19
|
+
end
|
20
|
+
|
21
|
+
Given /^"([^\"]*)" is missing$/ do |file|
|
22
|
+
type "rm #{file}"
|
23
|
+
end
|
24
|
+
|
25
|
+
Given /^the database is missing$/ do
|
26
|
+
File.open "config/database.yml", "w" do |f|
|
27
|
+
f.puts <<-DB
|
28
|
+
development:
|
29
|
+
adapter: mysql
|
30
|
+
username: root
|
31
|
+
password:
|
32
|
+
database: bad_bad_bad
|
33
|
+
socket: /var/run/mysqld/mysqld.sock
|
34
|
+
DB
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Given /^the submodule is missing$/ do
|
39
|
+
type "rm -rf submodule"
|
40
|
+
type "mkdir submodule"
|
41
|
+
end
|
42
|
+
|
43
|
+
Given /^my "([^\"]*)" environment variable is "([^\"]*)"$/ do |key, value|
|
44
|
+
@env ||= Hash.new
|
45
|
+
@env[key] = value
|
46
|
+
end
|
47
|
+
|
48
|
+
Given /^there is no git hook on the staging server$/ do
|
49
|
+
Dir.chdir "#{ROOT}/tmp/origin" do
|
50
|
+
type "rm .git/hooks/post-receive"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
Given /^the git hook on the staging server is not executable$/ do
|
55
|
+
Dir.chdir "#{ROOT}/tmp/origin" do
|
56
|
+
type "chmod 664 .git/hooks/post-receive"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
Given /^the git hook on the staging server is bad$/ do
|
61
|
+
Dir.chdir "#{ROOT}/tmp/origin" do
|
62
|
+
type "echo 'bad' > .git/hooks/post-receive"
|
63
|
+
end
|
19
64
|
end
|
20
65
|
|
@@ -2,6 +2,23 @@ Given /^I am on a non\-integration branch$/ do
|
|
2
2
|
type "git checkout -b bad_bad_bad"
|
3
3
|
end
|
4
4
|
|
5
|
+
Given /^I am on the master branch$/ do
|
6
|
+
type "git checkout master"
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /^there is no integration branch$/ do
|
10
|
+
type "git checkout master"
|
11
|
+
type "git branch -d integration"
|
12
|
+
end
|
13
|
+
|
14
|
+
Given /^there is no integration branch on the staging server$/ do
|
15
|
+
type "git branch -d origin/integration"
|
16
|
+
Dir.chdir "#{ROOT}/tmp/origin" do
|
17
|
+
type "git checkout master"
|
18
|
+
type "git branch -d integration"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
5
22
|
Given /^a dirty working directory$/ do
|
6
23
|
File.open("dirty_file", "w") { |f| f.puts "dirty dirty" }
|
7
24
|
end
|
@@ -29,10 +29,13 @@ BASH
|
|
29
29
|
end
|
30
30
|
|
31
31
|
When /^I type "([^\"]*)"$/ do |command|
|
32
|
-
|
33
|
-
|
32
|
+
type command.sub /\b(bard)\b/, "#{ROOT}/bin/bard"
|
33
|
+
end
|
34
|
+
|
35
|
+
When /^I type "([^\"]*)" on the staging server$/ do |command|
|
36
|
+
Dir.chdir "#{ROOT}/tmp/origin" do
|
37
|
+
When %(I type "#{command}")
|
34
38
|
end
|
35
|
-
type command
|
36
39
|
end
|
37
40
|
|
38
41
|
Then /^I should see the fatal error "([^\"]*)"$/ do |error_message|
|
@@ -42,3 +45,7 @@ end
|
|
42
45
|
Then /^I should see the warning "([^\"]*)"$/ do |warning_message|
|
43
46
|
@stderr.should include(warning_message)
|
44
47
|
end
|
48
|
+
|
49
|
+
Then /^I should see "([^\"]*)"$/ do |message|
|
50
|
+
@stdout.should include(message)
|
51
|
+
end
|
data/features/support/io.rb
CHANGED
data/lib/bard.rb
CHANGED
@@ -2,6 +2,7 @@ $:.unshift File.expand_path(File.dirname(__FILE__))
|
|
2
2
|
require 'term/ansicolor'
|
3
3
|
require 'systemu'
|
4
4
|
require 'grit'
|
5
|
+
require 'thor'
|
5
6
|
|
6
7
|
require 'bard/git'
|
7
8
|
require 'bard/io'
|
@@ -10,19 +11,23 @@ class Bard < Thor
|
|
10
11
|
include BardGit
|
11
12
|
include BardIO
|
12
13
|
|
13
|
-
desc "check", "check environment for missing dependencies"
|
14
|
-
def check
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
required
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
actual
|
25
|
-
|
14
|
+
desc "check [PROJECT]", "check PROJECT or environment for missing dependencies"
|
15
|
+
def check(project = nil)
|
16
|
+
return check_project(project) if project
|
17
|
+
puts ENV['ASDF']
|
18
|
+
|
19
|
+
required = {
|
20
|
+
'bard' => `gem list bard --remote`[/[0-9]+\.[0-9]+\.[0-9]+/],
|
21
|
+
'git' => '1.6.0',
|
22
|
+
'rubygems' => '1.3.4',
|
23
|
+
'ruby' => '1.8.6'
|
24
|
+
}
|
25
|
+
actual = {
|
26
|
+
'bard' => `gem list bard`[/[0-9]+\.[0-9]+\.[0-9]+/],
|
27
|
+
'git' => `git --version`[/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/],
|
28
|
+
'rubygems' => `gem --version`.chomp,
|
29
|
+
'ruby' => `ruby --version`[/[0-9]+\.[0-9]+\.[0-9]+/]
|
30
|
+
}
|
26
31
|
|
27
32
|
%w(bard git rubygems ruby).each do |pkg|
|
28
33
|
if actual[pkg] < required[pkg]
|
@@ -128,4 +133,40 @@ class Bard < Thor
|
|
128
133
|
system "touch tmp/restart.txt"
|
129
134
|
end
|
130
135
|
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def check_project(project)
|
139
|
+
errors = []
|
140
|
+
warnings = []
|
141
|
+
Dir.chdir project do
|
142
|
+
status, stdout, stderr = systemu "rake db:abort_if_pending_migrations"
|
143
|
+
errors << "missing config/database.yml" if stderr.include? "config/database.yml"
|
144
|
+
errors << "missing database" if stderr.include? "Unknown database"
|
145
|
+
errors << "pending migrations" if stdout.include? "pending migrations"
|
146
|
+
|
147
|
+
errors << "missing submodule" if `git submodule status` =~ /^-/
|
148
|
+
errors << "missing gems" if `rake gems` =~ /\[ \]/
|
149
|
+
errors << "you shouldn't be working on the master branch" if `cat .git/HEAD`.include? "refs/heads/master"
|
150
|
+
errors << "missing integration branch" if `git branch` !~ /\bintegration\b/
|
151
|
+
|
152
|
+
if ENV['RAILS_ENV'] == "staging"
|
153
|
+
if File.exist? ".git/hooks/post-receive"
|
154
|
+
errors << "unexecutable git hook" unless File.executable? ".git/hooks/post-receive"
|
155
|
+
errors << "improper git hook" unless File.read(".git/hooks/post-receive").include? "bard stage $@"
|
156
|
+
else
|
157
|
+
errors << "missing git hook"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
warnings << "RAILS_ENV is not set" if ENV['RAILS_ENV'].nil? or ENV['RAILS_ENV'].empty?
|
162
|
+
end
|
163
|
+
|
164
|
+
if not errors.empty?
|
165
|
+
fatal "#{errors.length} problems detected:\n #{errors.join("\n ")}"
|
166
|
+
elsif not warnings.empty?
|
167
|
+
warn "#{warnings.length} potential problems detected:\n #{warnings.join("\n ")}"
|
168
|
+
else
|
169
|
+
puts green("No problems detected in project: #{project}")
|
170
|
+
end
|
171
|
+
end
|
131
172
|
end
|
data/spec/bard_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Micah Geisel
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-10-05 00:00:00 -07:00
|
14
14
|
default_executable: bard
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|