puppet 0.24.4 → 0.24.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (316) hide show
  1. data/CHANGELOG +170 -0
  2. data/Rakefile +6 -4
  3. data/bin/filebucket +3 -2
  4. data/bin/puppet +7 -4
  5. data/bin/puppetca +32 -14
  6. data/bin/puppetd +12 -34
  7. data/bin/puppetmasterd +3 -2
  8. data/bin/puppetrun +5 -43
  9. data/bin/ralsh +2 -2
  10. data/conf/debian/README.source +2 -0
  11. data/conf/debian/TODO.Debian +1 -0
  12. data/conf/debian/changelog +257 -0
  13. data/conf/debian/compat +1 -0
  14. data/conf/debian/control +45 -0
  15. data/conf/debian/copyright +17 -0
  16. data/conf/debian/docs +1 -0
  17. data/conf/debian/fileserver.conf +12 -0
  18. data/conf/debian/puppet.NEWS +63 -0
  19. data/conf/debian/puppet.conf +8 -0
  20. data/conf/debian/puppet.dirs +7 -0
  21. data/conf/debian/puppet.files +6 -0
  22. data/conf/debian/puppet.init +64 -0
  23. data/conf/debian/puppet.logrotate +11 -0
  24. data/conf/debian/puppet.postinst +9 -0
  25. data/conf/debian/puppet.postrm +21 -0
  26. data/conf/debian/puppet.preinst +25 -0
  27. data/conf/debian/puppetmaster.files +4 -0
  28. data/conf/debian/puppetmaster.init +58 -0
  29. data/conf/debian/rules +115 -0
  30. data/conf/debian/watch +2 -0
  31. data/conf/gentoo/init.d/puppet +1 -1
  32. data/conf/gentoo/init.d/puppetmaster +32 -31
  33. data/conf/redhat/client.init +10 -2
  34. data/conf/redhat/puppet.spec +4 -1
  35. data/conf/redhat/server.init +9 -1
  36. data/examples/{code/allatonce → allatonce} +0 -0
  37. data/examples/{code/assignments → assignments} +0 -0
  38. data/examples/{code/components → components} +0 -0
  39. data/examples/{root/etc → etc}/init.d/sleeper +0 -0
  40. data/examples/{root/etc → etc}/otherfile +0 -0
  41. data/examples/{root/etc → etc}/puppet/fileserver.conf +0 -0
  42. data/examples/{root/etc → etc}/puppet/namespaceauth.conf +0 -0
  43. data/examples/{root/etc → etc}/puppet/puppet.conf +0 -0
  44. data/examples/{root/etc → etc}/puppet/tagmail.conf +0 -0
  45. data/examples/{code/execs → execs} +0 -0
  46. data/examples/{code/file.bl → file.bl} +0 -0
  47. data/examples/{code/filedefaults → filedefaults} +0 -0
  48. data/examples/{code/fileparsing → fileparsing} +0 -0
  49. data/examples/{code/filerecursion → filerecursion} +0 -0
  50. data/examples/{code/functions → functions} +0 -0
  51. data/examples/{code/groups → groups} +0 -0
  52. data/examples/{code/head → head} +0 -0
  53. data/examples/{code/importing → importing} +0 -0
  54. data/examples/{code/mac_automount.pp → mac_automount.pp} +0 -0
  55. data/examples/{code/mac_dscl.pp → mac_dscl.pp} +0 -0
  56. data/examples/{code/mac_dscl_revert.pp → mac_dscl_revert.pp} +0 -0
  57. data/examples/{code/mac_netinfo.pp → mac_netinfo.pp} +0 -0
  58. data/examples/{code/mac_pkgdmg.pp → mac_pkgdmg.pp} +0 -0
  59. data/examples/{code/modules → modules}/sample-module.pp +0 -0
  60. data/examples/{code/modules → modules}/sample-module/README.txt +0 -0
  61. data/examples/{code/modules → modules}/sample-module/lib/puppet/parser/functions/hostname_to_dn.rb +0 -0
  62. data/examples/{code/modules → modules}/sample-module/manifests/init.pp +0 -0
  63. data/examples/{code/modules → modules}/sample-module/templates/sample.erb +0 -0
  64. data/examples/{code/nodes → nodes} +0 -0
  65. data/examples/{code/one → one} +0 -0
  66. data/examples/{code/relationships → relationships} +0 -0
  67. data/examples/{code/selectors → selectors} +0 -0
  68. data/examples/{code/simpletests → simpletests} +0 -0
  69. data/examples/{code/svncommit → svncommit} +0 -0
  70. data/ext/autotest/Rakefile +8 -0
  71. data/ext/autotest/config +43 -0
  72. data/ext/autotest/readme.rst +16 -0
  73. data/{examples/root → ext}/bin/sleeper +1 -1
  74. data/ext/emacs/puppet-mode.el +246 -184
  75. data/ext/ldap/puppet.schema +7 -2
  76. data/ext/module_puppet +4 -3
  77. data/ext/nagios/check_puppet.rb +117 -0
  78. data/ext/puppetlast +40 -0
  79. data/install.rb +12 -3
  80. data/lib/puppet.rb +1 -44
  81. data/lib/puppet/defaults.rb +23 -10
  82. data/lib/puppet/dsl.rb +2 -2
  83. data/lib/puppet/executables/client/certhandler.rb +77 -0
  84. data/lib/puppet/external/nagios.rb +1 -1
  85. data/lib/puppet/external/nagios/base.rb +60 -46
  86. data/lib/puppet/file_serving/indirection_hooks.rb +4 -2
  87. data/lib/puppet/file_serving/metadata.rb +0 -9
  88. data/lib/puppet/file_serving/terminus_helper.rb +4 -4
  89. data/lib/puppet/indirector.rb +26 -28
  90. data/lib/puppet/indirector/catalog/compiler.rb +6 -28
  91. data/lib/puppet/indirector/checksum/file.rb +2 -2
  92. data/lib/puppet/indirector/direct_file_server.rb +7 -7
  93. data/lib/puppet/indirector/envelope.rb +13 -0
  94. data/lib/puppet/indirector/exec.rb +2 -2
  95. data/lib/puppet/indirector/facts/facter.rb +2 -2
  96. data/lib/puppet/indirector/file.rb +17 -14
  97. data/lib/puppet/indirector/file_metadata/file.rb +2 -2
  98. data/lib/puppet/indirector/file_server.rb +14 -14
  99. data/lib/puppet/indirector/indirection.rb +113 -48
  100. data/lib/puppet/indirector/ldap.rb +13 -25
  101. data/lib/puppet/indirector/memory.rb +7 -7
  102. data/lib/puppet/indirector/module_files.rb +14 -14
  103. data/lib/puppet/indirector/node/exec.rb +3 -10
  104. data/lib/puppet/indirector/node/ldap.rb +138 -41
  105. data/lib/puppet/indirector/node/plain.rb +1 -8
  106. data/lib/puppet/indirector/node/rest.rb +1 -1
  107. data/lib/puppet/indirector/plain.rb +2 -2
  108. data/lib/puppet/indirector/report/processor.rb +2 -2
  109. data/lib/puppet/indirector/request.rb +42 -0
  110. data/lib/puppet/indirector/rest.rb +51 -3
  111. data/lib/puppet/indirector/terminus.rb +0 -27
  112. data/lib/puppet/indirector/yaml.rb +12 -17
  113. data/lib/puppet/metatype/attributes.rb +3 -7
  114. data/lib/puppet/metatype/evaluation.rb +2 -2
  115. data/lib/puppet/module.rb +6 -2
  116. data/lib/puppet/network/client/master.rb +29 -81
  117. data/lib/puppet/network/handler/master.rb +12 -43
  118. data/lib/puppet/network/http.rb +8 -6
  119. data/lib/puppet/network/http/handler.rb +42 -32
  120. data/lib/puppet/network/http/mongrel.rb +8 -9
  121. data/lib/puppet/network/http/mongrel/rest.rb +42 -15
  122. data/lib/puppet/network/http/webrick.rb +27 -16
  123. data/lib/puppet/network/http/webrick/rest.rb +38 -14
  124. data/lib/puppet/network/http_pool.rb +3 -2
  125. data/lib/puppet/network/server.rb +24 -22
  126. data/lib/puppet/network/xmlrpc/client.rb +6 -1
  127. data/lib/puppet/node.rb +38 -79
  128. data/lib/puppet/node/catalog.rb +9 -0
  129. data/lib/puppet/node/facts.rb +9 -1
  130. data/lib/puppet/parser/ast/function.rb +1 -1
  131. data/lib/puppet/parser/collector.rb +6 -0
  132. data/lib/puppet/parser/compiler.rb +1 -1
  133. data/lib/puppet/parser/functions.rb +25 -1
  134. data/lib/puppet/parser/interpreter.rb +2 -17
  135. data/lib/puppet/parser/parser.rb +4 -4
  136. data/lib/puppet/parser/parser_support.rb +6 -2
  137. data/lib/puppet/parser/resource.rb +6 -0
  138. data/lib/puppet/parser/templatewrapper.rb +9 -0
  139. data/lib/puppet/pgraph.rb +1 -1
  140. data/lib/puppet/property.rb +0 -1
  141. data/lib/puppet/provider.rb +9 -95
  142. data/lib/puppet/provider/confine.rb +77 -0
  143. data/lib/puppet/provider/confine/exists.rb +22 -0
  144. data/lib/puppet/provider/confine/false.rb +19 -0
  145. data/lib/puppet/provider/confine/feature.rb +17 -0
  146. data/lib/puppet/provider/confine/true.rb +20 -0
  147. data/lib/puppet/provider/confine/variable.rb +42 -0
  148. data/lib/puppet/provider/confine_collection.rb +47 -0
  149. data/lib/puppet/provider/confiner.rb +20 -0
  150. data/lib/puppet/provider/cron/crontab.rb +6 -2
  151. data/lib/puppet/provider/group/groupadd.rb +1 -1
  152. data/lib/puppet/provider/group/ldap.rb +48 -0
  153. data/lib/puppet/provider/ldap.rb +137 -0
  154. data/lib/puppet/provider/nameservice.rb +1 -2
  155. data/lib/puppet/provider/nameservice/objectadd.rb +2 -5
  156. data/lib/puppet/provider/package/dpkg.rb +16 -1
  157. data/lib/puppet/provider/package/freebsd.rb +15 -4
  158. data/lib/puppet/provider/package/gem.rb +33 -12
  159. data/lib/puppet/provider/package/pkgdmg.rb +1 -60
  160. data/lib/puppet/provider/package/ports.rb +6 -1
  161. data/lib/puppet/provider/package/rpm.rb +14 -13
  162. data/lib/puppet/provider/package/urpmi.rb +3 -3
  163. data/lib/puppet/provider/service/base.rb +4 -4
  164. data/lib/puppet/provider/service/debian.rb +1 -1
  165. data/lib/puppet/provider/service/init.rb +5 -3
  166. data/lib/puppet/provider/service/redhat.rb +35 -7
  167. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +69 -0
  168. data/lib/puppet/provider/user/ldap.rb +133 -0
  169. data/lib/puppet/provider/user/useradd.rb +1 -1
  170. data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +14 -14
  171. data/lib/puppet/rails/database/schema.rb +9 -0
  172. data/lib/puppet/rails/resource.rb +1 -0
  173. data/lib/puppet/reference/providers.rb +8 -2
  174. data/lib/puppet/reference/report.rb +23 -0
  175. data/lib/puppet/reports/rrdgraph.rb +4 -2
  176. data/lib/puppet/sslcertificates/ca.rb +9 -4
  177. data/lib/puppet/sslcertificates/support.rb +26 -2
  178. data/lib/puppet/transaction.rb +11 -16
  179. data/lib/puppet/transaction/change.rb +94 -0
  180. data/lib/puppet/transaction/event.rb +21 -0
  181. data/lib/puppet/transaction/report.rb +4 -0
  182. data/lib/puppet/type.rb +0 -2
  183. data/lib/puppet/type/file/ensure.rb +0 -5
  184. data/lib/puppet/type/file/group.rb +13 -7
  185. data/lib/puppet/type/file/source.rb +8 -15
  186. data/lib/puppet/type/file/target.rb +2 -0
  187. data/lib/puppet/type/group.rb +1 -1
  188. data/lib/puppet/type/mount.rb +4 -2
  189. data/lib/puppet/type/nagios_hostescalation.rb +3 -0
  190. data/lib/puppet/type/nagios_servicegroup.rb +3 -0
  191. data/lib/puppet/type/ssh_authorized_key.rb +56 -0
  192. data/lib/puppet/type/user.rb +3 -0
  193. data/lib/puppet/type/yumrepo.rb +0 -1
  194. data/lib/puppet/util.rb +1 -1
  195. data/lib/puppet/util/ldap.rb +5 -0
  196. data/lib/puppet/util/ldap/connection.rb +69 -0
  197. data/lib/puppet/util/ldap/generator.rb +45 -0
  198. data/lib/puppet/util/ldap/manager.rb +281 -0
  199. data/lib/puppet/util/posix.rb +2 -2
  200. data/lib/puppet/util/resource_template.rb +61 -0
  201. data/lib/puppet/util/settings.rb +63 -3
  202. data/lib/puppet/util/storage.rb +4 -0
  203. data/lib/puppet/util/warnings.rb +7 -0
  204. data/man/man8/filebucket.8 +116 -0
  205. data/man/man8/pi.8 +34 -0
  206. data/man/man8/puppet.8 +78 -0
  207. data/man/man8/puppet.conf.8 +1747 -0
  208. data/man/man8/puppetca.8 +118 -0
  209. data/man/man8/puppetd.8 +184 -0
  210. data/man/man8/puppetdoc.8 +62 -0
  211. data/man/man8/puppetmasterd.8 +87 -0
  212. data/man/man8/puppetrun.8 +151 -0
  213. data/man/man8/ralsh.8 +135 -0
  214. data/test/README +24 -0
  215. data/test/certmgr/support.rb +28 -1
  216. data/test/data/failers/badclassnoparam +10 -0
  217. data/test/data/failers/badclassparam +10 -0
  218. data/test/data/failers/badcompnoparam +9 -0
  219. data/test/data/failers/badcompparam +9 -0
  220. data/test/data/failers/badtypeparam +3 -0
  221. data/test/data/failers/noobjectrvalue +1 -0
  222. data/test/data/providers/cron/crontab.allthree +17 -0
  223. data/test/data/providers/cron/crontab.envNcomment +12 -0
  224. data/test/data/providers/cron/crontab.envNname +11 -0
  225. data/test/data/providers/cron/crontab.multirecords +12 -0
  226. data/test/data/providers/cron/crontab_collections.yaml +44 -0
  227. data/test/data/providers/cron/crontab_multiple_with_env.yaml +54 -0
  228. data/test/data/providers/cron/crontab_sample_records.yaml +272 -0
  229. data/test/data/providers/cron/examples/freebsd +2 -0
  230. data/test/data/providers/cron/examples/one +14 -0
  231. data/test/data/providers/cron/examples/openbsd +20 -0
  232. data/test/data/providers/package/testpackages.yaml +65 -0
  233. data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +5 -0
  234. data/test/data/reports/1.yaml +108 -0
  235. data/test/data/reports/2.yaml +108 -0
  236. data/test/data/reports/tagmail_failers.conf +3 -0
  237. data/test/data/reports/tagmail_passers.conf +30 -0
  238. data/test/data/snippets/aliastest.pp +16 -0
  239. data/test/data/snippets/argumentdefaults +14 -0
  240. data/test/data/snippets/casestatement.pp +58 -0
  241. data/test/data/snippets/classheirarchy.pp +15 -0
  242. data/test/data/snippets/classincludes.pp +17 -0
  243. data/test/data/snippets/classpathtest +11 -0
  244. data/test/data/snippets/collection.pp +10 -0
  245. data/test/data/snippets/collection_within_virtual_definitions.pp +20 -0
  246. data/test/data/snippets/componentmetaparams.pp +11 -0
  247. data/test/data/snippets/componentrequire.pp +8 -0
  248. data/test/data/snippets/deepclassheirarchy.pp +23 -0
  249. data/test/data/snippets/defineoverrides.pp +17 -0
  250. data/test/data/snippets/emptyclass.pp +9 -0
  251. data/test/data/snippets/emptyexec.pp +3 -0
  252. data/test/data/snippets/falsevalues.pp +3 -0
  253. data/test/data/snippets/filecreate +11 -0
  254. data/test/data/snippets/fqdefinition.pp +5 -0
  255. data/test/data/snippets/fqparents.pp +11 -0
  256. data/test/data/snippets/implicititeration +15 -0
  257. data/test/data/snippets/multipleinstances +7 -0
  258. data/test/data/snippets/multisubs.pp +13 -0
  259. data/test/data/snippets/namevartest +9 -0
  260. data/test/data/snippets/scopetest +13 -0
  261. data/test/data/snippets/selectorvalues.pp +42 -0
  262. data/test/data/snippets/simpledefaults +5 -0
  263. data/test/data/snippets/simpleselector +38 -0
  264. data/test/data/snippets/singleary.pp +19 -0
  265. data/test/data/snippets/singlequote.pp +11 -0
  266. data/test/data/snippets/singleselector.pp +22 -0
  267. data/test/data/snippets/subclass_name_duplication.pp +11 -0
  268. data/test/data/snippets/tag.pp +9 -0
  269. data/test/data/snippets/tagged.pp +35 -0
  270. data/test/data/snippets/virtualresources.pp +14 -0
  271. data/test/data/types/hosts/1 +3 -0
  272. data/test/data/types/hosts/2 +13 -0
  273. data/test/data/types/hosts/solaris +5 -0
  274. data/test/data/types/mailalias/file1 +183 -0
  275. data/test/data/types/mount/freebsd.fstab +7 -0
  276. data/test/data/types/mount/linux.fstab +11 -0
  277. data/test/data/types/mount/solaris.fstab +11 -0
  278. data/test/data/types/port/1 +533 -0
  279. data/test/data/types/port/darwin +11866 -0
  280. data/test/data/types/ssh_authorized_key/1 +2 -0
  281. data/test/data/types/sshkey/1 +21 -0
  282. data/test/data/types/yumrepos/fedora-devel.repo +26 -0
  283. data/test/data/types/yumrepos/fedora.repo +9 -0
  284. data/test/language/parser.rb +8 -1
  285. data/test/lib/puppettest/runnable_test.rb +3 -0
  286. data/test/lib/puppettest/support/utils.rb +1 -1
  287. data/test/lib/rake/puppet_testtask.rb +3 -0
  288. data/test/lib/stubba.rb +1 -1
  289. data/test/network/client/ca.rb +1 -0
  290. data/test/network/client/master.rb +13 -127
  291. data/test/network/handler/master.rb +61 -80
  292. data/test/other/provider.rb +0 -45
  293. data/test/other/transactions.rb +53 -15
  294. data/test/rails/host.rb +0 -37
  295. data/test/ral/providers/cron/crontab.rb +32 -3
  296. data/test/ral/providers/provider.rb +28 -7
  297. data/test/ral/type/filesources.rb +2 -18
  298. data/test/ral/type/sshkey.rb +0 -1
  299. data/test/ral/type/user.rb +6 -0
  300. data/test/test +241 -0
  301. metadata +289 -113
  302. data/examples/root/etc/configfile +0 -0
  303. data/examples/root/etc/debian-passwd +0 -29
  304. data/examples/root/etc/debian-syslog.conf +0 -71
  305. data/lib/puppet/event.rb +0 -28
  306. data/lib/puppet/network/handler/configuration.rb +0 -184
  307. data/lib/puppet/network/http/mongrel/xmlrpc.rb +0 -4
  308. data/lib/puppet/network/http/webrick/xmlrpc.rb +0 -4
  309. data/lib/puppet/propertychange.rb +0 -141
  310. data/lib/puppet/provider/interface/redhat.rb +0 -250
  311. data/lib/puppet/provider/interface/sunos.rb +0 -133
  312. data/lib/puppet/type/interface.rb +0 -60
  313. data/lib/puppet/util/variables.rb +0 -38
  314. data/test/network/handler/configuration.rb +0 -160
  315. data/test/other/propertychange.rb +0 -140
  316. data/test/util/loadedfile.rb +0 -121
@@ -7,7 +7,7 @@
7
7
 
8
8
  Summary: A network tool for managing many disparate systems
9
9
  Name: puppet
10
- Version: 0.24.4
10
+ Version: 0.24.5
11
11
  Release: 1%{?dist}
12
12
  License: GPLv2+
13
13
  Group: System Environment/Base
@@ -157,6 +157,9 @@ fi
157
157
  rm -rf %{buildroot}
158
158
 
159
159
  %changelog
160
+ * Mon Jul 22 2008 James Turnbull <james@lovedthanlost.net> - 0.24.5-1
161
+ - New version
162
+
160
163
  * Sat Dec 22 2007 David Lutterkort <dlutter@redhat.com> - 0.24.1-1
161
164
  - New version
162
165
 
@@ -62,6 +62,11 @@ restart() {
62
62
  start
63
63
  }
64
64
 
65
+ genconfig() {
66
+ echo -n $"Generate configuration puppetmaster: "
67
+ $PUPPETMASTER $PUPPETMASTER_OPTS --genconfig
68
+ }
69
+
65
70
  case "$1" in
66
71
  start)
67
72
  start
@@ -79,8 +84,11 @@ case "$1" in
79
84
  status $PUPPETMASTER
80
85
  RETVAL=$?
81
86
  ;;
87
+ genconfig)
88
+ genconfig
89
+ ;;
82
90
  *)
83
- echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
91
+ echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|genconfig}"
84
92
  exit 1
85
93
  esac
86
94
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,8 @@
1
+ dest = File.expand_path("~/.autotest")
2
+ file dest => ["config", "Rakefile"] do
3
+ sh "cp config #{dest}"
4
+ end
5
+
6
+ task :install => dest
7
+
8
+ task :default => :install
@@ -0,0 +1,43 @@
1
+ # vim: syntax=ruby
2
+ # From http://pastie.caboo.se/115692, linked from rickbradley
3
+
4
+ require 'autotest/redgreen'
5
+ require 'autotest/timestamp'
6
+
7
+ Autotest.send(:alias_method, :real_find_files, :find_files)
8
+ Autotest.send(:define_method, :find_files) do |*args|
9
+ real_find_files.reject do |k, v|
10
+ if (ENV['AUTOTEST'] and !ENV['AUTOTEST'].empty?)
11
+ !Regexp.new(ENV['AUTOTEST']).match(k)
12
+ end
13
+ end
14
+ end
15
+
16
+ module Autotest::Growl
17
+
18
+ def self.growl title, msg, img, pri=0, sticky=""
19
+ system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
20
+ end
21
+
22
+ Autotest.add_hook :ran_command do |at|
23
+ image_root = "~/.autotest_images"
24
+ results = [at.results].flatten.join("\n")
25
+ output = results.slice(/(\d+)\stests,\s(\d+)\sassertions,\s(\d+)\sfailures,\s(\d+)\serrors/)
26
+ if output
27
+ if $~[3].to_i > 0 || $~[4].to_i > 0
28
+ growl "FAIL", "#{output}", "#{image_root}/fail.png", 2
29
+ else
30
+ growl "Pass", "#{output}", "#{image_root}/pass.png"
31
+ end
32
+ end
33
+
34
+ output = results.slice(/(\d+)\sexamples,\s(\d+)\sfailures?(,\s+\d+\s+pending)?/)
35
+ if output
36
+ if $~[2].to_i > 0 || $~[4].to_i > 0
37
+ growl "FAIL", "#{output}", "#{image_root}/fail.png", 2
38
+ else
39
+ growl "Pass", "#{output}", "#{image_root}/pass.png"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,16 @@
1
+ Autotest is a simple tool that automatically links tests with the files being
2
+ tested, and runs tests automatically when either the test or code has changed.
3
+
4
+ If you are running on a Mac and have growlnotify_ installed, install the
5
+ ZenTest_ gem, then copy the ``config`` file to ``~/.autotest`` (or just
6
+ run ``rake`` in this directory).
7
+
8
+ Once you have ``autotest`` installed, change to the root of your Puppet
9
+ git repository and run ``autotest`` with no arguments. To refresh the list
10
+ of files to scan, hit ``^c`` (that is, control-c).
11
+
12
+ It's recommended you leave this running in another terminal during all
13
+ development, preferably on another monitor.
14
+
15
+ .. _zentest: http://www.zenspider.com/ZSS/Products/ZenTest/
16
+ .. _growlnotify: http://growl.info/extras.php
@@ -1,4 +1,4 @@
1
- #!/usr/bin/ruby -w
1
+ #!/usr/bin/env ruby -w
2
2
 
3
3
  ###
4
4
  # sleep indefinitely as a debug
@@ -2,59 +2,52 @@
2
2
  ;;; puppet-mode.el
3
3
  ;;;
4
4
  ;;; Author: lutter
5
- ;;; Description: A simple mode for editing puppet manifests
5
+ ;;; Author: Russ Allbery <rra@stanford.edu>
6
6
  ;;;
7
+ ;;; Description: A simple mode for editing puppet manifests
7
8
 
8
- (defconst puppet-mode-version "0.0.1")
9
+ (defconst puppet-mode-version "0.2")
9
10
 
10
11
  (defvar puppet-mode-abbrev-table nil
11
12
  "Abbrev table in use in puppet-mode buffers.")
12
13
 
13
14
  (define-abbrev-table 'puppet-mode-abbrev-table ())
14
15
 
15
- (defvar puppet-mode-map nil "Keymap used in puppet mode.")
16
+ (defcustom puppet-indent-level 2
17
+ "*Indentation of Puppet statements."
18
+ :type 'integer :group 'puppet)
16
19
 
17
- (if puppet-mode-map
18
- nil
19
- (setq puppet-mode-map (make-sparse-keymap))
20
- ;; (define-key puppet-mode-map "{" 'puppet-electric-brace)
21
- ;; (define-key puppet-mode-map "}" 'puppet-electric-brace)
22
- ;; (define-key puppet-mode-map "\e\C-a" 'puppet-beginning-of-defun)
23
- ;; (define-key puppet-mode-map "\e\C-e" 'puppet-end-of-defun)
24
- ;; (define-key puppet-mode-map "\e\C-b" 'puppet-backward-sexp)
25
- ;; (define-key puppet-mode-map "\e\C-f" 'puppet-forward-sexp)
26
- ;; (define-key puppet-mode-map "\e\C-p" 'puppet-beginning-of-block)
27
- ;; (define-key puppet-mode-map "\e\C-n" 'puppet-end-of-block)
28
- ;; (define-key puppet-mode-map "\e\C-h" 'puppet-mark-defun)
29
- ;; (define-key puppet-mode-map "\e\C-q" 'puppet-indent-exp)
30
- ;; (define-key puppet-mode-map "\t" 'puppet-indent-command)
31
- ;; (define-key puppet-mode-map "\C-c\C-e" 'puppet-insert-end)
32
- ;; (define-key puppet-mode-map "\C-j" 'puppet-reindent-then-newline-and-indent)
33
- (define-key puppet-mode-map "\C-m" 'newline))
20
+ (defcustom puppet-include-indent 2
21
+ "*Indentation of continued Puppet include statements."
22
+ :type 'integer :group 'puppet)
34
23
 
35
- (defvar puppet-mode-syntax-table nil
36
- "Syntax table in use in puppet-mode buffers.")
24
+ (defvar puppet-mode-map
25
+ (let ((map (make-sparse-keymap)))
26
+ (define-key map "\C-j" 'newline-and-indent)
27
+ (define-key map "\C-m" 'newline-and-indent)
28
+ map)
29
+ "Key map used in puppet-mode buffers.")
37
30
 
38
- (if puppet-mode-syntax-table
39
- ()
40
- (setq puppet-mode-syntax-table (make-syntax-table))
41
- (modify-syntax-entry ?\' "\"" puppet-mode-syntax-table)
42
- (modify-syntax-entry ?\" "\"" puppet-mode-syntax-table)
43
- (modify-syntax-entry ?# "<" puppet-mode-syntax-table)
44
- (modify-syntax-entry ?\n ">" puppet-mode-syntax-table)
45
- (modify-syntax-entry ?\\ "\\" puppet-mode-syntax-table)
46
- (modify-syntax-entry ?$ "." puppet-mode-syntax-table)
47
- (modify-syntax-entry ?- "_" puppet-mode-syntax-table)
48
- (modify-syntax-entry ?> "." puppet-mode-syntax-table)
49
- (modify-syntax-entry ?= "." puppet-mode-syntax-table)
50
- (modify-syntax-entry ?\; "." puppet-mode-syntax-table)
51
- (modify-syntax-entry ?\( "()" puppet-mode-syntax-table)
52
- (modify-syntax-entry ?\) ")(" puppet-mode-syntax-table)
53
- (modify-syntax-entry ?\{ "(}" puppet-mode-syntax-table)
54
- (modify-syntax-entry ?\} "){" puppet-mode-syntax-table)
55
- (modify-syntax-entry ?\[ "(]" puppet-mode-syntax-table)
56
- (modify-syntax-entry ?\] ")[" puppet-mode-syntax-table)
57
- )
31
+ (defvar puppet-mode-syntax-table
32
+ (let ((table (make-syntax-table)))
33
+ (modify-syntax-entry ?\' "\"" table)
34
+ (modify-syntax-entry ?\" "\"" table)
35
+ (modify-syntax-entry ?# "<" table)
36
+ (modify-syntax-entry ?\n ">" table)
37
+ (modify-syntax-entry ?\\ "\\" table)
38
+ (modify-syntax-entry ?$ "." table)
39
+ (modify-syntax-entry ?- "_" table)
40
+ (modify-syntax-entry ?> "." table)
41
+ (modify-syntax-entry ?= "." table)
42
+ (modify-syntax-entry ?\; "." table)
43
+ (modify-syntax-entry ?\( "()" table)
44
+ (modify-syntax-entry ?\) ")(" table)
45
+ (modify-syntax-entry ?\{ "(}" table)
46
+ (modify-syntax-entry ?\} "){" table)
47
+ (modify-syntax-entry ?\[ "(]" table)
48
+ (modify-syntax-entry ?\] ")[" table)
49
+ table)
50
+ "Syntax table in use in puppet-mode buffers.")
58
51
 
59
52
  (defcustom puppet-indent-tabs-mode nil
60
53
  "*Indentation can insert tabs in puppet mode if this is non-nil."
@@ -64,36 +57,43 @@
64
57
  "*Indentation column of comments."
65
58
  :type 'integer :group 'puppet)
66
59
 
67
- (defun puppet-mode-variables ()
68
- (set-syntax-table puppet-mode-syntax-table)
69
- (setq local-abbrev-table puppet-mode-abbrev-table)
70
- ;(make-local-variable 'indent-line-function)
71
- ;(setq indent-line-function 'ruby-indent-line)
72
- (make-local-variable 'require-final-newline)
73
- (setq require-final-newline t)
74
- (make-variable-buffer-local 'comment-start)
75
- (setq comment-start "# ")
76
- (make-variable-buffer-local 'comment-end)
77
- (setq comment-end "")
78
- (make-variable-buffer-local 'comment-column)
79
- (setq comment-column puppet-comment-column)
80
- (make-variable-buffer-local 'comment-start-skip)
81
- (setq comment-start-skip "#+ *")
82
- (setq indent-tabs-mode puppet-indent-tabs-mode)
83
- (make-local-variable 'parse-sexp-ignore-comments)
84
- (setq parse-sexp-ignore-comments t)
85
- (make-local-variable 'paragraph-start)
86
- (setq paragraph-start (concat "$\\|" page-delimiter))
87
- (make-local-variable 'paragraph-separate)
88
- (setq paragraph-separate paragraph-start)
89
- (make-local-variable 'paragraph-ignore-fill-prefix)
90
- (setq paragraph-ignore-fill-prefix t))
60
+ (defun puppet-count-matches (re start end)
61
+ "The same as Emacs 22 count-matches, for portability to other versions
62
+ of Emacs."
63
+ (save-excursion
64
+ (let ((n 0))
65
+ (goto-char start)
66
+ (while (re-search-forward re end t) (setq n (1+ n)))
67
+ n)))
91
68
 
92
69
  (defun puppet-comment-line-p ()
93
70
  "Return non-nil iff this line is a comment."
94
71
  (save-excursion
95
- (beginning-of-line)
96
- (looking-at (format "\\s-*%s" comment-start))))
72
+ (save-match-data
73
+ (beginning-of-line)
74
+ (looking-at (format "\\s-*%s" comment-start)))))
75
+
76
+ (defun puppet-block-indent ()
77
+ "If point is in a block, return the indentation of the first line of that
78
+ block (the line containing the opening brace). Used to set the indentation
79
+ of the closing brace of a block."
80
+ (save-excursion
81
+ (save-match-data
82
+ (let ((opoint (point))
83
+ (apoint (search-backward "{" nil t)))
84
+ (when apoint
85
+ ;; This is a bit of a hack and doesn't allow for strings. We really
86
+ ;; want to parse by sexps at some point.
87
+ (let ((close-braces (puppet-count-matches "}" apoint opoint))
88
+ (open-braces 0))
89
+ (while (and apoint (> close-braces open-braces))
90
+ (setq apoint (search-backward "{" nil t))
91
+ (when apoint
92
+ (setq close-braces (puppet-count-matches "}" apoint opoint))
93
+ (setq open-braces (1+ open-braces)))))
94
+ (if apoint
95
+ (current-indentation)
96
+ nil))))))
97
97
 
98
98
  (defun puppet-in-array ()
99
99
  "If point is in an array, return the position of the opening '[' of
@@ -103,15 +103,36 @@ that array, else return nil."
103
103
  (let ((opoint (point))
104
104
  (apoint (search-backward "[" nil t)))
105
105
  (when apoint
106
- ;; An array opens before point. If it doesn't close before
107
- ;; point, then point must be in it.
108
- ;; ### TODO: of course, the '[' could be in a string literal,
109
- ;; ### in which case this whole idea is bogus. But baby
110
- ;; ### steps, baby steps. A more robust strategy might be
111
- ;; ### to walk backwards by sexps, until hit a wall, then
112
- ;; ### inspect the nature of that wall.
113
- (if (= (count-matches "\\]" apoint opoint) 0)
114
- apoint))))))
106
+ ;; This is a bit of a hack and doesn't allow for strings. We really
107
+ ;; want to parse by sexps at some point.
108
+ (let ((close-brackets (puppet-count-matches "]" apoint opoint))
109
+ (open-brackets 0))
110
+ (while (and apoint (> close-brackets open-brackets))
111
+ (setq apoint (search-backward "[" nil t))
112
+ (when apoint
113
+ (setq close-brackets (puppet-count-matches "]" apoint opoint))
114
+ (setq open-brackets (1+ open-brackets)))))
115
+ apoint)))))
116
+
117
+ (defun puppet-in-include ()
118
+ "If point is in a continued list of include statements, return the position
119
+ of the initial include plus puppet-include-indent."
120
+ (save-excursion
121
+ (save-match-data
122
+ (let ((include-column nil)
123
+ (not-found t))
124
+ (while not-found
125
+ (forward-line -1)
126
+ (cond
127
+ ((bobp)
128
+ (setq not-found nil))
129
+ ((looking-at "^\\s-*include\\s-+.*,\\s-*$")
130
+ (setq include-column
131
+ (+ (current-indentation) puppet-include-indent))
132
+ (setq not-found nil))
133
+ ((not (looking-at ".*,\\s-*$"))
134
+ (setq not-found nil))))
135
+ include-column))))
115
136
 
116
137
  (defun puppet-indent-line ()
117
138
  "Indent current line as puppet code."
@@ -121,6 +142,8 @@ that array, else return nil."
121
142
  (indent-line-to 0) ; First line is always non-indented
122
143
  (let ((not-indented t)
123
144
  (array-start (puppet-in-array))
145
+ (include-start (puppet-in-include))
146
+ (block-indent (puppet-block-indent))
124
147
  cur-indent)
125
148
  (cond
126
149
  (array-start
@@ -155,18 +178,13 @@ that array, else return nil."
155
178
  (re-search-forward "\\S-")
156
179
  (forward-char -1)
157
180
  (setq cur-indent (current-column))))
158
- ((looking-at "^[^{\n]*}")
159
- ;; This line contains the end of a block, but the block does
160
- ;; not also begin on this line, so decrease the indentation.
161
- (save-excursion
162
- (forward-line -1)
163
- (if (looking-at "^.*}")
164
- (progn
165
- (setq cur-indent (- (current-indentation) 2))
166
- (setq not-indented nil))
167
- (setq cur-indent (- (current-indentation) 2))))
168
- (if (< cur-indent 0) ; We can't indent past the left margin
169
- (setq cur-indent 0)))
181
+ (include-start
182
+ (setq cur-indent include-start))
183
+ ((and (looking-at "^\\s-*}\\s-*$") block-indent)
184
+ ;; This line contains only a closing brace and we're at the inner
185
+ ;; block, so we should indent it matching the indentation of the
186
+ ;; opening brace of the block.
187
+ (setq cur-indent block-indent))
170
188
  (t
171
189
  ;; Otherwise, we did not start on a block-ending-only line.
172
190
  (save-excursion
@@ -174,123 +192,167 @@ that array, else return nil."
174
192
  (while not-indented
175
193
  (forward-line -1)
176
194
  (cond
195
+ ;; Comment lines are ignored unless we're at the start of the
196
+ ;; buffer.
177
197
  ((puppet-comment-line-p)
178
198
  (if (bobp)
179
- (setq not-indented nil)
180
- ;; else ignore the line and continue iterating backwards
181
- ))
182
- ((looking-at "^.*}") ; indent at the level of the END_ token
199
+ (setq not-indented nil)))
200
+
201
+ ;; Brace or paren on a line by itself will already be indented to
202
+ ;; the right level, so we can cheat and stop there.
203
+ ((looking-at "^\\s-*[\)}]\\s-*")
183
204
  (setq cur-indent (current-indentation))
184
205
  (setq not-indented nil))
185
- ((looking-at "^.*{") ; indent an extra level
186
- (setq cur-indent (+ (current-indentation) 2))
187
- (setq not-indented nil))
188
- ((bobp)
189
- (setq not-indented nil))
190
- )))))
191
- (if cur-indent
192
- (indent-line-to cur-indent)
193
- (indent-line-to 0)))))
194
206
 
207
+ ;; Brace or paren not on a line by itself will be indented one
208
+ ;; level too much, but don't catch cases where the block is
209
+ ;; started and closed on the same line.
210
+ ((looking-at "^[^\n\({]*[\)}]\\s-*$")
211
+ (setq cur-indent (- (current-indentation) puppet-indent-level))
212
+ (setq not-indented nil))
195
213
 
196
- ;;;###autoload
197
- (defun puppet-mode ()
198
- "Major mode for editing puppet manifests.
214
+ ;; Indent by one level more than the start of our block. We lose
215
+ ;; if there is more than one block opened and closed on the same
216
+ ;; line but it's still unbalanced; hopefully people don't do that.
217
+ ((looking-at "^.*{[^\n}]*$")
218
+ (setq cur-indent (+ (current-indentation) puppet-indent-level))
219
+ (setq not-indented nil))
199
220
 
200
- The variable puppet-indent-level controls the amount of indentation.
201
- \\{puppet-mode-map}"
202
- (interactive)
203
- (kill-all-local-variables)
204
- (use-local-map puppet-mode-map)
205
- (setq mode-name "Puppet")
206
- (setq major-mode 'puppet-mode)
207
- (puppet-mode-variables)
208
- ;; Register our indentation function
209
- (set (make-local-variable 'indent-line-function) 'puppet-indent-line)
210
- (run-hooks 'puppet-mode-hook))
221
+ ;; Indent by one level if the line ends with an open paren.
222
+ ((looking-at "^.*\(\\s-*$")
223
+ (setq cur-indent (+ (current-indentation) puppet-indent-level))
224
+ (setq not-indented nil))
211
225
 
226
+ ;; Semicolon ends a block for a resource when multiple resources
227
+ ;; are defined in the same block, but try not to get the case of
228
+ ;; a complete resource on a single line wrong.
229
+ ((looking-at "^\\([^'\":\n]\\|\"[^\n\"]*\"\\|'[^\n']'\\)**;\\s-*$")
230
+ (setq cur-indent (- (current-indentation) puppet-indent-level))
231
+ (setq not-indented nil))
212
232
 
233
+ ;; Indent an extra level after : since it introduces a resource.
234
+ ((looking-at "^.*:\\s-*$")
235
+ (setq cur-indent (+ (current-indentation) puppet-indent-level))
236
+ (setq not-indented nil))
213
237
 
214
- (cond
215
- ((featurep 'font-lock)
216
- (or (boundp 'font-lock-variable-name-face)
217
- (setq font-lock-variable-name-face font-lock-type-face))
238
+ ;; Start of buffer.
239
+ ((bobp)
240
+ (setq not-indented nil)))))
218
241
 
219
- (setq puppet-font-lock-syntactic-keywords
220
- '(
221
- ("\\(^\\|[=(,~?:;]\\|\\(^\\|\\s \\)\\(if\\|elsif\\|unless\\|while\\|until\\|when\\|and\\|or\\|&&\\|||\\)\\|g?sub!?\\|scan\\|split!?\\)\\s *\\(/\\)[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*\\(/\\)"
222
- (4 (7 . ?/))
223
- (6 (7 . ?/)))
224
- ("^\\(=\\)begin\\(\\s \\|$\\)" 1 (7 . nil))
225
- ("^\\(=\\)end\\(\\s \\|$\\)" 1 (7 . nil))))
242
+ ;; If this line contains only a closing paren, we should lose one
243
+ ;; level of indentation.
244
+ (if (looking-at "^\\s-*\)\\s-*$")
245
+ (setq cur-indent (- cur-indent puppet-indent-level)))))
226
246
 
227
- (cond ((featurep 'xemacs)
228
- (put 'puppet-mode 'font-lock-defaults
229
- '((puppet-font-lock-keywords)
230
- nil nil nil
231
- beginning-of-line
232
- (font-lock-syntactic-keywords
233
- . puppet-font-lock-syntactic-keywords))))
234
- (t
235
- (add-hook 'puppet-mode-hook
236
- '(lambda ()
237
- (make-local-variable 'font-lock-defaults)
238
- (make-local-variable 'font-lock-keywords)
239
- (make-local-variable 'font-lock-syntax-table)
240
- (make-local-variable 'font-lock-syntactic-keywords)
241
- (setq font-lock-defaults '((puppet-font-lock-keywords) nil nil))
242
- (setq font-lock-keywords puppet-font-lock-keywords)
243
- (setq font-lock-syntax-table puppet-font-lock-syntax-table)
244
- (setq font-lock-syntactic-keywords puppet-font-lock-syntactic-keywords)))))
247
+ ;; We've figured out the indentation, so do it.
248
+ (if (and cur-indent (> cur-indent 0))
249
+ (indent-line-to cur-indent)
250
+ (indent-line-to 0)))))
245
251
 
246
- (defvar puppet-font-lock-syntax-table
247
- (let* ((tbl (copy-syntax-table puppet-mode-syntax-table)))
248
- (modify-syntax-entry ?_ "w" tbl)
249
- tbl))
252
+ (defvar puppet-font-lock-syntax-table
253
+ (let* ((tbl (copy-syntax-table puppet-mode-syntax-table)))
254
+ (modify-syntax-entry ?_ "w" tbl)
255
+ tbl))
250
256
 
251
- (defvar puppet-font-lock-keywords
252
- (list
253
- ;; defines
254
- '("^\\s *\\(define\\|node\\|class\\)\\s +\\([^( \t\n]+\\)"
255
- 2 font-lock-function-name-face)
256
- ;; include
257
- '("^\\s *include\\s +\\([^( \t\n]+\\)"
258
- 1 font-lock-reference-face)
259
- ;; keywords
260
- (cons (concat
261
- "\\b\\(\\("
262
- (mapconcat
263
- 'identity
264
- '("case"
265
- "class"
266
- "default"
267
- "define"
268
- "false"
269
- "import"
270
- "include"
271
- "inherits"
272
- "node"
273
- "true"
274
- )
275
- "\\|")
276
- "\\)\\>\\)")
277
- 1)
257
+ (defvar puppet-font-lock-keywords
258
+ (list
259
+ ;; defines, classes, and nodes
260
+ '("^\\s *\\(class\\|define\\|node\\)\\s +\\([^( \t\n]+\\)"
261
+ 2 font-lock-function-name-face)
262
+ ;; inheritence
263
+ '("\\s +inherits\\s +\\([^( \t\n]+\\)"
264
+ 1 font-lock-function-name-face)
265
+ ;; include
266
+ '("\\(^\\|\\s +\\)include\\s +\\(\\([a-zA-Z0-9:_-]+\\(,[ \t\n]*\\)?\\)+\\)"
267
+ 2 font-lock-reference-face)
268
+ ;; keywords
269
+ (cons (concat
270
+ "\\b\\(\\("
271
+ (mapconcat
272
+ 'identity
273
+ '("alert"
274
+ "case"
275
+ "class"
276
+ "crit"
277
+ "debug"
278
+ "default"
279
+ "define"
280
+ "defined"
281
+ "else"
282
+ "emerg"
283
+ "err"
284
+ "fail"
285
+ "false"
286
+ "file"
287
+ "filebucket"
288
+ "generate"
289
+ "if"
290
+ "import"
291
+ "include"
292
+ "info"
293
+ "inherits"
294
+ "node"
295
+ "notice"
296
+ "realize"
297
+ "search"
298
+ "tag"
299
+ "tagged"
300
+ "template"
301
+ "true"
302
+ "warning"
303
+ )
304
+ "\\|")
305
+ "\\)\\>\\)")
306
+ 1)
278
307
  ;; variables
279
- '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\>"
308
+ '("\\(^\\|[^_:.@$]\\)\\b\\(true\\|false\\)\\>"
280
309
  2 font-lock-variable-name-face)
281
- ;; variables
282
310
  '("\\(\\$\\([^a-zA-Z0-9 \n]\\|[0-9]\\)\\)\\W"
283
311
  1 font-lock-variable-name-face)
284
- '("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+"
312
+ '("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\|:\\)+"
285
313
  0 font-lock-variable-name-face)
286
314
  ;; usage of types
287
- '("^\\s +\\([a-zA-Z-]+\\)\\s +{"
315
+ '("^\\s *\\([a-zA-Z_-]+\\)\\s +{"
316
+ 1 font-lock-type-face)
317
+ ;; overrides and type references
318
+ '("\\s +\\([A-Z][a-zA-Z_:-]*\\)\\["
288
319
  1 font-lock-type-face)
289
320
  ;; general delimited string
290
321
  '("\\(^\\|[[ \t\n<+(,=]\\)\\(%[xrqQwW]?\\([^<[{(a-zA-Z0-9 \n]\\)[^\n\\\\]*\\(\\\\.[^\n\\\\]*\\)*\\(\\3\\)\\)"
291
- (2 font-lock-string-face))
292
- )
293
- "*Additional expressions to highlight in puppet mode."))
294
- )
322
+ (2 font-lock-string-face)))
323
+ "*Additional expressions to highlight in puppet mode.")
324
+
325
+ ;;;###autoload
326
+ (defun puppet-mode ()
327
+ "Major mode for editing puppet manifests.
328
+
329
+ The variable puppet-indent-level controls the amount of indentation.
330
+ \\{puppet-mode-map}"
331
+ (interactive)
332
+ (kill-all-local-variables)
333
+ (use-local-map puppet-mode-map)
334
+ (setq mode-name "Puppet")
335
+ (setq major-mode 'puppet-mode)
336
+ (set-syntax-table puppet-mode-syntax-table)
337
+ (set (make-local-variable 'local-abbrev-table) puppet-mode-abbrev-table)
338
+ (set (make-local-variable 'comment-start) "# ")
339
+ (set (make-local-variable 'comment-start-skip) "#+ *")
340
+ (set (make-local-variable 'comment-end) "")
341
+ (set (make-local-variable 'comment-column) puppet-comment-column)
342
+ (set (make-local-variable 'indent-line-function) 'puppet-indent-line)
343
+ (set (make-local-variable 'indent-tabs-mode) puppet-indent-tabs-mode)
344
+ (set (make-local-variable 'require-final-newline) t)
345
+ (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
346
+ (set (make-local-variable 'paragraph-start) "\f\\|[ ]*$")
347
+ (set (make-local-variable 'paragraph-separate) "[ \f]*$")
348
+ (or (boundp 'font-lock-variable-name-face)
349
+ (setq font-lock-variable-name-face font-lock-type-face))
350
+ (set (make-local-variable 'font-lock-keywords) puppet-font-lock-keywords)
351
+ (set (make-local-variable 'font-lock-multiline) t)
352
+ (set (make-local-variable 'font-lock-defaults)
353
+ '((puppet-font-lock-keywords) nil nil))
354
+ (set (make-local-variable 'font-lock-syntax-table)
355
+ puppet-font-lock-syntax-table)
356
+ (run-hooks 'puppet-mode-hook))
295
357
 
296
358
  (provide 'puppet-mode)