Basic CVS support
[puppet_vcsrepo.git] / lib / puppet / provider / vcsrepo / svn.rb
1 Puppet::Type.type(:vcsrepo).provide(:svn) do
2   desc "Supports Subversion repositories"
3
4   commands :svn      => 'svn',
5            :svnadmin => 'svnadmin'
6
7   defaultfor :svn => :exists
8   
9   def create
10     if !@resource.value(:source)
11       create_repository(@resource.value(:path))
12     else
13       checkout_repository(@resource.value(:source),
14                           @resource.value(:path),
15                           @resource.value(:revision))
16     end
17   end
18
19   def exists?
20     File.directory?(@resource.value(:path))
21   end
22
23   def destroy
24     FileUtils.rm_rf(@resource.value(:path))
25   end
26   
27   def revision
28     at_path do
29       svn('info')[/^Revision:\s+(\d+)/m, 1]
30     end
31   end
32
33   def revision=(desired)
34     at_path do
35       svn('update', '-r', desired)
36     end
37   end
38
39   private
40
41   def checkout_repository(source, path, revision = nil)
42     args = ['checkout']
43     if revision
44       args.push('-r', revision)
45     end
46     args.push(source, path)
47     svn(*args)
48   end
49
50   def create_repository(path)
51     args = ['create']
52     if @resource.value(:fstype)
53       args.push('--fs-type', @resource.value(:fstype))
54     end
55     args << path
56     svnadmin(*args)
57   end
58
59   # Note: We don't rely on Dir.chdir's behavior of automatically returning the
60   # value of the last statement -- for easier stubbing.
61   def at_path(&block) #:nodoc:
62     value = nil
63     Dir.chdir(@resource.value(:path)) do
64       value = yield
65     end
66     value
67   end
68
69 end