This patch doesn't work for this type of manifest:

      file { "/tmp/mydir" :
        source  => '/tmp/sourcedir',
        recurse => true,
      }

I've got another patch that I'll get reviewed tomorrow that includes
tests, but the change from I've already sent is really just:

--- a/lib/puppet/type/file/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -163,11 +163,12 @@ module Puppet
       Puppet.settings[:name] == "apply"
     end

-    # the content is munged so if it's a checksum source_or_content is nil here
+    # the content is munged so if it's a checksum source_or_content is nil
+    # unless the checksum indirectly comes from source
     def each_chunk_from(source_or_content)
       if source_or_content.is_a?(String)
         yield source_or_content
-      elsif content_is_really_a_checksum?
+      elsif content_is_really_a_checksum? && source_or_content.nil?
         yield read_file_from_filebucket
       elsif source_or_content.nil?
         yield ''

Full patch is on my branch:
https://github.com/mmrobins/puppet/tree/ticket/2.6.next/6541-md5_in_content_truncates

On Tue, Mar 1, 2011 at 5:41 PM, Matt Robinson <[email protected]> wrote:
> The patch for #6107 fd73874147a1aaa3a047f904a0bc1ae67780a2e4 introduced
> a bug when content was an invalid checksum.  Rather than error the
> checksum was invalid, it would overwrite the file with empty string,
> essentially truncating it.
>
> The problem with #6107 is that when I wrote it, I didn't realize that
> the content parameter was munged to be nil when it was a checksum, and
> then chunking method special cased nil content to mean you should check
> the filebucket.  #6107 intended to fix the case where content REALLY WAS
> nil, and handle that by returning an empty string.
>
> This patch fixes it so that we check to see if we really passed in a
> checksum when chunking, and only then going to the filebucket.
>
> I've said it before, and sure I'll say it again, but long term the file
> provider really needs a refactor.  I'll write some acceptance tests for
> file behavior right after committing this so that the refactoring will
> be easier.
>
> Reviewed-by: Daniel Pittman <[email protected]>
> Signed-off-by: Matt Robinson <[email protected]>
> ---
>  lib/puppet/type/file/content.rb     |   11 ++++++++---
>  spec/unit/type/file/content_spec.rb |    9 ++++++++-
>  2 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/lib/puppet/type/file/content.rb b/lib/puppet/type/file/content.rb
> index 5223ee3..ae541bc 100755
> --- a/lib/puppet/type/file/content.rb
> +++ b/lib/puppet/type/file/content.rb
> @@ -163,13 +163,14 @@ module Puppet
>       Puppet.settings[:name] == "apply"
>     end
>
> +    # the content is munged so if it's a checksum source_or_content is nil 
> here
>     def each_chunk_from(source_or_content)
>       if source_or_content.is_a?(String)
>         yield source_or_content
> -      elsif source_or_content.nil? && resource.parameter(:ensure) && 
> [:present, :file].include?(resource.parameter(:ensure).value)
> -        yield ''
> -      elsif source_or_content.nil?
> +      elsif content_is_really_a_checksum?
>         yield read_file_from_filebucket
> +      elsif source_or_content.nil?
> +        yield ''
>       elsif self.class.standalone?
>         yield source_or_content.content
>       elsif source_or_content.local?
> @@ -181,6 +182,10 @@ module Puppet
>
>     private
>
> +    def content_is_really_a_checksum?
> +      checksum?(should)
> +    end
> +
>     def chunk_file_from_disk(source_or_content)
>       File.open(source_or_content.full_path, "r") do |src|
>         while chunk = src.read(8192)
> diff --git a/spec/unit/type/file/content_spec.rb 
> b/spec/unit/type/file/content_spec.rb
> index 7d23399..3853484 100755
> --- a/spec/unit/type/file/content_spec.rb
> +++ b/spec/unit/type/file/content_spec.rb
> @@ -380,12 +380,19 @@ describe content do
>         @content.each_chunk_from(nil) { |chunk| chunk.should == '' }
>       end
>
> +      # you might do this if you were just auditing
>       it "when no content, source, but ensure file" do
>         @resource[:ensure] = :file
>         @content.each_chunk_from(nil) { |chunk| chunk.should == '' }
>       end
>
> -      it "when no content or source" do
> +      it "when source_or_content is nil and content not a checksum" do
> +        @content.each_chunk_from(nil) { |chunk| chunk.should == '' }
> +      end
> +
> +      # the content is munged so that if it's a checksum nil gets passed in
> +      it "when content is a checksum it should try to read from filebucket" 
> do
> +        @content.should = "{md5}123abcd"
>         
> @content.expects(:read_file_from_filebucket).once.returns('im_a_filebucket')
>         @content.each_chunk_from(nil) { |chunk| chunk.should == 
> 'im_a_filebucket' }
>       end
> --
> 1.7.3.1
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/puppet-dev?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to