Merge pull request #273 from hunner/fix_trustcert
[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            :svnlook  => 'svnlook'
9
10   has_features :filesystem_types, :reference_tracking, :basic_auth, :configuration, :conflict, :depth
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                           @resource.value(:depth))
20     end
21     update_owner
22   end
23
24   def working_copy_exists?
25     if File.directory?(@resource.value(:path))
26       # :path is an svn checkout
27       return true if File.directory?(File.join(@resource.value(:path), '.svn'))
28       if File.file?(File.join(@resource.value(:path), 'format'))
29         # :path is an svn server
30         return true if svnlook('uuid', @resource.value(:path))
31       end
32     end
33     false
34   end
35
36   def exists?
37     working_copy_exists?
38   end
39
40   def destroy
41     FileUtils.rm_rf(@resource.value(:path))
42   end
43
44   def latest?
45     at_path do
46       (self.revision >= self.latest) and (@resource.value(:source) == self.sourceurl)
47     end
48   end
49
50   def buildargs
51     args = ['--non-interactive']
52     if @resource.value(:basic_auth_username) && @resource.value(:basic_auth_password)
53       args.push('--username', @resource.value(:basic_auth_username))
54       args.push('--password', @resource.value(:basic_auth_password))
55       args.push('--no-auth-cache')
56     end
57
58     if @resource.value(:force)
59       args.push('--force')
60     end
61
62     if @resource.value(:configuration)
63       args.push('--config-dir', @resource.value(:configuration))
64     end
65
66     if @resource.value(:trust_server_cert) != :false
67       args.push('--trust-server-cert')
68     end
69
70     args
71   end
72
73   def latest
74     args = buildargs.push('info', '-r', 'HEAD')
75     at_path do
76       svn(*args)[/^Revision:\s+(\d+)/m, 1]
77     end
78   end
79
80   def sourceurl
81     args = buildargs.push('info')
82     at_path do
83       svn(*args)[/^URL:\s+(\S+)/m, 1]
84     end
85   end
86
87   def revision
88     args = buildargs.push('info')
89     at_path do
90       svn(*args)[/^Revision:\s+(\d+)/m, 1]
91     end
92   end
93
94   def revision=(desired)
95     args = if @resource.value(:source)
96              buildargs.push('switch', '-r', desired, @resource.value(:source))
97            else
98              buildargs.push('update', '-r', desired)
99            end
100
101     if @resource.value(:conflict)
102       args.push('--accept', @resource.value(:conflict))
103     end
104
105     at_path do
106       svn(*args)
107     end
108     update_owner
109   end
110
111   private
112
113   def checkout_repository(source, path, revision, depth)
114     args = buildargs.push('checkout')
115     if revision
116       args.push('-r', revision)
117     end
118     if depth
119       args.push('--depth', depth)
120     end
121     args.push(source, path)
122     svn(*args)
123   end
124
125   def create_repository(path)
126     args = ['create']
127     if @resource.value(:fstype)
128       args.push('--fs-type', @resource.value(:fstype))
129     end
130     args << path
131     svnadmin(*args)
132   end
133
134   def update_owner
135     if @resource.value(:owner) or @resource.value(:group)
136       set_ownership
137     end
138   end
139 end