Clean up puppet lint warnings
[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   feature :depth,
41           "The provider can do shallow clones"
42
43   feature :p4config,
44           "The provider understands Perforce Configuration"
45
46   feature :submodules,
47           "The repository contains submodules which can be optionally initialized"
48
49   feature :conflict,
50           "The provider supports automatic conflict resolution"
51
52   ensurable do
53     attr_accessor :latest
54
55     def insync?(is)
56       @should ||= []
57
58       case should
59       when :present
60         return true unless [:absent, :purged, :held].include?(is)
61       when :latest
62         if is == :latest
63           return true
64         else
65           return false
66         end
67       when :bare
68         return is == :bare
69       end
70     end
71
72     newvalue :present do
73       notice "Creating repository from present"
74       provider.create
75     end
76
77     newvalue :bare, :required_features => [:bare_repositories] do
78       if !provider.exists?
79         provider.create
80       end
81     end
82
83     newvalue :absent do
84       provider.destroy
85     end
86
87     newvalue :latest, :required_features => [:reference_tracking] do
88       if provider.exists? && !@resource.value(:force)
89         if provider.respond_to?(:update_references)
90           provider.update_references
91         end
92         if provider.respond_to?(:latest?)
93             reference = provider.latest || provider.revision
94         else
95           reference = resource.value(:revision) || provider.revision
96         end
97         notice "Updating to latest '#{reference}' revision"
98         provider.revision = reference
99       else
100         notice "Creating repository from latest"
101         provider.create
102       end
103     end
104
105     def retrieve
106       prov = @resource.provider
107       if prov
108         if prov.working_copy_exists?
109           (@should.include?(:latest) && prov.latest?) ? :latest : :present
110         elsif prov.class.feature?(:bare_repositories) and prov.bare_exists?
111           :bare
112         else
113           :absent
114         end
115       else
116         raise Puppet::Error, "Could not find provider"
117       end
118     end
119
120   end
121
122   newparam :path do
123     desc "Absolute path to repository"
124     isnamevar
125     validate do |value|
126       path = Pathname.new(value)
127       unless path.absolute?
128         raise ArgumentError, "Path must be absolute: #{path}"
129       end
130     end
131   end
132
133   newparam :source do
134     desc "The source URI for the repository"
135   end
136
137   newparam :fstype, :required_features => [:filesystem_types] do
138     desc "Filesystem type"
139   end
140
141   newproperty :revision do
142     desc "The revision of the repository"
143     newvalue(/^\S+$/)
144   end
145
146   newparam :owner do
147     desc "The user/uid that owns the repository files"
148   end
149
150   newparam :group do
151     desc "The group/gid that owns the repository files"
152   end
153
154   newparam :user do
155     desc "The user to run for repository operations"
156   end
157
158   newparam :excludes do
159     desc "Files to be excluded from the repository"
160   end
161
162   newparam :force do
163     desc "Force repository creation, destroying any files on the path in the process."
164     newvalues(:true, :false)
165     defaultto false
166   end
167
168   newparam :compression, :required_features => [:gzip_compression] do
169     desc "Compression level"
170     validate do |amount|
171       unless Integer(amount).between?(0, 6)
172         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
173       end
174     end
175   end
176
177   newparam :basic_auth_username, :required_features => [:basic_auth] do
178     desc "HTTP Basic Auth username"
179   end
180
181   newparam :basic_auth_password, :required_features => [:basic_auth] do
182     desc "HTTP Basic Auth password"
183   end
184
185   newparam :identity, :required_features => [:ssh_identity] do
186     desc "SSH identity file"
187   end
188
189   newparam :module, :required_features => [:modules] do
190     desc "The repository module to manage"
191   end
192
193   newparam :remote, :required_features => [:multiple_remotes] do
194     desc "The remote repository to track"
195     defaultto "origin"
196   end
197
198   newparam :configuration, :required_features => [:configuration]  do
199     desc "The configuration directory to use"
200   end
201
202   newparam :cvs_rsh, :required_features => [:cvs_rsh] do
203     desc "The value to be used for the CVS_RSH environment variable."
204   end
205
206   newparam :depth, :required_features => [:depth] do
207     desc "The value to be used to do a shallow clone."
208   end
209
210   newparam :p4config, :required_features => [:p4config] do
211     desc "The Perforce P4CONFIG environment."
212   end
213
214   newparam :submodules, :required_features => [:submodules] do
215     desc "Initialize and update each submodule in the repository."
216     newvalues(:true, :false)
217     defaultto true
218   end
219
220   newparam :conflict do
221     desc "The action to take if conflicts exist between repository and working copy"
222   end
223
224   autorequire(:package) do
225     ['git', 'git-core']
226   end
227 end