Rakefile in tzinfo-0.3.22 vs Rakefile in tzinfo-0.3.23
- old
+ new
@@ -1,177 +1,241 @@
-# Available options:
-#
-# rake test - Runs all test cases.
-# rake package - Runs test cases and builds packages for distribution.
-# rake rdoc - Builds API documentation in doc dir.
-# rake build_tz_modules - Builds Timezone modules and the Country index.
-# Expects to find source data in ../data.
-# rake build_tz_module zone=Zone/Name - Builds a single Timezone module.
-# Expects to find source data in ../data.
-# rake build_countries - Builds the Country index.
-# Expects to find source data in ../data.
-
-require 'rake'
-require 'rake/testtask'
-require 'rake/rdoctask'
-require 'rake/gempackagetask'
-require 'fileutils'
-
-PKG_VERSION = "0.3.22"
-PKG_FILES = FileList[
- 'CHANGES',
- 'LICENSE',
- 'Rakefile',
- 'README',
- 'bin/**/*',
- 'lib/**/*'
-].delete_if {|f| f.include?('.svn')}
-PKG_TEST_FILES = FileList['test/**/*'].delete_if {|f| f.include?('.svn')}
-
-RDOC_OPTIONS = %w[--exclude definitions --exclude indexes]
-RDOC_EXTRA_FILES = %w[README CHANGES]
-
-BUILD_TZ_CLASSES_DIR = 'lib/tzinfo.build_tz_classes'
-
-SPEC = Gem::Specification.new do |s|
- s.name = "tzinfo"
- s.version = PKG_VERSION
- s.author = "Philip Ross"
- s.email = "phil.ross@gmail.com"
- s.homepage = "http://tzinfo.rubyforge.org/"
- s.platform = Gem::Platform::RUBY
- s.summary = "Daylight-savings aware timezone library"
- s.description = "TZInfo is a Ruby library that uses the standard tz (Olson) database to provide daylight savings aware transformations between times in different time zones."
- s.files = PKG_FILES
- s.test_files = PKG_TEST_FILES
- s.require_path = "lib"
- s.has_rdoc = true
- s.extra_rdoc_files = RDOC_EXTRA_FILES
- s.rdoc_options = RDOC_OPTIONS
- s.rubyforge_project = "tzinfo"
-end
-
-Rake::GemPackageTask.new(SPEC) do |pkg|
- pkg.need_zip = true
- pkg.need_tar_gz = true
-end
-
-
-Rake::TestTask.new('test') do |t|
- # Force a particular timezone to be local (helps find issues when local
- # timezone isn't GMT). This won't work on Windows.
- ENV['TZ'] = 'America/Los_Angeles'
-
- t.libs << '.'
- t.pattern = 'test/tc_*.rb'
- t.verbose = true
-end
-
-
-Rake::RDocTask.new do |rdoc|
- rdoc.rdoc_dir = 'doc'
- rdoc.title = "TZInfo"
- rdoc.options << '--inline-source'
- rdoc.options.concat RDOC_OPTIONS
- rdoc.rdoc_files.include(*RDOC_EXTRA_FILES)
- rdoc.rdoc_files.include('lib')
-end
-
-task :build_tz_modules do
- require 'lib/tzinfo/tzdataparser'
-
- FileUtils.mkdir_p(BUILD_TZ_CLASSES_DIR)
- begin
- p = TZInfo::TZDataParser.new('../data', BUILD_TZ_CLASSES_DIR)
- p.execute
-
- ['indexes', 'definitions'].each {|dir|
- sync_svn("#{BUILD_TZ_CLASSES_DIR}/#{dir}", "lib/tzinfo/#{dir}")
- }
- ensure
- FileUtils.rm_rf(BUILD_TZ_CLASSES_DIR)
- end
-end
-
-def sync_svn(source_dir, target_dir)
- puts "SVN Sync from #{source_dir} to #{target_dir}"
-
- # Assumes a directory will never turn into a file and vice-versa
- # (files will all end in .rb, directories won't).
- # SVN wouldn't allow the change in a single commit anyway.
-
- source_entries, target_entries = [source_dir, target_dir].collect {|dir|
- Dir.entries(dir).delete_if {|entry| entry =~ /^\.(\.?|svn)$/}.sort
- }
-
- until source_entries.empty? || target_entries.empty?
- if source_entries.last == target_entries.last
- source_file = "#{source_dir}/#{source_entries.last}"
- target_file = "#{target_dir}/#{target_entries.last}"
-
- if File.directory?(source_file)
- sync_svn(source_file, target_file)
- else
- FileUtils.cp(source_file, target_file)
- end
-
- source_entries.pop
- target_entries.pop
- elsif source_entries.last < target_entries.last
- sync_svn_only_in_target(target_dir, target_entries)
- else
- sync_svn_only_in_source(source_dir, target_dir, source_entries)
- end
- end
-
- until target_entries.empty?
- sync_svn_only_in_target(target_dir, target_entries)
- end
-
- until source_entries.empty?
- sync_svn_only_in_source(source_dir, target_dir, source_entries)
- end
-end
-
-def sync_svn_only_in_target(target_dir, target_entries)
- target_file = "#{target_dir}/#{target_entries.last}"
- exec_svn "delete \"#{target_file}\""
- target_entries.pop
-end
-
-def sync_svn_only_in_source(source_dir, target_dir, source_entries)
- source_file = "#{source_dir}/#{source_entries.last}"
- target_file = "#{target_dir}/#{source_entries.last}"
-
- if File.directory?(source_file)
- Dir.mkdir(target_file)
- exec_svn "add \"#{target_file}\""
- sync_svn(source_file, target_file)
- else
- FileUtils.cp(source_file, target_file)
- exec_svn "add \"#{target_file}\""
- end
-
- source_entries.pop
-end
-
-def exec_svn(params)
- puts "svn #{params}"
- `svn #{params}`
- raise "SVN exited with status #$?" if $? != 0
-end
-
-task :build_tz_module do
- require 'lib/tzinfo/tzdataparser'
- p = TZInfo::TZDataParser.new('../data', 'lib/tzinfo')
- p.generate_countries = false
- p.only_zones = [ENV['zone']]
- p.execute
-end
-
-task :build_countries do
- require 'lib/tzinfo/tzdataparser'
- p = TZInfo::TZDataParser.new('../data', 'lib/tzinfo')
- p.generate_countries = true
- p.generate_zones = false
- p.execute
-end
+# Available options:
+#
+# rake test - Runs all test cases.
+# rake package - Runs test cases and builds packages for distribution.
+# rake rdoc - Builds API documentation in doc dir.
+# rake build_tz_modules - Builds Timezone modules and the Country index.
+# Expects to find source data in ../data.
+# rake build_tz_module zone=Zone/Name - Builds a single Timezone module.
+# Expects to find source data in ../data.
+# rake build_countries - Builds the Country index.
+# Expects to find source data in ../data.
+
+require 'rake'
+require 'rake/testtask'
+require 'rake/rdoctask'
+require 'rake/gempackagetask'
+require 'fileutils'
+
+Rake::TaskManager.class_eval do
+ def remove_task(task_name)
+ @tasks.delete(task_name.to_s)
+ end
+end
+
+def remove_task(task_name)
+ Rake.application.remove_task(task_name)
+end
+
+self.class.class_eval { alias_method :orig_sh, :sh }
+private :orig_sh
+
+def sh(*cmd, &block)
+ if cmd.first =~ /\A__tar_with_owner__ -?([zjcvf]+)(.*)\z/
+ opts = $1
+ args = $2
+ cmd[0] = "tar c --owner 0 --group 0 -#{opts.gsub('c', '')}#{args}"
+ end
+
+ orig_sh(*cmd, &block)
+end
+
+
+PKG_VERSION = "0.3.23"
+PKG_FILES = FileList[
+ 'CHANGES',
+ 'LICENSE',
+ 'Rakefile',
+ 'README',
+ 'lib',
+ 'lib/**/*'
+].delete_if {|f| f.include?('.svn')}
+PKG_TEST_FILES = FileList['test', 'test/**/*'].delete_if {|f| f.include?('.svn')}
+
+RDOC_OPTIONS = %w[--exclude definitions --exclude indexes]
+RDOC_EXTRA_FILES = %w[README CHANGES]
+
+BUILD_TZ_CLASSES_DIR = 'lib/tzinfo.build_tz_classes'
+
+SPEC = Gem::Specification.new do |s|
+ s.name = "tzinfo"
+ s.version = PKG_VERSION
+ s.author = "Philip Ross"
+ s.email = "phil.ross@gmail.com"
+ s.homepage = "http://tzinfo.rubyforge.org/"
+ s.platform = Gem::Platform::RUBY
+ s.summary = "Daylight-savings aware timezone library"
+ s.description = "TZInfo is a Ruby library that uses the standard tz (Olson) database to provide daylight savings aware transformations between times in different time zones."
+ s.files = PKG_FILES
+ s.test_files = PKG_TEST_FILES
+ s.require_path = "lib"
+ s.has_rdoc = true
+ s.extra_rdoc_files = RDOC_EXTRA_FILES
+ s.rdoc_options = RDOC_OPTIONS
+ s.rubyforge_project = "tzinfo"
+end
+
+package_task = Rake::GemPackageTask.new(SPEC) do |pkg|
+ pkg.need_zip = true
+ pkg.need_tar_gz = true
+ pkg.tar_command = '__tar_with_owner__'
+end
+
+# Replace the Rake::PackageTask task that prepares the files to package with
+# a version that ensures the permissions are correct for the package.
+# Also just copy rather than link the files so that old versions are maintained.
+remove_task package_task.package_dir_path
+file package_task.package_dir_path => [package_task.package_dir] + package_task.package_files do
+ mkdir_p package_task.package_dir_path rescue nil
+ chmod(0755, package_task.package_dir_path)
+ package_task.package_files.each do |fn|
+ f = File.join(package_task.package_dir_path, fn)
+ fdir = File.dirname(f)
+ mkdir_p(fdir) if !File.exist?(fdir)
+ if File.directory?(fn)
+ mkdir_p(f)
+ chmod(0755, f)
+ else
+ rm_f f
+ cp(fn, f)
+ chmod(0644, f)
+ end
+ end
+end
+
+
+# Replace the Rake::GemPackageTask task that builds the gem with a version that
+# changes to the copied package directory first. This allows the gem builder
+# to pick up the correct file permissions.
+remove_task "#{package_task.package_dir}/#{package_task.gem_file}"
+file "#{package_task.package_dir}/#{package_task.gem_file}" => [package_task.package_dir] + package_task.gem_spec.files do
+ when_writing("Creating GEM") do
+ chdir(package_task.package_dir_path) do
+ Gem::Builder.new(package_task.gem_spec).build
+ end
+
+ verbose(true) do
+ mv File.join(package_task.package_dir_path, package_task.gem_file), "#{package_task.package_dir}/#{package_task.gem_file}"
+ end
+ end
+end
+
+
+Rake::TestTask.new('test') do |t|
+ # Force a particular timezone to be local (helps find issues when local
+ # timezone isn't GMT). This won't work on Windows.
+ ENV['TZ'] = 'America/Los_Angeles'
+
+ t.libs << '.'
+ t.pattern = 'test/tc_*.rb'
+ t.verbose = true
+end
+
+
+Rake::RDocTask.new do |rdoc|
+ rdoc.rdoc_dir = 'doc'
+ rdoc.title = "TZInfo"
+ rdoc.options << '--inline-source'
+ rdoc.options.concat RDOC_OPTIONS
+ rdoc.rdoc_files.include(*RDOC_EXTRA_FILES)
+ rdoc.rdoc_files.include('lib')
+end
+
+task :build_tz_modules do
+ require 'lib/tzinfo/tzdataparser'
+
+ FileUtils.mkdir_p(BUILD_TZ_CLASSES_DIR)
+ begin
+ p = TZInfo::TZDataParser.new('../data', BUILD_TZ_CLASSES_DIR)
+ p.execute
+
+ ['indexes', 'definitions'].each {|dir|
+ sync_svn("#{BUILD_TZ_CLASSES_DIR}/#{dir}", "lib/tzinfo/#{dir}")
+ }
+ ensure
+ FileUtils.rm_rf(BUILD_TZ_CLASSES_DIR)
+ end
+end
+
+def sync_svn(source_dir, target_dir)
+ puts "SVN Sync from #{source_dir} to #{target_dir}"
+
+ # Assumes a directory will never turn into a file and vice-versa
+ # (files will all end in .rb, directories won't).
+ # SVN wouldn't allow the change in a single commit anyway.
+
+ source_entries, target_entries = [source_dir, target_dir].collect {|dir|
+ Dir.entries(dir).delete_if {|entry| entry =~ /^\.(\.?|svn)$/}.sort
+ }
+
+ until source_entries.empty? || target_entries.empty?
+ if source_entries.last == target_entries.last
+ source_file = "#{source_dir}/#{source_entries.last}"
+ target_file = "#{target_dir}/#{target_entries.last}"
+
+ if File.directory?(source_file)
+ sync_svn(source_file, target_file)
+ else
+ FileUtils.cp(source_file, target_file)
+ end
+
+ source_entries.pop
+ target_entries.pop
+ elsif source_entries.last < target_entries.last
+ sync_svn_only_in_target(target_dir, target_entries)
+ else
+ sync_svn_only_in_source(source_dir, target_dir, source_entries)
+ end
+ end
+
+ until target_entries.empty?
+ sync_svn_only_in_target(target_dir, target_entries)
+ end
+
+ until source_entries.empty?
+ sync_svn_only_in_source(source_dir, target_dir, source_entries)
+ end
+end
+
+def sync_svn_only_in_target(target_dir, target_entries)
+ target_file = "#{target_dir}/#{target_entries.last}"
+ exec_svn "delete \"#{target_file}\""
+ target_entries.pop
+end
+
+def sync_svn_only_in_source(source_dir, target_dir, source_entries)
+ source_file = "#{source_dir}/#{source_entries.last}"
+ target_file = "#{target_dir}/#{source_entries.last}"
+
+ if File.directory?(source_file)
+ Dir.mkdir(target_file)
+ exec_svn "add \"#{target_file}\""
+ sync_svn(source_file, target_file)
+ else
+ FileUtils.cp(source_file, target_file)
+ exec_svn "add \"#{target_file}\""
+ end
+
+ source_entries.pop
+end
+
+def exec_svn(params)
+ puts "svn #{params}"
+ `svn #{params}`
+ raise "SVN exited with status #$?" if $? != 0
+end
+
+task :build_tz_module do
+ require 'lib/tzinfo/tzdataparser'
+ p = TZInfo::TZDataParser.new('../data', 'lib/tzinfo')
+ p.generate_countries = false
+ p.only_zones = [ENV['zone']]
+ p.execute
+end
+
+task :build_countries do
+ require 'lib/tzinfo/tzdataparser'
+ p = TZInfo::TZDataParser.new('../data', 'lib/tzinfo')
+ p.generate_countries = true
+ p.generate_zones = false
+ p.execute
+end