origen 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. checksums.yaml +4 -4
  2. data/bin/ctags +0 -0
  3. data/bin/origen +165 -1
  4. data/bin/rgen +2 -0
  5. data/config/application.rb +141 -0
  6. data/config/commands.rb +72 -0
  7. data/config/development.rb +7 -0
  8. data/config/environment.rb +0 -0
  9. data/config/rgen.policy +7 -0
  10. data/config/rubocop/easy.yml +620 -0
  11. data/config/rubocop/easy_disabled.yml +271 -0
  12. data/config/rubocop/easy_enabled.yml +731 -0
  13. data/config/rubocop/strict.yml +620 -0
  14. data/config/rubocop/strict_disabled.yml +247 -0
  15. data/config/rubocop/strict_enabled.yml +755 -0
  16. data/config/users.rb +20 -0
  17. data/config/version.rb +1 -1
  18. data/helpers/url.rb +68 -0
  19. data/lib/c99/doc_interface.rb +56 -0
  20. data/lib/c99/j750_interface.rb +85 -0
  21. data/lib/c99/nvm.rb +89 -0
  22. data/lib/c99/target/mock2.rb +1 -0
  23. data/lib/c99/target/subdir/mock3.rb +1 -0
  24. data/lib/option_parser/optparse.rb +12 -0
  25. data/lib/origen/acronyms.rb +60 -0
  26. data/lib/origen/application/command_dispatcher.rb +12 -0
  27. data/lib/origen/application/configuration.rb +206 -0
  28. data/lib/origen/application/configuration_manager.rb +78 -0
  29. data/lib/origen/application/deployer.rb +367 -0
  30. data/lib/origen/application/environment.rb +186 -0
  31. data/lib/origen/application/lsf.rb +145 -0
  32. data/lib/origen/application/lsf_manager.rb +657 -0
  33. data/lib/origen/application/plugins_manager.rb +280 -0
  34. data/lib/origen/application/release.rb +359 -0
  35. data/lib/origen/application/runner.rb +246 -0
  36. data/lib/origen/application/statistics.rb +191 -0
  37. data/lib/origen/application/target.rb +374 -0
  38. data/lib/origen/application/version_tracker.rb +59 -0
  39. data/lib/origen/application/workspace_manager.rb +151 -0
  40. data/lib/origen/application.rb +746 -0
  41. data/lib/origen/bugs/bug.rb +36 -0
  42. data/lib/origen/bugs.rb +45 -0
  43. data/lib/origen/callbacks.rb +35 -0
  44. data/lib/origen/chip_mode.rb +118 -0
  45. data/lib/origen/chip_package.rb +461 -0
  46. data/lib/origen/client.rb +87 -0
  47. data/lib/origen/code_generators/actions.rb +258 -0
  48. data/lib/origen/code_generators/base.rb +57 -0
  49. data/lib/origen/code_generators/bundler.rb +17 -0
  50. data/lib/origen/code_generators/gem_setup.rb +49 -0
  51. data/lib/origen/code_generators/rake.rb +13 -0
  52. data/lib/origen/code_generators/rspec.rb +12 -0
  53. data/lib/origen/code_generators/semver.rb +39 -0
  54. data/lib/origen/code_generators/timever.rb +37 -0
  55. data/lib/origen/code_generators.rb +111 -0
  56. data/lib/origen/commands/add.rb +12 -0
  57. data/lib/origen/commands/compile.rb +62 -0
  58. data/lib/origen/commands/ctags.rb +9 -0
  59. data/lib/origen/commands/dispatch.rb +22 -0
  60. data/lib/origen/commands/environment.rb +11 -0
  61. data/lib/origen/commands/fetch.rb +63 -0
  62. data/lib/origen/commands/generate.rb +130 -0
  63. data/lib/origen/commands/interactive.rb +73 -0
  64. data/lib/origen/commands/lint.rb +82 -0
  65. data/lib/origen/commands/lsf.rb +93 -0
  66. data/lib/origen/commands/merge.rb +55 -0
  67. data/lib/origen/commands/modifications.rb +12 -0
  68. data/lib/origen/commands/new.rb +113 -0
  69. data/lib/origen/commands/plugin.rb +105 -0
  70. data/lib/origen/commands/program.rb +70 -0
  71. data/lib/origen/commands/rc.rb +442 -0
  72. data/lib/origen/commands/save.rb +56 -0
  73. data/lib/origen/commands/target.rb +27 -0
  74. data/lib/origen/commands/time.rb +127 -0
  75. data/lib/origen/commands/version.rb +17 -0
  76. data/lib/origen/commands/web.rb +221 -0
  77. data/lib/origen/commands.rb +272 -0
  78. data/lib/origen/commands_global.rb +76 -0
  79. data/lib/origen/controller.rb +94 -0
  80. data/lib/origen/core_ext/array.rb +23 -0
  81. data/lib/origen/core_ext/bignum.rb +36 -0
  82. data/lib/origen/core_ext/enumerable.rb +76 -0
  83. data/lib/origen/core_ext/fixnum.rb +46 -0
  84. data/lib/origen/core_ext/hash.rb +52 -0
  85. data/lib/origen/core_ext/module.rb +14 -0
  86. data/lib/origen/core_ext/numeric.rb +126 -0
  87. data/lib/origen/core_ext/object.rb +13 -0
  88. data/lib/origen/core_ext/range.rb +7 -0
  89. data/lib/origen/core_ext/string.rb +124 -0
  90. data/lib/origen/core_ext.rb +10 -0
  91. data/lib/origen/database/key_value_store.rb +111 -0
  92. data/lib/origen/database/key_value_stores.rb +108 -0
  93. data/lib/origen/database.rb +6 -0
  94. data/lib/origen/encodings.rb +102 -0
  95. data/lib/origen/features/feature.rb +22 -0
  96. data/lib/origen/features.rb +104 -0
  97. data/lib/origen/file_handler.rb +429 -0
  98. data/lib/origen/generator/comparator.rb +56 -0
  99. data/lib/origen/generator/compiler.rb +277 -0
  100. data/lib/origen/generator/flow.rb +49 -0
  101. data/lib/origen/generator/job.rb +131 -0
  102. data/lib/origen/generator/pattern.rb +356 -0
  103. data/lib/origen/generator/pattern_finder.rb +155 -0
  104. data/lib/origen/generator/pattern_iterator.rb +55 -0
  105. data/lib/origen/generator/renderer.rb +113 -0
  106. data/lib/origen/generator/resources.rb +40 -0
  107. data/lib/origen/generator/stage.rb +89 -0
  108. data/lib/origen/generator.rb +85 -0
  109. data/lib/origen/global_methods.rb +205 -0
  110. data/lib/origen/import_manager.rb +596 -0
  111. data/lib/origen/location/base.rb +116 -0
  112. data/lib/origen/location/map.rb +83 -0
  113. data/lib/origen/location.rb +6 -0
  114. data/lib/origen/log.rb +217 -0
  115. data/lib/origen/logger_methods.rb +56 -0
  116. data/lib/origen/mode.rb +61 -0
  117. data/lib/origen/model.rb +267 -0
  118. data/lib/origen/model_initializer.rb +45 -0
  119. data/lib/origen/nvm/block_array.rb +72 -0
  120. data/lib/origen/nvm.rb +6 -0
  121. data/lib/origen/parameters/live.rb +22 -0
  122. data/lib/origen/parameters/missing.rb +28 -0
  123. data/lib/origen/parameters/set.rb +144 -0
  124. data/lib/origen/parameters.rb +107 -0
  125. data/lib/origen/pdm.rb +218 -0
  126. data/lib/origen/pins/function_proxy.rb +36 -0
  127. data/lib/origen/pins/ground_pin.rb +6 -0
  128. data/lib/origen/pins/pin.rb +860 -0
  129. data/lib/origen/pins/pin_bank.rb +349 -0
  130. data/lib/origen/pins/pin_clock.rb +124 -0
  131. data/lib/origen/pins/pin_collection.rb +492 -0
  132. data/lib/origen/pins/pin_common.rb +206 -0
  133. data/lib/origen/pins/port.rb +268 -0
  134. data/lib/origen/pins/power_pin.rb +30 -0
  135. data/lib/origen/pins.rb +696 -0
  136. data/lib/origen/registers/bit.rb +562 -0
  137. data/lib/origen/registers/bit_collection.rb +787 -0
  138. data/lib/origen/registers/container.rb +288 -0
  139. data/lib/origen/registers/domain.rb +16 -0
  140. data/lib/origen/registers/reg.rb +1406 -0
  141. data/lib/origen/registers/reg_collection.rb +24 -0
  142. data/lib/origen/registers.rb +652 -0
  143. data/lib/origen/regression_manager.rb +251 -0
  144. data/lib/origen/remote_manager.rb +340 -0
  145. data/lib/origen/revision_control/base.rb +257 -0
  146. data/lib/origen/revision_control/design_sync.rb +276 -0
  147. data/lib/origen/revision_control/git.rb +243 -0
  148. data/lib/origen/revision_control/subversion.rb +6 -0
  149. data/lib/origen/revision_control.rb +44 -0
  150. data/lib/origen/ruby_version_check.rb +131 -0
  151. data/lib/origen/site_config.rb +61 -0
  152. data/lib/origen/specs/checkers.rb +103 -0
  153. data/lib/origen/specs/creation_info.rb +17 -0
  154. data/lib/origen/specs/doc_resource.rb +91 -0
  155. data/lib/origen/specs/exhibit.rb +17 -0
  156. data/lib/origen/specs/mode_select.rb +16 -0
  157. data/lib/origen/specs/note.rb +17 -0
  158. data/lib/origen/specs/override.rb +21 -0
  159. data/lib/origen/specs/power_supply.rb +13 -0
  160. data/lib/origen/specs/spec.rb +226 -0
  161. data/lib/origen/specs/version_history.rb +14 -0
  162. data/lib/origen/specs.rb +552 -0
  163. data/lib/origen/sub_blocks.rb +298 -0
  164. data/lib/origen/tester/api.rb +277 -0
  165. data/lib/origen/tester/bdm/bdm.rb +25 -0
  166. data/lib/origen/tester/command_based_tester.rb +46 -0
  167. data/lib/origen/tester/doc/doc.rb +226 -0
  168. data/lib/origen/tester/doc/generator/flow.rb +71 -0
  169. data/lib/origen/tester/doc/generator/flow_line.rb +203 -0
  170. data/lib/origen/tester/doc/generator/test.rb +68 -0
  171. data/lib/origen/tester/doc/generator/test_group.rb +66 -0
  172. data/lib/origen/tester/doc/generator/tests.rb +47 -0
  173. data/lib/origen/tester/doc/generator.rb +126 -0
  174. data/lib/origen/tester/doc/model.rb +162 -0
  175. data/lib/origen/tester/generator/flow_control_api.rb +606 -0
  176. data/lib/origen/tester/generator/identity_map.rb +25 -0
  177. data/lib/origen/tester/generator/placeholder.rb +13 -0
  178. data/lib/origen/tester/generator/test_numberer.rb +25 -0
  179. data/lib/origen/tester/generator.rb +271 -0
  180. data/lib/origen/tester/interface.rb +154 -0
  181. data/lib/origen/tester/j750/files.rb +45 -0
  182. data/lib/origen/tester/j750/generator/flow.rb +123 -0
  183. data/lib/origen/tester/j750/generator/flow_line.rb +288 -0
  184. data/lib/origen/tester/j750/generator/patgroup.rb +111 -0
  185. data/lib/origen/tester/j750/generator/patgroups.rb +41 -0
  186. data/lib/origen/tester/j750/generator/patset.rb +111 -0
  187. data/lib/origen/tester/j750/generator/patsets.rb +41 -0
  188. data/lib/origen/tester/j750/generator/templates/flow.txt.erb +9 -0
  189. data/lib/origen/tester/j750/generator/templates/instances.txt.erb +16 -0
  190. data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +8 -0
  191. data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +10 -0
  192. data/lib/origen/tester/j750/generator/test_instance.rb +846 -0
  193. data/lib/origen/tester/j750/generator/test_instance_group.rb +60 -0
  194. data/lib/origen/tester/j750/generator/test_instances.rb +182 -0
  195. data/lib/origen/tester/j750/generator.rb +203 -0
  196. data/lib/origen/tester/j750/j750.rb +845 -0
  197. data/lib/origen/tester/j750/j750_hpt.rb +35 -0
  198. data/lib/origen/tester/j750/parser/ac_spec.rb +11 -0
  199. data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
  200. data/lib/origen/tester/j750/parser/dc_spec.rb +36 -0
  201. data/lib/origen/tester/j750/parser/dc_specs.rb +50 -0
  202. data/lib/origen/tester/j750/parser/descriptions.rb +340 -0
  203. data/lib/origen/tester/j750/parser/flow.rb +111 -0
  204. data/lib/origen/tester/j750/parser/flow_line.rb +207 -0
  205. data/lib/origen/tester/j750/parser/flows.rb +23 -0
  206. data/lib/origen/tester/j750/parser/pattern_set.rb +94 -0
  207. data/lib/origen/tester/j750/parser/pattern_sets.rb +33 -0
  208. data/lib/origen/tester/j750/parser/test_instance.rb +322 -0
  209. data/lib/origen/tester/j750/parser/test_instances.rb +26 -0
  210. data/lib/origen/tester/j750/parser/timeset.rb +15 -0
  211. data/lib/origen/tester/j750/parser/timesets.rb +0 -0
  212. data/lib/origen/tester/j750/parser.rb +104 -0
  213. data/lib/origen/tester/jlink/jlink.rb +33 -0
  214. data/lib/origen/tester/parser/description_lookup.rb +64 -0
  215. data/lib/origen/tester/parser/searchable_array.rb +32 -0
  216. data/lib/origen/tester/parser/searchable_hash.rb +32 -0
  217. data/lib/origen/tester/parser.rb +24 -0
  218. data/lib/origen/tester/time.rb +338 -0
  219. data/lib/origen/tester/timing.rb +253 -0
  220. data/lib/origen/tester/ultraflex/files.rb +45 -0
  221. data/lib/origen/tester/ultraflex/generator/flow.rb +119 -0
  222. data/lib/origen/tester/ultraflex/generator/flow_line.rb +269 -0
  223. data/lib/origen/tester/ultraflex/generator/patgroup.rb +111 -0
  224. data/lib/origen/tester/ultraflex/generator/patgroups.rb +41 -0
  225. data/lib/origen/tester/ultraflex/generator/patset.rb +111 -0
  226. data/lib/origen/tester/ultraflex/generator/patsets.rb +41 -0
  227. data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +9 -0
  228. data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +16 -0
  229. data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +8 -0
  230. data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +10 -0
  231. data/lib/origen/tester/ultraflex/generator/test_instance.rb +622 -0
  232. data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +60 -0
  233. data/lib/origen/tester/ultraflex/generator/test_instances.rb +174 -0
  234. data/lib/origen/tester/ultraflex/generator.rb +200 -0
  235. data/lib/origen/tester/ultraflex/parser/ac_spec.rb +11 -0
  236. data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
  237. data/lib/origen/tester/ultraflex/parser/dc_spec.rb +36 -0
  238. data/lib/origen/tester/ultraflex/parser/dc_specs.rb +50 -0
  239. data/lib/origen/tester/ultraflex/parser/descriptions.rb +342 -0
  240. data/lib/origen/tester/ultraflex/parser/flow.rb +111 -0
  241. data/lib/origen/tester/ultraflex/parser/flow_line.rb +207 -0
  242. data/lib/origen/tester/ultraflex/parser/flows.rb +23 -0
  243. data/lib/origen/tester/ultraflex/parser/pattern_set.rb +94 -0
  244. data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +33 -0
  245. data/lib/origen/tester/ultraflex/parser/test_instance.rb +262 -0
  246. data/lib/origen/tester/ultraflex/parser/test_instances.rb +26 -0
  247. data/lib/origen/tester/ultraflex/parser/timeset.rb +15 -0
  248. data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
  249. data/lib/origen/tester/ultraflex/parser.rb +104 -0
  250. data/lib/origen/tester/ultraflex/ultraflex.rb +759 -0
  251. data/lib/origen/tester/v93k/generator/flow.rb +63 -0
  252. data/lib/origen/tester/v93k/generator/flow_node/print.rb +10 -0
  253. data/lib/origen/tester/v93k/generator/flow_node.rb +17 -0
  254. data/lib/origen/tester/v93k/generator/pattern.rb +16 -0
  255. data/lib/origen/tester/v93k/generator/pattern_master.rb +54 -0
  256. data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +6 -0
  257. data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +11 -0
  258. data/lib/origen/tester/v93k/generator/templates/template.flow.erb +121 -0
  259. data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +9 -0
  260. data/lib/origen/tester/v93k/generator/test_function.rb +103 -0
  261. data/lib/origen/tester/v93k/generator/test_functions.rb +79 -0
  262. data/lib/origen/tester/v93k/generator/test_method.rb +46 -0
  263. data/lib/origen/tester/v93k/generator/test_methods.rb +75 -0
  264. data/lib/origen/tester/v93k/generator/test_suite.rb +54 -0
  265. data/lib/origen/tester/v93k/generator/test_suites.rb +65 -0
  266. data/lib/origen/tester/v93k/generator.rb +80 -0
  267. data/lib/origen/tester/v93k/v93k.rb +420 -0
  268. data/lib/origen/tester/vector.rb +86 -0
  269. data/lib/origen/tester/vector_generator.rb +633 -0
  270. data/lib/origen/tester/vector_pipeline.rb +150 -0
  271. data/lib/origen/tester.rb +56 -0
  272. data/lib/origen/top_level.rb +134 -0
  273. data/lib/origen/users/ldap.rb +65 -0
  274. data/lib/origen/users/user.rb +149 -0
  275. data/lib/origen/users.rb +30 -0
  276. data/lib/origen/utility/block_args.rb +93 -0
  277. data/lib/origen/utility/csv_data.rb +110 -0
  278. data/lib/origen/utility/design_sync.rb +494 -0
  279. data/lib/origen/utility/diff.rb +158 -0
  280. data/lib/origen/utility/input_capture.rb +121 -0
  281. data/lib/origen/utility/mailer.rb +143 -0
  282. data/lib/origen/utility/s_record.rb +205 -0
  283. data/lib/origen/utility/time_and_date.rb +30 -0
  284. data/lib/origen/utility.rb +12 -0
  285. data/lib/origen/version_checker.rb +117 -0
  286. data/lib/origen/version_string.rb +356 -0
  287. data/lib/origen.rb +648 -0
  288. data/lib/tasks/gem.rake +27 -22
  289. data/origen_site_config.yml +36 -0
  290. data/source_setup +17 -0
  291. data/spec/format/rgen_formatter.rb +14 -0
  292. data/templates/api_doc/README.txt.erb +24 -0
  293. data/templates/code_generators/gemfile_app.rb +4 -0
  294. data/templates/code_generators/gemfile_plugin.rb +6 -0
  295. data/templates/code_generators/gemspec.rb +33 -0
  296. data/templates/code_generators/rakefile.rb +10 -0
  297. data/templates/code_generators/spec_helper.rb +49 -0
  298. data/templates/code_generators/version.rb +8 -0
  299. data/templates/code_generators/version_time.rb +3 -0
  300. data/templates/git/gitignore.erb +33 -0
  301. data/templates/j750/_vt_flow.txt.erb +8 -0
  302. data/templates/j750/_vt_instances.txt.erb +4 -0
  303. data/templates/j750/program_sheet.txt.erb +9 -0
  304. data/templates/nanoc/Rules +74 -0
  305. data/templates/nanoc/config.yaml +77 -0
  306. data/templates/nanoc/content/favicon.ico +0 -0
  307. data/templates/nanoc/layouts/bootstrap.html.erb +63 -0
  308. data/templates/nanoc/layouts/bootstrap3.html.erb +71 -0
  309. data/templates/nanoc/layouts/freescale.html.erb +79 -0
  310. data/templates/nanoc/lib/bootstrap_filter.rb +49 -0
  311. data/templates/nanoc/lib/codeblocks_filter.rb +41 -0
  312. data/templates/nanoc/lib/default.rb +2 -0
  313. data/templates/nanoc/lib/gzip_filter.rb +16 -0
  314. data/templates/nanoc/lib/haml_code_filter.rb +41 -0
  315. data/templates/nanoc/lib/helpers.rb +1 -0
  316. data/templates/nanoc/lib/search_filter.rb +62 -0
  317. data/templates/nanoc_dynamic/content/search.js.erb +92 -0
  318. data/templates/shared/web/_logo.html +10 -0
  319. data/templates/test/_inline_sub.txt.erb +2 -0
  320. data/templates/test/environment.txt.erb +1 -0
  321. data/templates/test/inline.txt.erb +11 -0
  322. data/templates/test/inspections.txt.erb +19 -0
  323. data/templates/test/set1/_sub1.txt.erb +12 -0
  324. data/templates/test/set1/_sub4.txt.erb +1 -0
  325. data/templates/test/set1/_sub5.txt.erb +1 -0
  326. data/templates/test/set1/main.txt.erb +53 -0
  327. data/templates/test/set1/sub_dir/_sub2.txt.erb +20 -0
  328. data/templates/test/set1/sub_dir/_sub3.txt.erb +12 -0
  329. data/templates/test/set1/sub_dir/main2.txt.erb +4 -0
  330. data/templates/test/set2/template_with_no_erb_1.txt +9 -0
  331. data/templates/test/set2/template_with_no_erb_2.txt +9 -0
  332. data/templates/test/set3/_layout.html.erb +4 -0
  333. data/templates/test/set3/content.html.erb +6 -0
  334. data/templates/time/filter.rb.erb +15 -0
  335. data/templates/time/rules.rb.erb +45 -0
  336. metadata +639 -5
@@ -0,0 +1,280 @@
1
+ module Origen
2
+ class Application
3
+ class PluginsManager
4
+ # Returns the temporary plugin instance if set, otherwise nil
5
+ attr_reader :temporary
6
+
7
+ # Returns the current plugin instance, this will be the temporary plugin if set, if
8
+ # not then the current default plugin if set, otherwise nil
9
+ def current
10
+ if @disabled || @set_to_nil
11
+ nil
12
+ else
13
+ temporary || default
14
+ end
15
+ end
16
+ alias_method :instance, :current
17
+ alias_method :current_plugin_instance, :current
18
+
19
+ def disable
20
+ @disabled = true
21
+ end
22
+
23
+ def enable
24
+ @disabled = false
25
+ end
26
+
27
+ # Returns the current plugin name, equivalent to calling current.name
28
+ def name
29
+ current ? current.name : nil
30
+ end
31
+
32
+ # Sets the given plugin as the temporary current plugin, this will last until
33
+ # changed or the end of the current Origen thread
34
+ def temporary=(plugin_name)
35
+ if !plugin_name || plugin_name.to_sym == :none
36
+ @set_to_nil = true
37
+ @temporary = nil
38
+ else
39
+ @set_to_nil = false
40
+ @temporary = find_plugin!(plugin_name)
41
+ end
42
+ end
43
+
44
+ # Same as temporary= except it will be remembered in the next Origen thread.
45
+ # Setting this will also clear any temporary assignment that is currently in
46
+ # effect.
47
+ def default=(plugin_name)
48
+ self.temporary = nil
49
+ if !plugin_name || plugin_name.to_sym == :none
50
+ @default = nil
51
+ else
52
+ @default = find_plugin!(plugin_name)
53
+ Origen.app.session.origen_core[:default_plugin] = @default.name
54
+ @default
55
+ end
56
+ end
57
+
58
+ # Returns the current plugin instance currently set as the default plugin,
59
+ # otherwise nil
60
+ def default
61
+ return @default if @default
62
+ if name = Origen.app.session.origen_core[:default_plugin]
63
+ begin
64
+ @default = find_plugin!(name)
65
+ rescue
66
+ # Hit here if what has been set to the default plugin has since been
67
+ # removed from the application
68
+ self.default = :none
69
+ nil
70
+ end
71
+ end
72
+ end
73
+
74
+ # Checks the given plugin name with the list of installed plugins
75
+ # and returns true if found else returns false
76
+ def valid_plugin_name?(plugin_name)
77
+ Origen.import_manager.names.include?(plugin_name)
78
+ end
79
+
80
+ # Lists all the plugins available on server
81
+ def list
82
+ puts 'The following plugins are available to add to your application:'
83
+ puts ''
84
+ Origen.client.plugins.group_by { |p| p[:category] }.sort_by { |k, _v| k }.each do |category, plugins|
85
+ puts category.upcase
86
+ puts '=' * category.length
87
+ plugins.sort_by { |p| p[:name] }.each do |plugin|
88
+ line = "#{plugin[:origen_name]}".ljust(25) + plugin[:name].strip.ljust(30)
89
+ if plugin[:latest_version_prod] || plugin[:latest_version_dev]
90
+ line += [plugin[:latest_version_prod] || plugin[:latest_version_dev]].compact.join(', ')
91
+ end
92
+ puts line
93
+ end
94
+ puts ''
95
+ end
96
+ end
97
+
98
+ # Updates the plugin to the supplied version
99
+ def update(plugin_name, version)
100
+ if plugin_name.class != Symbol
101
+ plugin_name = plugin_name.to_sym
102
+ end
103
+ if valid_plugin_name?(plugin_name)
104
+ update_config_file!(version: version,
105
+ plugin_name: plugin_name,
106
+ action: :update)
107
+ else
108
+ puts "Plugin #{plugin_name} not found in this app!"
109
+ end
110
+ end
111
+
112
+ # Adds the given plugin to the current app
113
+ def add(plugin_name, version, options)
114
+ if plugin_name.class != Symbol
115
+ plugin_name = plugin_name.to_sym
116
+ end
117
+ if !valid_plugin_name?(plugin_name)
118
+ plugin_data = read_plugin_info_from_server(plugin_name)
119
+ update_config_file!(vault: plugin_data[:vault],
120
+ version: version,
121
+ plugin_name: plugin_name,
122
+ action: :add,
123
+ dev_import: options[:dev_import])
124
+
125
+ puts 'Plugin added successfully!'
126
+ else
127
+ puts "Plugin #{plugin_name} is already included in this app!"
128
+ end
129
+ end
130
+
131
+ def remove(plugin_name)
132
+ if plugin_name.class != Symbol
133
+ plugin_name = plugin_name.to_sym
134
+ end
135
+ if valid_plugin_name?(plugin_name)
136
+ update_config_file!(plugin_name: plugin_name,
137
+ action: :remove)
138
+ if File.exist?("#{imports_dir}/#{plugin_name}")
139
+ FileUtils.rm_rf("#{imports_dir}/#{plugin_name}")
140
+ puts "Plugin '#{plugin_name}' removed successfully!"
141
+ end
142
+ else
143
+ puts "Plugin #{plugin_name} not found in this app!"
144
+ end
145
+ end
146
+
147
+ # Lists out the currently added plugins within the app on console
148
+ def list_added_plugins
149
+ puts 'The following plugins are included in this app:'
150
+ format = "%30s\t%30s\t%30s\n"
151
+ printf(format, 'Origen_Name', 'Name', 'Version')
152
+ printf(format, '---------', '----', '-------')
153
+
154
+ Origen.plugins.each do |plugin|
155
+ printf(format, plugin.name, plugin.config.name, plugin.version)
156
+ end
157
+ puts ''
158
+ end
159
+
160
+ # Describes the plugin
161
+ def describe(plugin_name)
162
+ if plugin_name
163
+ if plugin_name.class != Symbol
164
+ plugin_name = plugin_name.to_sym
165
+ end
166
+ description = nil
167
+ Origen.client.plugins.each do |plugin|
168
+ if plugin[:origen_name].to_sym == plugin_name
169
+ description = <<-EOT
170
+ Origen_Name: #{plugin[:origen_name]}
171
+ Actual Name: #{plugin[:name]}
172
+ Category: #{plugin[:category]}
173
+ Description: #{plugin[:description]}
174
+ EOT
175
+ break
176
+ end
177
+ end
178
+ if description.nil?
179
+ puts "Plugin #{plugin_name} not found or it does not include a description"
180
+ exit 1
181
+ end
182
+ description
183
+ else
184
+ puts 'No plugin name provided'
185
+ exit 1
186
+ end
187
+ end
188
+
189
+ private
190
+
191
+ def find_plugin!(name)
192
+ plugin = Origen.plugins.find { |p| p.name.to_sym == name.to_sym }
193
+ return plugin if plugin
194
+ puts ''
195
+ puts "No plugin named '#{name}' is included in this application!"
196
+ puts 'The plugins currently available are:'
197
+ Origen.plugins.each do |plugin|
198
+ puts " #{plugin.name}"
199
+ end
200
+ puts ''
201
+ fail 'Missing plugin error!'
202
+ end
203
+
204
+ def read_plugin_info_from_server(plugin_name)
205
+ plugin_data = nil
206
+ Origen.client.plugins.each do |plugin|
207
+ if plugin[:origen_name].to_sym == plugin_name
208
+ plugin_data = plugin
209
+ break
210
+ end
211
+ end
212
+
213
+ if plugin_data.nil?
214
+ fail "No plugin with name #{plugin_name} found!"
215
+ end
216
+ plugin_data
217
+ end
218
+
219
+ def update_config_file!(options = {})
220
+ file = "#{Origen.root}/config/application.rb"
221
+ lines = File.readlines(file)
222
+ if options[:action] == :add && !valid_plugin_name?(options[:plugin_name])
223
+ if options[:dev_import]
224
+ unless lines.find_index { |line| line =~ /config.imports_dev/ }
225
+ index = lines.find_index { |line| line =~ /config.vault =/ }
226
+ lines.insert(index + 1, ' config.imports_dev = [', '', ' ]')
227
+ end
228
+ else
229
+ unless lines.find_index { |line| line =~ /config.imports\s=\s/ }
230
+ index = lines.find_index { |line| line =~ /config.vault =/ }
231
+ lines.insert(index + 1, ' config.imports = [', '', ' ]')
232
+ end
233
+ end
234
+
235
+ File.open(file, 'w') do |f|
236
+ lines.each do |line|
237
+ f.puts line
238
+ if line =~ (options[:dev_import] ? (/config.imports_dev\s=\s/) : (/config.imports\s=\s/))
239
+ f.puts ' {'
240
+ f.puts " :vault => \"#{options[:vault]}\","
241
+ f.puts " :version => \"#{options[:version]}\","
242
+ if (options[:dev_import] ? (Origen.config.imports_dev) : (Origen.config.imports)).size == 0
243
+ f.puts ' }'
244
+ else
245
+ f.puts ' },'
246
+ end
247
+ end
248
+ end
249
+ end
250
+ elsif options[:action] == :remove && valid_plugin_name?(options[:plugin_name])
251
+ lines.slice!(plugin_index_range(lines, options))
252
+ File.open(file, 'w') { |f| lines.each { |line| f.puts line } }
253
+ elsif options[:action] == :update && valid_plugin_name?(options[:plugin_name])
254
+ range = plugin_index_range(lines, options)
255
+ version_index = lines[range].find_index { |line| line =~ /:version/ }
256
+ version_index += range.first
257
+ lines[version_index] = " :version => \"#{options[:version]}\","
258
+ File.open(file, 'w') { |f| lines.each { |line| f.puts line } }
259
+ end
260
+ load "#{Origen.root}/config/application.rb"
261
+ Origen.import_manager.required = false
262
+ Origen.import_manager.require!
263
+ end
264
+
265
+ def plugin_index_range(file_lines, options)
266
+ center = file_lines.find_index { |line| line =~ /:vault(.*)(#{options[:plugin_name]})/i }
267
+ if center
268
+ first = file_lines[0..center].length - 1 - file_lines[0..center].rindex.find_index { |line| line =~ /^(\s*)({)(\s*)$/ }
269
+ last = file_lines[center..(file_lines.size - 1)].find_index { |line| line =~ /^\s*}(,?)\s*$/ }
270
+ last = center + last
271
+ first..last
272
+ end
273
+ end
274
+
275
+ def imports_dir
276
+ Origen.application.workspace_manager.imports_directory
277
+ end
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,359 @@
1
+ require 'colored'
2
+ module Origen
3
+ class Application
4
+ # Responsible for co-ordinating application releases
5
+ class Release
6
+ include Users
7
+ include Utility::TimeAndDate
8
+ include Utility::InputCapture
9
+
10
+ def initialize
11
+ @mailer = Utility::Mailer.new
12
+ end
13
+
14
+ def self.valid_types
15
+ if Origen.config.semantically_version
16
+ if Origen.app.version.development?
17
+ [:development, :production]
18
+ else
19
+ [:development, :tiny, :minor, :major]
20
+ end
21
+ else
22
+ [:development, :production]
23
+ end
24
+ end
25
+
26
+ # Release a new application version
27
+ def run(options)
28
+ # Don't want plugin callbacks kicking in during the release process
29
+ Origen.current_plugin.disable
30
+ @options = options
31
+ if authorized?
32
+ Origen.import_manager.validate_production_status(true)
33
+ unless Origen.app.rc.local_modifications.empty?
34
+ puts <<-EOT
35
+ Your workspace has local modifications that are preventing the requested action
36
+ - run 'origen rc mods' to see them.
37
+ EOT
38
+ exit 1
39
+ end
40
+ get_release_type unless type
41
+ validate_branch
42
+ # For development tags always include the latest updates from everyone else,
43
+ # for production tag exactly what is in the user's workspace
44
+ if type == :development && !options[:no_fetch]
45
+ puts 'Fetching the latest version of all application files...'
46
+ Origen.app.rc.checkout(force: true)
47
+ end
48
+ Origen.app.listeners_for(:validate_release).each(&:validate_release)
49
+ lint_test
50
+ get_latest_version_files
51
+ base_version = Origen.app.version(refresh: true) # Read in the latest version
52
+ get_release_note unless note
53
+ new_version = get_or_confirm_version(type) # Don't mask this like the above!
54
+ write_version(new_version)
55
+ # Refresh the version in the current thread
56
+ Origen.app.version(refresh: true)
57
+ if Origen.app.version != new_version
58
+ fail "Sorry something has gone wrong trying to update the version counter to #{new_version}!"
59
+ end
60
+ Origen.app.version_tracker.add_version(Origen.app.version) if Origen.app.version.production?
61
+ write_history
62
+ Origen.app.listeners_for(:before_release_tag).each do |listener|
63
+ listener.before_release_tag(tag, note, type, selector, options)
64
+ end
65
+ puts "Tagging workspace, this could take a few minutes, don't interrupt..."
66
+ Origen.app.rc.checkin("#{version_file} #{history_file} Gemfile.lock", force: true, comment: 'Updated app version and history')
67
+ workspace_dirs.each do |wdir|
68
+ Origen.app.rc.tag tag
69
+ end
70
+ begin
71
+ Origen.client.release!
72
+ rescue
73
+ # Don't allow any server post errors to kill the release process
74
+ end
75
+ release_gem
76
+ Origen.app.listeners_for(:after_release_tag).each do |listener|
77
+ listener.after_release_tag(tag, note, type, selector, options)
78
+ end
79
+ # @mailer.send_release_notice(tag, note, type, selector) unless options[:silent]
80
+ Origen.app.listeners_for(:after_release_email).each do |listener|
81
+ listener.after_release_email(tag, note, type, selector, options)
82
+ end
83
+ puts "Successfully released version #{Origen.app.version}!"
84
+ end
85
+ end
86
+
87
+ protected
88
+
89
+ def validate_branch
90
+ if Origen.app.rc.git?
91
+ if Origen.app.config.rc_workflow == :gitflow
92
+ if type == :development && Origen.app.rc.current_branch == 'master'
93
+ puts "Development releases can only be made on the develop branch, your current branch is: #{Origen.app.rc.current_branch}"
94
+ exit 1
95
+ elsif type == :production && Origen.app.rc.current_branch != 'master'
96
+ puts "Production releases can only be made on the master branch, your current branch is: #{Origen.app.rc.current_branch}"
97
+ exit 1
98
+ end
99
+ else
100
+ unless Origen.app.rc.current_branch == 'master'
101
+ puts "With Git you can only release onto the master branch, your current branch is: #{Origen.app.rc.current_branch}"
102
+ puts
103
+ puts 'If you want to use a Gitflow workflow you will be able to do development releases on the develop branch, to'
104
+ puts 'do that set config.rc_workflow = :gitflow in your config/application.rb'
105
+ puts
106
+ puts 'Otherwise, for release on a non-standard branch you will need to manage it yourself.'
107
+ exit 1
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ def release_gem
114
+ if File.exist?(File.join Origen.root, "#{Origen.app.gem_name}.gemspec")
115
+ unless system 'rake gem:release'
116
+ puts '***************************************'.red
117
+ puts '***************************************'.red
118
+ puts 'SOMETHING WENT WRONG RELEASING THE GEM!'.red
119
+ puts '***************************************'.red
120
+ puts '***************************************'.red
121
+ end
122
+ end
123
+ end
124
+
125
+ # Run the lint test and require that it passes if enabled
126
+ def lint_test
127
+ if Origen.config.lint_test[:run_on_tag]
128
+ unless system('origen lint --no-correct')
129
+ puts ''
130
+ puts "Can't release due to lint/style errors, fix any errors from running 'origen lint' before trying again"
131
+ exit 1
132
+ end
133
+ end
134
+ end
135
+
136
+ # Sets the current release type
137
+ def type=(type)
138
+ type = type.to_s.chomp.downcase.to_sym
139
+ @type = self.class.valid_types.include?(type) ? type : nil
140
+ end
141
+
142
+ def type
143
+ @type ||= @options[:type]
144
+ end
145
+
146
+ # Sets the release note, returns nil if invalid
147
+ def note=(note)
148
+ if note.to_s =~ /[a-f]|[A-F]/
149
+ @note = note
150
+ else
151
+ @note = nil
152
+ end
153
+ end
154
+
155
+ def note
156
+ @note ||= @options[:note]
157
+ end
158
+
159
+ # Returns the selector, formatted as a string
160
+ def selector
161
+ "Branch: '#{Origen.app.rc.current_branch}'"
162
+ end
163
+
164
+ def version_file
165
+ File.join(Origen.root, 'config', 'version.rb')
166
+ end
167
+
168
+ def history_file
169
+ Origen.config.history_file
170
+ end
171
+
172
+ def workspace_dirs
173
+ dirs = ["#{Origen.root}"]
174
+ Origen.app.config.external_app_dirs.each do |edir|
175
+ dirs << edir
176
+ end
177
+ dirs
178
+ end
179
+
180
+ # Pull the latest versions of the history and version ID files into the workspace
181
+ def get_latest_version_files
182
+ # Get the latest version of the version and history files
183
+ if Origen.app.rc.dssc?
184
+ # Legacy code that makes use of the fact that DesignSync can handle different branch selectors
185
+ # for individual files, this capability has not been abstracted by the newer object oriented
186
+ # revision controllers since most others cannot do it
187
+ system "dssc co -get -force \"#{history_file};Trunk:Latest\" #{version_file}"
188
+ # Force the history selector to Trunk, only 1 branch of this file should ever exist
189
+ system "dssc setselector Trunk #{history_file}"
190
+ # Make sure both are writable
191
+ if Origen.running_on_windows?
192
+ `attrib -R #{history_file.gsub('/', '\\')} #{version_file.gsub('/', '\\')}`
193
+ else
194
+ `chmod 666 #{history_file} #{version_file}`
195
+ end
196
+ else
197
+ Origen.app.rc.checkout "#{history_file} #{version_file}", force: true
198
+ end
199
+ end
200
+
201
+ # Prompts the user to enter a release note
202
+ def get_release_note
203
+ puts ''
204
+ if @options[:note_file]
205
+ f = Origen.file_handler.clean_path_to(@options[:note_file])
206
+ else
207
+ f = "#{Origen.root}/release_note.txt"
208
+ end
209
+ if File.exist?(f)
210
+ lines = File.readlines(f)
211
+ puts 'HAPPY TO USE THIS RELEASE NOTE?:'
212
+ puts '------------------------------------------------------------------------------------------'
213
+ lines.each { |l| puts l }
214
+ puts '------------------------------------------------------------------------------------------'
215
+ if get_text(confirm: :return_boolean)
216
+ self.note = lines.join('')
217
+ return if note
218
+ end
219
+ end
220
+ puts 'RELEASE NOTE:'
221
+ self.note = get_text
222
+ unless note
223
+ puts 'Sorry but you must supply at least a minor description for this release!'
224
+ get_release_note
225
+ end
226
+ end
227
+
228
+ # Prompts the user to enter a release type
229
+ def get_release_type
230
+ puts ''
231
+ puts "RELEASE TYPE (#{self.class.valid_types.join(', ')}):"
232
+ self.type = get_text(default: self.class.valid_types.first, single: true)
233
+ unless type
234
+ puts 'Sorry but that release type is not valid!'
235
+ get_release_type
236
+ end
237
+ end
238
+
239
+ # Prompts the user to confirm the proposed version or enter a different one
240
+ def get_or_confirm_version(type)
241
+ proposed = nil
242
+ until version_unique?(proposed)
243
+ proposed ||= Origen.app.version
244
+ if type == :development
245
+ proposed = proposed.next_dev
246
+ else
247
+ proposed = proposed.next_prod(type)
248
+ end
249
+ end
250
+ if Origen.config.semantically_version
251
+ puts
252
+ puts 'HAPPY TO RELEASE THIS VERSION?:'
253
+ unless get_text(default: proposed, confirm: :return_boolean)
254
+ valid = false
255
+ puts
256
+ until valid
257
+ puts
258
+ puts 'ENTER THE VERSION NUMBER YOU WOULD LIKE TO USE INSTEAD:'
259
+ proposed = Origen::VersionString.new(get_text(single: true).strip)
260
+ valid = proposed.semantic?
261
+ unless valid
262
+ puts 'SORRY BUT THAT IS NOT A VALID VERSION NUMBER'
263
+ end
264
+ end
265
+ end
266
+ else
267
+ valid = false
268
+ until valid
269
+ puts
270
+ puts 'RELEASE TAG:'
271
+ proposed = Origen::VersionString.new(get_text(default: proposed, single: true).strip)
272
+ valid = proposed.timestamp?
273
+ unless valid
274
+ puts 'SORRY BUT THAT IS NOT A VALID VERSION NUMBER'
275
+ end
276
+ end
277
+ end
278
+ proposed
279
+ end
280
+
281
+ def version_unique?(version)
282
+ if version
283
+ if version.semantic?
284
+ if Origen.app.rc.git?
285
+ !Origen.app.rc.tag_exists?(version.prefixed)
286
+ else
287
+ # Don't worry about dssc, since a single branch is used for the version it will
288
+ # always be unique
289
+ true
290
+ end
291
+ else
292
+ true
293
+ end
294
+ end
295
+ end
296
+
297
+ # For now apply a leading 'v' to keep design sync happy, will make this CM type
298
+ # specific in future
299
+ def tag
300
+ tag = Origen.app.version
301
+ if tag =~ /^\d/
302
+ "v#{tag}"
303
+ else
304
+ tag
305
+ end
306
+ end
307
+
308
+ # Write out details of the given version to the history file
309
+ def write_history
310
+ text = File.read(history_file) # Read the existing contents
311
+ File.open(history_file, 'w') do |file| # Write them back, substituting the version number as required
312
+ if Origen.app.version.production?
313
+ file.puts "<a class=\"anchor release_tag\" name=\"#{tag.gsub('.', '_')}\"></a>"
314
+ file.puts "<h1><a href=\"##{tag.gsub('.', '_')}\">Tag: #{tag}</a></h1>"
315
+ file.puts ''
316
+ file.puts "##### #{selector}".escape_underscores
317
+ file.puts ''
318
+ file.puts "##### by #{User.current.name} on #{time_now}"
319
+ file.puts ''
320
+ else
321
+ file.puts "<a class=\"anchor release_tag\" name=\"#{tag.gsub('.', '_')}\"></a>"
322
+ file.puts "<h2><a href=\"##{tag.gsub('.', '_')}\">Tag: #{tag}</a></h2>"
323
+ file.puts ''
324
+ file.puts "##### #{selector}".escape_underscores
325
+ file.puts ''
326
+ file.puts "##### by #{User.current.name} on #{time_now}"
327
+ file.puts ''
328
+ end
329
+ file.puts ''
330
+ file.puts note.escape_underscores
331
+ file.puts ''
332
+ file.puts text
333
+ end
334
+ end
335
+
336
+ # Sets the version number in the file store
337
+ def write_version(version)
338
+ if version.semantic?
339
+ Origen::CodeGenerators.invoke 'semver', [], config: { change: version }
340
+ else
341
+ Origen::CodeGenerators.invoke 'timever', [], config: { change: version }
342
+ end
343
+ system 'origen -v' # Invoke Origen under the new version, this updates Gemfile.lock
344
+ end
345
+
346
+ # Only allows admins to release
347
+ def authorized?
348
+ # Not sure yet if this concept can work in the open source world...
349
+ true
350
+ # if User.current.admin?
351
+ # true
352
+ # else
353
+ # puts "Sorry but you can't run the release script, please contact a development team member"
354
+ # false
355
+ # end
356
+ end
357
+ end
358
+ end
359
+ end