On 18 Feb 2011, at 2:08 PM, Luke Kanies wrote:
> On Feb 18, 2011, at 1:20 PM, Ian Ward Comfort wrote:
>> On 18 Feb 2011, at 12:29 PM, Luke Kanies wrote:
>>> It's actually pretty straightforward to do the trimming, I think - we
>>> currently just return the parent class, but we should instead search
>>> through possible parent dirs and see which ones are in the catalog.
>>> Something like:
>>>
>>> autorequire(:file) do
>>> dirs = File.dirname(self[:path]).split(File::SEPARATOR)[1..-1].inject([""])
>>> { |list, d| list << File.join(list[-1], d); list }[1..-1].reverse
>>> parent = dirs.find { |dir| catalog.resource(:file, dir) }
>>> parent # either nil or a filename; works the same either way
>>> end
>>
>> Ah, hmm. Is that legit? Type.autorequire takes rel_catalog, which appears to
>> be the relative catalog against which autorequires are to be generated,
>> while this always uses the resource's catalog. But maybe rel_catalog is only
>> supposed to be for picking the final resources... or, actually, it never
>> seems to be used anyway.
>>
>> OK, I'll give this approach a shot.
>
> Are we looking at the same code? I'm comparing to the existing autorequire
> in File:
>
> autorequire(:file) do
> basedir = File.dirname(self[:path])
> if basedir != self[:path]
> basedir
> else
> nil
> end
> end
I was looking at lib/puppet/type.rb:
# Figure out of there are any objects we can automatically add as
# dependencies.
def autorequire(rel_catalog = nil)
rel_catalog ||= catalog
raise(Puppet::DevError, "You cannot add relationships without a catalog")
unless rel_catalog
...
But I don't think anything ever supplies a rel_catalog. (Should it be removed?)
Anyway, your approach does work. I rewrote a little, hoping that this would be
more robust across POSIX and non-POSIX:
autorequire(:file) do
basedir = File.dirname(self[:path])
if basedir != self[:path]
parents = []
until basedir == parents.last
parents.push basedir
basedir = File.dirname(basedir)
end
# The filename of the first parent found, or nil
parents.find { |dir| catalog.resource(:file, dir) }
else
nil
end
end
Now I'm just struggling to get rspec up and running on my RHEL box so I can add
some tests. (Is there any dev documentation I'm missing on this topic?)
--
Ian Ward Comfort <[email protected]>
Systems Team Lead, Academic Computing Services, Stanford University
--
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.