Add "exec" action to allow execution of arbitrary commands with the app's environment.
This commit is contained in:
@@ -53,7 +53,18 @@ class Foreman::CLI < Thor
|
|||||||
error "no processes defined" unless engine.procfile.entries.length > 0
|
error "no processes defined" unless engine.procfile.entries.length > 0
|
||||||
display "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
|
display "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "exec COMMAND", "Run a command using your application's environment"
|
||||||
|
|
||||||
|
def exec(*args)
|
||||||
|
engine.apply_environment!
|
||||||
|
Kernel.exec args.join(" ")
|
||||||
|
rescue Errno::EACCES
|
||||||
|
error "not executable: #{args.first}"
|
||||||
|
rescue Errno::ENOENT
|
||||||
|
error "command not found: #{args.first}"
|
||||||
|
end
|
||||||
|
|
||||||
private ######################################################################
|
private ######################################################################
|
||||||
|
|
||||||
def check_procfile!
|
def check_procfile!
|
||||||
|
|||||||
@@ -89,5 +89,54 @@ describe "Foreman::CLI" do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "exec" do
|
||||||
|
describe "with a valid Procfile" do
|
||||||
|
before { write_procfile }
|
||||||
|
|
||||||
|
describe "and a command" do
|
||||||
|
let(:command) { ["ls", "-l"] }
|
||||||
|
|
||||||
|
before(:each) do
|
||||||
|
stub(Kernel).exec
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should load the environment file" do
|
||||||
|
write_env
|
||||||
|
preserving_env do
|
||||||
|
subject.exec *command
|
||||||
|
ENV["FOO"].should == "bar"
|
||||||
|
end
|
||||||
|
|
||||||
|
ENV["FOO"].should be_nil
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should execute the command as a string" do
|
||||||
|
mock(Kernel).exec(command.join(" "))
|
||||||
|
subject.exec *command
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "and a non-existent command" do
|
||||||
|
let(:command) { "iuhtngrglhulhdfg" }
|
||||||
|
|
||||||
|
it "should print an error" do
|
||||||
|
mock_error(subject, "command not found: #{command}") do
|
||||||
|
subject.exec command
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "and a non-executable command" do
|
||||||
|
let(:command) { __FILE__ }
|
||||||
|
|
||||||
|
it "should print an error" do
|
||||||
|
mock_error(subject, "not executable: #{command}") do
|
||||||
|
subject.exec command
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
require "spec_helper"
|
||||||
|
|
||||||
|
describe "spec helpers" do
|
||||||
|
describe "#preserving_env" do
|
||||||
|
after { ENV.delete "FOO" }
|
||||||
|
|
||||||
|
it "should remove added environment vars" do
|
||||||
|
preserving_env { ENV["FOO"] = "baz" }
|
||||||
|
ENV["FOO"].should == nil
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should reset modified environment vars" do
|
||||||
|
ENV["FOO"] = "bar"
|
||||||
|
preserving_env { ENV["FOO"] = "baz"}
|
||||||
|
ENV["FOO"].should == "bar"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -63,6 +63,16 @@ def example_export_file(filename)
|
|||||||
data
|
data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def preserving_env
|
||||||
|
old_env = ENV.to_hash
|
||||||
|
begin
|
||||||
|
yield
|
||||||
|
ensure
|
||||||
|
ENV.clear
|
||||||
|
ENV.update(old_env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
config.color_enabled = true
|
config.color_enabled = true
|
||||||
config.include FakeFS::SpecHelpers
|
config.include FakeFS::SpecHelpers
|
||||||
|
|||||||
Reference in New Issue
Block a user