Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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.