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