bard 0.19.2 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/VERSION +1 -1
- data/bard.gemspec +0 -1
- data/bin/bard +3 -7
- data/lib/bard.rb +31 -96
- data/lib/bard/base.rb +28 -0
- data/lib/bard/error.rb +12 -17
- data/lib/bard/git.rb +16 -40
- metadata +46 -81
- data/lib/bard/io.rb +0 -27
- data/lib/bard/ssh_delegation.rb +0 -31
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 02b8af12d5e8b586b968b4ca9013bf254721792e
|
4
|
+
data.tar.gz: 0ca8d631a309b80d8d159a72db5a24296c5dbd00
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b53174e6149124a50d836ed7209df93338f0024493cb3b9f283dfcf9c3e35b0d2bd8f9ff9a5eb93a413016b21ff13ab21fe4d808f8fb1756ffe561fd534375ce
|
7
|
+
data.tar.gz: 95d3290c6155ebb4381e06b744f475d90ebb620c4cbe1f01339e0bdc81945c6f0fd74b2aa8cfb5f46273ff0c433a3fa7ac70395de49732521554de8cf888226d
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.20.0
|
data/bard.gemspec
CHANGED
@@ -17,7 +17,6 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.add_dependency "thor", "0.11.7"
|
18
18
|
gem.add_dependency "capistrano", "2.5.10"
|
19
19
|
gem.add_dependency "rvm-capistrano"
|
20
|
-
gem.add_dependency "grit", "1.1.1"
|
21
20
|
gem.add_dependency "systemu", ">=1.2.0"
|
22
21
|
gem.add_dependency "term-ansicolor", ">=1.0.3"
|
23
22
|
gem.add_dependency "bard-rake", ">=0.1.1"
|
data/bin/bard
CHANGED
data/lib/bard.rb
CHANGED
@@ -1,54 +1,16 @@
|
|
1
1
|
$:.unshift File.expand_path(File.dirname(__FILE__))
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
require 'bard/io'
|
12
|
-
|
13
|
-
require 'bard/ssh_delegation'
|
14
|
-
|
15
|
-
class Bard < Thor
|
16
|
-
include BardGit
|
17
|
-
include BardIO
|
18
|
-
|
19
|
-
VERSION = File.read(File.expand_path(File.dirname(__FILE__) + "../../VERSION")).chomp
|
20
|
-
|
21
|
-
desc "install [PROJECT NAME]", "install and bootstrap existing project"
|
22
|
-
def install(project_name)
|
23
|
-
auto_update!
|
24
|
-
command = <<-BASH
|
25
|
-
git clone git@git.botandrose.com:#{project_name}.git
|
26
|
-
|
27
|
-
cd #{project_name}
|
28
|
-
git checkout integration
|
29
|
-
rvm . do bundle
|
30
|
-
rvm . do bundle exec rake bootstrap
|
31
|
-
|
32
|
-
sudo -s <#{"<EOF"}
|
33
|
-
echo "<VirtualHost *:80>
|
34
|
-
ServerName #{project_name}.local
|
35
|
-
DocumentRoot `pwd`/public
|
36
|
-
</VirtualHost>" > /etc/apache2/sites-available/#{project_name}
|
37
|
-
a2ensite #{project_name}
|
38
|
-
apache2ctl restart
|
39
|
-
|
40
|
-
if ! grep "#{project_name}.local" /etc/hosts; then
|
41
|
-
echo 127.0.0.1 #{project_name}.local >> /etc/hosts
|
42
|
-
fi
|
43
|
-
EOF
|
44
|
-
BASH
|
45
|
-
exec command
|
46
|
-
end
|
2
|
+
|
3
|
+
module Bard; end
|
4
|
+
|
5
|
+
require "bard/base"
|
6
|
+
require "bard/error"
|
7
|
+
require "bard/git"
|
8
|
+
|
9
|
+
class Bard::CLI < Thor
|
10
|
+
include Bard::CLI::Git
|
47
11
|
|
48
12
|
desc "data [FROM=production, TO=local]", "copy database and assets from FROM to TO"
|
49
13
|
def data(from = "production", to = "local")
|
50
|
-
ensure_sanity!(true)
|
51
|
-
|
52
14
|
if to == "local"
|
53
15
|
if from == "production" and heroku?
|
54
16
|
exec "heroku db:pull --confirm #{project_name}"
|
@@ -66,10 +28,6 @@ EOF
|
|
66
28
|
method_options %w( verbose -v ) => :boolean
|
67
29
|
desc "pull", "pull changes to your local machine"
|
68
30
|
def pull
|
69
|
-
ensure_sanity!
|
70
|
-
|
71
|
-
warn NonFastForwardError unless fast_forward_merge?("origin/#{current_branch}")
|
72
|
-
|
73
31
|
run_crucial "git pull --rebase origin #{current_branch}", options.verbose?
|
74
32
|
run_crucial "bundle && bundle exec rake bootstrap", options.verbose?
|
75
33
|
end
|
@@ -77,10 +35,7 @@ EOF
|
|
77
35
|
method_options %w( verbose -v ) => :boolean
|
78
36
|
desc "push", "push local changes out to the remote"
|
79
37
|
def push
|
80
|
-
ensure_sanity!
|
81
|
-
|
82
38
|
raise NonFastForwardError unless fast_forward_merge?("origin/#{current_branch}")
|
83
|
-
|
84
39
|
run_crucial "git push origin #{current_branch}", true
|
85
40
|
end
|
86
41
|
|
@@ -165,53 +120,33 @@ EOF
|
|
165
120
|
end
|
166
121
|
|
167
122
|
private
|
168
|
-
def heroku?
|
169
|
-
`git remote -v`.include? "production\tgit@heroku.com:"
|
170
|
-
end
|
171
123
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
def has_ci?
|
177
|
-
`curl -s -I #{ci_host}/?token=botandrose` =~ /\b200 OK\b/
|
178
|
-
end
|
124
|
+
def heroku?
|
125
|
+
`git remote -v`.include? "production\tgit@heroku.com:"
|
126
|
+
end
|
179
127
|
|
180
|
-
|
181
|
-
|
182
|
-
|
128
|
+
def ci_host
|
129
|
+
"http://botandrose:thecakeisalie!@ci.botandrose.com/job/#{project_name}"
|
130
|
+
end
|
183
131
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
$1 ? $1.to_i : nil
|
188
|
-
end
|
132
|
+
def has_ci?
|
133
|
+
`curl -s -I #{ci_host}/?token=botandrose` =~ /\b200 OK\b/
|
134
|
+
end
|
189
135
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
$1 ? $1.to_i / 1000 : nil
|
194
|
-
end
|
136
|
+
def start_ci
|
137
|
+
`curl -s -I -X POST #{ci_host}/build?token=botandrose`
|
138
|
+
end
|
195
139
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
end
|
140
|
+
def get_last_build_number
|
141
|
+
response = `curl -s #{ci_host}/lastBuild/api/xml?token=botandrose`
|
142
|
+
response.match(/<number>(\d+)<\/number>/)
|
143
|
+
$1 ? $1.to_i : nil
|
144
|
+
end
|
202
145
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
original_command = [ENV["_"], @_invocations[Bard].first, ARGV].flatten.join(" ")
|
209
|
-
puts "bard gem is out of date... updating to new version"
|
210
|
-
exec "gem install bard && #{original_command}"
|
211
|
-
end
|
212
|
-
if options.verbose?
|
213
|
-
puts green("#{"bard".ljust(9)} (#{Bard::VERSION})")
|
214
|
-
end
|
215
|
-
end
|
146
|
+
def get_last_time_elapsed
|
147
|
+
response = `curl -s #{ci_host}/lastStableBuild/api/xml?token=botandrose`
|
148
|
+
response.match(/<duration>(\d+)<\/duration>/)
|
149
|
+
$1 ? $1.to_i / 1000 : nil
|
150
|
+
end
|
216
151
|
end
|
217
152
|
|
data/lib/bard/base.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "term/ansicolor"
|
3
|
+
require "systemu"
|
4
|
+
|
5
|
+
class Bard::CLI < Thor
|
6
|
+
include Term::ANSIColor
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def fatal(message)
|
11
|
+
raise Bard::CLI::Error, red("!!! ") + message
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_crucial(command, verbose = false)
|
15
|
+
status, stdout, stderr = systemu command
|
16
|
+
fatal "Running command: #{yellow(command)}: #{stderr}" if status.to_i.nonzero?
|
17
|
+
if verbose
|
18
|
+
$stdout.puts stdout
|
19
|
+
$stderr.puts stderr
|
20
|
+
end
|
21
|
+
stdout.chomp
|
22
|
+
end
|
23
|
+
|
24
|
+
def project_name
|
25
|
+
@project_name ||= File.expand_path(".").split("/").last
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/bard/error.rb
CHANGED
@@ -1,28 +1,23 @@
|
|
1
|
-
class Bard < Thor
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
class #{error} < Bard::Error
|
12
|
-
def message
|
13
|
-
%q{#{message}}
|
14
|
-
end
|
1
|
+
class Bard::CLI < Thor
|
2
|
+
class NonFastForwardError < Bard::CLI::Error
|
3
|
+
def message
|
4
|
+
"Someone has pushed some changes since you last pulled.\n Kindly run bard pull, ensure that your your changes still work, and try again"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class MasterNonFastForwardError < Bard::CLI::Error
|
9
|
+
def message
|
10
|
+
"The master branch has advanced since last deploy, probably due to a bugfix.\n Rebase your integration branch on top of it, and check for breakage."
|
15
11
|
end
|
16
|
-
RUBY
|
17
12
|
end
|
18
13
|
|
19
|
-
class TestsFailedError < Bard::Error
|
14
|
+
class TestsFailedError < Bard::CLI::Error
|
20
15
|
def message
|
21
16
|
"Automated tests failed!\n See #{super} for more info."
|
22
17
|
end
|
23
18
|
end
|
24
19
|
|
25
|
-
class TestsAbortedError < Bard::Error
|
20
|
+
class TestsAbortedError < Bard::CLI::Error
|
26
21
|
def message
|
27
22
|
"Automated tests aborted!\n See #{super} for more info."
|
28
23
|
end
|
data/lib/bard/git.rb
CHANGED
@@ -1,46 +1,22 @@
|
|
1
|
-
module
|
1
|
+
module Bard::CLI::Git
|
2
2
|
private
|
3
|
-
def current_branch
|
4
|
-
ref = `git symbolic-ref HEAD 2>&1`.chomp
|
5
|
-
return false if ref =~ /^fatal:/
|
6
|
-
ref.sub(/refs\/heads\//, '') # refs/heads/master ... we want "master"
|
7
|
-
end
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@common_ancestor == root_head
|
15
|
-
end
|
4
|
+
def current_branch
|
5
|
+
ref = `git symbolic-ref HEAD 2>&1`.chomp
|
6
|
+
return false if ref =~ /^fatal:/
|
7
|
+
ref.sub(/refs\/heads\//, '') # refs/heads/master ... we want "master"
|
8
|
+
end
|
16
9
|
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
def fast_forward_merge?(root = "origin/integration", branch = "HEAD")
|
11
|
+
run_crucial "git fetch origin"
|
12
|
+
root_head = run_crucial "git rev-parse #{root}"
|
13
|
+
branch_head = run_crucial "git rev-parse #{branch}"
|
14
|
+
@common_ancestor = find_common_ancestor root_head, branch_head
|
15
|
+
@common_ancestor == root_head
|
16
|
+
end
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def submodule_dirty?
|
26
|
-
@repo ||= Grit::Repo.new "."
|
27
|
-
submodules = Grit::Submodule.config(@repo, @repo.head.name)
|
28
|
-
submodules.any? do |name, submodule|
|
29
|
-
Dir.chdir submodule["path"] do
|
30
|
-
not `git status`.include? "working directory clean"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def submodule_unpushed?
|
36
|
-
@repo ||= Grit::Repo.new "."
|
37
|
-
submodules = Grit::Submodule.config(@repo, @repo.head.name)
|
38
|
-
submodules.any? do |name, submodule|
|
39
|
-
Dir.chdir submodule["path"] do
|
40
|
-
`git fetch origin`
|
41
|
-
submodule["id"] != `git rev-parse origin/#{current_branch}`.chomp
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
18
|
+
def find_common_ancestor(head1, head2)
|
19
|
+
run_crucial "git merge-base #{head1} #{head2}"
|
20
|
+
end
|
45
21
|
end
|
46
22
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.19.2
|
4
|
+
version: 0.20.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Micah Geisel
|
@@ -10,148 +9,116 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-12-12 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
|
-
prerelease: false
|
17
|
-
type: :runtime
|
18
15
|
name: thor
|
19
|
-
|
20
|
-
none: false
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
21
17
|
requirements:
|
22
18
|
- - '='
|
23
19
|
- !ruby/object:Gem::Version
|
24
20
|
version: 0.11.7
|
25
|
-
|
26
|
-
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
24
|
requirements:
|
28
25
|
- - '='
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: 0.11.7
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
|
-
prerelease: false
|
33
|
-
type: :runtime
|
34
29
|
name: capistrano
|
35
|
-
|
36
|
-
none: false
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
37
31
|
requirements:
|
38
32
|
- - '='
|
39
33
|
- !ruby/object:Gem::Version
|
40
34
|
version: 2.5.10
|
41
|
-
|
42
|
-
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
38
|
requirements:
|
44
39
|
- - '='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: 2.5.10
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
|
-
prerelease: false
|
49
|
-
type: :runtime
|
50
43
|
name: rvm-capistrano
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- - ! '>='
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '0'
|
57
44
|
requirement: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
45
|
requirements:
|
60
|
-
- -
|
46
|
+
- - '>='
|
61
47
|
- !ruby/object:Gem::Version
|
62
48
|
version: '0'
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
prerelease: false
|
65
49
|
type: :runtime
|
66
|
-
|
50
|
+
prerelease: false
|
67
51
|
version_requirements: !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
|
-
requirements:
|
70
|
-
- - '='
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 1.1.1
|
73
|
-
requirement: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
52
|
requirements:
|
76
|
-
- - '
|
53
|
+
- - '>='
|
77
54
|
- !ruby/object:Gem::Version
|
78
|
-
version:
|
55
|
+
version: '0'
|
79
56
|
- !ruby/object:Gem::Dependency
|
80
|
-
prerelease: false
|
81
|
-
type: :runtime
|
82
57
|
name: systemu
|
83
|
-
|
84
|
-
none: false
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
85
59
|
requirements:
|
86
|
-
- -
|
60
|
+
- - '>='
|
87
61
|
- !ruby/object:Gem::Version
|
88
62
|
version: 1.2.0
|
89
|
-
|
90
|
-
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
66
|
requirements:
|
92
|
-
- -
|
67
|
+
- - '>='
|
93
68
|
- !ruby/object:Gem::Version
|
94
69
|
version: 1.2.0
|
95
70
|
- !ruby/object:Gem::Dependency
|
96
|
-
prerelease: false
|
97
|
-
type: :runtime
|
98
71
|
name: term-ansicolor
|
99
|
-
|
100
|
-
none: false
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
101
73
|
requirements:
|
102
|
-
- -
|
74
|
+
- - '>='
|
103
75
|
- !ruby/object:Gem::Version
|
104
76
|
version: 1.0.3
|
105
|
-
|
106
|
-
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
80
|
requirements:
|
108
|
-
- -
|
81
|
+
- - '>='
|
109
82
|
- !ruby/object:Gem::Version
|
110
83
|
version: 1.0.3
|
111
84
|
- !ruby/object:Gem::Dependency
|
112
|
-
prerelease: false
|
113
|
-
type: :runtime
|
114
85
|
name: bard-rake
|
115
|
-
|
116
|
-
none: false
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
117
87
|
requirements:
|
118
|
-
- -
|
88
|
+
- - '>='
|
119
89
|
- !ruby/object:Gem::Version
|
120
90
|
version: 0.1.1
|
121
|
-
|
122
|
-
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
94
|
requirements:
|
124
|
-
- -
|
95
|
+
- - '>='
|
125
96
|
- !ruby/object:Gem::Version
|
126
97
|
version: 0.1.1
|
127
98
|
- !ruby/object:Gem::Dependency
|
128
|
-
prerelease: false
|
129
|
-
type: :development
|
130
99
|
name: rspec
|
131
|
-
|
132
|
-
none: false
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
133
101
|
requirements:
|
134
102
|
- - ~>
|
135
103
|
- !ruby/object:Gem::Version
|
136
104
|
version: 1.3.0
|
137
|
-
|
138
|
-
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
108
|
requirements:
|
140
109
|
- - ~>
|
141
110
|
- !ruby/object:Gem::Version
|
142
111
|
version: 1.3.0
|
143
112
|
- !ruby/object:Gem::Dependency
|
144
|
-
prerelease: false
|
145
|
-
type: :development
|
146
113
|
name: cucumber
|
147
|
-
|
148
|
-
none: false
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
149
115
|
requirements:
|
150
116
|
- - ~>
|
151
117
|
- !ruby/object:Gem::Version
|
152
118
|
version: 0.9.0
|
153
|
-
|
154
|
-
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
122
|
requirements:
|
156
123
|
- - ~>
|
157
124
|
- !ruby/object:Gem::Version
|
@@ -189,35 +156,33 @@ files:
|
|
189
156
|
- features/support/grit_ext.rb
|
190
157
|
- features/support/io.rb
|
191
158
|
- lib/bard.rb
|
159
|
+
- lib/bard/base.rb
|
192
160
|
- lib/bard/capistrano.rb
|
193
161
|
- lib/bard/error.rb
|
194
162
|
- lib/bard/git.rb
|
195
|
-
- lib/bard/io.rb
|
196
|
-
- lib/bard/ssh_delegation.rb
|
197
163
|
- spec/bard_spec.rb
|
198
164
|
- spec/spec_helper.rb
|
199
165
|
homepage: https://github.com/botandrose/bard
|
200
166
|
licenses: []
|
167
|
+
metadata: {}
|
201
168
|
post_install_message:
|
202
169
|
rdoc_options: []
|
203
170
|
require_paths:
|
204
171
|
- lib
|
205
172
|
required_ruby_version: !ruby/object:Gem::Requirement
|
206
|
-
none: false
|
207
173
|
requirements:
|
208
|
-
- -
|
174
|
+
- - '>='
|
209
175
|
- !ruby/object:Gem::Version
|
210
176
|
version: '0'
|
211
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
212
|
-
none: false
|
213
178
|
requirements:
|
214
|
-
- -
|
179
|
+
- - '>='
|
215
180
|
- !ruby/object:Gem::Version
|
216
181
|
version: '0'
|
217
182
|
requirements: []
|
218
183
|
rubyforge_project:
|
219
|
-
rubygems_version: 1.
|
184
|
+
rubygems_version: 2.1.10
|
220
185
|
signing_key:
|
221
|
-
specification_version:
|
186
|
+
specification_version: 4
|
222
187
|
summary: Tools for collaborating with Bot and Rose Design.
|
223
188
|
test_files: []
|
data/lib/bard/io.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module BardIO
|
2
|
-
include Term::ANSIColor
|
3
|
-
private
|
4
|
-
|
5
|
-
def warn(message)
|
6
|
-
message = message.new.message if message.superclass == Bard::Error
|
7
|
-
$stderr.puts yellow("! ") + message
|
8
|
-
end
|
9
|
-
|
10
|
-
def fatal(message)
|
11
|
-
raise Bard::Error, red("!!! ") + message
|
12
|
-
end
|
13
|
-
|
14
|
-
def run_crucial(command, verbose = false)
|
15
|
-
status, stdout, stderr = systemu command
|
16
|
-
fatal "Running command: #{yellow(command)}: #{stderr}" if status.to_i.nonzero?
|
17
|
-
if verbose
|
18
|
-
$stdout.puts stdout
|
19
|
-
$stderr.puts stderr
|
20
|
-
end
|
21
|
-
stdout.chomp
|
22
|
-
end
|
23
|
-
|
24
|
-
def project_name
|
25
|
-
@project_name ||= File.expand_path(".").split("/").last
|
26
|
-
end
|
27
|
-
end
|
data/lib/bard/ssh_delegation.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
class Bard < Thor
|
2
|
-
desc "install-authorized-keys", "!!! INTERNAL USE ONLY !!! run as sudo"
|
3
|
-
def install_authorized_keys(source_user, dest_user)
|
4
|
-
source = "/home/#{source_user}/.ssh/authorized_keys"
|
5
|
-
dest = "/home/#{dest_user}/.ssh/authorized_keys"
|
6
|
-
|
7
|
-
file = File.read(source)
|
8
|
-
file.gsub! /gitosis-serve/, "bard delegate"
|
9
|
-
|
10
|
-
File.open(dest, "w") { |f| f.write(file) }
|
11
|
-
end
|
12
|
-
|
13
|
-
desc "delegate", "!!! INTERNAL USER ONLY !!!"
|
14
|
-
def delegate(key)
|
15
|
-
command = ENV['SSH_ORIGINAL_COMMAND']
|
16
|
-
|
17
|
-
case command
|
18
|
-
when /^scp -f (\w+)\.sql\.gz$/
|
19
|
-
project = $1
|
20
|
-
`#{command_for("staging", "cd #{project} && rake db:dump RAILS_ENV=staging && gzip -9f db/data.sql")}`
|
21
|
-
command = "scp -f ~/#{project}/db/data.sql.gz"
|
22
|
-
end
|
23
|
-
|
24
|
-
exec command_for("staging", command)
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def command_for(user, command)
|
29
|
-
%(sudo -H -u #{user} bash -c "cd ~ && #{command}")
|
30
|
-
end
|
31
|
-
end
|