Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

foreman run can run things from the Procfile like heroku run.

  • Loading branch information...
commit e99f3173efd2c33c5124e1296f54d33caa028e1a 1 parent 6c04dab
@dpiddy dpiddy authored
View
11 lib/foreman/cli.rb
@@ -75,10 +75,19 @@ def check
def run(*args)
load_environment!
+
+ if File.exist?(procfile)
+ engine.load_procfile(procfile)
+ end
+
pid = fork do
begin
engine.env.each { |k,v| ENV[k] = v }
- exec args.shelljoin
+ if args.size == 1 && process = engine.process(args.first)
+ process.exec(:env => engine.env)
+ else
+ exec args.shelljoin
+ end
rescue Errno::EACCES
error "not executable: #{args.first}"
rescue Errno::ENOENT
View
39 lib/foreman/process.rb
@@ -21,6 +21,21 @@ def initialize(command, options={})
@options[:env] ||= {}
end
+ # Get environment-expanded command for a +Process+
+ #
+ # @param [Hash] custom_env ({}) Environment variables to merge with defaults
+ #
+ # @return [String] The expanded command
+ #
+ def expanded_command(custom_env={})
+ env = @options[:env].merge(custom_env)
+ expanded_command = command.dup
+ env.each do |key, val|
+ expanded_command.gsub!("$#{key}", val)
+ end
+ expanded_command
+ end
+
# Run a +Process+
#
# @param [Hash] options
@@ -31,16 +46,12 @@ def initialize(command, options={})
# @returns [Fixnum] pid The +pid+ of the process
#
def run(options={})
- env = options[:env] ? @options[:env].merge(options[:env]) : @options[:env]
+ env = @options[:env].merge(options[:env] || {})
output = options[:output] || $stdout
if Foreman.windows?
Dir.chdir(cwd) do
- expanded_command = command.dup
- env.each do |key, val|
- expanded_command.gsub!("$#{key}", val)
- end
- Process.spawn env, expanded_command, :out => output, :err => output
+ Process.spawn env, expanded_command(env), :out => output, :err => output
end
elsif Foreman.jruby?
require "posix/spawn"
@@ -52,7 +63,7 @@ def run(options={})
$stderr.reopen output
env.each { |k,v| ENV[k] = v }
wrapped_command = "#{Foreman.runner} -d '#{cwd}' -p -- #{command}"
- exec wrapped_command
+ Kernel.exec wrapped_command
end
else
wrapped_command = "#{Foreman.runner} -d '#{cwd}' -p -- #{command}"
@@ -60,6 +71,20 @@ def run(options={})
end
end
+ # Exec a +Process+
+ #
+ # @param [Hash] options
+ #
+ # @option options :env ({}) Environment variables to set for this execution
+ #
+ # @return Does not return
+ def exec(options={})
+ env = @options[:env].merge(options[:env] || {})
+ env.each { |k, v| ENV[k] = v }
+ Dir.chdir(cwd)
+ Kernel.exec expanded_command(env)
+ end
+
# Send a signal to this +Process+
#
# @param [String] signal The signal to send
View
4 spec/foreman/cli_spec.rb
@@ -73,6 +73,10 @@
forked_foreman("run #{resource_path("bin/env FOO")} -e #{resource_path(".env")}").should == "bar\n"
end
+ it "can run a command from the Procfile" do
+ forked_foreman("run -f #{resource_path("Procfile")} test").should == "testing\n"
+ end
+
it "exits with the same exit code as the command" do
fork_and_get_exitstatus("run echo 1").should == 0
fork_and_get_exitstatus("run date 'invalid_date'").should == 1
Please sign in to comment.
Something went wrong with that request. Please try again.