public
Description: Project Sprouts is an open-source, cross-platform project generation and configuration tool for ActionScript 2, ActionScript 3, Adobe AIR Flash and Flex projects
Homepage: http://projectsprouts.org/
Clone URL: git://github.com/lukebayes/project-sprouts.git
Click here to lend your support to: project-sprouts and make a donation at www.pledgie.com !
lukebayes (author)
Fri Oct 30 07:41:48 -0700 2009
commit  f1e1dd9d6b86a28a16b54c9d922e869d66d4ce1c
tree    6f8bff80c7bd5750f94b3b9a64e269ab823a7421
parent  74acc92ef855593ceb84bb6ed8b47c23b4a36814
project-sprouts / rakefile.rb
100644 359 lines (296 sloc) 9.873 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
require 'rubygems'
require 'rake/clean'
require 'rake/rdoctask'
 
PROJECT_NAME = 'sprout'
ARTIFACTS = File.expand_path(ENV['CC_BUILD_ARTIFACTS'] || 'pkg')
PROJECTS = ['tools/flashplayer',
            'tools/flex2sdk',
            'tools/flex3sdk',
            'tools/mtasc',
            'tools/swfmill',
            'bundles/developer',
            'bundles/as2',
            'bundles/as3',
            'bundles/flashplayer',
            'libraries',
            'sprout'
            ]
 
if(File.basename(ARTIFACTS) == 'pkg')
  CLEAN.add(ARTIFACTS)
end
 
Rake::RDocTask.new do |t|
  t.rdoc_files.include(['sprout/doc/*',
                        'sprout/lib/**/*.rb',
                        'bundles/**/lib/**/*.rb',
                        'bundles/**/README'
                        ])
  t.title = "Project Sprouts"
  t.rdoc_dir = 'rdoc'
  t.options << '-i . -i sprout'
  t.main = 'Sprout::Sprout'
end
 
desc "Copy rdoc output to the site directory"
task :copy_rdoc => :rdoc do |t|
  FileUtils.rm_rf('../site/www/rdoc')
  FileUtils.cp_r('rdoc', '../site/www/rdoc')
end
 
CLEAN.add('rdoc')
 
# Duplicate code from sprout/script/build_helpers.rb!
def add_tool(file, clazz)
  name = File.basename(file).gsub(/.rb$/, '').gsub(/_task/, '')
  doc_file = File.expand_path(File.dirname(file) + "/#{name}_documentation.rb")
  content = clazz.new(name, Rake::application).to_rdoc
 
  deps = FileList['**/**/*.rb']
  file deps
 
  file doc_file => deps do |t|
    puts ">> Writing #{doc_file}"
    File.open(doc_file, 'w') do |f|
      f.write content
    end
  end
  
  CLEAN.add(doc_file)
  task :rdoc => doc_file
end
 
$:.push(File.dirname(__FILE__) + '/sprout/lib')
$:.push(File.dirname(__FILE__) + '/bundles/as2/lib')
$:.push(File.dirname(__FILE__) + '/bundles/as3/lib')
 
require 'sprout/as2'
require 'sprout/as3'
 
add_tool(File.dirname(__FILE__) + '/bundles/as2/lib/sprout/tasks/swfmill_task.rb', Sprout::SWFMillTask)
add_tool(File.dirname(__FILE__) + '/bundles/as2/lib/sprout/tasks/mtasc_task.rb', Sprout::MTASCTask)
 
add_tool(File.dirname(__FILE__) + '/bundles/as3/lib/sprout/tasks/mxmlc_task.rb', Sprout::MXMLCTask)
add_tool(File.dirname(__FILE__) + '/bundles/as3/lib/sprout/tasks/compc_task.rb', Sprout::COMPCTask)
 
add_tool(File.dirname(__FILE__) + '/bundles/as3/lib/sprout/tasks/adl.rb', Sprout::ADLTask)
add_tool(File.dirname(__FILE__) + '/bundles/as3/lib/sprout/tasks/adt_task.rb', Sprout::ADTTask)
add_tool(File.dirname(__FILE__) + '/bundles/as3/lib/sprout/tasks/adt_cert_task.rb', Sprout::ADTCertTask)
 
def execute_in_each_project(str)
  PROJECTS.each do |p|
    puts "----------------------"
    puts ">> Execute #{p} #{str}"
    execute_in_project(p, str)
  end
end
 
def execute_in_project(project, str)
  start = File.expand_path(Dir.pwd)
  Dir.chdir project
  begin
    raise "[ERROR] '#{project}' exited with errors: #{$?}" unless system(str)
  ensure
    Dir.chdir start
  end
end
 
task :cruise => [:clean, :package]
 
desc "Increment the revision number for everything"
task :increment_revision do |t|
  execute_in_each_project("rake increment_revision")
end
 
def fix_x86_mswin
  files = Dir.glob('pkg/*x86-mswin*')
  files.each do |name|
    new_name = name.gsub('-x86', '')
    puts "Renaming x86-mswin gem from #{name} to #{new_name}"
    File.mv(name, new_name)
  end
end
 
task :package do
  fix_x86_mswin
end
 
desc "Package #{PROJECTS.join(', ')} sprouts"
task :package do |t|
  execute_in_each_project("rake package CC_BUILD_ARTIFACTS=#{ARTIFACTS}")
 
  FileUtils.mkdir_p(ARTIFACTS)
  PROJECTS.each do |p|
    files = FileList["#{p}/pkg/*"]
    FileUtils.cp(files, "#{ARTIFACTS}/")
  end
  
  fix_x86_mswin
end
 
task :clean do |t|
  execute_in_each_project("rake clean CC_BUILD_ARTIFACTS=#{ARTIFACTS}")
end
 
def gem_suffixes
  return {'darwin' => true, 'mswin32' => true, 'linux' => true, 'x86' => true}
end
 
##########################
# Rubyforge Support
 
def build_expected_package_names(releases)
  basename = nil
  packages = {}
  releases.each do |file|
    parts = File.basename(file.gsub(/.gem$/,'')).split('-')
    version = parts.pop
    while(gem_suffixes[version]) do
      version = parts.pop
    end
    package_name = parts.join('-')
    if(packages[package_name].nil?)
      #puts "Creating new package for: #{package_name}"
      packages[package_name] = {:version => version, :files => []}
    end
    #puts ">> Adding file: #{file} version #{version} to package #{package_name}"
    packages[package_name][:files] << file
  end
 
  return packages
end
 
class RubyForgeError < StandardError; end
 
class RubyForge
 
  def get_group_id(group_name)
    groups.each do |key, value|
      puts ">> looking for #{group_name} against: #{key}"
      if(key == group_name)
        return value
      end
    end
    raise RubyForgeError.new("Unable to find group_id for #{group_name}")
  end
  
  def ensure_package_exists(group_id, package_name)
    if(!packages[package_name])
      raise RubyForgeError.new("Package Name must be non-null for creation") unless package_name
      puts ">> Creating new package for #{package_name}"
      create_package(group_id, package_name)
    end
    return packages[package_name]
  end
  
  def has_release?(package_name, release_name)
    begin
      package = self.releases[package_name]
      package.each do |release|
        if(release[0] == release_name)
          return true
        end
      end
      return false
    rescue StandardError => e
      return false
    end
  end
  
  def releases
    @autoconfig['release_ids']
  end
  
  def packages
    @autoconfig['package_ids']
  end
  
  def groups
    @autoconfig['group_ids']
  end
  
end
 
desc "Release the contents of 'pkg/*.gem' to Rubyforge"
task :release_to_rubyforge do |t|
  require 'rubyforge'
  releases = Dir.glob('pkg/*')
  expected_packages = build_expected_package_names(releases)
 
  known_packages = {}
  rubyforge = RubyForge.new
  rubyforge.configure
  rubyforge.login
  
  group_id = rubyforge.get_group_id(PROJECT_NAME)
  raise RubyForgeError.new("Cannot create packages or add releases without expected group_id for #{PROJECT_NAME}") unless (group_id)
  
  puts "-------------------"
  
  expected_packages.each do |package_name, release|
 
    package_id = rubyforge.ensure_package_exists(group_id, package_name)
    files = release[:files]
    version = release[:version]
    
    puts ">> Checking: #{package_name} [#{version}] with: #{files.join(', ')}"
    if(!rubyforge.has_release?(package_name, version))
 
      begin
        # Build up arguments list because the *files arg is strangely implemented
        args = [group_id, package_id, version]
        args = args.concat(files)
        rubyforge.send(:add_release, *args)
        puts "++ RELEASED #{package_name} #{version} with #{files.join(', ')}"
      rescue StandardError => e
        if(e.message.index('already released this version'))
          puts ">> Rubyforge already has a release for: #{package_name} #{version}"
        elsif(e.message.index('Invalid package_id'))
          puts ">> Rubyforge cannot work with #{package_name}"
        else
          puts ">> Unhandled Rubyforge exception on #{package_name} for #{version}"
          raise e
        end
      end
 
    else
      puts ">> No release necessary for: #{package_name} #{version}"
    end
 
  end
 
end
 
desc "Release to gems.projectsprouts.org (cannot work from *all* sprouts)"
task :release_to_dev do |t|
  exec 'scp pkg/* dev.patternpark.com:/var/www/projectsprouts/current/gems/'
end
 
require File.join(File.dirname(__FILE__), 'sprout', 'lib', 'sprout', 'tasks', 'ssh_task')
 
desc "Update the remote gem index immediately"
ssh :update_gem_index => :release_to_dev do |t|
  t.host = 'dev.patternpark.com'
  t.commands << 'cd /var/www/projectsprouts/current/gems'
  t.commands << 'gem generate_index -d .'
end
 
=begin
desc "Release rdocs to www.projectsprouts.org/rdoc"
sftp :release_rdoc => :clear_rdoc do |t|
t.host = 'dev.patternpark.com'
t.remote_path = '/var/www/projectsprouts/current/rdoc'
t.files = Dir.glob("rdoc/**/**/*")
t.local_path = "rdoc"
end
 
desc "Remove the existing rdoc build"
ssh :clear_rdoc do |t|
t.host = 'dev.patternpark.com'
t.commands << 'rm -Rf /var/www/projectsprouts/current/rdoc'
t.commands << 'mkdir /var/www/projectsprouts/current/rdoc'
end
=end
 
# desc "Release to RubyForge and ProjectSprouts"
# task :release => [:update_gem_index, :release_to_rubyforge]
 
##########################
 
def gem_files
  FileList['pkg/*.gem'].each do |name|
    yield name if block_given?
  end
end
 
desc "Migrate gems from RubyForge to GemCutter"
task :migrate do
  gem_files.each do |file|
    name = name.gsub(/.gem$/, '')
    name = name.gsub(/-\d.*$/, '')
    name = name.gsub(/^pkg\//, '')
    begin
      puts "Migrating: #{name}"
      sh "gem migrate #{name}"
    rescue
      puts ">> [ERROR] There was a problem migrating: #{name}"
    end
  end
end
 
desc "Release gems to gemcutter.org"
task :release do
  gem_files.each do |file|
    begin
      sh "gem push #{file}"
    rescue
      puts ">> [ERROR] There was a problem pushing #{name}"
    end
  end
end
 
desc "Remove all gems that begin with 'sprout-'"
task :remove_all do |t|
  RubiGen::GemGeneratorSource.new().each_sprout do |sprout|
    puts "found sprout: #{sprout.name}"
    raise ">> Exited with errors: #{$?}" unless system("gem uninstall -x -a #{sprout.name}")
  end
end
 
# Add required support for remove_all task
gem 'rubigen'
require 'rubigen'
 
module RubiGen
  class GemGeneratorSource < AbstractGemSource
 
    def each_sprout
      Gem::cache.search(/sprout-*/).inject({}) { |latest, gem|
        hem = latest[gem.name]
        latest[gem.name] = gem if hem.nil? or gem.version > hem.version
        latest
      }.values.each { |gem|
        yield Spec.new(gem.name, gem.full_gem_path, label)
      }
    end
  end
end