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