[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. puppet-0.24.5-rc3-1601-gf8c1b08

James Turnbull james at lovedthanlost.net
Fri Jan 15 09:08:35 UTC 2010


The following commit has been merged in the upstream branch:
commit 7e64393dd10023d528d2fc21383ead30c9ee94dd
Author: Markus Roberts <Markus at reality.com>
Date:   Thu Dec 31 01:04:06 2009 -0800

    Additional fix for #2994 (followed symlinks do not have checksums)
    
    The first patch for #2994, to which this is an extension, exposed
    the fact that checksums were not being included in the metadata
    for followed links; checksums are needed for managing the contents
    of files that are represented on the server as links (links => follow).
    
    This patch adds checksums for followed links and tests to confirm that
    it works as expected.

diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb
index 275a090..678a4ff 100644
--- a/lib/puppet/file_serving/metadata.rb
+++ b/lib/puppet/file_serving/metadata.rb
@@ -22,18 +22,15 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
     PARAM_ORDER = [:mode, :ftype, :owner, :group]
 
     def attributes_with_tabs
+        raise(ArgumentError, "Cannot manage files of type #{ftype}") unless ['file','directory','link'].include? ftype
         desc = []
         PARAM_ORDER.each { |check|
             check = :ftype if check == :type
             desc << send(check)
         }
 
-        case ftype
-        when "file", "directory"; desc << checksum
-        when "link"; desc << @destination
-        else
-            raise ArgumentError, "Cannot manage files of type %s" % ftype
-        end
+        desc << checksum     if ftype == 'file' or ftype == 'directory' or (ftype == 'link' and @links == :follow)
+        desc << @destination if                                             ftype == 'link' and @links != :follow
 
         return desc.join("\t")
     end
@@ -66,6 +63,7 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
             @checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path).to_s
         when "link"
             @destination = File.readlink(real_path)
+            @checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, real_path).to_s if @links == :follow
         else
             raise ArgumentError, "Cannot manage files of type %s" % stat.ftype
         end
diff --git a/spec/unit/file_serving/metadata.rb b/spec/unit/file_serving/metadata.rb
index 38240f7..a3078fa 100755
--- a/spec/unit/file_serving/metadata.rb
+++ b/spec/unit/file_serving/metadata.rb
@@ -230,23 +230,37 @@ describe Puppet::FileServing::Metadata, " when collecting attributes" do
 end
 
 describe Puppet::FileServing::Metadata, " when pointing to a link" do
-    it "should store the destination of the link in :destination if links are :manage" do
-        file = Puppet::FileServing::Metadata.new("/base/path/my/file", :links => :manage)
-
-        File.expects(:lstat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "link", :mode => 0755)
-        File.expects(:readlink).with("/base/path/my/file").returns "/some/other/path"
-
-        file.collect
-        file.destination.should == "/some/other/path"
+    describe "when links are managed" do
+        before do
+             @file = Puppet::FileServing::Metadata.new("/base/path/my/file", :links => :manage)
+             File.expects(:lstat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "link", :mode => 0755)
+             File.expects(:readlink).with("/base/path/my/file").returns "/some/other/path"
+        end
+        it "should store the destination of the link in :destination if links are :manage" do
+            @file.collect
+            @file.destination.should == "/some/other/path"
+        end
+        it "should not collect the checksum if links are :manage" do
+            @file.collect
+            @file.checksum.should be_nil
+        end
     end
 
-    it "should not collect the checksum" do
-        file = Puppet::FileServing::Metadata.new("/base/path/my/file", :links => :manage)
-
-        File.expects(:lstat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "link", :mode => 0755)
-        File.expects(:readlink).with("/base/path/my/file").returns "/some/other/path"
-
-        file.collect
-        file.checksum.should be_nil
+    describe "when links are followed" do
+        before do
+            @file = Puppet::FileServing::Metadata.new("/base/path/my/file", :links => :follow)
+            File.expects(:stat).with("/base/path/my/file").returns stub("stat", :uid => 1, :gid => 2, :ftype => "file", :mode => 0755)
+            File.expects(:readlink).with("/base/path/my/file").never
+            @checksum = Digest::MD5.hexdigest("some content\n")
+            @file.stubs(:md5_file).returns(@checksum)
+        end
+        it "should not store the destination of the link in :destination if links are :follow" do
+            @file.collect
+            @file.destination.should be_nil
+        end
+        it "should collect the checksum if links are :follow" do
+            @file.collect
+            @file.checksum.should == "{md5}#{@checksum}"
+        end
     end
 end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list