Merge pull request #273 from hunner/fix_trustcert
[puppet_vcsrepo.git] / lib / puppet / provider / vcsrepo / svn.rb
index c6603b0..fccfaa5 100644 (file)
@@ -3,10 +3,11 @@ require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
 Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo) do
   desc "Supports Subversion repositories"
 
-  optional_commands :svn      => 'svn',
-           :svnadmin => 'svnadmin'
+  commands :svn      => 'svn',
+           :svnadmin => 'svnadmin',
+           :svnlook  => 'svnlook'
 
-  has_features :filesystem_types, :reference_tracking, :basic_auth
+  has_features :filesystem_types, :reference_tracking, :basic_auth, :configuration, :conflict, :depth
 
   def create
     if !@resource.value(:source)
@@ -14,13 +15,22 @@ Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo)
     else
       checkout_repository(@resource.value(:source),
                           @resource.value(:path),
-                          @resource.value(:revision))
+                          @resource.value(:revision),
+                          @resource.value(:depth))
     end
     update_owner
   end
 
   def working_copy_exists?
-    File.directory?(File.join(@resource.value(:path), '.svn'))
+    if File.directory?(@resource.value(:path))
+      # :path is an svn checkout
+      return true if File.directory?(File.join(@resource.value(:path), '.svn'))
+      if File.file?(File.join(@resource.value(:path), 'format'))
+        # :path is an svn server
+        return true if svnlook('uuid', @resource.value(:path))
+      end
+    end
+    false
   end
 
   def exists?
@@ -33,11 +43,7 @@ Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo)
 
   def latest?
     at_path do
-      if self.revision < self.latest then
-        return false
-      else
-        return true
-      end
+      (self.revision >= self.latest) and (@resource.value(:source) == self.sourceurl)
     end
   end
 
@@ -53,25 +59,49 @@ Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo)
       args.push('--force')
     end
 
-    return args
+    if @resource.value(:configuration)
+      args.push('--config-dir', @resource.value(:configuration))
+    end
+
+    if @resource.value(:trust_server_cert) != :false
+      args.push('--trust-server-cert')
+    end
+
+    args
   end
 
   def latest
     args = buildargs.push('info', '-r', 'HEAD')
     at_path do
-      svn(*args)[/^Last Changed Rev:\s+(\d+)/m, 1]
+      svn(*args)[/^Revision:\s+(\d+)/m, 1]
+    end
+  end
+
+  def sourceurl
+    args = buildargs.push('info')
+    at_path do
+      svn(*args)[/^URL:\s+(\S+)/m, 1]
     end
   end
 
   def revision
     args = buildargs.push('info')
     at_path do
-      svn(*args)[/^Last Changed Rev:\s+(\d+)/m, 1]
+      svn(*args)[/^Revision:\s+(\d+)/m, 1]
     end
   end
 
   def revision=(desired)
-    args = buildargs.push('update', '-r', desired)
+    args = if @resource.value(:source)
+             buildargs.push('switch', '-r', desired, @resource.value(:source))
+           else
+             buildargs.push('update', '-r', desired)
+           end
+
+    if @resource.value(:conflict)
+      args.push('--accept', @resource.value(:conflict))
+    end
+
     at_path do
       svn(*args)
     end
@@ -80,11 +110,14 @@ Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo)
 
   private
 
-  def checkout_repository(source, path, revision)
+  def checkout_repository(source, path, revision, depth)
     args = buildargs.push('checkout')
     if revision
       args.push('-r', revision)
     end
+    if depth
+      args.push('--depth', depth)
+    end
     args.push(source, path)
     svn(*args)
   end