From a7cdaadd1933cb4565ab9c2de5996821d3748d0a Mon Sep 17 00:00:00 2001
From: Marcel Molina <marcel@vernix.org>
Date: Sat, 8 Oct 2005 18:40:00 +0000
Subject: Evaluate dynamic templates before checking if the new file is
 identical to the old one.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2494 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
---
 railties/lib/rails_generator/commands.rb | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

(limited to 'railties/lib')

diff --git a/railties/lib/rails_generator/commands.rb b/railties/lib/rails_generator/commands.rb
index e6795efdb9..f8a7e706a3 100644
--- a/railties/lib/rails_generator/commands.rb
+++ b/railties/lib/rails_generator/commands.rb
@@ -144,12 +144,16 @@ module Rails
         # Collisions are handled by checking whether the destination file
         # exists and either skipping the file, forcing overwrite, or asking
         # the user what to do.
-        def file(relative_source, relative_destination, file_options = {})
+        def file(relative_source, relative_destination, file_options = {}, &block)
           # Determine full paths for source and destination files.
           source              = source_path(relative_source)
           destination         = destination_path(relative_destination)
           destination_exists  = File.exists?(destination)
-          return logger.identical(relative_destination) if destination_exists and identical?(source, destination)
+
+          # If source and destination are identical then we're done.
+          if destination_exists and identical?(source, destination, &block)
+            return logger.identical(relative_destination) 
+          end
 
           # Check for and resolve file collisions.
           if destination_exists
@@ -209,9 +213,13 @@ module Rails
           system("svn add #{destination}") if options[:svn]
         end
 
-        # Checks if the source and the destination file are identical.
-        def identical?(source, destination)
-          IO.read(source) == IO.read(destination)
+        # Checks if the source and the destination file are identical. If
+        # passed a block then the source file is a template that needs to first
+        # be evaluated before being compared to the destination.
+        def identical?(source, destination, &block)
+          source      = block_given? ? File.open(source) {|sf| yield(sf)} : IO.read(source)
+          destination = IO.read(destination)
+          source == destination
         end
 
         # Generate a file for a Rails application using an ERuby template.
-- 
cgit v1.2.3