harukaze 1.2.0
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.
- data/.gitignore +2 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +21 -0
- data/VERSION +1 -0
- data/bin/harukaze +175 -0
- data/harukaze.gemspec +50 -0
- data/lib/harukaze.rb +0 -0
- metadata +82 -0
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Andrey Subbotin
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= harukaze
|
2
|
+
|
3
|
+
A tool to simplify building of your iPhone app for ad hoc distribution or submitting to the App Store.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 Andrey Subbotin. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "harukaze"
|
8
|
+
gem.summary = %Q{iPhone Ad Hoc / App Store builds made easy.}
|
9
|
+
gem.description = %Q{A tool to simplify building of your iPhone app for ad hoc distribution or submitting to the App Store.}
|
10
|
+
gem.email = "andrey@subbotin.me"
|
11
|
+
gem.homepage = "http://github.com/eploko/harukaze"
|
12
|
+
gem.authors = ["Andrey Subbotin"]
|
13
|
+
gem.executables = ['harukaze']
|
14
|
+
gem.default_executable = ['harukaze']
|
15
|
+
gem.add_dependency "term-ansicolor"
|
16
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
+
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
21
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.2.0
|
data/bin/harukaze
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'term/ansicolor'
|
6
|
+
require 'tmpdir'
|
7
|
+
require 'yaml'
|
8
|
+
|
9
|
+
include Term::ANSIColor
|
10
|
+
|
11
|
+
def main
|
12
|
+
banner
|
13
|
+
check_args
|
14
|
+
config = setup
|
15
|
+
print_config config
|
16
|
+
Dir.mkdir config['tmp_dir']
|
17
|
+
bump_versions(config)
|
18
|
+
xcodebuild(config['src_dir'], config['project'], config['sdk'], config['target'], config['configuration'])
|
19
|
+
commit_build(config)
|
20
|
+
zip_build(config)
|
21
|
+
copy_build(config)
|
22
|
+
FileUtils.rm_rf config['tmp_dir'], :verbose => true
|
23
|
+
success "All done!"
|
24
|
+
end
|
25
|
+
|
26
|
+
def banner
|
27
|
+
puts "Harukaze v1.2.0"
|
28
|
+
puts "© 2010 Andrey Subbotin <andrey@subbotin.me>"
|
29
|
+
end
|
30
|
+
|
31
|
+
def usage
|
32
|
+
puts ""
|
33
|
+
puts "Usage: harukaze <model> [<rules.harukaze>]"
|
34
|
+
puts ""
|
35
|
+
puts "<model> = adhoc | appstore"
|
36
|
+
puts "<rules.harukaze> = harukaze config file, default is rules.harukaze"
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_args
|
40
|
+
if (ARGV.length == 0)
|
41
|
+
usage
|
42
|
+
exit 1
|
43
|
+
elsif (ARGV.length == 1)
|
44
|
+
unless (ARGV[0] == 'adhoc' || ARGV[0] == 'appstore')
|
45
|
+
usage
|
46
|
+
exit 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def setup
|
52
|
+
result = Hash.new
|
53
|
+
global_config_filename = File.expand_path('~/.harukaze')
|
54
|
+
if (File.exist?(global_config_filename))
|
55
|
+
result.merge!(YAML.load_file(global_config_filename))
|
56
|
+
end
|
57
|
+
config = YAML.load_file(ARGV[1].nil? ? 'rules.harukaze' : ARGV[1])
|
58
|
+
config = config['common'].merge(config[ARGV[0]])
|
59
|
+
config['tmp_dir'] = File.join Dir.tmpdir, "epl.builder.#{$$}"
|
60
|
+
config['startwd'] = Dir.getwd
|
61
|
+
config['src_dir'] = config['startwd']
|
62
|
+
config['build_results_dir'] = File.join config['src_dir'], 'build',
|
63
|
+
"#{config['configuration']}-#{config['build_dir_suffix']}"
|
64
|
+
config['payload_target'] = File.join config['tmp_dir'], 'payload'
|
65
|
+
config['mode'] = ARGV[0]
|
66
|
+
result.merge!(config)
|
67
|
+
result['builds_folder'] = File.expand_path(result['builds_folder'])
|
68
|
+
result['products_folder'] = File.expand_path(result['products_folder'])
|
69
|
+
result
|
70
|
+
end
|
71
|
+
|
72
|
+
def print_config(config)
|
73
|
+
# Print out settings
|
74
|
+
status "CONFIG"
|
75
|
+
y config
|
76
|
+
end
|
77
|
+
|
78
|
+
def exe(cmd)
|
79
|
+
print magenta, "CMD: '#{cmd}'", reset, "\n"
|
80
|
+
system cmd
|
81
|
+
end
|
82
|
+
|
83
|
+
def status(msg)
|
84
|
+
print blue, "--- #{msg} ---", reset, "\n"
|
85
|
+
end
|
86
|
+
|
87
|
+
def error(msg)
|
88
|
+
print red, bold, 'ERROR: ', msg, reset, "\n"
|
89
|
+
exit 1
|
90
|
+
end
|
91
|
+
|
92
|
+
def success(msg)
|
93
|
+
print green, bold, 'SUCCESS: ', msg, reset, "\n"
|
94
|
+
end
|
95
|
+
|
96
|
+
def xcodebuild(src_dir, project, sdk, target, configuration)
|
97
|
+
Dir.chdir src_dir
|
98
|
+
status "BUILDING"
|
99
|
+
rc = exe "xcodebuild -project '#{project}' -sdk '#{sdk}' -target '#{target}' -configuration '#{configuration}'"
|
100
|
+
error "Failed to build the project!" unless rc
|
101
|
+
Dir.chdir src_dir
|
102
|
+
end
|
103
|
+
|
104
|
+
def bump_versions(config)
|
105
|
+
status "BUMPING VERSIONS"
|
106
|
+
rc = exe 'agvtool bump -all'
|
107
|
+
|
108
|
+
error "Failed to bump the build number!" unless rc
|
109
|
+
rc = exe "agvtool new-marketing-version #{config['marketing_version']}"
|
110
|
+
error "Failed to set the marketing version!" unless rc
|
111
|
+
config['current_version'] = `agvtool what-version -terse`.chomp!
|
112
|
+
config['current_marketing_version'] = `agvtool what-marketing-version -terse1`.chomp!
|
113
|
+
end
|
114
|
+
|
115
|
+
def commit_build(config)
|
116
|
+
# commit
|
117
|
+
status "COMMITING BUILD"
|
118
|
+
rc = exe "git commit -a -m 'Successful build #{config['current_version']} for v#{config['current_marketing_version']}'"
|
119
|
+
error "Failed to commit the build!" unless rc
|
120
|
+
|
121
|
+
# remember the SHA1 for the build
|
122
|
+
config['git_sha'] = `git rev-parse --short HEAD`.chomp!
|
123
|
+
|
124
|
+
# tag the build
|
125
|
+
status "TAGGING BUILD"
|
126
|
+
config['git_tag'] = "v#{config['current_marketing_version']}-b#{config['current_version']}";
|
127
|
+
rc = exe "git tag -s -m 'Tagging version #{config['current_marketing_version']}, build #{config['current_version']}' " +
|
128
|
+
"'#{config['git_tag']}'"
|
129
|
+
error "Failed to tag the build!" unless rc
|
130
|
+
|
131
|
+
# # pull whatever is there
|
132
|
+
# status "PULLING ORIGIN MASTER"
|
133
|
+
# rc = exe "git pull origin master"
|
134
|
+
# error "Failed to pull origin master!" unless rc
|
135
|
+
#
|
136
|
+
# # push whatever is here
|
137
|
+
# status "PUSHING ORIGIN MASTER"
|
138
|
+
# rc = exe "git push origin master"
|
139
|
+
# error "Failed to push origin master!" unless rc
|
140
|
+
|
141
|
+
# push the tag
|
142
|
+
status "PUSHING THE NEW TAG"
|
143
|
+
rc = exe "git push origin tag '#{config['git_tag']}'"
|
144
|
+
error "Failed to push the tag!" unless rc
|
145
|
+
end
|
146
|
+
|
147
|
+
def zip_build(config)
|
148
|
+
status "ZIPPING THE BUILD"
|
149
|
+
Dir.chdir config['build_results_dir']
|
150
|
+
config['buildbase'] = ("#{config['zip_prefix']}_#{config['current_marketing_version']}_" +
|
151
|
+
"#{config['configuration']}_b#{config['current_version']}_#{config['git_sha']}_" +
|
152
|
+
Time.now.strftime('%Y%m%d')).gsub('.', '_').gsub('-', '_')
|
153
|
+
config['zipname'] = config['buildbase'] + '.zip'
|
154
|
+
config['zipname_absolute'] = File.join config['tmp_dir'], config['zipname']
|
155
|
+
exe "zip -r -9 -y '#{config['zipname_absolute']}' *.app"
|
156
|
+
unless config['mode'] == 'appstore'
|
157
|
+
exe "zip -r -9 -y '#{config['zipname_absolute']}' *.app.dSYM"
|
158
|
+
end
|
159
|
+
unless config['payload'].nil?
|
160
|
+
Dir.chdir File.join(config['src_dir'], config['payload'])
|
161
|
+
exe "zip -r -9 -y '#{config['zipname_absolute']}' ."
|
162
|
+
end
|
163
|
+
FileUtils.mv config['zipname_absolute'], config['products_folder'], :verbose => true
|
164
|
+
end
|
165
|
+
|
166
|
+
def copy_build(config)
|
167
|
+
status "POPULATING BUILDS FOLDER"
|
168
|
+
build_folder = File.join(config['builds_folder'], config['buildbase'])
|
169
|
+
exe "mkdir -p \"#{build_folder}\""
|
170
|
+
FileUtils.cp_r Dir.glob(File.join(config['build_results_dir'], '*')),
|
171
|
+
build_folder, :verbose => true
|
172
|
+
end
|
173
|
+
|
174
|
+
main
|
175
|
+
exit 0
|
data/harukaze.gemspec
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{harukaze}
|
8
|
+
s.version = "1.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Andrey Subbotin"]
|
12
|
+
s.date = %q{2010-04-20}
|
13
|
+
s.default_executable = ["harukaze"]
|
14
|
+
s.description = %q{A tool to simplify building of your iPhone app for ad hoc distribution or submitting to the App Store.}
|
15
|
+
s.email = %q{andrey@subbotin.me}
|
16
|
+
s.executables = ["harukaze"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bin/harukaze",
|
28
|
+
"harukaze.gemspec",
|
29
|
+
"lib/harukaze.rb"
|
30
|
+
]
|
31
|
+
s.homepage = %q{http://github.com/eploko/harukaze}
|
32
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.rubygems_version = %q{1.3.6}
|
35
|
+
s.summary = %q{iPhone Ad Hoc / App Store builds made easy.}
|
36
|
+
|
37
|
+
if s.respond_to? :specification_version then
|
38
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
39
|
+
s.specification_version = 3
|
40
|
+
|
41
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
42
|
+
s.add_runtime_dependency(%q<term-ansicolor>, [">= 0"])
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<term-ansicolor>, [">= 0"])
|
45
|
+
end
|
46
|
+
else
|
47
|
+
s.add_dependency(%q<term-ansicolor>, [">= 0"])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
data/lib/harukaze.rb
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: harukaze
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 1.2.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Andrey Subbotin
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-04-20 00:00:00 +04:00
|
18
|
+
default_executable:
|
19
|
+
- harukaze
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: term-ansicolor
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
description: A tool to simplify building of your iPhone app for ad hoc distribution or submitting to the App Store.
|
34
|
+
email: andrey@subbotin.me
|
35
|
+
executables:
|
36
|
+
- harukaze
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- LICENSE
|
41
|
+
- README.rdoc
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- LICENSE
|
45
|
+
- README.rdoc
|
46
|
+
- Rakefile
|
47
|
+
- VERSION
|
48
|
+
- bin/harukaze
|
49
|
+
- harukaze.gemspec
|
50
|
+
- lib/harukaze.rb
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://github.com/eploko/harukaze
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- --charset=UTF-8
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.3.6
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: iPhone Ad Hoc / App Store builds made easy.
|
81
|
+
test_files: []
|
82
|
+
|