Take into account :latest status in git provider
[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
9   feature :bare_repositories,
10           "The provider differentiates between bare repositories
11           and those with working copies",
12           :methods => [:bare_exists?, :working_copy_exists?]
13
14   feature :filesystem_types,
15           "The provider supports different filesystem types"
16
17   feature :reference_tracking,
18           "The provider supports tracking revision references that can change
19            over time (eg, some VCS tags and branch names)"
20   
21   ensurable do
22     attr_accessor :latest
23     
24     def insync?(is)
25       @should ||= []
26
27       case should
28         when :present
29           return true unless [:absent, :purged, :held].include?(is)
30         when :latest
31           if is == :latest
32             return true
33           else
34             self.debug "%s repo revision is %s, latest is %s" %
35                 [@resource.name, provider.revision, provider.latest]
36             return false
37           end
38       end
39     end     
40               
41     newvalue :present do
42       provider.create
43     end
44
45     newvalue :bare, :required_features => [:bare_repositories] do
46       provider.create
47     end
48
49     newvalue :absent do
50       provider.destroy
51     end
52
53     newvalue :latest, :required_features => [:reference_tracking] do
54       if provider.exists?
55         if provider.respond_to?(:update_references)
56           provider.update_references
57         end
58         if provider.respond_to?(:latest?)
59             reference = provider.latest || provider.revision
60         else
61           reference = resource.value(:revision) || provider.revision
62         end
63         notice "Updating to latest '#{reference}' revision"
64         provider.revision = reference
65       else
66         provider.create
67       end
68     end
69
70     def retrieve
71       prov = @resource.provider
72       if prov
73         if prov.working_copy_exists?
74           prov.latest? ? :latest : :present
75         elsif prov.class.feature?(:bare_repositories) and prov.bare_exists?
76           :bare
77         else
78           :absent
79         end
80       else
81         raise Puppet::Error, "Could not find provider"
82       end
83     end
84
85   end
86
87   newparam(:path) do
88     desc "Absolute path to repository"
89     isnamevar
90     validate do |value|
91       path = Pathname.new(value)
92       unless path.absolute?
93         raise ArgumentError, "Path must be absolute: #{path}"
94       end
95     end
96   end
97
98   newparam(:source) do
99     desc "The source URI for the repository"
100   end
101
102   newparam(:fstype, :required_features => [:filesystem_types]) do
103     desc "Filesystem type"
104   end
105
106   newproperty(:revision) do
107     desc "The revision of the repository"
108     newvalue(/^\S+$/)
109   end
110
111   newparam :compression, :required_features => [:gzip_compression] do
112     desc "Compression level"
113     validate do |amount|
114       unless Integer(amount).between?(0, 6)
115         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
116       end
117     end
118   end
119
120 end