Compare commits

...
70 Commits
Author SHA1 Message Date
David Dollar d86b0bed1f 0.40.0 2012-02-24 11:32:00 -05:00
David Dollar 12f825204b support various quoting styles in .env 2012-02-24 11:31:21 -05:00
David Dollar 62c9d1db45 remove load_env! as it's made unnecessary by foreman run 2012-02-24 11:31:21 -05:00
David Dollar cf5689a77a Merge pull request #155 from rtyler/bug/152-check-exception-no-procfile
Provide a useful error if `foreman check` fails to find a Procfile
2012-02-21 17:40:20 -08:00
R. Tyler Croy c23dbb79af Provide a useful error if foreman check fails to find a Procfile
Fixes #152
2012-02-21 17:27:15 -08:00
David Dollar 7e55d8d3e2 update docs 2012-02-21 11:58:57 -05:00
David Dollar d4f23d45a4 add run to docs 2012-02-21 11:58:52 -05:00
David Dollar 93fa1645e7 update docs 2012-02-21 11:50:11 -05:00
David Dollar 7bdada4a10 update docs 2012-02-21 11:49:57 -05:00
David Dollar 2b47d24ab7 Travis doesn't support cext. Revert "try java again"
This reverts commit 24695348fb.
2012-02-09 19:16:14 -05:00
David Dollar 24695348fb try java again 2012-02-09 19:12:11 -05:00
David Dollar 38b6482af5 changelog 2012-02-07 11:19:12 -05:00
David Dollar 501bc138c5 authors 2012-02-07 11:18:06 -05:00
David Dollar df8c05cd6c 0.39.0 2012-02-07 11:17:59 -05:00
David Dollar edcc4f3567 move to foreman-runner 2012-02-07 11:17:44 -05:00
David Dollar 3759dbb463 fix tgz release 2012-02-07 11:16:07 -05:00
David Dollar b673931c05 Double Revert "Revert "bundle update hpricot""
This reverts commit 137e43b040.
2012-02-04 19:47:48 -05:00
David Dollar 137e43b040 Revert "bundle update hpricot"
This reverts commit 16d4b84a5d.
2012-02-04 19:25:01 -05:00
David Dollar 79211d9bbf Merge pull request #147 from jfirebaugh/rubinius
bundle update hpricot
2012-02-04 14:05:06 -08:00
John Firebaugh 16d4b84a5d bundle update hpricot
0.8.2 doesn't compile on Rubinius; 0.8.6 does.
2012-02-04 13:46:48 -08:00
David Dollar 5ea4537046 remove version from inner pkg 2012-02-02 21:31:58 -05:00
David Dollar d51433ff82 fix foreman pkg builder 2012-02-02 21:08:01 -05:00
David Dollar 54ab74d305 fix release tasks 2012-02-02 17:32:52 -05:00
David Dollar e8b8f34f41 changelog 2012-02-02 17:27:56 -05:00
David Dollar 7535f1d3d8 0.38.0 2012-02-02 17:26:42 -05:00
David Dollar 3af0dfb4ae bring back single process starting 2012-02-02 17:26:25 -05:00
David Dollar 78547b8175 foreman + jruby + travis = nope 2012-02-01 13:24:43 -05:00
David Dollar 976fbc0bb0 stub out proctitle/termtitle 2012-02-01 10:19:33 -05:00
David Dollar 28a9aa774f try ci on jruby 2012-02-01 10:06:25 -05:00
David Dollar 51f5ff3842 latest jruby fixed non-excutable to raise EACCESS 2012-01-31 18:01:53 -05:00
David Dollar e1e18f62bb remove jruby until we figure out what's going on with travis 2012-01-30 11:42:41 -05:00
David Dollar 0a09117328 set JRUBY_OPTS for travis 2012-01-29 23:02:48 -05:00
David Dollar c3df12746f ignore .rbenv-version 2012-01-29 23:02:40 -05:00
David Dollar 2ec6a23fb3 force to binary encoding if supported 2012-01-29 23:02:20 -05:00
David Dollar 0d6b784de1 disable test in jruby 2012-01-29 23:02:10 -05:00
David Dollar 2dcd2c03db wait for process termination instead of sleeping 2012-01-29 23:02:03 -05:00
David Dollar 9d6d0bbb7d add bundler setup to rakefile 2012-01-29 22:45:50 -05:00
David Dollar 89c1314abe try jruby with travis 2012-01-29 22:37:07 -05:00
David Dollar f33211d100 clean up gems 2012-01-29 21:35:51 -05:00
David Dollar 4317079bf3 tweak changelog 2012-01-29 21:29:11 -05:00
David Dollar c745c282c9 update docs 2012-01-29 21:28:49 -05:00
David Dollar 7dca45db57 0.37.2 2012-01-29 21:28:30 -05:00
David Dollar de3c47fe21 handle directories with spaces in runner 2012-01-29 21:28:11 -05:00
David Dollar a8a255db4a update docs 2012-01-29 14:06:09 -05:00
David Dollar 307d63b631 changelog 2012-01-29 14:05:59 -05:00
David Dollar de54f6a5a5 0.37.1 2012-01-29 14:03:45 -05:00
David Dollar 0dff116340 use a 1.8-compatbiel method for IO.pipe 2012-01-29 14:01:13 -05:00
David Dollar e053dc8434 cleanup 2012-01-29 13:58:16 -05:00
David Dollar 20f6ba1563 use binary pipes 2012-01-29 13:56:57 -05:00
David Dollar 557a08ea77 add utf8 test to engine 2012-01-29 13:56:51 -05:00
David Dollar 8eccc819d6 remove nonfunctional utf8 test 2012-01-29 13:56:42 -05:00
David Dollar 347d4a0184 factor out poll_readers 2012-01-29 13:56:35 -05:00
David Dollar 0147f5d284 set up example procfile with utf8 item 2012-01-29 13:56:22 -05:00
David Dollar 1da034ce66 try to add failing test for utf8 2012-01-29 10:03:31 -05:00
David Dollar 5fc7552572 refactor resource_file 2012-01-29 10:03:14 -05:00
David Dollar 083efe3ae9 sleep longer after loading scripts 2012-01-29 10:03:03 -05:00
David Dollar 9d2382a2d2 remove autotest 2012-01-29 02:06:01 -05:00
David Dollar f731daae1a update docs 2012-01-29 01:55:44 -05:00
David Dollar b7f0e3f573 typo 2012-01-29 01:55:14 -05:00
David Dollar e7c523dab7 cleanup 2012-01-29 01:52:30 -05:00
David Dollar 9f4f15a29c update docs 2012-01-29 01:51:52 -05:00
David Dollar b2dc89c50e fix up authors 2012-01-29 01:51:00 -05:00
David Dollar 389bf05800 cleanup 2012-01-29 01:47:05 -05:00
David Dollar a632a62efd update docs 2012-01-29 01:45:57 -05:00
David Dollar 2edf6e1c68 pedantry 2012-01-29 01:41:21 -05:00
David Dollar 56158e881b add changelog 2012-01-29 01:40:36 -05:00
David Dollar 6b5ed495d5 fix up packaging after moving tasks 2012-01-29 01:38:21 -05:00
David Dollar 9652c285f1 fix up changelog task 2012-01-29 01:32:20 -05:00
David Dollar ba171cc10d curate changelog 2012-01-29 01:26:21 -05:00
David Dollar ebb191adba better changelog task 2012-01-29 01:26:14 -05:00
31 changed files with 357 additions and 326 deletions
+1
View File
@@ -1,4 +1,5 @@
/.bundle /.bundle
/.rbenv-version
/coverage /coverage
/example/log/* /example/log/*
/man/*.html /man/*.html
+146 -169
View File
@@ -1,190 +1,167 @@
## 0.37.0.pre5 2012-01-24 9632227 ## 0.39.0 (2012-02-07)
0.37.0.pre5 [David Dollar]
Merge pull request #142 from apollo13/master [David Dollar]
rename readme [David Dollar]
Fix the test for an empty string in bin/runner [Florian Apolloner]
## 0.37.0.pre4 2012-01-24 a040324 * rename bin/runner to bin/foreman-runner [David Dollar]
0.37.0.pre4 [David Dollar] * fix tgz release [David Dollar]
Merge pull request #130 from clowder/foreman [David Dollar] * bundle update hpricot [John Firebaugh]
Don't expose the options hash. [Chris Lowder] * touch up .pkg release tasks [David Dollar]
Simplify subclassing by adding all arguments to the initializer. Also, clean up the method signatures for existing exporters. [Chris Lowder]
Add ZenTest as a development dependency, there is an autotest folder but the gem is missing. [Chris Lowder]
Attempt to require the custom export class. [Chris Lowder]
Catching more than we need to. [Chris Lowder]
Extract commonality into the base class, make life easy for our plugin writers. [Chris Lowder]
Removing the hard coding of export formats allowing the user to 'plug-in' their own export format. [Chris Lowder]
Update README.markdown [David Dollar]
Revert "try on more rubies" [David Dollar]
try on more rubies [David Dollar]
fix webhook url [David Dollar]
Update README.markdown [David Dollar]
Update README.markdown [David Dollar]
ensure we have non-nil data, fixes #111 [David Dollar]
make sure error method exists. fixes #104 [David Dollar]
Merge pull request #136 from fnichol/foreman [David Dollar]
remove other from install instructions [David Dollar]
cleanup [David Dollar]
Revert "tweak authors" [David Dollar]
tweak authors [David Dollar]
fix authors [David Dollar]
readme tweaks [David Dollar]
readme tweaks [David Dollar]
fix up authors [David Dollar]
Update README.markdown [David Dollar]
fix up specs [David Dollar]
we're not chdiring any more [David Dollar]
use strings rather than symbols to better emulate the real thing [David Dollar]
Merge pull request #139 from brainopia/foreman [David Dollar]
Add specs for Foreman::Process#run [brainopia]
Implement Foreman::Process#kill,detach,alive?,dead? [brainopia]
- Use explicit fakefs tag in specs - Clean up trailing whitespace [brainopia]
Simplify Foreman::Process#with_environment [brainopia]
Add specs for options of Foreman::Process#run [brainopia]
Add specs for initialization of Foreman::Process [brainopia]
runit creates a full path to export directory. [Fletcher Nichol]
## 0.37.0.pre3 2012-01-22 51eee01 ## 0.38.0 (2012-02-02)
0.37.0.pre3 [David Dollar]
normalize platform names [David Dollar]
windows support [David Dollar]
add windows support [David Dollar]
dont need pty [David Dollar]
fix specs [David Dollar]
## 0.37.0.pre2 2012-01-22 2995a60 * bring back single process starting [David Dollar]
0.37.0.pre2 [David Dollar] * more attempts at getting ci working with jruby [David Dollar]
0.37.0.pre1 [David Dollar] * ignore .rbenv-version [David Dollar]
remove unnecessary stdout/stderr flattening [David Dollar] * force to binary encoding if supported [David Dollar]
use PLATFORM=jruby instead of JRUBY=true [David Dollar]
## 0.37.0.pre1 2012-01-22 3e98170 ## 0.37.2 (2012-01-29)
fix java build bug [David Dollar]
dont do rubygems/bundler in the Rakefile [David Dollar]
switch to posix-spawn for jruby [David Dollar]
add jruby build [David Dollar]
spork is in the gemspec now [David Dollar]
remove debugging [David Dollar]
move the spoon require into the jruby branch [David Dollar]
pass basedir along to the runner script [David Dollar]
beef up the runner script to allow a working directory to be set [David Dollar]
Merge pull request #140 from jc00ke/foreman [David Dollar]
Move spoon dep to Gemfile [jc00ke]
Using spoon for JRuby support [jc00ke]
use default bucket for storage [David Dollar]
Merge pull request #138 from technomancy/debian [David Dollar]
Add Debian packaging. [Phil Hagelberg]
Ignore vendor dir. [Phil Hagelberg]
## 0.36.1 2012-01-18 1485eeb * handle directories with spaces in runner [David Dollar]
0.36.1 [David Dollar] * update docs [David Dollar]
bump term-ansicolor in gemspec [David Dollar]
## 0.36.0 2012-01-17 a73dce5 ## 0.37.1 (2012-01-29)
0.36.0 [David Dollar]
sync the writer stream [David Dollar]
capture stderr as well [David Dollar]
## 0.35.0 2012-01-16 2bfc065 * use binary pipes to better handle UTF-8 data [David Dollar]
update rake [David Dollar] * set up example procfile with UTF-8 item [David Dollar]
0.35.0 [David Dollar] * remove autotest [David Dollar]
Merge pull request #132 from Viximo/feature/concurrency [David Dollar] * fix up authors generation [David Dollar]
Fix export specs [Matt Griffin] * fix up packaging after moving tasks [David Dollar]
Merge branch 'master' of https://github.com/michaeldwan/foreman into feature/concurrency [Matt Griffin] * fix up changelog tasks [David Dollar]
default process concurrency is 0 when concurrency options specified, otherwise default concurrency is 1 [Michael Dwan]
## 0.34.1 2012-01-16 d4c2332 ## 0.37.0 (2012-01-29)
0.34.1 [David Dollar]
fix missing start desc [David Dollar]
## 0.34.0 2012-01-16 a278755 * put an entire line of output inside a single mutex so we don't cross the streams [David Dollar]
0.34.0 [David Dollar] * fix race condition with process termination [David Dollar]
update man page [David Dollar] * allow external custom exporters [Chris Lowder]
update docs for -d [David Dollar] * fix the test for an empty string in bin/runner [Florian Apolloner]
Merge pull request #101 from ndbroadbent/foreman [David Dollar] * ensure we have non-nil data, fixes #111 [David Dollar]
Wrap around to the first colour when all the colours are used [Craig R Webster] * make sure error method exists, fixes #104 [David Dollar]
run specs in random order [David Dollar] * clean up chdir usage [David Dollar]
update rspec [David Dollar] * normalize platform names [David Dollar]
pedantry [David Dollar] * add windows support [David Dollar]
Set executable bit on runit run scripts. [Matthijs Langenberg] * add jruby support [David Dollar]
Merge pull request #114 from gburt/master [David Dollar] * pass basedir along to the runner script [David Dollar]
add more colors [Gabriel Burt] * harden runner script [David Dollar]
Added option to specify app_root, if executing a Procfile from a shared location [Nathan Broadbent] * add many missing specs [brainopia]
* clean up fakefs usage in specs [brainopia]
* runit creates a full path to export directory. [Fletcher Nichol]
## 0.33.1 2012-01-16 533139e ## 0.36.1 (2012-01-18)
0.33.1 [David Dollar]
Merge pull request #129 from fnichol/resolve-home-template [David Dollar]
Expand template path under user's home directory. [Fletcher Nichol]
## 0.33.0 2012-01-15 cf269c3 * 0.36.1 [David Dollar]
0.33.0 [David Dollar] * bump term-ansicolor in gemspec [David Dollar]
Revert "Merge pull request #125 from brainopia/master" [David Dollar]
## 0.32.0 2012-01-12 83748cb ## 0.36.0 (2012-01-17)
0.32.0 [David Dollar]
Merge pull request #125 from brainopia/master [David Dollar]
Merge pull request #121 from Viximo/feature/run [David Dollar]
Return some whitespace that was accidentally removed [Matt Griffin]
Steal the run method back from Thor so that it can be used in place for exec for running commands in the foreman environment. [Matt Griffin]
Remove old cruft [brainopia]
In case someone wants to use bin/runner directly [brainopia]
Fix for double fork [brainopia]
Use ruby exec which works with escaped cmd and replaces shell [brainopia]
Fix foreman to work with cmds containing pipes and redirects [brainopia]
Add "exec" action to allow execution of arbitrary commands with the app's environment. [Matt Griffin]
tweak readme [David Dollar]
## 0.31.0 2012-01-04 342d30b * 0.36.0 [David Dollar]
0.31.0 [David Dollar] * sync the writer stream [David Dollar]
make fork more robust [David Dollar] * capture stderr as well [David Dollar]
remove unnecessary debug [David Dollar]
add more information when shutting down [David Dollar]
Merge pull request #110 from lstoll/master [David Dollar]
Use different port ranges for each process type [Lincoln Stoll]
## 0.30.1 2011-12-23 fcfa913 ## 0.35.0 (2012-01-16)
0.30.1 [David Dollar]
require thread for mutex [David Dollar]
## 0.30.0 2011-12-22 fc95936 * update rake [David Dollar]
0.30.0 [David Dollar] * 0.35.0 [David Dollar]
compatibility with ruby 1.8 [David Dollar] * Merge pull request #132 from Viximo/feature/concurrency [David Dollar]
* Fix export specs [Matt Griffin]
* Merge branch 'master' of https://github.com/michaeldwan/foreman into feature/concurrency [Matt Griffin]
* default process concurrency is 0 when concurrency options specified, otherwise default concurrency is 1 [Michael Dwan]
## 0.29.0 2011-12-22 356c61f ## 0.34.1 (2012-01-16)
0.29.0 [David Dollar]
## 0.28.0.pre2 2011-12-08 dcff4da * 0.34.1 [David Dollar]
0.28.0.pre2 [David Dollar] * fix missing start desc [David Dollar]
fix pipe error [David Dollar]
## 0.28.0.pre1 2011-12-08 c7b6b33 ## 0.34.0 (2012-01-16)
0.28.0.pre1 [David Dollar]
Merge branch 'fork' [David Dollar]
wip [David Dollar]
wip [David Dollar]
wip [David Dollar]
wip [David Dollar]
wip [David Dollar]
## 0.27.0 2011-12-05 914a1ee * 0.34.0 [David Dollar]
0.27.0 [David Dollar] * update man page [David Dollar]
add changelog [David Dollar] * update docs for -d [David Dollar]
Merge pull request #103 from csquared/load_env_from_irb [David Dollar] * Merge pull request #101 from ndbroadbent/foreman [David Dollar]
refactor load_env to apply_environment [Chris Continanza] * Wrap around to the first colour when all the colours are used [Craig R Webster]
rename load! to load_env! [Chris Continanza] * run specs in random order [David Dollar]
use ./.env as default [Chris Continanza] * update rspec [David Dollar]
load contents from env file [Chris Continanza] * pedantry [David Dollar]
refactor engine to expose env methods [Chris Continanza] * Set executable bit on runit run scripts. [Matthijs Langenberg]
disable email notifications [David Dollar] * Merge pull request #114 from gburt/master [David Dollar]
add travis config [David Dollar] * add more colors [Gabriel Burt]
* Added option to specify app_root, if executing a Procfile from a shared location [Nathan Broadbent]
## 0.26.1 2011-12-05 a5e0943 ## 0.33.1 (2012-01-16)
Merge pull request #103 from csquared/load_env_from_irb [David Dollar] * 0.33.1 [David Dollar]
refactor load_env to apply_environment [Chris Continanza] * Merge pull request #129 from fnichol/resolve-home-template [David Dollar]
rename load! to load_env! [Chris Continanza] * Expand template path under user's home directory. [Fletcher Nichol]
use ./.env as default [Chris Continanza]
load contents from env file [Chris Continanza] ## 0.33.0 (2012-01-15)
refactor engine to expose env methods [Chris Continanza]
disable email notifications [David Dollar] * 0.33.0 [David Dollar]
add travis config [David Dollar] * Revert "Merge pull request #125 from brainopia/master" [David Dollar]
## 0.32.0 (2012-01-12)
* 0.32.0 [David Dollar]
* Merge pull request #125 from brainopia/master [David Dollar]
* Merge pull request #121 from Viximo/feature/run [David Dollar]
* Return some whitespace that was accidentally removed [Matt Griffin]
* Steal the run method back from Thor so that it can be used in place for exec for running commands in the foreman environment. [Matt Griffin]
* Remove old cruft [brainopia]
* In case someone wants to use bin/runner directly [brainopia]
* Fix for double fork [brainopia]
* Use ruby exec which works with escaped cmd and replaces shell [brainopia]
* Fix foreman to work with cmds containing pipes and redirects [brainopia]
* Add "exec" action to allow execution of arbitrary commands with the app's environment. [Matt Griffin]
* tweak readme [David Dollar]
## 0.31.0 (2012-01-04)
* 0.31.0 [David Dollar]
* make fork more robust [David Dollar]
* remove unnecessary debug [David Dollar]
* add more information when shutting down [David Dollar]
* Merge pull request #110 from lstoll/master [David Dollar]
* Use different port ranges for each process type [Lincoln Stoll]
## 0.30.1 (2011-12-23)
* 0.30.1 [David Dollar]
* require thread for mutex [David Dollar]
## 0.30.0 (2011-12-22)
* 0.30.0 [David Dollar]
* compatibility with ruby 1.8 [David Dollar]
## 0.29.0 (2011-12-22)
* 0.29.0 [David Dollar]
* 0.28.0.pre2 [David Dollar]
* fix pipe error [David Dollar]
* 0.28.0.pre1 [David Dollar]
* Merge branch 'fork' [David Dollar]
* wip [David Dollar]
* wip [David Dollar]
* wip [David Dollar]
* wip [David Dollar]
* wip [David Dollar]
## 0.27.0 (2011-12-05)
* 0.27.0 [David Dollar]
* add changelog [David Dollar]
* Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
* refactor load_env to apply_environment [Chris Continanza]
* rename load! to load_env! [Chris Continanza]
* use ./.env as default [Chris Continanza]
* load contents from env file [Chris Continanza]
* refactor engine to expose env methods [Chris Continanza]
* disable email notifications [David Dollar]
* add travis config [David Dollar]
## 0.26.1 2011-12-05
* Merge pull request #103 from csquared/load_env_from_irb [David Dollar]
* refactor load_env to apply_environment [Chris Continanza]
* rename load! to load_env! [Chris Continanza]
* use ./.env as default [Chris Continanza]
* load contents from env file [Chris Continanza]
* refactor engine to expose env methods [Chris Continanza]
* disable email notifications [David Dollar]
* add travis config [David Dollar]
+1 -3
View File
@@ -11,14 +11,12 @@ platform :jruby do
end end
group :development do group :development do
gem 'aws-s3'
gem 'parka' gem 'parka'
gem 'rake' gem 'rake'
gem 'ronn' gem 'ronn'
gem 'fakefs', '~> 0.3.2' gem 'fakefs', '~> 0.3.2'
gem 'rr', '~> 1.0.2' gem 'rr', '~> 1.0.2'
gem 'rspec', '~> 2.0' gem 'rspec', '~> 2.0'
gem 'ZenTest'
gem 'aws-s3'
gem "rubyzip"
gem "simplecov", :require => false gem "simplecov", :require => false
end end
+3 -7
View File
@@ -1,14 +1,13 @@
PATH PATH
remote: . remote: .
specs: specs:
foreman (0.37.0) foreman (0.40.0)
term-ansicolor (~> 1.0.7) term-ansicolor (~> 1.0.7)
thor (>= 0.13.6) thor (>= 0.13.6)
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
ZenTest (4.6.2)
aws-s3 (0.6.2) aws-s3 (0.6.2)
builder builder
mime-types mime-types
@@ -17,8 +16,8 @@ GEM
crack (0.1.8) crack (0.1.8)
diff-lcs (1.1.3) diff-lcs (1.1.3)
fakefs (0.3.2) fakefs (0.3.2)
hpricot (0.8.2) hpricot (0.8.6)
hpricot (0.8.2-java) hpricot (0.8.6-java)
mime-types (1.16) mime-types (1.16)
multi_json (1.0.4) multi_json (1.0.4)
mustache (0.11.2) mustache (0.11.2)
@@ -44,7 +43,6 @@ GEM
rspec-expectations (2.8.0) rspec-expectations (2.8.0)
diff-lcs (~> 1.1.2) diff-lcs (~> 1.1.2)
rspec-mocks (2.8.0) rspec-mocks (2.8.0)
rubyzip (0.9.4)
simplecov (0.5.4) simplecov (0.5.4)
multi_json (~> 1.0.3) multi_json (~> 1.0.3)
simplecov-html (~> 0.5.3) simplecov-html (~> 0.5.3)
@@ -60,7 +58,6 @@ PLATFORMS
x86-mingw32 x86-mingw32
DEPENDENCIES DEPENDENCIES
ZenTest
aws-s3 aws-s3
fakefs (~> 0.3.2) fakefs (~> 0.3.2)
foreman! foreman!
@@ -70,6 +67,5 @@ DEPENDENCIES
ronn ronn
rr (~> 1.0.2) rr (~> 1.0.2)
rspec (~> 2.0) rspec (~> 2.0)
rubyzip
simplecov simplecov
win32console (~> 1.3.0) win32console (~> 1.3.0)
+2 -1
View File
@@ -25,6 +25,7 @@ Manage Procfile-based applications
* [man page](http://ddollar.github.com/foreman) * [man page](http://ddollar.github.com/foreman)
* [wiki](http://github.com/ddollar/foreman/wiki) * [wiki](http://github.com/ddollar/foreman/wiki)
* [changelog](https://github.com/ddollar/foreman/blob/master/Changelog.md)
## Authors ## Authors
@@ -32,7 +33,7 @@ Manage Procfile-based applications
David Dollar David Dollar
#### Patches contributed by #### Patches contributed by
Adam Wiggins, Chris Continanza, Chris Lowder, Craig R Webster, Dan Farina, Dan Peterson, David Dollar, Fletcher Nichol, Gabriel Burt, Gamaliel Toro, Greg Reinacker, Hugues Le Gendre, Hunter Nield, Iain Hecker, Jay Zeschin, Keith Rarick, Khaja Minhajuddin, Lincoln Stoll, Marcos Muino Garcia, Mark McGranaghan, Matt Griffin, Matt Haynes, Matthijs Langenberg, Michael Dwan, Michael van Rooijen, Mike Javorski, Nathan Broadbent, Nathan L Smith, Nick Zadrozny, Phil Hagelberg, Ricardo Chimal, Jr, Thom May, Tom Ward, brainopia, clifff, jc00ke Adam Wiggins, Chris Continanza, Chris Lowder, Craig R Webster, Dan Farina, Dan Peterson, David Dollar, Fletcher Nichol, Florian Apolloner, Gabriel Burt, Gamaliel Toro, Greg Reinacker, Hugues Le Gendre, Hunter Nield, Iain Hecker, Jay Zeschin, John Firebaugh, Keith Rarick, Khaja Minhajuddin, Lincoln Stoll, Marcos Muino Garcia, Mark McGranaghan, Matt Griffin, Matt Haynes, Matthijs Langenberg, Michael Dwan, Michael van Rooijen, Mike Javorski, Nathan Broadbent, Nathan L Smith, Nick Zadrozny, Phil Hagelberg, Ricardo Chimal, Jr, Thom May, Tom Ward, brainopia, clifff, jc00ke
## License ## License
+2
View File
@@ -1,6 +1,8 @@
$:.unshift File.expand_path("../lib", __FILE__) $:.unshift File.expand_path("../lib", __FILE__)
require "foreman" require "foreman"
require "bundler/setup"
Dir[File.expand_path("../tasks/*.rake", __FILE__)].each do |task| Dir[File.expand_path("../tasks/*.rake", __FILE__)].each do |task|
load task load task
end end
-1
View File
@@ -1 +0,0 @@
Autotest.add_discovery { "rspec2" }
+2 -2
View File
@@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
# #
#/ Usage: runner [-d <dir>] <command> #/ Usage: foreman-runner [-d <dir>] <command>
#/ #/
#/ Run a command with exec, optionally changing directory first #/ Run a command with exec, optionally changing directory first
@@ -18,7 +18,7 @@ usage() {
while getopts ":hd:" OPT; do while getopts ":hd:" OPT; do
case $OPT in case $OPT in
d) cd $OPTARG ;; d) cd "$OPTARG" ;;
h) usage ;; h) usage ;;
\?) error "invalid option: -$OPTARG" ;; \?) error "invalid option: -$OPTARG" ;;
:) error "option -$OPTARG requires an argument" ;; :) error "option -$OPTARG requires an argument" ;;
+1
View File
@@ -1,2 +1,3 @@
ticker: ruby ./ticker $PORT ticker: ruby ./ticker $PORT
error: ruby ./error error: ruby ./error
utf8: ruby ./utf8
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env ruby
# encoding: BINARY
$stdout.sync = true
while true
puts "\u65e5\u672c\u8a9e\u6587\u5b57\u5217"
puts "\u0915\u0932\u094d\u0907\u0928\u0643\u0637\u0628\u041a\u0430\u043b\u0438\u043d\u0430"
puts "\xff\x03"
sleep 1
end
+1 -1
View File
@@ -4,7 +4,7 @@ file pkg("/apt-#{version}/foreman-#{version}.deb") => distribution_files("deb")
assemble_distribution assemble_distribution
assemble_gems assemble_gems
assemble resource("deb/foreman"), "bin/foreman", 0755 assemble resource("deb/foreman"), "bin/foreman", 0755
File.chmod 0755, "bin/runner" File.chmod 0755, "bin/foreman-runner"
end end
assemble resource("deb/control"), "control" assemble resource("deb/control"), "control"
+3 -1
View File
@@ -1,5 +1,7 @@
file pkg("foreman-#{version}-jruby.gem") => distribution_files do |t| file pkg("foreman-#{version}-jruby.gem") => distribution_files do |t|
sh "env PLATFORM=java gem build foreman.gemspec" Bundler.with_clean_env do
sh "env PLATFORM=java gem build foreman.gemspec"
end
sh "mv foreman-#{version}-java.gem #{t.name}" sh "mv foreman-#{version}-java.gem #{t.name}"
end end
+3 -1
View File
@@ -1,5 +1,7 @@
file pkg("foreman-#{version}-mingw32.gem") => distribution_files do |t| file pkg("foreman-#{version}-mingw32.gem") => distribution_files do |t|
sh "env PLATFORM=mingw32 gem build foreman.gemspec" Bundler.with_clean_env do
sh "env PLATFORM=mingw32 gem build foreman.gemspec"
end
sh "mv foreman-#{version}-mingw32.gem #{t.name}" sh "mv foreman-#{version}-mingw32.gem #{t.name}"
end end
+8 -7
View File
@@ -13,7 +13,7 @@ file pkg("foreman-#{version}.pkg") => distribution_files do |t|
mkdir_p "pkg" mkdir_p "pkg"
mkdir_p "pkg/Resources" mkdir_p "pkg/Resources"
mkdir_p "pkg/foreman-#{version}.pkg" mkdir_p "pkg/foreman.pkg"
dist = File.read(resource("pkg/Distribution.erb")) dist = File.read(resource("pkg/Distribution.erb"))
dist = ERB.new(dist).result(binding) dist = ERB.new(dist).result(binding)
@@ -21,20 +21,21 @@ file pkg("foreman-#{version}.pkg") => distribution_files do |t|
dist = File.read(resource("pkg/PackageInfo.erb")) dist = File.read(resource("pkg/PackageInfo.erb"))
dist = ERB.new(dist).result(binding) dist = ERB.new(dist).result(binding)
File.open("pkg/foreman-#{version}.pkg/PackageInfo", "w") { |f| f.puts dist } File.open("pkg/foreman.pkg/PackageInfo", "w") { |f| f.puts dist }
mkdir_p "pkg/foreman-#{version}.pkg/Scripts" mkdir_p "pkg/foreman.pkg/Scripts"
cp resource("pkg/postinstall"), "pkg/foreman-#{version}.pkg/Scripts/postinstall" cp resource("pkg/postinstall"), "pkg/foreman.pkg/Scripts/postinstall"
chmod 0755, "pkg/foreman-#{version}.pkg/Scripts/postinstall" chmod 0755, "pkg/foreman.pkg/Scripts/postinstall"
sh %{ mkbom -s foreman pkg/foreman-#{version}.pkg/Bom } sh %{ mkbom -s foreman pkg/foreman.pkg/Bom }
Dir.chdir("foreman") do Dir.chdir("foreman") do
sh %{ pax -wz -x cpio . > ../pkg/foreman-#{version}.pkg/Payload } sh %{ pax -wz -x cpio . > ../pkg/foreman.pkg/Payload }
end end
sh %{ pkgutil --flatten pkg foreman-#{version}.pkg } sh %{ pkgutil --flatten pkg foreman-#{version}.pkg }
FileUtils.mkdir_p(File.dirname(t.name))
cp_r "foreman-#{version}.pkg", t.name cp_r "foreman-#{version}.pkg", t.name
end end
end end
+3 -3
View File
@@ -10,14 +10,14 @@
]]></script> ]]></script>
<choices-outline> <choices-outline>
<line choice="git"/> <line choice="git"/>
<line choice="foreman-<%= version %>"/> <line choice="foreman"/>
</choices-outline> </choices-outline>
<choice id="git" title="git" start_selected="false" start_enabled="false" selected="needs_git()" enabled="needs_git()"> <choice id="git" title="git" start_selected="false" start_enabled="false" selected="needs_git()" enabled="needs_git()">
<pkg-ref id="git.pkg" /> <pkg-ref id="git.pkg" />
</choice> </choice>
<choice id="foreman-<%= version %>" title="foreman"> <choice id="foreman" title="foreman">
<pkg-ref id="io.foreman.installer"/> <pkg-ref id="io.foreman.installer"/>
</choice> </choice>
<pkg-ref id="io.foreman.installer" installKBytes="<%= kbytes %>" version="<%= version %>" auth="Root">#foreman-<%= version %>.pkg</pkg-ref> <pkg-ref id="io.foreman.installer" installKBytes="<%= kbytes %>" version="<%= version %>" auth="Root">#foreman.pkg</pkg-ref>
</installer-script> </installer-script>
-1
View File
@@ -4,4 +4,3 @@
<postinstall file="./postinstall"/> <postinstall file="./postinstall"/>
</scripts> </scripts>
</pkg-info> </pkg-info>
+1 -1
View File
@@ -3,7 +3,7 @@ file pkg("foreman-#{version}.tgz") => distribution_files do |t|
mkchdir("foreman") do mkchdir("foreman") do
assemble_distribution assemble_distribution
assemble_gems assemble_gems
rm_rf "bin" rm_f "bin/foreman"
assemble resource("tgz/foreman"), "foreman", 0755 assemble resource("tgz/foreman"), "foreman", 0755
end end
+1 -7
View File
@@ -4,14 +4,8 @@ module Foreman
class AppDoesNotExist < Exception; end class AppDoesNotExist < Exception; end
# load contents of env_file into ENV
def self.load_env!(env_file = './.env')
require 'foreman/engine'
Foreman::Engine.load_env!(env_file)
end
def self.runner def self.runner
File.expand_path("../../bin/runner", __FILE__) File.expand_path("../../bin/foreman-runner", __FILE__)
end end
def self.jruby? def self.jruby?
+4 -2
View File
@@ -10,7 +10,7 @@ class Foreman::CLI < Thor
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile" class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
desc "start", "Start the application" desc "start [PROCESS]", "Start the application (or a specific PROCESS)"
class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile" class_option :procfile, :type => :string, :aliases => "-f", :desc => "Default: Procfile"
class_option :app_root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory" class_option :app_root, :type => :string, :aliases => "-d", :desc => "Default: Procfile directory"
@@ -27,8 +27,9 @@ class Foreman::CLI < Thor
end end
end end
def start def start(process=nil)
check_procfile! check_procfile!
engine.options[:concurrency] = "#{process}=1" if process
engine.start engine.start
end end
@@ -53,6 +54,7 @@ class Foreman::CLI < Thor
desc "check", "Validate your application's Procfile" desc "check", "Validate your application's Procfile"
def check def check
check_procfile!
error "no processes defined" unless engine.procfile.entries.length > 0 error "no processes defined" unless engine.procfile.entries.length > 0
puts "valid procfile detected (#{engine.procfile.process_names.join(', ')})" puts "valid procfile detected (#{engine.procfile.process_names.join(', ')})"
end end
+42 -48
View File
@@ -10,6 +10,7 @@ require "thread"
class Foreman::Engine class Foreman::Engine
attr_reader :environment
attr_reader :procfile attr_reader :procfile
attr_reader :directory attr_reader :directory
attr_reader :options attr_reader :options
@@ -23,16 +24,11 @@ class Foreman::Engine
def initialize(procfile, options={}) def initialize(procfile, options={})
@procfile = Foreman::Procfile.new(procfile) @procfile = Foreman::Procfile.new(procfile)
@directory = options[:app_root] || File.expand_path(File.dirname(procfile)) @directory = options[:app_root] || File.expand_path(File.dirname(procfile))
@options = options @options = options.dup
@environment = read_environment_files(options[:env]) @environment = read_environment_files(options[:env])
@output_mutex = Mutex.new @output_mutex = Mutex.new
end end
def self.load_env!(env_file)
@environment = read_environment_files(env_file)
apply_environment!
end
def start def start
proctitle "ruby: foreman master" proctitle "ruby: foreman master"
termtitle "#{File.basename(@directory)} - foreman" termtitle "#{File.basename(@directory)} - foreman"
@@ -52,13 +48,17 @@ class Foreman::Engine
base_port.to_i + offset + num - 1 base_port.to_i + offset + num - 1
end end
def apply_environment!
environment.each { |k,v| ENV[k] = v }
end
private ###################################################################### private ######################################################################
def spawn_processes def spawn_processes
concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency]) concurrency = Foreman::Utils.parse_concurrency(@options[:concurrency])
procfile.entries.each do |entry| procfile.entries.each do |entry|
reader, writer = IO.pipe reader, writer = (IO.method(:pipe).arity == 0 ? IO.pipe : IO.pipe("BINARY"))
entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process| entry.spawn(concurrency[entry.name], writer, @directory, @environment, port_for(entry, 1, base_port)).each do |process|
running_processes[process.pid] = process running_processes[process.pid] = process
readers[process] = reader readers[process] = reader
@@ -94,19 +94,24 @@ private ######################################################################
kill_all "SIGKILL" kill_all "SIGKILL"
end end
def poll_readers
rs, ws = IO.select(readers.values, [], [], 1)
(rs || []).each do |r|
data = r.gets
next unless data
data.force_encoding("BINARY") if data.respond_to?(:force_encoding)
ps, message = data.split(",", 2)
color = colors[ps.split(".").first]
info message, ps, color
end
end
def watch_for_output def watch_for_output
Thread.new do Thread.new do
require "win32console" if Foreman.windows? require "win32console" if Foreman.windows?
begin begin
loop do loop do
rs, ws = IO.select(readers.values, [], [], 1) poll_readers
(rs || []).each do |r|
data = r.gets
next unless data
ps, message = data.split(",", 2)
color = colors[ps.split(".").first]
info message, ps, color
end
end end
rescue Exception => ex rescue Exception => ex
puts ex.message puts ex.message
@@ -193,42 +198,31 @@ private ######################################################################
COLORS[@current_color] COLORS[@current_color]
end end
module Env def read_environment_files(filenames)
attr_reader :environment environment = {}
def read_environment_files(filenames) (filenames || "").split(",").map(&:strip).each do |filename|
environment = {} error "No such file: #{filename}" unless File.exists?(filename)
environment.merge!(read_environment(filename))
(filenames || "").split(",").map(&:strip).each do |filename|
error "No such file: #{filename}" unless File.exists?(filename)
environment.merge!(read_environment(filename))
end
environment.merge!(read_environment(".env")) unless filenames
environment
end end
def read_environment(filename) environment.merge!(read_environment(".env")) unless filenames
return {} unless File.exists?(filename) environment
File.read(filename).split("\n").inject({}) do |hash, line|
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
hash[$1] = $2
end
hash
end
end
def apply_environment!
@environment.each { |k,v| ENV[k] = v }
end
def error(message)
puts "ERROR: #{message}"
exit 1
end
end end
include Env def read_environment(filename)
extend Env return {} unless File.exists?(filename)
File.read(filename).split("\n").inject({}) do |hash, line|
if line =~ /\A([A-Za-z_0-9]+)=(.*)\z/
key, val = [$1, $2]
case val
when /\A'(.*)'\z/ then hash[key] = $1
when /\A"(.*)"\z/ then hash[key] = $1.gsub(/\\(.)/, '\1')
else hash[key] = val
end
end
hash
end
end
end end
+1 -1
View File
@@ -1,5 +1,5 @@
module Foreman module Foreman
VERSION = "0.37.0" VERSION = "0.40.0"
end end
+13 -3
View File
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3
. .
.TH "FOREMAN" "1" "January 2012" "Foreman 0.33.1" "Foreman Manual" .TH "FOREMAN" "1" "February 2012" "Foreman 0.39.0" "Foreman Manual"
. .
.SH "NAME" .SH "NAME"
\fBforeman\fR \- manage Procfile\-based applications \fBforeman\fR \- manage Procfile\-based applications
@@ -10,10 +10,13 @@
\fBforeman start [process]\fR \fBforeman start [process]\fR
. .
.br .br
\fBforeman run <command>\fR
.
.br
\fBforeman export <format> [location]\fR \fBforeman export <format> [location]\fR
. .
.SH "DESCRIPTION" .SH "DESCRIPTION"
\fBForeman\fR is a manager for Procfile\-based applications\. Its aim is to abstract away the details of the Procfile format, and allow you to either run your application directly or export it to some other process management format\. Foreman is a manager for Procfile\-based applications\. Its aim is to abstract away the details of the Procfile format, and allow you to either run your application directly or export it to some other process management format\.
. .
.SH "RUNNING" .SH "RUNNING"
\fBforeman start\fR is used to run your application directly from the command line\. \fBforeman start\fR is used to run your application directly from the command line\.
@@ -35,6 +38,9 @@ Specify the number of each process type to run\. The value passed in should be i
\fB\-p\fR, \fB\-\-port\fR \fB\-p\fR, \fB\-\-port\fR
Specify which port to use as the base for this application\. Should be a multiple of 1000\. Specify which port to use as the base for this application\. Should be a multiple of 1000\.
. .
.P
\fBforeman run\fR is used to run one\-off commands using the same environment as your defined processes\.
.
.SH "EXPORTING" .SH "EXPORTING"
\fBforeman export\fR is used to export your application to another process management format\. \fBforeman export\fR is used to export your application to another process management format\.
. .
@@ -61,10 +67,14 @@ Specify the directory to place process logs in\.
Specify which port to use as the base for this application\. Should be a multiple of 1000\. Specify which port to use as the base for this application\. Should be a multiple of 1000\.
. .
.TP .TP
\fB\-t\fR, \fB\-\-template\fR
Specify an alternate template to use for creating export files\. See \fIhttps://github\.com/ddollar/foreman/tree/master/data/export\fR for examples\.
.
.TP
\fB\-u\fR, \fB\-\-user\fR \fB\-u\fR, \fB\-\-user\fR
Specify the user the application should be run as\. Defaults to the app name Specify the user the application should be run as\. Defaults to the app name
. .
.SH "OPTIONS" .SH "GLOBAL OPTIONS"
These options control all modes of foreman\'s operation\. These options control all modes of foreman\'s operation\.
. .
.TP .TP
+10 -2
View File
@@ -4,11 +4,12 @@ foreman(1) -- manage Procfile-based applications
## SYNOPSIS ## SYNOPSIS
`foreman start [process]`<br> `foreman start [process]`<br>
`foreman run <command>`<br>
`foreman export <format> [location]` `foreman export <format> [location]`
## DESCRIPTION ## DESCRIPTION
**Foreman** is a manager for Procfile-based applications. Its aim is to Foreman is a manager for Procfile-based applications. Its aim is to
abstract away the details of the Procfile format, and allow you to either run abstract away the details of the Procfile format, and allow you to either run
your application directly or export it to some other process management your application directly or export it to some other process management
format. format.
@@ -33,6 +34,9 @@ The following options control how the application is run:
Specify which port to use as the base for this application. Should be Specify which port to use as the base for this application. Should be
a multiple of 1000. a multiple of 1000.
`foreman run` is used to run one-off commands using the same environment
as your defined processes.
## EXPORTING ## EXPORTING
`foreman export` is used to export your application to another process `foreman export` is used to export your application to another process
@@ -58,11 +62,15 @@ The following options control how the application is run:
Specify which port to use as the base for this application. Should be Specify which port to use as the base for this application. Should be
a multiple of 1000. a multiple of 1000.
* `-t`, `--template`:
Specify an alternate template to use for creating export files.
See <https://github.com/ddollar/foreman/tree/master/data/export> for examples.
* `-u`, `--user`: * `-u`, `--user`:
Specify the user the application should be run as. Defaults to the Specify the user the application should be run as. Defaults to the
app name app name
## OPTIONS ## GLOBAL OPTIONS
These options control all modes of foreman's operation. These options control all modes of foreman's operation.
+19
View File
@@ -3,6 +3,8 @@ require "foreman/cli"
describe "Foreman::CLI", :fakefs do describe "Foreman::CLI", :fakefs do
subject { Foreman::CLI.new } subject { Foreman::CLI.new }
let(:engine) { subject.send(:engine) }
let(:entries) { engine.procfile.entries.inject({}) { |h,e| h.update(e.name => e) } }
describe "start" do describe "start" do
describe "with a non-existent Procfile" do describe "with a non-existent Procfile" do
@@ -22,6 +24,15 @@ describe "Foreman::CLI", :fakefs do
mock.instance_of(Foreman::Engine).start mock.instance_of(Foreman::Engine).start
subject.start subject.start
end end
it "can run a single process" do
dont_allow(subject).error
stub(engine).watch_for_output
stub(engine).watch_for_termination
mock(entries["alpha"]).spawn(1, is_a(IO), engine.directory, {}, 5000) { [] }
mock(entries["bravo"]).spawn(0, is_a(IO), engine.directory, {}, 5100) { [] }
subject.start("alpha")
end
end end
end end
@@ -109,6 +120,14 @@ describe "Foreman::CLI", :fakefs do
end end
end end
end end
describe "without a Procfile" do
it "displays an error" do
mock_error(subject, "Procfile does not exist.") do
subject.check
end
end
end
end end
describe "run" do describe "run" do
+42 -8
View File
@@ -4,6 +4,13 @@ require "foreman/engine"
describe "Foreman::Engine", :fakefs do describe "Foreman::Engine", :fakefs do
subject { Foreman::Engine.new("Procfile", {}) } subject { Foreman::Engine.new("Procfile", {}) }
before do
any_instance_of(Foreman::Engine) do |engine|
stub(engine).proctitle
stub(engine).termtitle
end
end
describe "initialize" do describe "initialize" do
describe "without an existing Procfile" do describe "without an existing Procfile" do
it "raises an error" do it "raises an error" do
@@ -46,14 +53,16 @@ describe "Foreman::Engine", :fakefs do
before(:each) do before(:each) do
write_procfile write_procfile
stub(Process).fork stub(Process).fork
any_instance_of(Foreman::Engine) do |engine|
stub(engine).info
stub(engine).spawn_processes
stub(engine).watch_for_termination
end
end end
it "should read if specified" do it "should read if specified" do
File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") } File.open("/tmp/env", "w") { |f| f.puts("FOO=baz") }
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env") engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
stub(engine).info
mock(engine).spawn_processes
mock(engine).watch_for_termination
engine.environment.should == {"FOO"=>"baz"} engine.environment.should == {"FOO"=>"baz"}
engine.start engine.start
end end
@@ -62,13 +71,21 @@ describe "Foreman::Engine", :fakefs do
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") } File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") } File.open("/tmp/env2", "w") { |f| f.puts("BAZ=qux") }
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env1,/tmp/env2") engine = Foreman::Engine.new("Procfile", :env => "/tmp/env1,/tmp/env2")
stub(engine).info
mock(engine).spawn_processes
mock(engine).watch_for_termination
engine.environment.should == { "FOO"=>"bar", "BAZ"=>"qux" } engine.environment.should == { "FOO"=>"bar", "BAZ"=>"qux" }
engine.start engine.start
end end
it "should handle quoted values" do
File.open("/tmp/env", "w") do |f|
f.puts 'FOO=bar'
f.puts 'BAZ="qux"'
f.puts "FRED='barney'"
f.puts 'OTHER="escaped\"quote"'
end
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
engine.environment.should == { "FOO" => "bar", "BAZ" => "qux", "FRED" => "barney", "OTHER" => 'escaped"quote' }
end
it "should fail if specified and doesnt exist" do it "should fail if specified and doesnt exist" do
mock.instance_of(Foreman::Engine).error("No such file: /tmp/env") mock.instance_of(Foreman::Engine).error("No such file: /tmp/env")
engine = Foreman::Engine.new("Procfile", :env => "/tmp/env") engine = Foreman::Engine.new("Procfile", :env => "/tmp/env")
@@ -77,10 +94,27 @@ describe "Foreman::Engine", :fakefs do
it "should read .env if none specified" do it "should read .env if none specified" do
File.open(".env", "w") { |f| f.puts("FOO=qoo") } File.open(".env", "w") { |f| f.puts("FOO=qoo") }
engine = Foreman::Engine.new("Procfile") engine = Foreman::Engine.new("Procfile")
mock(engine).spawn_processes
mock(engine).watch_for_termination
engine.environment.should == {"FOO"=>"qoo"} engine.environment.should == {"FOO"=>"qoo"}
engine.start engine.start
end end
end end
describe "utf8" do
before(:each) do
File.open("Procfile", "w") do |file|
file.puts "utf8: #{resource_path("bin/utf8")}"
end
end
it "should spawn" do
stub(subject).watch_for_output
stub(subject).watch_for_termination
subject.start
Process.waitall
mock(subject).info(/started with pid \d+/, "utf8.1", anything)
mock(subject).info("\xff\x03\n", "utf8.1", anything)
subject.send(:poll_readers)
subject.send(:poll_readers)
end
end
end end
+1 -1
View File
@@ -36,6 +36,7 @@ describe Foreman::Process do
def run_file(executable, code) def run_file(executable, code)
file = File.open("#{basedir}/script", 'w') {|it| it << code } file = File.open("#{basedir}/script", 'w') {|it| it << code }
run "#{executable} #{file.path}" run "#{executable} #{file.path}"
sleep 1
end end
context 'options' do context 'options' do
@@ -98,7 +99,6 @@ describe Foreman::Process do
trap "TERM", "IGNORE" trap "TERM", "IGNORE"
loop { sleep 1 } loop { sleep 1 }
CODE CODE
sleep 1 # wait for ruby to start
subject.should be_alive subject.should be_alive
subject.kill 'TERM' subject.kill 'TERM'
subject.should be_alive subject.should be_alive
-18
View File
@@ -8,24 +8,6 @@ describe Foreman do
it { should be_a String } it { should be_a String }
end end
describe "::load_env!(env_file)", :fakefs do
after do
ENV['FOO'] = nil
end
it "should load env_file into ENV" do
File.open("/tmp/env1", "w") { |f| f.puts("FOO=bar") }
Foreman.load_env!("/tmp/env1")
ENV['FOO'].should == 'bar'
end
it "should assume env_file in ./.env" do
File.open("./.env", "w") { |f| f.puts("FOO=bar") }
Foreman.load_env!
ENV['FOO'].should == 'bar'
end
end
describe "runner" do describe "runner" do
it "should exist" do it "should exist" do
File.exists?(Foreman.runner).should == true File.exists?(Foreman.runner).should == true
+2
View File
@@ -0,0 +1,2 @@
#!/usr/bin/env ruby
puts "\xff\x03"
+5 -1
View File
@@ -68,9 +68,13 @@ def load_export_templates_into_fakefs(type)
end end
end end
def resource_path(filename)
File.expand_path("../resources/#{filename}", __FILE__)
end
def example_export_file(filename) def example_export_file(filename)
FakeFS.deactivate! FakeFS.deactivate!
data = File.read(File.expand_path("../resources/export/#{filename}", __FILE__)) data = File.read(File.expand_path(resource_path("export/#{filename}"), __FILE__))
FakeFS.activate! FakeFS.activate!
data data
end end
+5 -6
View File
@@ -21,7 +21,7 @@ end
GEM_BLACKLIST = %w( bundler foreman ) GEM_BLACKLIST = %w( bundler foreman )
def assemble_gems(target_dir=Dir.pwd) def assemble_gems(target_dir=Dir.pwd)
lines = %x{ bundle show }.strip.split("\n") lines = %x{ cd #{project_root} && bundle show }.strip.split("\n")
raise "error running bundler" unless $?.success? raise "error running bundler" unless $?.success?
%x{ env BUNDLE_WITHOUT="development:test" bundle show }.split("\n").each do |line| %x{ env BUNDLE_WITHOUT="development:test" bundle show }.split("\n").each do |line|
@@ -47,8 +47,7 @@ def distribution_files(type=nil)
require "foreman/distribution" require "foreman/distribution"
base_files = Foreman::Distribution.files base_files = Foreman::Distribution.files
type_files = type ? type_files = type ?
Dir[File.expand_path("../dist/resources/#{type}/**/*", __FILE__)] : Dir[File.expand_path("../../dist/resources/#{type}/**/*", __FILE__)] : []
[]
base_files.concat(type_files) base_files.concat(type_files)
end end
@@ -60,15 +59,15 @@ def mkchdir(dir)
end end
def pkg(filename) def pkg(filename)
File.expand_path("../pkg/#{filename}", __FILE__) File.expand_path("../../pkg/#{filename}", __FILE__)
end end
def project_root def project_root
File.dirname(__FILE__) File.expand_path("../..", __FILE__)
end end
def resource(name) def resource(name)
File.expand_path("../dist/resources/#{name}", __FILE__) File.expand_path("../../dist/resources/#{name}", __FILE__)
end end
def s3_connect def s3_connect
+24 -31
View File
@@ -9,8 +9,8 @@ end
desc "Commit the manual to git" desc "Commit the manual to git"
task "man:commit" => :man do task "man:commit" => :man do
sh "git add README.markdown" sh "git add README.md"
sh "git commit -m 'update readme' || echo 'nothing to commit'" sh "git commit -am 'update docs' || echo 'nothing to commit'"
end end
desc "Generate the Github docs" desc "Generate the Github docs"
@@ -30,52 +30,45 @@ end
desc "Generate an authors list" desc "Generate an authors list"
task :authors do task :authors do
authors = %x{ git log --pretty=format:"%an" | sort -u }.split("\n") authors = %x{ git log --pretty=format:"%an" | sort -u }.split("\n")
puts authors.join(", ") readme = File.read("README.md")
readme.gsub!(/#### Patches contributed by\n([^\n]*)\n/m, "#### Patches contributed by\n#{authors.join(", ")}\n")
File.open("README.md", "w") { |f| f.print readme }
end end
def latest_release def latest_release
latest = File.read("Changelog.md").split("\n").first.split(" ").last latest = File.read("Changelog.md").split("\n").first.split(" ")[1]
end end
def newer_release def newer_release
release = %x{ git tag --contains #{latest_release} }.split("\n")[1] tags = %x{ git tag --contains v#{latest_release} }.split("\n").sort_by do |tag|
Gem::Version.new(tag[1..-1])
end
tags.reject { |tag| Gem::Version.new(tag[1..-1]).prerelease? }[1]
end end
desc "Generate a Changelog" desc "Generate a Changelog"
task :changelog do task :changelog do
while release = newer_release while release = newer_release
entry = %x{ git show --format="%h %cd" #{release} | head -n 1 } entry = %x{ git show --format="%cd" #{release} | head -n 1 }
commit, date_raw = entry.split(" ", 2) date = Time.parse(entry.chomp).strftime("%Y-%m-%d")
date = Time.parse(date_raw).strftime("%Y-%m-%d")
message = "## #{release[1..-1]} #{date} #{commit}\n" message = "## #{release[1..-1]} (#{date})\n\n"
message += %x{ git log --format="%s [%an]" #{latest_release}..#{release} } message += %x{ git log --format="* %s [%an]" v#{latest_release}..#{release} }
changelog = File.read("Changelog.md") changelog = File.read("Changelog.md")
changelog = message + "\n" + changelog changelog = message + "\n" + changelog
puts release
File.open("Changelog.md", "w") do |file| File.open("Changelog.md", "w") do |file|
file.puts changelog file.print changelog
end end
end end
end
# date = desc "Cut a release"
# message = "## #{release[1..-1]} task :release do
# timestamp = Time.now.utc.strftime('%m/%d/%Y') Rake::Task["authors"].invoke
# sha = `git log | head -1`.split(' ').last Rake::Task["changelog"].invoke
# changelog = ["#{version} #{timestamp} #{sha}"] Rake::Task["pages"].invoke
# changelog << ('=' * changelog[0].length)
# changelog << ''
# last_sha = `cat Changelog | head -1`.split(' ').last
# shortlog = `git log #{last_sha}..HEAD --pretty=format:'%s [%an]'`
# changelog << shortlog.split("\n")
# changelog.concat ['', '', '']
# old_changelog = File.read('Changelog')
# File.open('Changelog', 'w') do |file|
# file.write(changelog.join("\n"))
# file.write(old_changelog)
# end
end end