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