When ensure => latest, svn didn't update.
[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 provider.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.class.feature?(:bare_repositories)
74           if prov.working_copy_exists?
75             :present
76           elsif prov.bare_exists?
77             :bare
78           else
79             :absent
80           end
81         else
82           prov.exists? ? :present : :absent
83         end
84       else
85         raise Puppet::Error, "Could not find provider"
86       end
87     end
88
89   end
90
91   newparam(:path) do
92     desc "Absolute path to repository"
93     isnamevar
94     validate do |value|
95       path = Pathname.new(value)
96       unless path.absolute?
97         raise ArgumentError, "Path must be absolute: #{path}"
98       end
99     end
100   end
101
102   newparam(:source) do
103     desc "The source URI for the repository"
104   end
105
106   newparam(:fstype, :required_features => [:filesystem_types]) do
107     desc "Filesystem type"
108   end
109
110   newproperty(:revision) do
111     desc "The revision of the repository"
112     newvalue(/^\S+$/)
113   end
114
115   newparam :compression, :required_features => [:gzip_compression] do
116     desc "Compression level"
117     validate do |amount|
118       unless Integer(amount).between?(0, 6)
119         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
120       end
121     end
122   end
123
124 end