perkins 0.0.1

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.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.env.example +4 -0
  4. data/.gitignore +19 -0
  5. data/.pryrc +3 -0
  6. data/.rspec +2 -0
  7. data/Gemfile +18 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +71 -0
  10. data/Rakefile +28 -0
  11. data/TODO.md +4 -0
  12. data/bin/perkins +6 -0
  13. data/db/migrate/20150130143030_create_repo.rb +18 -0
  14. data/db/migrate/20150130143050_create_builds.rb +20 -0
  15. data/db/schema.rb +38 -0
  16. data/examples/config.rb +12 -0
  17. data/examples/database.yml +17 -0
  18. data/examples/mongo.yml +13 -0
  19. data/lib/core_ext/hash/compact.rb +8 -0
  20. data/lib/core_ext/hash/deep_merge.rb +15 -0
  21. data/lib/core_ext/hash/deep_symbolize_keys.rb +20 -0
  22. data/lib/core_ext/object/false.rb +5 -0
  23. data/lib/core_ext/string/indent.rb +5 -0
  24. data/lib/core_ext/string/unindent.rb +5 -0
  25. data/lib/perkins/.DS_Store +0 -0
  26. data/lib/perkins/application.rb +40 -0
  27. data/lib/perkins/assets/images/github.svg +4 -0
  28. data/lib/perkins/assets/images/spinner.svg +23 -0
  29. data/lib/perkins/assets/javascripts/app.js +9 -0
  30. data/lib/perkins/assets/javascripts/log_view.js.coffee +95 -0
  31. data/lib/perkins/assets/javascripts/perkings.js.coffee +40 -0
  32. data/lib/perkins/assets/javascripts/vendor/ansiparse.js +187 -0
  33. data/lib/perkins/assets/javascripts/vendor/jquery.timeago.js +189 -0
  34. data/lib/perkins/assets/javascripts/vendor/log.js +2 -0
  35. data/lib/perkins/assets/javascripts/vendor/minispade.js +55 -0
  36. data/lib/perkins/assets/stylesheets/app.css +2 -0
  37. data/lib/perkins/assets/stylesheets/log.css.scss +115 -0
  38. data/lib/perkins/assets/stylesheets/styles.css.scss +199 -0
  39. data/lib/perkins/auth/github.rb +181 -0
  40. data/lib/perkins/build/data/env.rb +84 -0
  41. data/lib/perkins/build/data/var.rb +60 -0
  42. data/lib/perkins/build/data.rb +167 -0
  43. data/lib/perkins/build/script/bundler.rb +76 -0
  44. data/lib/perkins/build/script/go.rb +100 -0
  45. data/lib/perkins/build/script/helpers.rb +39 -0
  46. data/lib/perkins/build/script/jdk.rb +43 -0
  47. data/lib/perkins/build/script/ruby.rb +31 -0
  48. data/lib/perkins/build/script/rvm.rb +73 -0
  49. data/lib/perkins/build/script/stages.rb +28 -0
  50. data/lib/perkins/build/script/templates/footer.sh +3 -0
  51. data/lib/perkins/build/script/templates/header.sh +201 -0
  52. data/lib/perkins/build/script/templates/xcode.sh +21 -0
  53. data/lib/perkins/build/script.rb +167 -0
  54. data/lib/perkins/build/shell/dsl.rb +104 -0
  55. data/lib/perkins/build/shell/node.rb +121 -0
  56. data/lib/perkins/build/shell.rb +16 -0
  57. data/lib/perkins/build.rb +27 -0
  58. data/lib/perkins/build_report.rb +11 -0
  59. data/lib/perkins/cli.rb +42 -0
  60. data/lib/perkins/commit.rb +30 -0
  61. data/lib/perkins/dsl/app_proxy.rb +23 -0
  62. data/lib/perkins/dsl.rb +12 -0
  63. data/lib/perkins/listener.rb +38 -0
  64. data/lib/perkins/logger.rb +12 -0
  65. data/lib/perkins/notifier.rb +5 -0
  66. data/lib/perkins/repo.rb +145 -0
  67. data/lib/perkins/runner.rb +124 -0
  68. data/lib/perkins/server.rb +314 -0
  69. data/lib/perkins/thor_utils.rb +79 -0
  70. data/lib/perkins/version.rb +3 -0
  71. data/lib/perkins/views/401.haml +1 -0
  72. data/lib/perkins/views/builds.haml +46 -0
  73. data/lib/perkins/views/index.haml +6 -0
  74. data/lib/perkins/views/layout.haml +53 -0
  75. data/lib/perkins/views/menu.haml +18 -0
  76. data/lib/perkins/views/orgs.haml +101 -0
  77. data/lib/perkins/views/profile.haml +31 -0
  78. data/lib/perkins/views/readme.md +20 -0
  79. data/lib/perkins/views/repos/config.haml +72 -0
  80. data/lib/perkins/views/repos/github.haml +76 -0
  81. data/lib/perkins/views/repos/menu.haml +17 -0
  82. data/lib/perkins/views/repos/repo.haml +64 -0
  83. data/lib/perkins/views/repos/spinner.haml +3 -0
  84. data/lib/perkins/webhooks/github.rb +12 -0
  85. data/lib/perkins/worker.rb +33 -0
  86. data/lib/perkins.rb +36 -0
  87. data/perkins.gemspec +52 -0
  88. data/spec/fixtures/.travis.yml +8 -0
  89. data/spec/fixtures/config.yml +6 -0
  90. data/spec/lib/build/build_spec.rb +58 -0
  91. data/spec/lib/commit_spec.rb +6 -0
  92. data/spec/lib/dsl_spec.rb +17 -0
  93. data/spec/lib/listener_spec.rb +30 -0
  94. data/spec/lib/repo_spec.rb +110 -0
  95. data/spec/lib/runner_spec.rb +76 -0
  96. data/spec/lib/server_spec.rb +108 -0
  97. data/spec/spec_helper.rb +67 -0
  98. data/spec/support/auth.rb +30 -0
  99. data/spec/support/github_api.rb +177 -0
  100. metadata +503 -0
@@ -0,0 +1,76 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ module Bundler
5
+ DEFAULT_BUNDLER_ARGS = "--jobs=3 --retry=3"
6
+
7
+ def cache_slug
8
+ super << "--gemfile-" << config[:gemfile].to_s
9
+ end
10
+
11
+ def use_directory_cache?
12
+ super || data.cache?(:bundler)
13
+ end
14
+
15
+ def setup
16
+ super
17
+
18
+ gemfile? do |sh|
19
+ sh.set "BUNDLE_GEMFILE", "$PWD/#{config[:gemfile]}"
20
+ end
21
+ end
22
+
23
+ def announce
24
+ super
25
+ cmd "bundle --version", timing: false
26
+ end
27
+
28
+ def install
29
+ gemfile? do |sh|
30
+ sh.if "-f #{config[:gemfile]}.lock" do |sub|
31
+ directory_cache.add(sub, bundler_path) if data.cache?(:bundler)
32
+ sub.cmd bundler_command("--deployment"), fold: "install.bundler", retry: true
33
+ end
34
+
35
+ sh.else do |sub|
36
+ # Cache bundler if it has been explicitly enabled
37
+ directory_cache.add(sub, bundler_path) if data.cache?(:bundler, false)
38
+ sub.cmd bundler_command, fold: "install.bundler", retry: true
39
+ end
40
+ end
41
+ end
42
+
43
+ def prepare_cache
44
+ cmd("bundle clean") if bundler_path
45
+ end
46
+
47
+ private
48
+
49
+ def gemfile?(*args, &block)
50
+ self.if "-f #{config[:gemfile]}", *args, &block
51
+ end
52
+
53
+ def bundler_args_path
54
+ args = Array(bundler_args).join(" ")
55
+ path = args[/--path[= ](\S+)/, 1]
56
+ path ||= "vendor/bundle" #if args.include?("--deployment")
57
+ path
58
+ end
59
+
60
+ def bundler_path
61
+ bundler_args_path || "${BUNDLE_PATH:-vendor/bundle}"
62
+ end
63
+
64
+ def bundler_command(args = nil)
65
+ args = bundler_args || [DEFAULT_BUNDLER_ARGS, args].compact
66
+ args = [args].flatten << "--path=#{bundler_path}" if data.cache?(:bundler) && !bundler_args_path
67
+ ["bundle install", *args].compact.join(" ")
68
+ end
69
+
70
+ def bundler_args
71
+ config[:bundler_args]
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,100 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ class Go < Script
5
+ DEFAULTS = {
6
+ gobuild_args: '-v',
7
+ go: '1.3.1'
8
+ }
9
+
10
+ def cache_slug
11
+ super << "--go-" << config[:go].to_s
12
+ end
13
+
14
+ def pre_setup
15
+ puts "configure"
16
+ end
17
+
18
+ def configure
19
+ puts "configure"
20
+ end
21
+
22
+ def export
23
+ super
24
+ "export GO_VERSION=#{go_version}"
25
+ end
26
+
27
+ def announce
28
+ super
29
+ 'gvm version && ' <<
30
+ 'go version && ' <<
31
+ 'go env'
32
+ end
33
+
34
+ def setup
35
+ super
36
+ "gvm get &&" <<
37
+ "gvm update && source #{HOME_DIR}/.gvm/scripts/gvm && " <<
38
+ "gvm install #{go_version} --binary || gvm install #{go_version} && " <<
39
+ "gvm use #{go_version} && "
40
+ # Prepend *our* GOPATH entry so that built binaries and packages are
41
+ # easier to find and our `git clone`'d libraries are found by the
42
+ # `go` commands.
43
+ source_path = repo.url.gsub(/https\:\/\/|\.git/, "")
44
+ source_owner_path = source_path.split('/')[0..1].join("/")
45
+ local_path = self.repo.working_dir + self.repo.name
46
+ "export GOPATH=#{HOME_DIR}/gopath:$GOPATH && " <<
47
+ #binding.pry
48
+ "mkdir -p #{HOME_DIR}/gopath/src/#{source_owner_path} && " <<
49
+ "cp -r #{local_path} #{HOME_DIR}/gopath/src/#{source_owner_path} && " <<
50
+ "export BUILD_DIR=#{HOME_DIR}/gopath/src/#{source_path} && " <<
51
+ "cd #{HOME_DIR}/gopath/src/#{source_path}"
52
+ end
53
+
54
+ def install
55
+ if uses_make?
56
+ 'true'
57
+ else
58
+ "go get #{config[:gobuild_args]} ./..."
59
+ end
60
+ end
61
+
62
+ def script
63
+ if uses_make?
64
+ 'make'
65
+ else
66
+ "go test #{config[:gobuild_args]} ./..."
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def uses_make?(*args)
73
+ self.if '-f GNUmakefile || -f makefile || -f Makefile || -f BSDmakefile', *args
74
+ end
75
+
76
+ def go_version
77
+ version = config[:go].to_s
78
+ case version
79
+ when '1'
80
+ 'go1.3.1'
81
+ when '1.0'
82
+ 'go1.0.3'
83
+ when '1.2'
84
+ 'go1.2.2'
85
+ when '1.3'
86
+ 'go1.3.1'
87
+ when /^[0-9]\.[0-9\.]+/
88
+ "go#{config[:go]}"
89
+ else
90
+ if config[:go].is_a?(Travis::Yaml::Nodes::VersionList)
91
+ config[:go].first
92
+ else
93
+ config[:go]
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,39 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ module Helpers
5
+ Shell::Dsl.instance_methods(false).each do |name|
6
+ define_method(name) do |*args, &block|
7
+ options = args.last if args.last.is_a?(Hash)
8
+ sh.send(name, *args, &stacking(&block)) unless sh.blank?
9
+ end
10
+ end
11
+
12
+ def sh
13
+ stack.last
14
+ end
15
+
16
+ def failure(message)
17
+ echo message
18
+ raw 'false'
19
+ end
20
+
21
+ def stacking
22
+ ->(sh) {
23
+ stack.push(sh)
24
+ yield(sh) if block_given?
25
+ stack.pop
26
+ }
27
+ end
28
+
29
+ def before_install
30
+ puts "before install"
31
+ end
32
+
33
+ def announce?(stage)
34
+ stage && stage != :after_result
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,43 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ module Jdk
5
+ def export
6
+ super
7
+ set 'TRAVIS_JDK_VERSION', config[:jdk], echo: false if uses_jdk?
8
+ end
9
+
10
+ def setup
11
+ super
12
+ cmd "jdk_switcher use #{config[:jdk]}", assert: true, timing: false if uses_jdk?
13
+ self.if '-f build.gradle' do
14
+ set 'TERM', 'dumb', echo: false
15
+ end
16
+ end
17
+
18
+ def announce
19
+ super
20
+ if uses_java?
21
+ cmd "java -version", timing: false
22
+ cmd "javac -version", timing: false
23
+ end
24
+ end
25
+
26
+ def cache_slug
27
+ return super unless uses_jdk?
28
+ super << "--jdk-" << config[:jdk].to_s
29
+ end
30
+
31
+ private
32
+
33
+ def uses_java?
34
+ true
35
+ end
36
+
37
+ def uses_jdk?
38
+ !!config[:jdk]
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ class Ruby < Script
5
+ DEFAULTS = {
6
+ rvm: 'default',
7
+ gemfile: 'Gemfile'
8
+ }
9
+
10
+ include Jdk
11
+ include RVM
12
+ include Bundler
13
+
14
+ def announce
15
+ super
16
+ cmd 'gem --version', timing: false
17
+ end
18
+
19
+ def script
20
+ gemfile? then: 'bundle exec rake', else: 'rake'
21
+ end
22
+
23
+ private
24
+
25
+ def uses_java?
26
+ uses_jdk?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,73 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ module RVM
5
+ def cache_slug
6
+ super << "--rvm-" << ruby_version.to_s
7
+ end
8
+
9
+ def export
10
+ super
11
+ set 'TRAVIS_RUBY_VERSION', config[:rvm], echo: false
12
+ end
13
+
14
+ def setup
15
+ super
16
+ config[:ruby] ? setup_chruby : setup_rvm
17
+ end
18
+
19
+ def announce
20
+ super
21
+ cmd 'ruby --version'
22
+ if config[:ruby]
23
+ cmd 'chruby --version'
24
+ else
25
+ cmd 'rvm --version'
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def ruby_version
32
+ config[:rvm].to_s.gsub(/-(1[89]|2[01])mode$/, '-d\1')
33
+ end
34
+
35
+ def setup_chruby
36
+ echo 'BETA: Using chruby to select Ruby version. This is currently a beta feature and may change at any time."', color: :yellow
37
+ cmd "curl -sLo ~/chruby.sh https://gist.githubusercontent.com/henrikhodne/a01cd7367b12a59ee051/raw/chruby.sh", echo: false
38
+ cmd "source ~/chruby.sh", echo: false
39
+ cmd "chruby #{config[:ruby]}"
40
+ end
41
+
42
+ def setup_rvm
43
+ file '$rvm_path/user/db', %w(
44
+ rvm_remote_server_url3=https://s3.amazonaws.com/travis-rubies/binaries
45
+ rvm_remote_server_type3=rubies
46
+ rvm_remote_server_verify_downloads3=1
47
+ ).join("\n")
48
+
49
+ if ruby_version =~ /ruby-head/
50
+ fold("rvm.1") do
51
+ echo 'Setting up latest %s' % ruby_version, ansi: :yellow
52
+ cmd "rvm get stable", assert: false if ruby_version == 'jruby-head'
53
+ set 'ruby_alias', "`rvm alias show #{ruby_version} 2>/dev/null`"
54
+ cmd "rvm alias delete #{ruby_version}", assert: false
55
+ cmd "rvm remove ${ruby_alias:-#{ruby_version}} --gems", assert: false
56
+ cmd "rvm remove #{ruby_version} --gems --fuzzy", assert: false
57
+ cmd "rvm install #{ruby_version} --binary"
58
+ end
59
+ cmd "rvm use #{ruby_version}"
60
+ elsif ruby_version == 'default'
61
+ self.if "-f .ruby-version" do |sh|
62
+ sh.echo 'BETA: Using Ruby version from .ruby-version. This is a beta feature and may be removed in the future.', color: :yellow
63
+ fold("rvm.1") { sh.cmd "rvm use . --install --binary --fuzzy" }
64
+ end
65
+ self.else "rvm use default"
66
+ else
67
+ fold("rvm.1") { cmd "rvm use #{ruby_version} --install --binary --fuzzy" }
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,28 @@
1
+ module Perkins
2
+ module Build
3
+ class Script
4
+ module Stages
5
+
6
+ def run_stages
7
+ STAGES[:builtin].each { |stage| run_builtin_stage(stage) }
8
+ STAGES[:custom].each { |stage| run_stage(stage) }
9
+ end
10
+
11
+ def run_builtin_stage(stage)
12
+ self.send(stage)
13
+ end
14
+
15
+ def run_stage(stage)
16
+ puts "call #{stage}"
17
+ call_custom_stage(stage)
18
+ end
19
+
20
+ def call_custom_stage(stage)
21
+ #binding.pry
22
+ @config.send(stage).present? ? cmd(@config.send(stage)) : self.send(stage)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ echo -e "\nDone. Your build exited with $TRAVIS_TEST_RESULT."
2
+
3
+ travis_terminate $TRAVIS_TEST_RESULT
@@ -0,0 +1,201 @@
1
+ #!/bin/bash
2
+ source $HOME/.profile
3
+
4
+ ANSI_RED="\033[31;1m"
5
+ ANSI_GREEN="\033[32;1m"
6
+ ANSI_RESET="\033[0m"
7
+ ANSI_CLEAR="\033[0K"
8
+
9
+ TRAVIS_TEST_RESULT=
10
+ TRAVIS_CMD=
11
+
12
+ function travis_cmd() {
13
+ local assert output display retry timing cmd result
14
+
15
+ cmd=$1
16
+ TRAVIS_CMD=$cmd
17
+ shift
18
+
19
+ while true; do
20
+ case "$1" in
21
+ --assert) assert=true; shift ;;
22
+ --echo) output=true; shift ;;
23
+ --display) display=$2; shift 2;;
24
+ --retry) retry=true; shift ;;
25
+ --timing) timing=true; shift ;;
26
+ *) break ;;
27
+ esac
28
+ done
29
+
30
+ if [[ -n "$timing" ]]; then
31
+ travis_time_start
32
+ fi
33
+
34
+ if [[ -n "$output" ]]; then
35
+ echo "\$ ${display:-$cmd}"
36
+ fi
37
+
38
+ if [[ -n "$retry" ]]; then
39
+ travis_retry eval "$cmd"
40
+ else
41
+ eval "$cmd"
42
+ fi
43
+ result=$?
44
+
45
+ if [[ -n "$timing" ]]; then
46
+ travis_time_finish
47
+ fi
48
+
49
+ if [[ -n "$assert" ]]; then
50
+ travis_assert $result
51
+ fi
52
+
53
+ travis_result $result
54
+ return $result
55
+ }
56
+
57
+ travis_time_start() {
58
+ travis_timer_id=$(printf %08x $(( RANDOM * RANDOM )))
59
+ travis_start_time=$(travis_nanoseconds)
60
+ echo -en "travis_time:start:$travis_timer_id\r${ANSI_CLEAR}"
61
+ }
62
+
63
+ travis_time_finish() {
64
+ local result=$?
65
+ travis_end_time=$(travis_nanoseconds)
66
+ local duration=$(($travis_end_time-$travis_start_time))
67
+ echo -en "travis_time:end:$travis_timer_id:start=$travis_start_time,finish=$travis_end_time,duration=$duration\r${ANSI_CLEAR}"
68
+ return $result
69
+ }
70
+
71
+ function travis_nanoseconds() {
72
+ local cmd="date"
73
+ local format="+%s%N"
74
+ local os=$(uname)
75
+
76
+ if hash gdate > /dev/null 2>&1; then
77
+ cmd="gdate" # use gdate if available
78
+ elif [[ "$os" = Darwin ]]; then
79
+ format="+%s000000000" # fallback to second precision on darwin (does not support %N)
80
+ fi
81
+
82
+ $cmd -u $format
83
+ }
84
+
85
+ travis_assert() {
86
+ local result=${1:-$?}
87
+ if [ $result -ne 0 ]; then
88
+ echo -e "\n${ANSI_RED}The command \"$TRAVIS_CMD\" failed and exited with $result during $TRAVIS_STAGE.${ANSI_RESET}\n\nYour build has been stopped."
89
+ travis_terminate 2
90
+ fi
91
+ }
92
+
93
+ travis_result() {
94
+ local result=$1
95
+ export TRAVIS_TEST_RESULT=$(( ${TRAVIS_TEST_RESULT:-0} | $(($result != 0)) ))
96
+ if [ $result -eq 0 ]; then
97
+ echo -e "\n${ANSI_GREEN}The command \"$TRAVIS_CMD\" exited with $result.${ANSI_RESET}"
98
+ else
99
+ echo -e "\n${ANSI_RED}The command \"$TRAVIS_CMD\" exited with $result.${ANSI_RESET}"
100
+ fi
101
+ }
102
+
103
+ travis_terminate() {
104
+ pkill -9 -P $$ &> /dev/null || true
105
+ exit $1
106
+ }
107
+
108
+ travis_wait() {
109
+ local timeout=$1
110
+
111
+ if [[ $timeout =~ ^[0-9]+$ ]]; then
112
+ # looks like an integer, so we assume it's a timeout
113
+ shift
114
+ else
115
+ # default value
116
+ timeout=20
117
+ fi
118
+
119
+ local cmd="$@"
120
+ local log_file=travis_wait_$$.log
121
+
122
+ $cmd &>$log_file &
123
+ local cmd_pid=$!
124
+
125
+ travis_jigger $! $timeout $cmd &
126
+ local jigger_pid=$!
127
+ local result
128
+
129
+ {
130
+ wait $cmd_pid 2>/dev/null
131
+ result=$?
132
+ ps -p$jigger_pid &>/dev/null && kill $jigger_pid
133
+ } || return 1
134
+
135
+ if [ $result -eq 0 ]; then
136
+ echo -e "\n${ANSI_GREEN}The command \"$TRAVIS_CMD\" exited with $result.${ANSI_RESET}"
137
+ else
138
+ echo -e "\n${ANSI_RED}The command \"$TRAVIS_CMD\" exited with $result.${ANSI_RESET}"
139
+ fi
140
+
141
+ echo -e "\n${ANSI_GREEN}Log:${ANSI_RESET}\n"
142
+ cat $log_file
143
+
144
+ return $result
145
+ }
146
+
147
+ travis_jigger() {
148
+ # helper method for travis_wait()
149
+ local cmd_pid=$1
150
+ shift
151
+ local timeout=$1 # in minutes
152
+ shift
153
+ local count=0
154
+
155
+ # clear the line
156
+ echo -e "\n"
157
+
158
+ while [ $count -lt $timeout ]; do
159
+ count=$(($count + 1))
160
+ echo -ne "Still running $count of $timeout: $@\r"
161
+ sleep 60
162
+ done
163
+
164
+ echo -e "\n${ANSI_RED}Timeout ${timeout} minutes reached. Terminating \"$@\"${ANSI_RESET}\n"
165
+ kill -9 $cmd_pid
166
+ }
167
+
168
+ travis_retry() {
169
+ local result=0
170
+ local count=1
171
+ while [ $count -le 3 ]; do
172
+ [ $result -ne 0 ] && {
173
+ echo -e "\n${ANSI_RED}The command \"$@\" failed. Retrying, $count of 3.${ANSI_RESET}\n" >&2
174
+ }
175
+ "$@"
176
+ result=$?
177
+ [ $result -eq 0 ] && break
178
+ count=$(($count + 1))
179
+ sleep 1
180
+ done
181
+
182
+ [ $count -gt 3 ] && {
183
+ echo -e "\n${ANSI_RED}The command \"$@\" failed 3 times.${ANSI_RESET}\n" >&2
184
+ }
185
+
186
+ return $result
187
+ }
188
+
189
+ travis_fold() {
190
+ local action=$1
191
+ local name=$2
192
+ echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
193
+ }
194
+
195
+ decrypt() {
196
+ echo $1 | base64 -d | openssl rsautl -decrypt -inkey ~/.ssh/id_rsa.repo
197
+ }
198
+
199
+ mkdir -p <%= BUILD_DIR %>
200
+ cd <%= @working_dir %>
201
+
@@ -0,0 +1,21 @@
1
+ mkdir ~/bin
2
+ cat > ~/bin/xcodebuild <<EOF
3
+ #!/usr/bin/env perl
4
+
5
+ my $status = 1;
6
+
7
+ open my $fh, "-|", @ARGV
8
+ or die "unable to run command: $!\n";
9
+
10
+ while (my $line = readline($fh)) {
11
+ print $line;
12
+ $status = 0 if $line =~ /^\*\* TEST SUCCEEDED \*\*$/;
13
+ }
14
+
15
+ close $fh;
16
+
17
+ exit $status;
18
+ EOF
19
+ chmod +x ~/bin/xcodebuild
20
+
21
+ export PATH="$HOME/bin:$PATH"