ensure = latest to support reference tracking.\n\nWorking with tags, more work needed...
[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
23     newvalue :present do
24       provider.create
25     end
26
27     newvalue :bare, :required_features => [:bare_repositories] do
28       provider.create
29     end
30
31     newvalue :absent do
32       provider.destroy
33     end
34
35     newvalue :latest, :required_features => [:reference_tracking] do
36       if provider.exists?
37         if provider.respond_to?(:update_references)
38           provider.update_references
39         end
40         reference = resource.value(:revision) || provider.revision
41         notice "Updating to latest '#{reference}' revision"
42         provider.revision = reference
43       else
44         provider.create
45       end
46     end
47
48     def retrieve
49       prov = @resource.provider
50       if prov
51         if prov.class.feature?(:bare_repositories)
52           if prov.working_copy_exists?
53             :present
54           elsif prov.bare_exists?
55             :bare
56           else
57             :absent
58           end
59         else
60           prov.exists? ? :present : :absent
61         end
62       else
63         raise Puppet::Error, "Could not find provider"
64       end
65     end
66
67   end
68
69   newparam(:path) do
70     desc "Absolute path to repository"
71     isnamevar
72     validate do |value|
73       path = Pathname.new(value)
74       unless path.absolute?
75         raise ArgumentError, "Path must be absolute: #{path}"
76       end
77     end
78   end
79
80   newparam(:source) do
81     desc "The source URI for the repository"
82   end
83
84   newparam(:fstype, :required_features => [:filesystem_types]) do
85     desc "Filesystem type"
86   end
87
88   newproperty(:revision) do
89     desc "The revision of the repository"
90     newvalue(/^\S+$/)
91   end
92
93   newparam :compression, :required_features => [:gzip_compression] do
94     desc "Compression level"
95     validate do |amount|
96       unless Integer(amount).between?(0, 6)
97         raise ArgumentError, "Unsupported compression level: #{amount} (expected 0-6)"
98       end
99     end
100   end
101
102 end