From ead99f3f2e7085688b7d31b2cf2af9aecc1a1982 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 5 Jul 2006 02:17:25 +0000 Subject: Fixed that real files and symlinks should be treated the same when compiling templates (closes #5438) [zachary@panandscan.com] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4546 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 + actionpack/lib/action_view/base.rb | 3 +- .../test/template/compiled_templates_test.rb | 134 +++++++++++++++++++++ .../test/template/compiled_templates_tests.rb | 63 ---------- 4 files changed, 138 insertions(+), 64 deletions(-) create mode 100644 actionpack/test/template/compiled_templates_test.rb delete mode 100644 actionpack/test/template/compiled_templates_tests.rb diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index e00fc9e64a..c85acf800b 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Fixed that real files and symlinks should be treated the same when compiling templates #5438 [zachary@panandscan.com] + * Fixed that the flash should be reset when reset_session is called #5584 [shugo@ruby-lang.org] * Added special case for "1 Byte" in NumberHelper#number_to_human_size #5593 [murpyh@rubychan.de] diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb index d3758f4583..87b0174703 100644 --- a/actionpack/lib/action_view/base.rb +++ b/actionpack/lib/action_view/base.rb @@ -425,7 +425,8 @@ module ActionView #:nodoc: if @@compile_time[render_symbol] && supports_local_assigns?(render_symbol, local_assigns) if file_name && !@@cache_template_loading - @@compile_time[render_symbol] < File.mtime(file_name) + @@compile_time[render_symbol] < File.mtime(file_name) || (File.symlink?(file_name) ? + @@compile_time[render_symbol] < File.lstat(file_name).mtime : false) end else true diff --git a/actionpack/test/template/compiled_templates_test.rb b/actionpack/test/template/compiled_templates_test.rb new file mode 100644 index 0000000000..3bb1e58c1a --- /dev/null +++ b/actionpack/test/template/compiled_templates_test.rb @@ -0,0 +1,134 @@ +require 'test/unit' +require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper' +require File.dirname(__FILE__) + "/../abstract_unit" + +class CompiledTemplateTests < Test::Unit::TestCase + + def setup + @ct = ActionView::CompiledTemplates.new + @v = Class.new + @v.send :include, @ct + @a = './test_compile_template_a.rhtml' + @b = './test_compile_template_b.rhtml' + @s = './test_compile_template_link.rhtml' + end + def teardown + [@a, @b, @s].each do |f| + `rm #{f}` if File.exist?(f) || File.symlink?(f) + end + end + attr_reader :ct, :v + + def test_name_allocation + hi_world = ct.method_names['hi world'] + hi_sexy = ct.method_names['hi sexy'] + wish_upon_a_star = ct.method_names['I love seeing decent error messages'] + + assert_equal hi_world, ct.method_names['hi world'] + assert_equal hi_sexy, ct.method_names['hi sexy'] + assert_equal wish_upon_a_star, ct.method_names['I love seeing decent error messages'] + assert_equal 3, [hi_world, hi_sexy, wish_upon_a_star].uniq.length + end + + def test_wrap_source + assert_equal( + "def aliased_assignment(value)\nself.value = value\nend", + @ct.wrap_source(:aliased_assignment, [:value], 'self.value = value') + ) + + assert_equal( + "def simple()\nnil\nend", + @ct.wrap_source(:simple, [], 'nil') + ) + end + + def test_compile_source_single_method + selector = ct.compile_source('doubling method', [:a], 'a + a') + assert_equal 2, @v.new.send(selector, 1) + assert_equal 4, @v.new.send(selector, 2) + assert_equal -4, @v.new.send(selector, -2) + assert_equal 0, @v.new.send(selector, 0) + selector + end + + def test_compile_source_two_method + sel1 = test_compile_source_single_method # compile the method in the other test + sel2 = ct.compile_source('doubling method', [:a, :b], 'a + b + a + b') + assert_not_equal sel1, sel2 + + assert_equal 2, @v.new.send(sel1, 1) + assert_equal 4, @v.new.send(sel1, 2) + + assert_equal 6, @v.new.send(sel2, 1, 2) + assert_equal 32, @v.new.send(sel2, 15, 1) + end + + def test_mtime + t1 = Time.now + test_compile_source_single_method + assert (t1..Time.now).include?(ct.mtime('doubling method', [:a])) + end + + def test_compile_time + `echo '#{@a}' > #{@a}; echo '#{@b}' > #{@b}; ln -s #{@a} #{@s}` + + v = ActionView::Base.new + v.base_path = '.' + v.cache_template_loading = false; + + sleep 1 + t = Time.now + v.compile_and_render_template(:rhtml, '', @a) + v.compile_and_render_template(:rhtml, '', @b) + v.compile_and_render_template(:rhtml, '', @s) + a_n = v.method_names[@a] + b_n = v.method_names[@b] + s_n = v.method_names[@s] + # all of the files have changed since last compile + assert v.compile_time[a_n] > t + assert v.compile_time[b_n] > t + assert v.compile_time[s_n] > t + + sleep 1 + t = Time.now + v.compile_and_render_template(:rhtml, '', @a) + v.compile_and_render_template(:rhtml, '', @b) + v.compile_and_render_template(:rhtml, '', @s) + # none of the files have changed since last compile + assert v.compile_time[a_n] < t + assert v.compile_time[b_n] < t + assert v.compile_time[s_n] < t + + `rm #{@s}; ln -s #{@b} #{@s}` + v.compile_and_render_template(:rhtml, '', @a) + v.compile_and_render_template(:rhtml, '', @b) + v.compile_and_render_template(:rhtml, '', @s) + # the symlink has changed since last compile + assert v.compile_time[a_n] < t + assert v.compile_time[b_n] < t + assert v.compile_time[s_n] > t + + sleep 1 + `touch #{@b}` + t = Time.now + v.compile_and_render_template(:rhtml, '', @a) + v.compile_and_render_template(:rhtml, '', @b) + v.compile_and_render_template(:rhtml, '', @s) + # the file at the end of the symlink has changed since last compile + # both the symlink and the file at the end of it should be recompiled + assert v.compile_time[a_n] < t + assert v.compile_time[b_n] > t + assert v.compile_time[s_n] > t + end +end + +module ActionView + class Base + def compile_time + @@compile_time + end + def method_names + @@method_names + end + end +end diff --git a/actionpack/test/template/compiled_templates_tests.rb b/actionpack/test/template/compiled_templates_tests.rb deleted file mode 100644 index 4734e6e81e..0000000000 --- a/actionpack/test/template/compiled_templates_tests.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'test/unit' -require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper' -require File.dirname(__FILE__) + "/../abstract_unit" - -class CompiledTemplateTests < Test::Unit::TestCase - - def setup - @ct = ActionView::CompiledTemplates.new - @v = Class.new - @v.send :include, @ct - end - attr_reader :ct, :v - - def test_name_allocation - hi_world = ct.method_names['hi world'] - hi_sexy = ct.method_names['hi sexy'] - wish_upon_a_star = ct.method_names['I love seeing decent error messages'] - - assert_equal hi_world, ct.method_names['hi world'] - assert_equal hi_sexy, ct.method_names['hi sexy'] - assert_equal wish_upon_a_star, ct.method_names['I love seeing decent error messages'] - assert_equal 3, [hi_world, hi_sexy, wish_upon_a_star].uniq.length - end - - def test_wrap_source - assert_equal( - "def aliased_assignment(value)\nself.value = value\nend", - @ct.wrap_source(:aliased_assignment, [:value], 'self.value = value') - ) - - assert_equal( - "def simple()\nnil\nend", - @ct.wrap_source(:simple, [], 'nil') - ) - end - - def test_compile_source_single_method - selector = ct.compile_source('doubling method', [:a], 'a + a') - assert_equal 2, @v.new.send(selector, 1) - assert_equal 4, @v.new.send(selector, 2) - assert_equal -4, @v.new.send(selector, -2) - assert_equal 0, @v.new.send(selector, 0) - selector - end - - def test_compile_source_two_method - sel1 = test_compile_source_single_method # compile the method in the other test - sel2 = ct.compile_source('doubling method', [:a, :b], 'a + b + a + b') - assert_not_equal sel1, sel2 - - assert_equal 2, @v.new.send(sel1, 1) - assert_equal 4, @v.new.send(sel1, 2) - - assert_equal 6, @v.new.send(sel2, 1, 2) - assert_equal 32, @v.new.send(sel2, 15, 1) - end - - def test_mtime - t1 = Time.now - test_compile_source_single_method - assert (t1..Time.now).include?(ct.mtime('doubling method', [:a])) - end -end -- cgit v1.2.3