Merge pull request #81 from sepulworld/svn-configurtation-parameter
[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   ensurable do
38     attr_accessor :latest
39
40     def insync?(is)
41       @should ||= []
42
43       case should
44       when :present
45         return true unless [:absent, :purged, :held].include?(is)
46       when :latest
47         if is == :latest
48           return true
49         else
50           return false
51         end
52       when :bare
53         return is == :bare
54       end
55     end
56
57     newvalue :present do
58       notice "Creating repository from present"
59       provider.create
60     end
61
62     newvalue :bare, :required_features => [:bare_repositories] do
63       if !provider.exists?
64         provider.create
65       end
66     end
67
68     newvalue :absent do
69       provider.destroy
70     end
71
72     newvalue :latest, :required_features => [:reference_tracking] do
73       if provider.exists?
74         if provider.respond_to?(:update_references)
75           provider.update_references
76         end
77         if provider.respond_to?(:latest?)
78             reference = provider.latest || provider.revision
79         else
80           reference = resource.value(:revision) || provider.revision
81         end
82         notice "Updating to latest '#{reference}' revision"
83         provider.revision = reference
84       else
85         notice "Creating repository from latest"
86         provider.create
87       end
88     end
89
90     def retrieve
91       prov = @resource.provider
92       if prov
93         if prov.working_copy_exists?
94           (@should.include?(:latest) && prov.latest?) ? :latest : :present
95         elsif prov.class.feature?(:bare_repositories) and prov.bare_exists?
96           :bare
97         else
98           :absent
99         end
100       else
101         raise Puppet::Error, "Could not find provider"
102       end
103     end
104
105   end
106
107   newparam :path do
108     desc "Absolute path to repository"
109     isnamevar
110     validate do |value|
111       path = Pathname.new(value)
112       unless path.absolute?
113         raise ArgumentError, "Path must be absolute: #{path}"
114       end
115     end
116   end
117
118   newparam :source do
119     desc "The source URI for the repository"
120   end
121
122   newparam :fstype, :required_features => [:filesystem_types] do
123     desc "Filesystem type"
124   end
125
126   newproperty :revision do
127     desc "The revision of the repository"
128     newvalue(/^\S+$/)
129   end
130
131   newparam :owner do
132     desc "The user/uid that owns the repository files"
133   end
134
135   newparam :group do
136     desc "The group/gid that owns the repository files"
137   end
138
139   newparam :user do
140     desc "The user to run for repository operations"
141   end
142
143   newparam :excludes do
144     desc "Files to be excluded from the repository"
145   end
146
147   newparam :force do
148     desc "Force repository creation, destroying any files on the path in the process."
149     newvalues(:true, :false)
150     defaultto false
151   end
152
153   newparam :compression, :required_features => [:gzip_compression] do
154     desc "Compression level"
155     validate do |amount|
156       unless Integer(amount).between?(0, 6)
157         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
158       end
159     end
160   end
161
162   newparam :basic_auth_username, :required_features => [:basic_auth] do
163     desc "HTTP Basic Auth username"
164   end
165
166   newparam :basic_auth_password, :required_features => [:basic_auth] do
167     desc "HTTP Basic Auth password"
168   end
169
170   newparam :identity, :required_features => [:ssh_identity] do
171     desc "SSH identity file"
172   end
173
174   newparam :module, :required_features => [:modules] do
175     desc "The repository module to manage"
176   end
177
178   newparam :remote, :required_features => [:multiple_remotes] do
179     desc "The remote repository to track"
180     defaultto "origin"
181   end
182   
183   newparam :configuration, :required_features => [:configuration]  do
184     desc "The configuration directory to use"
185   end
186
187 end