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