diff options
Diffstat (limited to 'lib/puppet')
| -rw-r--r-- | lib/puppet/metatype/metaparams.rb | 16 | ||||
| -rw-r--r-- | lib/puppet/pgraph.rb | 31 | ||||
| -rw-r--r-- | lib/puppet/relationship.rb | 4 |
3 files changed, 38 insertions, 13 deletions
diff --git a/lib/puppet/metatype/metaparams.rb b/lib/puppet/metatype/metaparams.rb index c9c3a694d..93fffc04c 100644 --- a/lib/puppet/metatype/metaparams.rb +++ b/lib/puppet/metatype/metaparams.rb @@ -288,15 +288,15 @@ class Puppet::Type target = object end - # ok, both sides of the connection store some information - # we store the method to call when a given subscription is - # triggered, but the source object decides whether - subargs = { - :event => self.class.events - } - if method = self.class.callback - subargs[:callback] = method + subargs = { + :event => self.class.events, + :callback => method + } + else + # If there's no callback, there's no point in even adding + # a label. + subargs = nil end rel = Puppet::Relationship.new(source, target, subargs) end diff --git a/lib/puppet/pgraph.rb b/lib/puppet/pgraph.rb index de89e0a71..64f411a40 100644 --- a/lib/puppet/pgraph.rb +++ b/lib/puppet/pgraph.rb @@ -33,6 +33,23 @@ class Puppet::PGraph < GRATR::Digraph end end + # Make sure whichever edge has a label keeps the label + def copy_label(source, target, label) + # 'require' relationships will not have a label, + # and all 'subscribe' relationships have the same + # label, at least for now. + + # Labels default to {}, so we can't just test for nil. + newlabel = label || {} + oldlabel = edge_label(source, target) || {} + if ! newlabel.empty? and oldlabel.empty? + edge_label_set(source, target, label) + # We should probably check to see if the labels both exist + # and don't match, but we'd just throw an error which the user + # couldn't do anyting about. + end + end + # Which resources a given resource depends upon. def dependents(resource) tree_from_vertex2(resource).keys @@ -128,6 +145,7 @@ class Puppet::PGraph < GRATR::Digraph s = child t = neighbor end + if s.is_a?(type) raise "Source %s is still a container" % s end @@ -135,9 +153,16 @@ class Puppet::PGraph < GRATR::Digraph raise "Target %s is still a container" % t end - # It *appears* that we're having a problem - # with multigraphs. - next if edge?(s, t) + # We don't want to add multiple copies of the + # same edge, but we *do* want to make sure we + # keep labels around. + # XXX This will *not* work when we support multiple + # types of labels, and only works now because + # you can only do simple subscriptions. + if edge?(s, t) + copy_label(s, t, edge.label) + next + end add_edge!(s, t, edge.label) if cyclic? raise ArgumentError, diff --git a/lib/puppet/relationship.rb b/lib/puppet/relationship.rb index 879beeab7..15f67b384 100644 --- a/lib/puppet/relationship.rb +++ b/lib/puppet/relationship.rb @@ -46,9 +46,9 @@ class Puppet::Relationship < GRATR::Edge # Does the passed event match our event? This is where the meaning # of :NONE comes from. def match?(event) - if event == :NONE or self.event == :NONE + if self.event.nil? or event == :NONE or self.event == :NONE return false - elsif self.event == :ALL_EVENTS or event == :ALL_EVENTS or event == self.event + elsif self.event == :ALL_EVENTS or event == self.event return true else return false |
