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
This commit is contained in:
Marcel Molina 2005-10-08 18:40:00 +00:00
parent d451044ece
commit a7cdaadd19

@ -144,12 +144,16 @@ def class_collisions(*class_names)
# 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 @@ def file(relative_source, relative_destination, file_options = {})
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.