Best unofficial Apache Server developers community
Username
Forgot password?
Sign in with Twitter account
Sign in with Facebook account
List archives

Re: [PATCH/puppet 1/3] [#4472]+[#4483] Moved type-name resolution out of Puppet::Parser::TypeLoader.

PATCH/puppet 3/3] [#4496]+[#4521]+[#4522] Add structures to the AST to represent type definitions (classes, definitions, and nodes).
(27 lines)
Possible fix for #4418
(14 lines)
Aug 12, 2010
Jesse A Wolfe
Jesse A Wolfe
+1 (as a partial pairing partner)

On Thu, Aug 12, 2010 at 2:10 PM, Paul Berry <pa### @puppetlabs.com>
wrote:

 Moved type-name resolution out of Puppet::Parser::TypeLoader, and
into
 its primary client, Puppet::Resource::TypeCollection.  TypeCollection
 now always passes fully qualified type names to TypeLoader.

 This avoids duplicate type-name resolution logic between TypeLoader
 and TypeCollection.  That in turn fixes bug 4472, which resulted
 from flaws in the type-name resolution logic in TypeLoader.

 In addition, it fixes bug 4483, which resulted from improper
 interleaving between looking up names using the TypeCollection and
the
 TypeLoader.

 Signed-off-by: Paul Berry <pa### @puppetlabs.com>
 ---
  lib/puppet/parser/parser_support.rb        |    4 +-
  lib/puppet/parser/type_loader.rb           |   66 ++++++++
Reply
Tags: clientprimaryresolution
Similar Threads
PATCH/puppet 1/3] [#4472]+[#4483] Moved type-name resolution out of Puppet::Parser::TypeLoader.
Moved type-name resolution out of Puppet::Parser::TypeLoader, and into
its primary client, Puppet::Resource::TypeCollection.  TypeCollection
now always passes fully qualified type names to TypeLoader.

This avoids duplicate type-name resolution logic between TypeLoader
and TypeCollection.  That in turn fixes bug 4472, which resulted
from flaws in the type-name resolution logic in TypeLoader.

In addition, it fixes bug 4483, which resulted from improper
interleaving between looking up names using the TypeCollection and the
TypeLoader.

Signed-off-by: Paul Berry <pa### @puppetlabs.com>
---
 lib/puppet/parser/parser_support.rb        |    4 +-
 lib/puppet/parser/type_loader.rb           |   66 ++++++++
PATCH/puppet 1/1] [#4397]+[#4344] Move type-name resolution out of Puppet::Resource into the AST re
Move type-name resolution out of Puppet::Resource into the AST resources.
Move find_resource_type out of Puppet::Resource into Scope
Thus, never pass unqualified type names to Puppet::Resource objects.
Thus, Puppet::Resource objects don't need the namespace property,
and Puppet::Resource objects never consult the harddrive to look for
.pp files that might contain their type definitions,
Thus, performance is improved.

Also removes the temporary fix for #4257 that caused #4397
(The code was too eager to look for a class in the topscope)

Paired-With: Paul Berry <pa### @puppetlabs.com>
Signed-off-by: Jesse Wolfe <jes### @gmail.com>
---
 lib/puppet/parser/ast/resource.rb               |    6 +-
 lib/puppet/parser/ast/resource_reference.rb     |   25 ++++-
 lib/puppet/parser/resource.rb                   |    6 +-
 lib/puppet/parser/scope.rb                      |   14 +++
 lib/puppet/resource.rb                          |  128 +++
PATCH/puppet 2/3] Moved perform_initial_import and version from Puppet::Resource::TypeCollection to
This change is part of an ongoing effort to remove functionality from
TypeCollection that is not related to keeping track of a collection of
types.  This reduces TypeCollection's linkage to the environment,
which is a step toward decoupling it from the type loading mechanism.

Signed-off-by: Paul Berry <pau### @puppetlabs.com>
---
 lib/puppet/node/environment.rb             |   36 +++++++++++-
 lib/puppet/parser/compiler.rb              |    2 +-
 lib/puppet/parser/parser_support.rb        |    2 +-
 lib/puppet/resource/type_collection.rb     |   32 
PATCH/puppet 1/1] [#4247] storeconfigs was calling Puppet::Parser::Resource.new with the wrong argu
When the interface to Puppet::Resource changed, its subclass
Puppet::Parser::Resource was also affected. One case of initializing
those objects did not get updated when the code changed, causing
storeconfigs to break.

Also, this patch adds a error message that would have made it easier to
catch this problem (as puppet could consume all memory and die trying to
print the old error message)

Signed-off-by: Jesse Wolfe <jes5### @gmail.com>
---
 lib/puppet/rails/resource.rb     |    6 +++---
 lib/puppet/resource.rb           |    3 +++
 spec/unit/rails/resource_spec.rb |   16 ++++++++++++++++
 spec/unit/resource_spec.rb       |    6 ++++++
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/lib/puppet/rails/resource.rb b/lib/puppet/rails/resource.rb
index a5cdd0c..cac9de2 100644
--- a/lib/puppet/rails/resource.rb
+++ b/lib/puppet/rails/resource.rb
@@ -212,16 +212,16 @@ class Puppet::Rails::Resource <
ActiveRecord::Base
     end
     hash[:scope] = scope
     hash[:source] = scope.source
-    hash[:params] = []
+    hash[:parameters] = []
     names = []
     self.param_names.each do |pname|
       # We can get the same name multiple times because of how the
       # db layout works.
       next if names.include?(pname.name)
       names << pname.name
-      hash[:params] << pname.to_resourceparam(self, scope.source)
+      hash[:parameters] << pname.to_resourceparam(self,
scope.source)
     end
-    obj = Puppet::Parser::Resource.new(hash)
+    obj = Puppet::Parser::Resource.new(hash["type"], hash["title"], hash)
 
     # Store the ID, so we can check if we're re-collecting the same
resource.
     obj.rails_id = self.id
diff --git a/lib/puppet/resource.rb b/lib/puppet/resource.rb
index 31237e3..d68e0ee 100644
--- a/lib/puppet/resource.rb
+++ b/lib/puppet/resource.rb
@@ -409,6 +409,9 @@ class Puppet::Resource
     if    (argtitle || argtype) =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1,    
            $2            ]
     elsif argtitle                                         then [
argtype,            argtitle      ]
     elsif argtype.is_a?(Puppet::Type)                      then [
argtype.class.name, argtype.title ]
+    elsif argtype.is_a?(Hash)                              then
+      raise ArgumentError, "Puppet::Resource.new does not take a hash as
the first argument. "+
+        "Did you mean (#{(argtype[:type] || argtype["type"]).inspect},
#{(argtype[:title] || argtype["title"]).inspect }) ?"
     else raise ArgumentError, "No title provided and #{argtype.inspect}
is not a valid resource reference"
     end
   end
diff --git a/spec/unit/rails/resource_spec.rb
b/spec/unit/rails/resource_spec.rb
index ac74693..08deda6 100755
--- a/spec/unit/rails/resource_spec.rb
+++ b/spec/unit/rails/resource_spec.rb
@@ -104,4 +104,20 @@ describe "Puppet::Rails::Resource" do
       @resource.merge_parameters(merge_resource)
     end
   end
+
+  describe "#to_resource" do
+    it "should instantiate a Puppet::Parser::Resource" do
+      scope = stub "scope", :source => nil
+
+      @resource = Puppet::Rails::Resource.new
+      @resource.stubs(:attributes).returns({
+        "restype" => 'notify',
+        "title"   => 'hello'
+      })
+      @resource.stubs(:param_names).returns([])
+
+      @resource.to_resource(scope).should be_a(Puppet::Parser::Resource)
+
+    end
+  end
 end
diff --git a/spec/unit/resource_spec.rb b/spec/unit/resource_spec.rb
index 95f0dd0..204a2b0 100755
--- a/spec/unit/resource_spec.rb
+++ b/spec/unit/resource_spec.rb
@@ -98,6 +98,12 @@ describe Puppet::Resource do
     lambda { Puppet::Resource.new("foo") }.should
raise_error(ArgumentError)
   end
 
+  it "should fail if the title is a hash and the type is not a valid
resource reference string" do
+    lambda { Puppet::Resource.new({:type => "foo", :title =>
"bar"}) }.should raise_error(ArgumentError,
+      'Puppet::Resource.new does not take a hash as the first argument.
Did you mean ("foo", "bar") ?'
+    )
+  end
+
   it "should be able to produce a backward-compatible reference array" do
     Puppet::Resource.new("foobar", "/f").to_trans_ref.should == %w{Foobar
/f}
   end






PATCH/puppet 1/1] Fixed #4275 - Added parser call to extlookup for 2.6.x
Signed-off-by: James Turnbull <jam### @lovedthanlost.net>
---
 ext/extlookup.rb |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/ext/extlookup.rb b/ext/extlookup.rb
index d87583b..81e6a4b 100644
--- a/ext/extlookup.rb
+++ b/ext/extlookup.rb
@@ -125,6 +125,8 @@ module Puppet::Parser::Functions
 
     desired = "_ExtUNSET_"
 
+    parser = Puppet::Parser::Parser.new(environment)
+
     datafiles.each do |file|
       parser.watch_file(file) if File.exists?(file)
 






PATCH/puppet 1/1] [#4404] Remove requirement for source on Parser::Resource::Param
Stage[main] is created without an associated source, to which
Parser::Resource::Param objects. This patch observes that the source
attribute of both Parser::Resource and Parser::Resource::Param seem
not to be used anywhere, and removes the requirement that it be
supplied.

Signed-off-by: Nick Lewis <ni### @puppetlabs.com>
---
 lib/puppet/parser/resource/param.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/puppet/parser/resource/param.rb
b/lib/puppet/parser/resource/param.rb
index af2d98f..c283223 100644
--- a/lib/puppet/parser/resource/param.rb
+++ b/lib/puppet/parser/resource/param.rb
@@ -13,7 +13,7 @@ class Puppet::Parser::Resource::Param
 
   def initialize(hash)
     set_options(hash)
-    requiredopts(:name, :value, :source)
+    requiredopts(:name, :value)
     @name = symbolize(@name)
   end
 






PATCH/puppet 2/2] Update RDoc parser to reflect change of custom plugin and fact locations
Signed-off-by: James Turnbull <jam### @lovedthanlost.net>
---
 lib/puppet/util/rdoc/parser.rb     |    2 +-
 spec/unit/util/rdoc/parser_spec.rb |    6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/puppet/util/rdoc/parser.rb
b/lib/puppet/util/rdoc/parser.rb
index 0693c44..9c86ec3 100644
--- a/lib/puppet/util/rdoc/parser.rb
+++ b/lib/puppet/util/rdoc/parser.rb
@@ -82,7 +82,7 @@ class Parser
         # find a module
         fullpath = File.expand_path(path)
         Puppet.debug "rdoc: testing %s" % fullpath
-        if fullpath =~
/(.*)\/([^\/]+)\/(?:manifests|plugins)\/.+\.(pp|rb)$/
+        if fullpath =~
/(.*)\/([^\/]+)\/(?:manifests|plugins|lib)\/.+\.(pp|rb)$/
             modpath = $1
             name = $2
             Puppet.debug "rdoc: module %s into %s ?" % [name, modpath]
diff --git a/spec/unit/util/rdoc/parser_spec.rb
b/spec/unit/util/rdoc/parser_spec.rb
index 7113b95..d30c0c1 100755
--- a/spec/unit/util/rdoc/parser_spec.rb
+++ b/spec/unit/util/rdoc/parser_spec.rb
@@ -109,7 +109,7 @@ describe RDoc::Parser do
         end
 
         it "should defer plugins parsing to parse_plugins for this
module" do
-            @parser.input_file_name =
"module/plugins/puppet/parser/function.rb"
+            @parser.input_file_name =
"module/lib/puppet/parser/function.rb"
 
             @parser.expects(:parse_plugins).with(@module)
 
@@ -462,14 +462,14 @@ describe RDoc::Parser do
         end
 
         it "should delegate parsing custom facts to parse_facts" do
-            @parser = RDoc::Parser.new(@top_level,
"module/manifests/plugins/puppet/facter/test.rb", nil, Options.instance,
RDoc::Stats.new)
+            @parser = RDoc::Parser.new(@top_level,
"module/manifests/lib/puppet/facter/test.rb", nil, Options.instance,
RDoc::Stats.new)
 
             @parser.expects(:parse_fact).with(@container)
             @parser.parse_plugins(@container)
         end
 
         it "should delegate parsing plugins to parse_plugins" do
-            @parser = RDoc::Parser.new(@top_level,
"module/manifests/plugins/puppet/functions/test.rb", nil, Options.instance,
RDoc::Stats.new)
+            @parser = RDoc::Parser.new(@top_level,
"module/manifests/lib/puppet/functions/test.rb", nil, Options.instance,
RDoc::Stats.new)
 
             @parser.expects(:parse_puppet_plugin).with(@container)
             @parser.parse_plugins(@container)






PATCH/puppet 1/1] Add new type and provider for sysctl, ticket #4068 The sysctl type manages the /e
---
 lib/puppet/provider/sysctl/linux.rb |   69
+++++++++++++++++++++++++++++++++++
 lib/puppet/type/sysctl.rb           |   36 ++++++++++++++++++
 spec/unit/provider/sysctl/linux.rb  |   25 +++++++++++++
 spec/unit/type/sysctl.rb            |   23 ++++++++++++
 4 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/provider/sysctl/linux.rb
 create mode 100644 lib/puppet/type/sysctl.rb
 create mode 100644 spec/unit/provider/sysctl/linux.rb
 create mode 100644 spec/unit/type/sysctl.rb

diff --git a/lib/puppet/provider/sysctl/linux.rb
b/lib/puppet/provider/sysctl/linux.rb
new file mode 100644
index 0000000..ca9de35
--- /dev/null
+++ b/lib/puppet/provider/sysctl/linux.rb
@@ -0,0 +1,69 @@
+# Manage the linux kernel stack, should work for most sysctl unixes
+require 'pathname'
+
+Puppet::Type.type(:sysctl).provide(:linux) do
+
+    desc "Support for managing the linux kernel stack
+    Manages the /etc/sysctl.conf file and uses the sysctl command to
apply changes
+    "
+
+    defaultfor :operatingsystem => [:redhat, :fedora, :suse, :centos,
:sles, :debian, :ubuntu, :gentoo]
+
+    commands :sysctl_cmd => "sysctl"
+
+    #Verify that the setting is available and add the setting to the file
+    def create
+        # First, apply the setting, if the setting is invalid the
commands
+        # interface will throw and prevent the value from being applied.
+        sysctl_cmd "-w", "#{@resource[:name]}=#{@resource[:value]}"
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        done = false
+        lines.each_index do |i|
+            if lines[i].split('=')[0].strip == @resource[:name]
+                lines[i] = "#{@resource[:name]} = #{@resource[:value]}\n"
+                done = true
+            end
+        end
+        unless done
+            lines << "#{@resource[:name]} = #{@resource[:value]}\n"
+        end
+            sysfile = File.new('/etc/sysctl.conf', 'w')
+        for line in lines
+            sysfile.write(line)
+        end
+        sysfile.close
+        sysctl_cmd "-p"
+    end
+
+    # Remove the setting from the file - Will not return the setting to
the kernel default!!
+    def destroy
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        lines.each_index do |i|
+            if lines[i].split('=')[0].strip == @resource[:name]
+                lines[i] = ""
+            end
+            sysfile = File.new('/etc/sysctl.conf', 'w')
+            for line in lines
+                sysfile.write(line)
+            end
+            sysfile.close
+        end
+    end
+    
+    # Checks for the setting in the sysctl.conf file, if the rule is set
to be absent
+    # then it can exist with any value.
+    def exists?
+        lines = File.new('/etc/sysctl.conf', 'r').readlines
+        lines.each do |line|
+            if line.split('=')[0].strip == @resource[:name]
+                if line.split('=')[1].strip == @resource[:value]
+                return true
+                elsif @resource[:ensure] == :absent
+                    return true
+                end
+            end
+        end
+        return false
+    end
+end
+
diff --git a/lib/puppet/type/sysctl.rb b/lib/puppet/type/sysctl.rb
new file mode 100644
index 0000000..2633e2e
--- /dev/null
+++ b/lib/puppet/type/sysctl.rb
@@ -0,0 +1,36 @@
+module Puppet
+    newtype(:sysctl) do
+        @doc = "Manages the sysctl interface for unix-like systems.
+        The sysctl module works primarily by managing the
/etc/sysctl.conf
+        file, and then by calling the 'sysctl -p' command to apply the
state
+        of the /etc/sysctl.conf file.
+    
+        This is a very simple type and only makes use of a few
paramaters.
+        The type only supports three paramaters, the namevar paramater,
name,
+        is the dot notation reference to the desired sysctl setting, aka
+        'vm.swappiness'.  The value paramater is always a string and is
the
+        value to pass to the gives sysctl setting.  The sysctl trype is
also
+        ensurable, so all rules need to have the regular ensure =>
present
+        option set.
+    
+        A typical rule will look like this:
+    
+            sysctl {'vm.swappiness':
+                ensure => present,
+                value => '20',
+            }
+        
+        This rule would ensure that the kernel swappiness setting be set
to '20'"
+
+        ensurable
+
+        newparam(:name, :namevar => true) do
+            desc "The name of the variable in the sysctl tree, given in
dot notation, eg vm.swappiness"
+        end
+
+        newparam(:value) do
+            desc "The value to enforce for the sysctl variable."
+        end
+    end
+end
+
diff --git a/spec/unit/provider/sysctl/linux.rb
b/spec/unit/provider/sysctl/linux.rb
new file mode 100644
index 0000000..95b5203
--- /dev/null
+++ b/spec/unit/provider/sysctl/linux.rb
@@ -0,0 +1,25 @@
+#/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+provider_class = Puppet::Type.type(:sysctl).provider(:linux)
+
+describe provider_class do
+    before do
+        @resource = stub("resource", :name => "vm.swappiness")
+        @resource.stubs(:[]).with(:name).returns "vm.swappiness"
+        @provider = provider_class.new(@resource)
+    end
+    it "should have a create method" do
+        @provider.should respond_to(:create)
+    end
+
+    it "should have a destroy method" do
+        @provider.should respond_to(:destroy)
+    end
+
+    it "should have an exists? method" do
+        @provider.should respond_to(:exists?)
+    end
+
+end
diff --git a/spec/unit/type/sysctl.rb b/spec/unit/type/sysctl.rb
new file mode 100644
index 0000000..185d7ab
--- /dev/null
+++ b/spec/unit/type/sysctl.rb
@@ -0,0 +1,23 @@
+#/usr/bin/env ruby
+
+Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ?
require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") }
+
+sysctl = Puppet::Type.type(:sysctl)
+
+describe sysctl do
+    properties = [:ensure]
+
+    properties.each do |property|
+        it "should have a %s property" % property do
+            sysctl.attrclass(property).ancestors.should
be_include(Puppet::Property)
+        end
+    end 
+    parameters = [:name, :value]
+
+    parameters.each do |parameter|
+        it "should have a %s parameter" % parameter do
+            sysctl.attrclass(parameter).ancestors.should
be_include(Puppet::Parameter)
+        end
+    end
+end
+






PATCH/puppet 1/1] Added cost parameter to the yumrepo type
Signed-off-by: James Turnbull <ja### @lovedthanlost.net>
---
 lib/puppet/type/yumrepo.rb |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/lib/puppet/type/yumrepo.rb b/lib/puppet/type/yumrepo.rb
index e0ed3ad..d2b9b7e 100644
--- a/lib/puppet/type/yumrepo.rb
+++ b/lib/puppet/type/yumrepo.rb
@@ -324,6 +324,12 @@ module Puppet
       newvalue(%r{[1-9][0-9]?}) { }
     end
 
+    newproperty(:cost, :parent => Puppet::IniProperty) do
+      desc "Cost of this repository.\n#{ABSENT_DOC}"
+      newvalue(:absent) { self.should = :absent }
+      newvalue(%r{\d+}) { }
+    end
+
     newproperty(:proxy, :parent => Puppet::IniProperty) do
       desc "URL to the proxy server for this repository.\n#{ABSENT_DOC}"
       newvalue(:absent) { self.should = :absent }






PATCH/puppet 1/1] Fixed yumrepo type deprecation wanring `
Signed-off-by: James Turnbull <ja### @lovedthanlost.net>
---
 lib/puppet/type/yumrepo.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/puppet/type/yumrepo.rb b/lib/puppet/type/yumrepo.rb
index e0ed3ad..5d86b1c 100644
--- a/lib/puppet/type/yumrepo.rb
+++ b/lib/puppet/type/yumrepo.rb
@@ -85,7 +85,7 @@ module Puppet
       clear
       inifile.each_section do |s|
         next if s.name == "main"
-        obj = create(:name => s.name, :audit => check)
+        obj = new(:name => s.name, :audit => check)
         current_values = obj.retrieve
         obj.eachproperty do |property|
           if current_values[property].nil?






PATCH/puppet 1/1] Fixed #4100 - Added http_caching to yumrepo type
Signed-off-by: James Turnbull <ja### @lovedthanlost.net>
---
 lib/puppet/type/yumrepo.rb |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/lib/puppet/type/yumrepo.rb b/lib/puppet/type/yumrepo.rb
index e0ed3ad..cc2cc41 100644
--- a/lib/puppet/type/yumrepo.rb
+++ b/lib/puppet/type/yumrepo.rb
@@ -294,6 +294,12 @@ module Puppet
       newvalue(%r{(0|1)}) { }
     end
 
+     newproperty(:http_caching, :parent => Puppet::IniProperty) do
+       desc "Either 'packages' or 'all' or 'none'.\n#{ABSENT_DOC}" 
+       newvalue(:absent) { self.should = :absent }
+       newvalue(%r(packages|all|none)) { }
+     end
+
     newproperty(:timeout, :parent => Puppet::IniProperty) do
       desc "Number of seconds to wait for a connection before timing
         out.\n#{ABSENT_DOC}"






PATCH/puppet 1/1] [#4110] Wrap Type#retrieve calls for backwards compatibility
This patch introduces Type#retrieve_resource as a wrapper for
Type#resource, to coerce the return value from legacy types from Hash to
Resource.

Signed-off-by: Jesse Wolfe <jes### @gmail.com>
---
 lib/puppet/transaction/resource_harness.rb |    2 +-
 lib/puppet/type.rb                         |   12 +++++++++---
 lib/puppet/type/mount.rb                   |    2 +-
 lib/puppet/type/resources.rb               |    2 +-
 spec/unit/type_spec.rb                     |   12 ++++++------
 test/ral/type/mailalias.rb                 |    2 +-
 6 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/lib/puppet/transaction/resource_harness.rb
b/lib/puppet/transaction/resource_harness.rb
index ae38bcb..848ba7b 100644
--- a/lib/puppet/transaction/resource_harness.rb
+++ b/lib/puppet/transaction/resource_harness.rb
@@ -38,7 +38,7 @@ class Puppet::Transaction::ResourceHarness
     end
 
     def changes_to_perform(status, resource)
-        current = resource.retrieve
+        current = resource.retrieve_resource
 
         cache resource, :checked, Time.now
 
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index 6e553d4..57caf1d 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -743,6 +743,14 @@ class Type
         result
     end
 
+    def retrieve_resource
+        resource = retrieve
+        if resource.is_a? Hash
+            resource = Resource.new(type, title, :parameters =>
resource)
+        end
+        resource
+    end
+
     # Get a hash of the current properties.  Returns a hash with
     # the actual property instance as the key and the current value
     # as the, um, value.
@@ -1924,10 +1932,8 @@ class Type
     def to_trans(ret = true)
         trans = TransObject.new(self.title, self.class.name)
 
-        values = retrieve()
+        values = retrieve_resource
         values.each do |name, value|
-            # sometimes we get symbols and sometimes we get Properties
-            # I think it's a bug, but I can't find it. ~JW
             name = name.name if name.respond_to? :name
             trans[name] = value
         end
diff --git a/lib/puppet/type/mount.rb b/lib/puppet/type/mount.rb
index e79bc0a..b2185b6 100755
--- a/lib/puppet/type/mount.rb
+++ b/lib/puppet/type/mount.rb
@@ -67,7 +67,7 @@ module Puppet
 
             def syncothers
                 # We have to flush any changes to disk.
-                currentvalues = @resource.retrieve
+                currentvalues = @resource.retrieve_resource
 
                 # Determine if there are any out-of-sync properties.
                 oos = @resource.send(:properties).find_all do |prop|
diff --git a/lib/puppet/type/resources.rb b/lib/puppet/type/resources.rb
index 136b691..0080846 100644
--- a/lib/puppet/type/resources.rb
+++ b/lib/puppet/type/resources.rb
@@ -131,7 +131,7 @@ Puppet::Type.newtype(:resources) do
         return true unless self[:unless_system_user]
 
         resource[:audit] = :uid
-        current_values = resource.retrieve
+        current_values = resource.retrieve_resource
 
         if system_users().include?(resource[:name])
             return false
diff --git a/spec/unit/type_spec.rb b/spec/unit/type_spec.rb
index 54fb297..70597f7 100755
--- a/spec/unit/type_spec.rb
+++ b/spec/unit/type_spec.rb
@@ -368,11 +368,11 @@ describe Puppet::Type do
         it "should fail if its provider is unsuitable" do
             @resource = Puppet::Type.type(:mount).new(:name => "foo",
:fstype => "bar", :pass => 1, :ensure => :present)
             @resource.provider.class.expects(:suitable?).returns false
-            lambda { @resource.retrieve }.should
raise_error(Puppet::Error)
+            lambda { @resource.retrieve_resource }.should
raise_error(Puppet::Error)
         end
 
         it "should return a Puppet::Resource instance with its type and
title set appropriately" do
-            result = @resource.retrieve
+            result = @resource.retrieve_resource
             result.should be_instance_of(Puppet::Resource)
             result.type.should == "Mount"
             result.title.should == "foo"
@@ -381,11 +381,11 @@ describe Puppet::Type do
         it "should set the name of the returned resource if its own name
and title differ" do
             @resource[:name] = "my name"
             @resource.title = "other name"
-            @resource.retrieve[:name].should == "my name"
+            @resource.retrieve_resource[:name].should == "my name"
         end
 
         it "should provide a value for all set properties" do
-            values = @resource.retrieve
+            values = @resource.retrieve_resource
             [:ensure, :fstype, :pass].each { |property|
values[property].should_not be_nil }
         end
 
@@ -396,13 +396,13 @@ describe Puppet::Type do
         it "should not call retrieve on non-ensure properties if the
resource is absent and should consider the property absent" do
             @resource.property(:ensure).expects(:retrieve).returns
:absent
             @resource.property(:fstype).expects(:retrieve).never
-            @resource.retrieve[:fstype].should == :absent
+            @resource.retrieve_resource[:fstype].should == :absent
         end
 
         it "should include the result of retrieving each property's
current value if the resource is present" do
             @resource.property(:ensure).expects(:retrieve).returns
:present
             @resource.property(:fstype).expects(:retrieve).returns 15
-            @resource.retrieve[:fstype] == 15
+            @resource.retrieve_resource[:fstype] == 15
         end
     end
 
diff --git a/test/ral/type/mailalias.rb b/test/ral/type/mailalias.rb
index 5d5023a..ff0e62e 100755
--- a/test/ral/type/mailalias.rb
+++ b/test/ral/type/mailalias.rb
@@ -34,7 +34,7 @@ class TestMailAlias < Test::Unit::TestCase
     # This isn't much of a test, but then, it's not much of a type.
     def test_recipient_arrays
         resource = @type.new(:name => "luke", :recipient => "yay",
:target => tempfile)
-        values = resource.retrieve
+        values = resource.retrieve_resource
         assert_equal(:absent, values[:recipient])
         resource.property(:recipient).expects(:set).with(%w{yay})
         assert_nothing_raised("Could not sync mailalias") do






PATCH/puppet 3/3] [#4496]+[#4521]+[#4522] Add structures to the AST to represent type definitions (c
Previously, type definitions were not represented directly in the AST.
Instead, the parser would instantiate types and insert them into
known_resource_types as soon as they were parsed.  This made it
difficult to distinguish which types had come from the file that was
just parsed and which types had been loaded previously, which led to
bug 4496.

A side-effect of this change is that the user is no longer allowed to
define types inside of conditional constructs (such as if/else).  This
was allowed before but had unexpected semantics (bugs 4521 and 4522).

It is still possible, however, to place an "include" statement inside
a conditional construct, and have that "include" statement trigger the
autoloading of a file that instantiates types.

Signed-off-by: Paul Berry <pa### @puppetlabs.com>
---
 lib/puppet/node/environment.rb               |   14 +-
 lib/puppet/parser/ast.rb                     |    7 +-
 lib/puppet/parser/ast/astarray.rb            |   19 +-
 lib/puppet/parser/ast/definition.rb          |   12 +
 lib/puppet/parser/ast/hostclass.rb           |   26 +
 lib/puppet/parser/ast/node.rb                |   15 +
 lib/puppet/parser/ast/top_level_construct.rb |    4 +
 lib/puppet/parser/grammar.ra                 |   63 +-
 lib/puppet/parser/parser.rb                  | 2858 +++++++++++++
PATCH/puppet 1/1] [#4467] Make Puppet Master respect facts_terminus settings
* Remove hard-coded facts terminus in master
* Change facts_terminus default to 'yaml' for master and 'facter' for
  everything else.

Paired-with: Matt Robinson <ma### @puppetlabs.com>
Signed-off-by: Rein Henrichs <re### @puppetlabs.com>
---
 lib/puppet/application/master.rb       |    3 ---
 lib/puppet/defaults.rb                 |    2 +-
 spec/unit/indirector/node/ldap_spec.rb |    4 ----
 spec/unit/node/facts_spec.rb           |   15 +++++++++++++--
 4 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/lib/puppet/application/master.rb
b/lib/puppet/application/master.rb
index 777a50e..fde4749 100644
--- a/lib/puppet/application/master.rb
+++ b/lib/puppet/application/master.rb
@@ -138,9 +138,6 @@ class Puppet::Application::Master <
Puppet::Application
 
     Puppet.settings.use :main, :master, :ssl
 
-    # A temporary solution, to at least make the master work for now.
-    Puppet::Node::Facts.terminus_class = :yaml
-
     # Cache our nodes in yaml.  Currently not configurable.
     Puppet::Node.cache_class = :yaml
 
diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb
index 84e2d93..3c79439 100644
--- a/lib/puppet/defaults.rb
+++ b/lib/puppet/defaults.rb
@@ -115,7 +115,7 @@ module Puppet
     :node_terminus => ["plain", "Where to find information about
nodes."],
     :catalog_terminus => ["compiler", "Where to get node catalogs. 
This is useful to change if, for instance,
       you'd like to pre-compile catalogs and store them in memcached or
some other easily-accessed store."],
-    :facts_terminus => ["facter", "Where to get node facts."],
+    :facts_terminus => [Puppet.application_name.to_s == "master" ?
'yaml' : 'facter', "The node facts terminus."],
     :httplog => { :default => "$logdir/http.log",
       :owner => "root",
       :mode => 0640,
diff --git a/spec/unit/indirector/node/ldap_spec.rb
b/spec/unit/indirector/node/ldap_spec.rb
index f9c5efa..a5f14fc 100755
--- a/spec/unit/indirector/node/ldap_spec.rb
+++ b/spec/unit/indirector/node/ldap_spec.rb
@@ -5,10 +5,6 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
 require 'puppet/indirector/node/ldap'
 
 describe Puppet::Node::Ldap do
-  before do
-    Puppet::Node::Facts.stubs(:terminus_class).returns :yaml
-  end
-
   describe "when searching for a single node" do
     before :each do
       @searcher = Puppet::Node::Ldap.new
diff --git a/spec/unit/node/facts_spec.rb b/spec/unit/node/facts_spec.rb
index a2f4ab9..394db79 100755
--- a/spec/unit/node/facts_spec.rb
+++ b/spec/unit/node/facts_spec.rb
@@ -88,9 +88,20 @@ describe Puppet::Node::Facts, "when indirecting" do
       @facts.save
     end
 
-    it "should default to the 'facter' terminus" do
-      Puppet::Node::Facts.indirection.terminus_class.should == :facter
+    describe "when the Puppet application is 'master'" do
+      it "should default to the 'yaml' terminus" do
+        pending "Cannot test the behavior of defaults in defaults.rb"
+        # Puppet::Node::Facts.indirection.terminus_class.should == :yaml
+      end
     end
+
+    describe "when the Puppet application is not 'master'" do
+      it "should default to the 'facter' terminus" do
+        pending "Cannot test the behavior of defaults in defaults.rb"
+        # Puppet::Node::Facts.indirection.terminus_class.should ==
:facter
+      end
+    end
+
   end
 
   describe "when storing and retrieving" do






PATCH/puppet 1/1] [#4264] Fix failing specs run as root due to missing puppet group
These specs 'use' some settings which create directories belonging
to the 'service' user/group. If the default service group doesn't
exist, these fail. This patch explicitly sets the service group to
the gid of the process, which is known to be accessible by the user.

Signed-off-by: Nick Lewis <ni### @puppetlabs.com>
---
 .../indirector/bucket_file/rest_spec.rb            |    1 +
 .../indirector/certificate/rest_spec.rb            |    1 +
 .../indirector/certificate_request/rest_spec.rb    |    1 +
 .../certificate_revocation_list/rest_spec.rb       |    1 +
 spec/integration/indirector/report/rest_spec.rb    |    1 +
 spec/integration/indirector/rest_spec.rb           |    1 +
 spec/integration/network/server/webrick_spec.rb    |    1 +
 spec/integration/ssl/certificate_authority_spec.rb |    1 +
 spec/integration/ssl/certificate_request_spec.rb   |    1 +
 .../ssl/certificate_revocation_list_spec.rb        |    1 +
 spec/integration/ssl/host_spec.rb                  |    1 +
 11 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/spec/integration/indirector/bucket_file/rest_spec.rb
b/spec/integration/indirector/bucket_file/rest_spec.rb
index 4d90a8c..dc10faa 100644
--- a/spec/integration/indirector/bucket_file/rest_spec.rb
+++ b/spec/integration/indirector/bucket_file/rest_spec.rb
@@ -17,6 +17,7 @@ describe "Filebucket REST Terminus" do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git a/spec/integration/indirector/certificate/rest_spec.rb
b/spec/integration/indirector/certificate/rest_spec.rb
index 356a7d3..58aa96c 100755
--- a/spec/integration/indirector/certificate/rest_spec.rb
+++ b/spec/integration/indirector/certificate/rest_spec.rb
@@ -17,6 +17,7 @@ describe "Certificate REST Terminus" do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git a/spec/integration/indirector/certificate_request/rest_spec.rb
b/spec/integration/indirector/certificate_request/rest_spec.rb
index 2c98ef6..c718b78 100755
--- a/spec/integration/indirector/certificate_request/rest_spec.rb
+++ b/spec/integration/indirector/certificate_request/rest_spec.rb
@@ -19,6 +19,7 @@ describe "Certificate Request REST Terminus" do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git
a/spec/integration/indirector/certificate_revocation_list/rest_spec.rb
b/spec/integration/indirector/certificate_revocation_list/rest_spec.rb
index 62a2f80..86f2b01 100755
--- a/spec/integration/indirector/certificate_revocation_list/rest_spec.rb
+++ b/spec/integration/indirector/certificate_revocation_list/rest_spec.rb
@@ -17,6 +17,7 @@ describe "Certificate REST Terminus" do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git a/spec/integration/indirector/report/rest_spec.rb
b/spec/integration/indirector/report/rest_spec.rb
index 089f8fd..fdc2189 100644
--- a/spec/integration/indirector/report/rest_spec.rb
+++ b/spec/integration/indirector/report/rest_spec.rb
@@ -17,6 +17,7 @@ describe "Report REST Terminus" do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git a/spec/integration/indirector/rest_spec.rb
b/spec/integration/indirector/rest_spec.rb
index e904839..14e9e95 100755
--- a/spec/integration/indirector/rest_spec.rb
+++ b/spec/integration/indirector/rest_spec.rb
@@ -39,6 +39,7 @@ describe Puppet::Indirector::REST do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
     Puppet.settings[:server] = "127.0.0.1"
     Puppet.settings[:masterport] = "34343"
 
diff --git a/spec/integration/network/server/webrick_spec.rb
b/spec/integration/network/server/webrick_spec.rb
index 2809df7..2b14dfb 100755
--- a/spec/integration/network/server/webrick_spec.rb
+++ b/spec/integration/network/server/webrick_spec.rb
@@ -18,6 +18,7 @@ describe Puppet::Network::Server do
 
       Puppet.settings[:confdir] = @dir
       Puppet.settings[:vardir] = @dir
+      Puppet.settings[:group] = Process.gid
 
       Puppet::SSL::Host.ca_location = :local
 
diff --git a/spec/integration/ssl/certificate_authority_spec.rb
b/spec/integration/ssl/certificate_authority_spec.rb
index be82b5f..fca17b4 100755
--- a/spec/integration/ssl/certificate_authority_spec.rb
+++ b/spec/integration/ssl/certificate_authority_spec.rb
@@ -17,6 +17,7 @@ describe Puppet::SSL::CertificateAuthority do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
 
     Puppet::SSL::Host.ca_location = :local
     @ca = Puppet::SSL::CertificateAuthority.new
diff --git a/spec/integration/ssl/certificate_request_spec.rb
b/spec/integration/ssl/certificate_request_spec.rb
index 365ecce..8426b9d 100755
--- a/spec/integration/ssl/certificate_request_spec.rb
+++ b/spec/integration/ssl/certificate_request_spec.rb
@@ -21,6 +21,7 @@ describe Puppet::SSL::CertificateRequest do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
 
     Puppet::SSL::Host.ca_location = :none
 
diff --git a/spec/integration/ssl/certificate_revocation_list_spec.rb
b/spec/integration/ssl/certificate_revocation_list_spec.rb
index 127654c..44eee36 100755
--- a/spec/integration/ssl/certificate_revocation_list_spec.rb
+++ b/spec/integration/ssl/certificate_revocation_list_spec.rb
@@ -17,6 +17,7 @@ describe Puppet::SSL::CertificateRevocationList do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
 
     Puppet::SSL::Host.ca_location = :local
   end
diff --git a/spec/integration/ssl/host_spec.rb
b/spec/integration/ssl/host_spec.rb
index 9b4152e..05862df 100755
--- a/spec/integration/ssl/host_spec.rb
+++ b/spec/integration/ssl/host_spec.rb
@@ -17,6 +17,7 @@ describe Puppet::SSL::Host do
 
     Puppet.settings[:confdir] = @dir
     Puppet.settings[:vardir] = @dir
+    Puppet.settings[:group] = Process.gid
 
     Puppet::SSL::Host.ca_location = :local
 






PATCH/puppet] [#4219] Install misses command_line dir, puppet $app --help fails
---
 install.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/install.rb b/install.rb
index d35aaa0..b06ec09 100755
--- a/install.rb
+++ b/install.rb
@@ -84,7 +84,7 @@ bins  = glob(%w{bin/*})
 rdoc  = glob(%w{bin/* sbin/* lib/**/*.rb README README-library CHANGELOG
TODO Install}).reject { |e| e=~ /\.(bat|cmd)$/ }
 ri    = glob(%w{bin/*.rb sbin/* lib/**/*.rb}).reject { |e| e=~
/\.(bat|cmd)$/ }
 man   = glob(%w{man/man[0-9]/*})
-libs  = glob(%w{lib/**/*.rb lib/**/*.py})
+libs  = glob(%w{lib/**/*.rb lib/**/*.py lib/puppet/util/command_line/*})
 tests = glob(%w{test/**/*.rb})
 
 def do_bins(bins, target, strip = 's?bin/')








PATCH/puppet 1/1] added md5 support as requested in http://serverfault.com/questions/166199/puppet-
From: Alice Kærast <kaer### @newscloud.com>


Signed-off-by: James Turnbull <ja### @lovedthanlost.net>
---
 lib/puppet/parser/functions/md5.rb |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/parser/functions/md5.rb

diff --git a/lib/puppet/parser/functions/md5.rb
b/lib/puppet/parser/functions/md5.rb
new file mode 100644
index 0000000..f7a4f72
--- /dev/null
+++ b/lib/puppet/parser/functions/md5.rb
@@ -0,0 +1,5 @@
+Puppet::Parser::Functions::newfunction(:md5, :type => :rvalue, :doc
=> "Returns a MD5 hash value from a provided string.") do |args|
+      require 'md5'
+
+      Digest::MD5.hexdigest(args[0])
+end






PATCH/puppet 1/1] Fix #4348 - Puppet doc single manifest broken
The refactoring of using environment instances instead of strings
for initializing the parser, rdoc wasn't updated, thus was unable
to initialize the parser.

Signed-off-by: Brice Figureau <brice-pupp### @daysofwonder.com>
---
 lib/puppet/util/rdoc.rb     |    2 +-
 spec/unit/util/rdoc_spec.rb |   13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/lib/puppet/util/rdoc.rb b/lib/puppet/util/rdoc.rb
index 4a80b06..085d8ec 100644
--- a/lib/puppet/util/rdoc.rb
+++ b/lib/puppet/util/rdoc.rb
@@ -41,7 +41,7 @@ module Puppet::Util::RDoc
   def manifestdoc(files)
     Puppet[:ignoreimport] = true
     files.select { |f| FileTest.file?(f) }.each do |f|
-      parser = Puppet::Parser::Parser.new(:environment =>
Puppet[:environment])
+      parser =
Puppet::Parser::Parser.new(Puppet::Node::Environment.new(Puppet[:environment]))
       parser.file = f
       ast = parser.parse
       output(f, ast)
diff --git a/spec/unit/util/rdoc_spec.rb b/spec/unit/util/rdoc_spec.rb
index 65df261..58c2034 100755
--- a/spec/unit/util/rdoc_spec.rb
+++ b/spec/unit/util/rdoc_spec.rb
@@ -75,6 +75,19 @@ describe Puppet::Util::RDoc do
       Puppet::Util::RDoc.manifestdoc([])
     end
 
+    it "should use a parser with the correct environment" do
+      FileTest.stubs(:file?).returns(true)
+      Puppet::Util::RDoc.stubs(:output)
+
+      parser = stub_everything
+      Puppet::Parser::Parser.stubs(:new).with{ |env|
env.is_a?(Puppet::Node::Environment) }.returns(parser)
+
+      parser.expects(:file=).with("file")
+      parser.expects(:parse)
+
+      Puppet::Util::RDoc.manifestdoc(["file"])
+    end
+
     it "should puppet parse all given files" do
       FileTest.stubs(:file?).returns(true)
       Puppet::Util::RDoc.stubs(:output)






PATCH/puppet 0/4] Some random puppet fix for JRuby
Hi,

Here is the first stab of JRuby Puppet compatibility.
There looks to be more thread issue (the last ones I found are
parser functions initializations), which will be addressed in
subsequent patches.

No patch in this serie have tests, because they most deal with
threading issues that can be reproduced only under JRuby.

Please review,
Brice

Brice Figureau (4):
  JRuby doesn't implement Process.maxgroups
  Fix #4244 - Cached Attributes is not thread safe
  Fix race condition in rack autoloading of request/response
  Fix #4245 - default insertion of ACL is not thread safe

 lib/puppet/network/http/rack.rb       |    3 +++
 lib/puppet/network/rest_authconfig.rb |    9 ++++++---
 lib/puppet/util/cacher.rb             |   31 +++++++++++++++++++++
PATCH/puppet 1/1] [#4298] Puppet apply prints an error if the file to apply doesn't exist
Also warns you it's skipping files if you pass it more than one file to
apply.

Reviewed-by: Nick Lewis <nic### @puppetlabs.com>
Signed-off-by: Matt Robinson <ma### @puppetlabs.com>
---
 lib/puppet/application/apply.rb     |    5 ++++-
 spec/unit/application/apply_spec.rb |   24 +++++++++++++++++++++---
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/lib/puppet/application/apply.rb
b/lib/puppet/application/apply.rb
index bb4186d..152b754 100644
--- a/lib/puppet/application/apply.rb
+++ b/lib/puppet/application/apply.rb
@@ -78,7 +78,10 @@ class Puppet::Application::Apply <
Puppet::Application
     if options[:code] or command_line.args.length == 0
       Puppet[:code] = options[:code] || STDIN.read
     else
-      Puppet[:manifest] = command_line.args.shift
+      manifest = command_line.args.shift
+      raise "Could not find file #{manifest}" unless
File.exist?(manifest)
+      Puppet.warning("Only one file can be applied per run.  Skipping
#{command_line.args.join(', ')}") if command_line.args.size > 0
+      Puppet[:manifest] = manifest
     end
 
     # Collect our facts.
diff --git a/spec/unit/application/apply_spec.rb
b/spec/unit/application/apply_spec.rb
index 0b00d1a..8c53136 100755
--- a/spec/unit/application/apply_spec.rb
+++ b/spec/unit/application/apply_spec.rb
@@ -3,6 +3,7 @@
 require File.dirname(__FILE__) + '/../../spec_helper'
 
 require 'puppet/application/apply'
+require 'puppet/file_bucket/dipper'
 
 describe Puppet::Application::Apply do
   before :each do
@@ -53,7 +54,6 @@ describe Puppet::Application::Apply do
       Puppet.stubs(:trap)
       Puppet::Log.stubs(:level=)
       Puppet.stubs(:parse_config)
-      require 'lib/puppet/file_bucket/dipper'
       Puppet::FileBucket::Dipper.stubs(:new)
       STDIN.stubs(:read)
 
@@ -212,7 +212,8 @@ describe Puppet::Application::Apply do
         @apply.main
       end
 
-      it "should set the manifest if some files are passed on command
line" do
+      it "should set the manifest if a file is passed on command line and
the file exists" do
+        File.stubs(:exist?).with('site.pp').returns true
         @apply.command_line.stubs(:args).returns(['site.pp'])
 
         Puppet.expects(:[]=).with(:manifest,"site.pp")
@@ -220,6 +221,23 @@ describe Puppet::Application::Apply do
         @apply.main
       end
 
+      it "should raise an error if a file is passed on command line and
the file does not exist" do
+        File.stubs(:exist?).with('noexist.pp').returns false
+        @apply.command_line.stubs(:args).returns(['noexist.pp'])
+        lambda { @apply.main }.should raise_error(RuntimeError, 'Could
not find file noexist.pp')
+      end
+
+      it "should set the manifest to the first file and warn other files
will be skipped" do
+        File.stubs(:exist?).with('starwarsIV').returns true
+        File.expects(:exist?).with('starwarsI').never
+        @apply.command_line.stubs(:args).returns(['starwarsIV',
'starwarsI', 'starwarsII'])
+
+        Puppet.expects(:[]=).with(:manifest,"starwarsIV")
+        Puppet.expects(:warning).with('Only one file can be applied per
run.  Skipping starwarsI, starwarsII')
+
+        @apply.main
+      end
+
       it "should collect the node facts" do
         Puppet::Node::Facts.expects(:find).returns(@facts)
 
@@ -232,7 +250,7 @@ describe Puppet::Application::Apply do
         lambda { @apply.main }.should raise_error
       end
 
-      it "should find the node" do
+      it "should look for the node" do
         Puppet::Node.expects(:find).returns(@node)
 
         @apply.main