Thanks for doing this, Ian!  Josh and I have merged the following
additional tests into the patch.

diff --git i/spec/unit/type/file_spec.rb w/spec/unit/type/file_spec.rb
index cbd6812..223873f 100755
--- i/spec/unit/type/file_spec.rb
+++ w/spec/unit/type/file_spec.rb
@@ -182,6 +182,12 @@ describe Puppet::Type.type(:file) do
         reqs[0].target.must == file
       end
 
+      it "should not autorequire anything when there is no nearest ancestor 
directory" do
+        file = Puppet::Type::File.new(:path => "/foo/bar/baz")
+        @catalog.add_resource file
+        file.autorequire.should be_empty
+      end
+
       it "should not autorequire its parent dir if its parent dir is itself" do
         file = Puppet::Type::File.new(:path => "/")
         @catalog.add_resource file
@@ -268,6 +274,12 @@ describe Puppet::Type.type(:file) do
         reqs[0].target.must == file
       end
 
+      it "should not autorequire anything when there is no nearest ancestor 
directory" do
+        file = Puppet::Type::File.new(:path => "X:/foo/bar/baz")
+        @catalog.add_resource file
+        file.autorequire.should be_empty
+      end
+
       it "should not autorequire its parent dir if its parent dir is itself" do
         file = Puppet::Type::File.new(:path => "X:/")
         @catalog.add_resource file
@@ -342,6 +354,12 @@ describe Puppet::Type.type(:file) do
         reqs[0].target.must == file
       end
 
+      it "should not autorequire anything when there is no nearest ancestor 
directory" do
+        file = Puppet::Type::File.new(:path => "//server/foo/bar/baz/qux")
+        @catalog.add_resource file
+        file.autorequire.should be_empty
+      end
+
       it "should not autorequire its parent dir if its parent dir is itself" do
         file = Puppet::Type::File.new(:path => "//server/foo")
         @catalog.add_resource file

-- 
Jacob Helwig

On Sat, 19 Feb 2011 11:38:20 -0800, Ian Ward Comfort wrote:
> 
> The File type will now autorequire the nearest ancestor directory found in the
> catalog, not just the file's parent directory. This is useful for setting up
> transitive relationships in cases when a package or other resource creates a
> large directory hierarchy, e.g.
> 
>   package { 'foo': ensure => present }
>   file { '/var/lib/foo': require => Package['foo'] }
> 
> This will make File resources at arbitrarily deep levels under /var/lib/foo
> automatically (transitively) require the foo package.
> 
> Only the nearest ancestor is autorequired, to prevent explosion of the
> relationship graph.
> 
> Signed-off-by: Ian Ward Comfort <[email protected]>
> ---
> 
> On 18 Feb 2011, at 2:20 PM, Luke Kanies wrote:
> > autorequire is a bit of a weird beast, so I know why you're having problems.
> > 
> > My code was just about changing the behavior of existing autorequire, rather
> > than adding a new kind of autorequire.
> > 
> > The code I sent was just replacing the *call* to that method you're looking
> > at - weird, but true.
> > 
> > Glad to hear it seems to work.  And I notice that your code is far simpler
> > and clearer than mine. :)
> 
> OK, I was definitely quite confused before, but having spent some time
> *actually* learning Ruby and swimming about this part of the codebase, I think
> I've got it. Given the late stage at which Type#autorequire gets called, this
> strategy works just fine.
> 
> This patch is based on master, but I can rebase if that's wrong. It can also
> be pulled from:
> 
>   git://github.com/icomfort/puppet.git file-autorequire-first-ancestor
> 
>  lib/puppet/type/file.rb     |   10 ++++++++--
>  spec/unit/type/file_spec.rb |   39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 47 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/puppet/type/file.rb b/lib/puppet/type/file.rb
> index 963b9e5..da09392 100644
> --- a/lib/puppet/type/file.rb
> +++ b/lib/puppet/type/file.rb
> @@ -244,11 +244,17 @@ Puppet::Type.newtype(:file) do
>      newvalues(:first, :all)
>    end
>  
> -  # Autorequire any parent directories.
> +  # Autorequire the nearest ancestor directory found in the catalog.
>    autorequire(:file) do
>      basedir = File.dirname(self[:path])
>      if basedir != self[:path]
> -      basedir
> +      parents = []
> +      until basedir == parents.last
> +        parents << basedir
> +        basedir = File.dirname(basedir)
> +      end
> +      # The filename of the first ancestor found, or nil
> +      parents.find { |dir| catalog.resource(:file, dir) }
>      else
>        nil
>      end
> diff --git a/spec/unit/type/file_spec.rb b/spec/unit/type/file_spec.rb
> index 539782f..cbd6812 100755
> --- a/spec/unit/type/file_spec.rb
> +++ b/spec/unit/type/file_spec.rb
> @@ -169,6 +169,19 @@ describe Puppet::Type.type(:file) do
>          reqs[0].target.must == file
>        end
>  
> +      it "should autorequire its nearest ancestor directory" do
> +        file = Puppet::Type::File.new(:path => "/foo/bar/baz")
> +        dir = Puppet::Type::File.new(:path => "/foo")
> +        root = Puppet::Type::File.new(:path => "/")
> +        @catalog.add_resource file
> +        @catalog.add_resource dir
> +        @catalog.add_resource root
> +        reqs = file.autorequire
> +        reqs.length.must == 1
> +        reqs[0].source.must == dir
> +        reqs[0].target.must == file
> +      end
> +
>        it "should not autorequire its parent dir if its parent dir is itself" 
> do
>          file = Puppet::Type::File.new(:path => "/")
>          @catalog.add_resource file
> @@ -242,6 +255,19 @@ describe Puppet::Type.type(:file) do
>          reqs[0].target.must == file
>        end
>  
> +      it "should autorequire its nearest ancestor directory" do
> +        file = Puppet::Type::File.new(:path => "X:/foo/bar/baz")
> +        dir = Puppet::Type::File.new(:path => "X:/foo")
> +        root = Puppet::Type::File.new(:path => "X:/")
> +        @catalog.add_resource file
> +        @catalog.add_resource dir
> +        @catalog.add_resource root
> +        reqs = file.autorequire
> +        reqs.length.must == 1
> +        reqs[0].source.must == dir
> +        reqs[0].target.must == file
> +      end
> +
>        it "should not autorequire its parent dir if its parent dir is itself" 
> do
>          file = Puppet::Type::File.new(:path => "X:/")
>          @catalog.add_resource file
> @@ -303,6 +329,19 @@ describe Puppet::Type.type(:file) do
>          reqs[0].target.must == file
>        end
>  
> +      it "should autorequire its nearest ancestor directory" do
> +        file = Puppet::Type::File.new(:path => "//server/foo/bar/baz/qux")
> +        dir = Puppet::Type::File.new(:path => "//server/foo/bar")
> +        root = Puppet::Type::File.new(:path => "//server/foo")
> +        @catalog.add_resource file
> +        @catalog.add_resource dir
> +        @catalog.add_resource root
> +        reqs = file.autorequire
> +        reqs.length.must == 1
> +        reqs[0].source.must == dir
> +        reqs[0].target.must == file
> +      end
> +
>        it "should not autorequire its parent dir if its parent dir is itself" 
> do
>          file = Puppet::Type::File.new(:path => "//server/foo")
>          @catalog.add_resource file
> -- 
> 1.7.3.2
> 
> -- 
> 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.
> 

Attachment: signature.asc
Description: Digital signature

Reply via email to