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,251 @@
1
+ require 'bundler'
2
+ module Origen
3
+ # Supports executing code regression testing.
4
+ #
5
+ # Reference workspace used for comparison will automatically be
6
+ # populated based on tag selected (default: latest).
7
+ #
8
+ # An instance of this class is hooked up to:
9
+ # Origen.regression_manager
10
+ # == Basic Usage
11
+ # options[:target] = %w{target1.rb target2.rb target3.rb}
12
+ # Origen.regression_manager.run(options) do |options|
13
+ # Origen.target.loop(options) do |options|
14
+ # Origen.lsf.submit_origen_job "generate regression.list -t #{options[:target]}"
15
+ # end
16
+ # end
17
+ class RegressionManager
18
+ include Utility::InputCapture
19
+ include Users
20
+
21
+ def ws
22
+ Origen.app.workspace_manager
23
+ end
24
+
25
+ # Serves to execute a regression.
26
+ # Any block of code passed to this method will receive regression check
27
+ # @param [Hash] options Options to customize the run instance
28
+ # @option options [Array] :target String Array of target names on which to run regression
29
+ # @option options [Boolean] :build_reference (true) Build reference workspace automatically
30
+ # @option options [Boolean] :send_email (false) Send results email when regression complete
31
+ # @option options [Boolean] :email_all_developers (false) If sending email, whether to email all developers or just user
32
+ # @option options [Boolean] :report_results (false) Whether to report results inline to console
33
+ #
34
+ #
35
+ def run(options = {})
36
+ options = {
37
+ build_reference: true,
38
+ send_email: false,
39
+ email_all_developers: false,
40
+ report_results: false,
41
+ uses_lsf: true
42
+ }.merge(options)
43
+ options = load_options if running_in_reference_workspace?
44
+ targets = prepare_targets(options)
45
+ if running_in_reference_workspace?
46
+ Origen.lsf.clear_all
47
+ yield options
48
+ wait_for_completion(options) if options[:uses_lsf]
49
+ save_and_delete_output
50
+ else
51
+ if options[:build_reference]
52
+ @reference_tag = version_to_tag(options[:version] || get_version(options))
53
+ setup_reference_workspace
54
+ # Generate the reference files
55
+ save_options(options)
56
+ Origen.with_origen_root(reference_origen_root) do
57
+ Origen.with_disable_origen_version_check(all_processes: true) do
58
+ Dir.chdir reference_origen_root do
59
+ Bundler.with_clean_env do
60
+ system 'origen -v' # Used to make sure gems install
61
+ Origen.log.info '######################################################'
62
+ Origen.log.info 'running regression command in reference workspace...'
63
+ Origen.log.info '######################################################'
64
+ Origen.log.info
65
+ system 'origen regression'
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ # Generate the latest files for comparison
72
+ Origen.lsf.clear_all
73
+ Origen.log.info '######################################################'
74
+ Origen.log.info 'running regression command in local workspace...'
75
+ Origen.log.info '######################################################'
76
+ Origen.log.info
77
+ yield options
78
+ wait_for_completion(options) if options[:uses_lsf]
79
+ summarize_results(options)
80
+ end
81
+ end
82
+
83
+ def summarize_results(options = {})
84
+ Origen.lsf.build_log
85
+ stats = Origen.app.stats
86
+ if options[:report_results]
87
+ puts "Regression results: \n"
88
+ puts "#{stats.summary_text}\n"
89
+ end
90
+ if stats.clean_run?
91
+ stats.report_pass
92
+ else
93
+ stats.report_fail
94
+ end
95
+ if options[:send_email]
96
+ to = options[:email_all_developers] ? developers : current_user
97
+ Origen.mailer.send_regression_complete_notice(to: to)
98
+ end
99
+ end
100
+
101
+ # Saves all generated output (to the reference dir) and then
102
+ # deletes the output directory to save space
103
+ def save_and_delete_output
104
+ Origen.lsf.build_log
105
+ Origen.log.flush
106
+ Dir.chdir reference_origen_root do
107
+ Bundler.with_clean_env do
108
+ system 'origen save all'
109
+ end
110
+ end
111
+ FileUtils.rm_rf "#{reference_origen_root}/output"
112
+ end
113
+
114
+ # Cycle through all targets in the upcoming run to ensure
115
+ # that all output directories exist
116
+ def prepare_targets(options)
117
+ targets = [options[:target], options[:targets]].flatten.compact
118
+ if targets.empty?
119
+ puts 'You must supply the targets you are going to run in the options'
120
+ puts 'passed to regression_manager.run.'
121
+ fail
122
+ end
123
+ Origen.target.loop(options) { |_options| }
124
+ targets
125
+ end
126
+
127
+ def store_file
128
+ @store_file ||= Pathname.new "#{reference_origen_root}/.regression_options"
129
+ end
130
+
131
+ def load_options
132
+ options = {}
133
+ if File.exist?(store_file)
134
+ File.open(store_file.to_s) do |f|
135
+ options = Marshal.load(f)
136
+ end
137
+ FileUtils.rm_f store_file
138
+ end
139
+ options
140
+ end
141
+
142
+ def save_options(options)
143
+ File.open(store_file.to_s, 'w') do |f|
144
+ Marshal.dump(options, f)
145
+ end
146
+ end
147
+
148
+ def running_in_reference_workspace?
149
+ File.exist?("#{Origen.root}/.this_is_a_reference_workspace")
150
+ end
151
+
152
+ def wait_for_completion(_options = {})
153
+ highlight { Origen.log.info 'Waiting for all to complete...' }
154
+ Origen.lsf.wait_for_completion
155
+ end
156
+
157
+ def reference_origen_root
158
+ if running_in_reference_workspace?
159
+ Origen.root
160
+ else
161
+ ws.origen_root(@reference_workspace)
162
+ end
163
+ end
164
+
165
+ def setup_reference_workspace
166
+ if ws.reference_workspace_set?
167
+ @reference_workspace = ws.reference_workspace
168
+ else
169
+ @reference_workspace = get_reference_workspace
170
+ unless File.exist?(@reference_workspace)
171
+ highlight { Origen.log.info 'Building reference workspace...' }
172
+ ws.build(@reference_workspace)
173
+ end
174
+ ws.set_reference_workspace(@reference_workspace)
175
+ end
176
+ highlight { Origen.log.info "Switching reference workspace to version #{@reference_tag}..." }
177
+ ws.switch_version(@reference_workspace, @reference_tag, origen_root_only: true)
178
+ unless File.exist?("#{reference_origen_root}/.this_is_a_reference_workspace")
179
+ system "touch #{reference_origen_root}/.this_is_a_reference_workspace"
180
+ end
181
+ copy_regression_file
182
+ end
183
+
184
+ # We want the reference workspace to run the same regression as the local
185
+ # workspace, so copy the current version of the regression command file
186
+ # across.
187
+ def copy_regression_file
188
+ path_to_command_file = regression_command_file.relative_path_from(Origen.root)
189
+ system "rm -f #{reference_origen_root}/#{path_to_command_file}"
190
+ system "cp #{Origen.root}/#{path_to_command_file} #{reference_origen_root}/#{path_to_command_file}"
191
+ end
192
+
193
+ # Returns a full path to the regression command file within the local application
194
+ def regression_command_file
195
+ first_call = caller.find { |line| line =~ /regression_manager.rb.*run/ }
196
+ app_caller_line = caller[caller.index(first_call) + 1]
197
+ app_caller_line =~ /(.*\.rb)/
198
+ path = Pathname.new(Regexp.last_match[1])
199
+ end
200
+
201
+ def get_reference_workspace(_options = {})
202
+ puts ''
203
+ puts 'It looks like this is the first time that you have run a regression from this workspace.'
204
+ puts ''
205
+ puts 'In order to run a regression test Origen must have access to a secondary workspace in which'
206
+ puts 'it can build the reference files.'
207
+ puts ''
208
+ puts 'Generally all of your developments workspaces should use the same reference workspace.'
209
+ puts ''
210
+ puts 'Origen will make a suggestion for the reference workspace below, however if you know that'
211
+ puts 'you already have an existing one at a different location then please enter the path.'
212
+ puts ''
213
+ puts 'WHERE SHOULD THE REFERENCE WORKSPACE RESIDE?'
214
+ puts ''
215
+ get_text(default: ws.reference_workspace_proposal, single: true)
216
+ end
217
+
218
+ def get_version(_options = {})
219
+ puts ''
220
+ puts 'WHAT VERSION DO YOU WANT TO COMPARE AGAINST?'
221
+ puts ''
222
+ puts "Valid values are 'latest', 'last' (production release), or a tag."
223
+ puts ''
224
+ get_text(default: Origen.app.version, single: true)
225
+ end
226
+
227
+ def version_to_tag(version)
228
+ version = version.strip
229
+ if version.downcase == 'last'
230
+ Origen.app.version_tracker.versions.last
231
+ elsif version.downcase == 'latest'
232
+ version
233
+ elsif VersionString.new(version).valid?
234
+ version
235
+ else
236
+ puts 'Sorry but that version tag looks to be invalid!'
237
+ exit 1
238
+ end
239
+ end
240
+
241
+ private
242
+
243
+ def highlight
244
+ Origen.log.info ''
245
+ Origen.log.info '######################################################################'
246
+ yield
247
+ Origen.log.info '######################################################################'
248
+ Origen.log.info ''
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,340 @@
1
+ module Origen
2
+ # Responsible for ensuring that all dependencies defined in
3
+ # config.remotes are available.
4
+ #
5
+ # Workspaces will automatically be created and updated to the
6
+ # correct version as required.
7
+ #
8
+ # An instance of this class is hooked up to:
9
+ # Origen.remote_manager
10
+ class RemoteManager
11
+ def initialize
12
+ @required = false
13
+ end
14
+
15
+ # This will fetch all remotes (if required)
16
+ # It does not add the libs to the load path, and require the environments
17
+ # since remotes are not assumed to be Ruby.
18
+ def require!
19
+ unless required?
20
+ # Make sure the imports have already been required and added
21
+ # to the load path of the current thread
22
+ unless imports_required?
23
+ fail 'Error: Imports must be required before remotes!'
24
+ end
25
+
26
+ while updates_required?
27
+ Origen.log.info 'The following remotes need to be updated, this will now happen automatically:'
28
+ dirty_remotes.each do |name, remote|
29
+ if remote[:path]
30
+ Origen.log.info " #{name} - #{remote[:path]}"
31
+ else
32
+ Origen.log.info " #{name} - #{remote[:version]}"
33
+ end
34
+ end
35
+ update!
36
+ end
37
+ @required = true
38
+ end
39
+ end
40
+
41
+ # Returns true if the imports have already been required and added
42
+ # to the load path of the current thread
43
+ def required?
44
+ @required
45
+ end
46
+
47
+ # Returns true if the imports have already been required and added
48
+ # to the load path of the current thread
49
+ def imports_required?
50
+ Origen.import_manager.required?
51
+ end
52
+
53
+ def validate_production_status(force = false)
54
+ if Origen.mode.production? || force
55
+ remotes.each do |_name, remote|
56
+ if remote[:path]
57
+ fail "The following remote is defined as a path, but that is not allowed in production: #{remote}"
58
+ end
59
+ version = Origen::VersionString.new(remote[:version])
60
+ unless version.valid?
61
+ fail "The following remote version is not in a valid format: #{remote}"
62
+ end
63
+ if version.latest?
64
+ fail "Latest is not allowed as a remote version in production: #{remote}"
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ # Returns an array of symbols that represent the names of all remotes
71
+ def names
72
+ named_remotes.keys
73
+ end
74
+
75
+ # Returns a hash containing all remotes
76
+ def named_remotes
77
+ remotes
78
+ end
79
+
80
+ # Returns the path to origen root for the given import name
81
+ def origen_root(name)
82
+ origen_root_for(named_remotes[name])
83
+ end
84
+
85
+ # Handles all symlink creation since Ruby/Windows is ropey. On windows it will create
86
+ # an additional flag file to easily tell us a symlink is active later.
87
+ # @api private
88
+ def create_symlink(from, to)
89
+ if Origen.running_on_windows?
90
+ system("call mklink /D #{to.to_s.gsub('/', '\\')} #{from.to_s.gsub('/', '\\')}")
91
+ File.new("#{to}_is_a_symlink", 'w') {}
92
+ else
93
+ FileUtils.symlink from, to
94
+ end
95
+ end
96
+
97
+ # Manually handle symlink deletion to support windows
98
+ # @api private
99
+ def delete_symlink(path)
100
+ if Origen.running_on_windows?
101
+ # Don't use regular rm on windows symlink, will delete into the remote dir!
102
+ system("call cmd /c rmdir #{path.to_s.gsub('/', '\\')}")
103
+ FileUtils.rm_f("#{path}_is_a_symlink")
104
+ else
105
+ FileUtils.rm_f(path)
106
+ end
107
+ end
108
+
109
+ # Returns true if the given path is a symlink. Since Rubies handling of symlinks is ropey
110
+ # we will manually maintain a flag (an empty file that means true when present) to indicate
111
+ # when an import is currently setup as a symlink to a path.
112
+ # @api private
113
+ def symlink?(path)
114
+ if Origen.running_on_windows?
115
+ File.exist?("#{path}_is_a_symlink")
116
+ else
117
+ File.symlink?(path)
118
+ end
119
+ end
120
+
121
+ private
122
+
123
+ # Returns the name of the given import (a lower cased symbol)
124
+ def name_of(remote)
125
+ dir_defined?(remote)
126
+ dir = remote[:dir].dup
127
+ dir.gsub! '/', '_'
128
+ name = dir.downcase.to_sym
129
+ end
130
+
131
+ # Returns the name of the given import (a lower cased symbol)
132
+ def dir_of(remote)
133
+ dir_defined?(remote)
134
+ dir = remote[:dir]
135
+ end
136
+
137
+ def dir_defined?(remote)
138
+ if remote[:dir].nil?
139
+ Origen.log.error 'A problem was encountered with a configuration remote'
140
+ Origen.log.error "Error: ':dir' must be defined for each remote."
141
+ fail 'Remote error!'
142
+ end
143
+ true
144
+ end
145
+
146
+ def origen_root_for(remote, options = {})
147
+ workspace = Pathname.new(workspace_of(remote))
148
+ if File.exist?("#{workspace}/config/application.rb")
149
+ root = workspace
150
+ elsif remote[:app_path] && File.exist?("#{workspace}/#{remote[:app_path]}/config/application.rb")
151
+ root = workspace.join(remote[:app_path])
152
+ else
153
+ root = workspace.join('tool_data', 'origen')
154
+ end
155
+ if File.exist?("#{root}/config/application.rb")
156
+ root
157
+ else
158
+ if options[:accept_missing]
159
+ nil
160
+ else
161
+ Origen.log.error 'A problem was encountered with the following remote:'
162
+ Origen.log.error remote
163
+ Origen.log.error 'Please check that all vault, version or path references are correct.'
164
+ Origen.log.error ''
165
+ Origen.log.error 'If you are sure that the remote is setup correctly and this error'
166
+ Origen.log.error 'persists, you can try running the following command to blow away'
167
+ Origen.log.error 'the local remote cache and then try again from scratch:'
168
+ Origen.log.error ''
169
+ Origen.log.error "rm -fr #{ws.remotes_directory}"
170
+ Origen.log.error ''
171
+ fail 'Remote error!'
172
+ end
173
+ end
174
+ end
175
+
176
+ def updates_required?
177
+ resolve_remotes
178
+ dirty_remotes.size > 0
179
+ end
180
+
181
+ def dirty_remotes
182
+ remotes.select do |_name, remote|
183
+ dirty?(remote)
184
+ end
185
+ end
186
+
187
+ def dirty?(remote)
188
+ if remote[:path] && path_enabled?(remote)
189
+ false
190
+ else
191
+ (!remote[:path] && path_enabled?(remote)) ||
192
+ (remote[:path] && !path_enabled?(remote)) ||
193
+ current_version_of(remote) != remote[:version]
194
+ end
195
+ end
196
+
197
+ def current_version_of(remote)
198
+ ws.current_version_of(workspace_of(remote))
199
+ end
200
+
201
+ # Returns true if the given import is currently setup as a path
202
+ def path_enabled?(remote)
203
+ dir = workspace_of(remote)
204
+ File.exist?(dir) && symlink?(dir)
205
+ end
206
+
207
+ # Populate an array of required remotes from the current application
208
+ # state and resolve any duplications or conflicts.
209
+ # Conflicts are resolved by the following rules:
210
+ # * A path reference always wins.
211
+ # * If two different paths are found an errors will be raised.
212
+ # * If multiple versions of the same remote are found the most
213
+ # recent one wins.
214
+ def resolve_remotes
215
+ @remotes = {}
216
+ top_level_remotes
217
+ top_level_remotes.each do |remote|
218
+ traverse_remotes(remote) do |remote|
219
+ add_remote(remote)
220
+ end
221
+ end
222
+ # Add remotes from imports
223
+ Origen.plugins.each do |plugin|
224
+ plugin.config.remotes.each do |import_remote|
225
+ add_remote(import_remote)
226
+ end
227
+ end
228
+ @remotes
229
+ end
230
+
231
+ def top_level_remotes
232
+ Origen.app.config.remotes #+ Origen.app.config.remotes_dev (there are no core remotes at this time)
233
+ end
234
+
235
+ # Walks down an import tree recursively yielding all nested imports, if
236
+ # the imported application has not been populated yet then it will
237
+ # not return any nested imports.
238
+ #
239
+ # This will also update the required origen version if a app
240
+ # instance is encountered that requires a newer version than the current
241
+ # version.
242
+ def traverse_remotes(remote, &block)
243
+ yield remote
244
+ if remote_present?(remote)
245
+ app = Origen.application_instance(origen_root_for(remote), reload: true)
246
+ app.config.remotes.each do |remote|
247
+ traverse_remotes(remote, &block)
248
+ end
249
+ end
250
+ end
251
+
252
+ def remotes
253
+ @remotes ||= resolve_remotes
254
+ end
255
+
256
+ def remote_present?(remote)
257
+ !!origen_root_for(remote, accept_missing: true)
258
+ end
259
+
260
+ # Conflicts are resolved by the following rules:
261
+ # * A path reference always wins.
262
+ # * If two different paths are found an errors will be raised.
263
+ # * If multiple versions of the same remote are found the most
264
+ # recent one wins.
265
+ def add_remote(new)
266
+ name = name_of(new)
267
+ # If the current remote has been imported by one of it's dev dependencies
268
+ # then always use the local workspace
269
+ if name == @current_app_name
270
+ new = @current_app
271
+ end
272
+ existing = remotes[name]
273
+ if existing
274
+ if new[:path]
275
+ if existing[:path]
276
+ if existing[:path] != new[:path]
277
+ Origen.log.error 'Cannot resolve remote dependencies due to conflicting paths:'
278
+ Origen.log.error " #{name}:"
279
+ Origen.log.error " - #{existing[:path]}"
280
+ Origen.log.error " - #{new[:path]}"
281
+ Origen.log.error ''
282
+ fail 'Remote error!'
283
+ end
284
+ else
285
+ remotes[name] = new
286
+ end
287
+ elsif existing[:version] != new[:version]
288
+ existing_version = Origen::VersionString.new(existing[:version])
289
+ if existing_version.less_than?(new[:version])
290
+ remotes[name] = new
291
+ end
292
+ end
293
+ else
294
+ remotes[name] = new
295
+ end
296
+ end
297
+
298
+ # Makes all dirty imports clean
299
+ def update!
300
+ ensure_remotes_directory
301
+ dirty_remotes.each do |_name, remote|
302
+ dir = workspace_of(remote)
303
+ if remote[:path] || path_enabled?(remote)
304
+ if symlink?(dir)
305
+ delete_symlink(dir)
306
+ else
307
+ FileUtils.rm_rf(dir) if File.exist?(dir)
308
+ end
309
+ end
310
+ if remote[:path]
311
+ create_symlink(remote[:path], dir)
312
+
313
+ else
314
+ unless File.exist?("#{dir}/.initial_populate_successful")
315
+ ws.build(dir, rc_url: remote[:vault], allow_rebuild: true)
316
+ ws.switch_version(dir, remote[:version])
317
+ `touch "#{dir}/.initial_populate_successful"`
318
+ end
319
+ ws.switch_version(dir, remote[:version])
320
+ end
321
+ end
322
+ end
323
+
324
+ def workspace_of(remote)
325
+ Pathname.new("#{ws.remotes_directory}/#{dir_of(remote)}")
326
+ end
327
+
328
+ def ensure_remotes_directory
329
+ unless remotes.empty?
330
+ unless File.exist?(ws.remotes_directory)
331
+ FileUtils.mkdir_p(ws.remotes_directory)
332
+ end
333
+ end
334
+ end
335
+
336
+ def ws
337
+ Origen.app.workspace_manager
338
+ end
339
+ end
340
+ end