680188c1e0fd79cc829481a0252a497d9b819728
[puppet_vcsrepo.git] / lib / puppet / provider / vcsrepo / svn.rb
1 require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
2
3 Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo) do
4   desc "Supports Subversion repositories"
5
6   commands :svn      => 'svn',
7            :svnadmin => 'svnadmin'
8
9   defaultfor :svn => :exists
10   has_features :filesystem_types, :reference_tracking
11
12   def create
13     if !@resource.value(:source)
14       create_repository(@resource.value(:path))
15     else
16       checkout_repository(@resource.value(:source),
17                           @resource.value(:path),
18                           @resource.value(:revision))
19     end
20   end
21
22   def working_copy_exists?
23     File.directory?(File.join(@resource.value(:path), '.svn'))
24   end
25
26   def exists?
27     working_copy_exists?
28   end
29
30   def destroy
31     FileUtils.rm_rf(@resource.value(:path))
32   end
33
34   def latest?
35     at_path do
36       if self.revision < self.latest then
37         return false
38       else
39         return true
40       end
41     end
42   end
43
44   def latest
45     at_path do
46       svn('info', '-r', 'HEAD')[/^Revision:\s+(\d+)/m, 1]
47     end
48   end
49   
50   def revision
51     at_path do
52       svn('info')[/^Revision:\s+(\d+)/m, 1]
53     end
54   end
55
56   def revision=(desired)
57     at_path do
58       svn('update', '-r', desired)
59     end
60   end
61
62   private
63
64   def checkout_repository(source, path, revision = nil)
65     args = ['checkout']
66     if revision
67       args.push('-r', revision)
68     end
69     args.push(source, path)
70     svn(*args)
71   end
72
73   def create_repository(path)
74     args = ['create']
75     if @resource.value(:fstype)
76       args.push('--fs-type', @resource.value(:fstype))
77     end
78     args << path
79     svnadmin(*args)
80   end
81
82 end