Whitespace
[puppet_vcsrepo.git] / lib / puppet / type / vcsrepo.rb
1 require 'pathname'
2
3 Puppet::Type.newtype(:vcsrepo) do
4   desc "A local version control repository"
5
6   feature :gzip_compression,
7           "The provider supports explicit GZip compression levels"
8   feature :basic_auth,
9           "The provider supports HTTP Basic Authentication"
10   feature :bare_repositories,
11           "The provider differentiates between bare repositories
12           and those with working copies",
13           :methods => [:bare_exists?, :working_copy_exists?]
14
15   feature :filesystem_types,
16           "The provider supports different filesystem types"
17
18   feature :reference_tracking,
19           "The provider supports tracking revision references that can change
20            over time (eg, some VCS tags and branch names)"
21
22   feature :ssh_identity,
23           "The provider supports a configurable SSH identity file"
24
25   feature :user,
26           "The provider can run as a different user"
27
28   feature :modules,
29           "The repository contains modules that can be chosen of"
30
31   feature :multiple_remotes,
32           "The repository tracks multiple remote repositories"
33
34   feature :configuration,
35           "The configuration directory to use"
36
37   feature :cvs_rsh,
38           "The provider understands the CVS_RSH environment variable"
39
40   ensurable do
41     attr_accessor :latest
42
43     def insync?(is)
44       @should ||= []
45
46       case should
47       when :present
48         return true unless [:absent, :purged, :held].include?(is)
49       when :latest
50         if is == :latest
51           return true
52         else
53           return false
54         end
55       when :bare
56         return is == :bare
57       end
58     end
59
60     newvalue :present do
61       notice "Creating repository from present"
62       provider.create
63     end
64
65     newvalue :bare, :required_features => [:bare_repositories] do
66       if !provider.exists?
67         provider.create
68       end
69     end
70
71     newvalue :absent do
72       provider.destroy
73     end
74
75     newvalue :latest, :required_features => [:reference_tracking] do
76       if provider.exists?
77         if provider.respond_to?(:update_references)
78           provider.update_references
79         end
80         if provider.respond_to?(:latest?)
81             reference = provider.latest || provider.revision
82         else
83           reference = resource.value(:revision) || provider.revision
84         end
85         notice "Updating to latest '#{reference}' revision"
86         provider.revision = reference
87       else
88         notice "Creating repository from latest"
89         provider.create
90       end
91     end
92
93     def retrieve
94       prov = @resource.provider
95       if prov
96         if prov.working_copy_exists?
97           (@should.include?(:latest) && prov.latest?) ? :latest : :present
98         elsif prov.class.feature?(:bare_repositories) and prov.bare_exists?
99           :bare
100         else
101           :absent
102         end
103       else
104         raise Puppet::Error, "Could not find provider"
105       end
106     end
107
108   end
109
110   newparam :path do
111     desc "Absolute path to repository"
112     isnamevar
113     validate do |value|
114       path = Pathname.new(value)
115       unless path.absolute?
116         raise ArgumentError, "Path must be absolute: #{path}"
117       end
118     end
119   end
120
121   newparam :source do
122     desc "The source URI for the repository"
123   end
124
125   newparam :fstype, :required_features => [:filesystem_types] do
126     desc "Filesystem type"
127   end
128
129   newproperty :revision do
130     desc "The revision of the repository"
131     newvalue(/^\S+$/)
132   end
133
134   newparam :owner do
135     desc "The user/uid that owns the repository files"
136   end
137
138   newparam :group do
139     desc "The group/gid that owns the repository files"
140   end
141
142   newparam :user do
143     desc "The user to run for repository operations"
144   end
145
146   newparam :excludes do
147     desc "Files to be excluded from the repository"
148   end
149
150   newparam :force do
151     desc "Force repository creation, destroying any files on the path in the process."
152     newvalues(:true, :false)
153     defaultto false
154   end
155
156   newparam :compression, :required_features => [:gzip_compression] do
157     desc "Compression level"
158     validate do |amount|
159       unless Integer(amount).between?(0, 6)
160         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
161       end
162     end
163   end
164
165   newparam :basic_auth_username, :required_features => [:basic_auth] do
166     desc "HTTP Basic Auth username"
167   end
168
169   newparam :basic_auth_password, :required_features => [:basic_auth] do
170     desc "HTTP Basic Auth password"
171   end
172
173   newparam :identity, :required_features => [:ssh_identity] do
174     desc "SSH identity file"
175   end
176
177   newparam :module, :required_features => [:modules] do
178     desc "The repository module to manage"
179   end
180
181   newparam :remote, :required_features => [:multiple_remotes] do
182     desc "The remote repository to track"
183     defaultto "origin"
184   end
185
186   newparam :configuration, :required_features => [:configuration]  do
187     desc "The configuration directory to use"
188   end
189
190   newparam :cvs_rsh, :required_features => [:cvs_rsh] do
191     desc "The value to be used for the CVS_RSH environment variable."
192   end
193
194 end