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.
- checksums.yaml +4 -4
- data/bin/ctags +0 -0
- data/bin/origen +165 -1
- data/bin/rgen +2 -0
- data/config/application.rb +141 -0
- data/config/commands.rb +72 -0
- data/config/development.rb +7 -0
- data/config/environment.rb +0 -0
- data/config/rgen.policy +7 -0
- data/config/rubocop/easy.yml +620 -0
- data/config/rubocop/easy_disabled.yml +271 -0
- data/config/rubocop/easy_enabled.yml +731 -0
- data/config/rubocop/strict.yml +620 -0
- data/config/rubocop/strict_disabled.yml +247 -0
- data/config/rubocop/strict_enabled.yml +755 -0
- data/config/users.rb +20 -0
- data/config/version.rb +1 -1
- data/helpers/url.rb +68 -0
- data/lib/c99/doc_interface.rb +56 -0
- data/lib/c99/j750_interface.rb +85 -0
- data/lib/c99/nvm.rb +89 -0
- data/lib/c99/target/mock2.rb +1 -0
- data/lib/c99/target/subdir/mock3.rb +1 -0
- data/lib/option_parser/optparse.rb +12 -0
- data/lib/origen/acronyms.rb +60 -0
- data/lib/origen/application/command_dispatcher.rb +12 -0
- data/lib/origen/application/configuration.rb +206 -0
- data/lib/origen/application/configuration_manager.rb +78 -0
- data/lib/origen/application/deployer.rb +367 -0
- data/lib/origen/application/environment.rb +186 -0
- data/lib/origen/application/lsf.rb +145 -0
- data/lib/origen/application/lsf_manager.rb +657 -0
- data/lib/origen/application/plugins_manager.rb +280 -0
- data/lib/origen/application/release.rb +359 -0
- data/lib/origen/application/runner.rb +246 -0
- data/lib/origen/application/statistics.rb +191 -0
- data/lib/origen/application/target.rb +374 -0
- data/lib/origen/application/version_tracker.rb +59 -0
- data/lib/origen/application/workspace_manager.rb +151 -0
- data/lib/origen/application.rb +746 -0
- data/lib/origen/bugs/bug.rb +36 -0
- data/lib/origen/bugs.rb +45 -0
- data/lib/origen/callbacks.rb +35 -0
- data/lib/origen/chip_mode.rb +118 -0
- data/lib/origen/chip_package.rb +461 -0
- data/lib/origen/client.rb +87 -0
- data/lib/origen/code_generators/actions.rb +258 -0
- data/lib/origen/code_generators/base.rb +57 -0
- data/lib/origen/code_generators/bundler.rb +17 -0
- data/lib/origen/code_generators/gem_setup.rb +49 -0
- data/lib/origen/code_generators/rake.rb +13 -0
- data/lib/origen/code_generators/rspec.rb +12 -0
- data/lib/origen/code_generators/semver.rb +39 -0
- data/lib/origen/code_generators/timever.rb +37 -0
- data/lib/origen/code_generators.rb +111 -0
- data/lib/origen/commands/add.rb +12 -0
- data/lib/origen/commands/compile.rb +62 -0
- data/lib/origen/commands/ctags.rb +9 -0
- data/lib/origen/commands/dispatch.rb +22 -0
- data/lib/origen/commands/environment.rb +11 -0
- data/lib/origen/commands/fetch.rb +63 -0
- data/lib/origen/commands/generate.rb +130 -0
- data/lib/origen/commands/interactive.rb +73 -0
- data/lib/origen/commands/lint.rb +82 -0
- data/lib/origen/commands/lsf.rb +93 -0
- data/lib/origen/commands/merge.rb +55 -0
- data/lib/origen/commands/modifications.rb +12 -0
- data/lib/origen/commands/new.rb +113 -0
- data/lib/origen/commands/plugin.rb +105 -0
- data/lib/origen/commands/program.rb +70 -0
- data/lib/origen/commands/rc.rb +442 -0
- data/lib/origen/commands/save.rb +56 -0
- data/lib/origen/commands/target.rb +27 -0
- data/lib/origen/commands/time.rb +127 -0
- data/lib/origen/commands/version.rb +17 -0
- data/lib/origen/commands/web.rb +221 -0
- data/lib/origen/commands.rb +272 -0
- data/lib/origen/commands_global.rb +76 -0
- data/lib/origen/controller.rb +94 -0
- data/lib/origen/core_ext/array.rb +23 -0
- data/lib/origen/core_ext/bignum.rb +36 -0
- data/lib/origen/core_ext/enumerable.rb +76 -0
- data/lib/origen/core_ext/fixnum.rb +46 -0
- data/lib/origen/core_ext/hash.rb +52 -0
- data/lib/origen/core_ext/module.rb +14 -0
- data/lib/origen/core_ext/numeric.rb +126 -0
- data/lib/origen/core_ext/object.rb +13 -0
- data/lib/origen/core_ext/range.rb +7 -0
- data/lib/origen/core_ext/string.rb +124 -0
- data/lib/origen/core_ext.rb +10 -0
- data/lib/origen/database/key_value_store.rb +111 -0
- data/lib/origen/database/key_value_stores.rb +108 -0
- data/lib/origen/database.rb +6 -0
- data/lib/origen/encodings.rb +102 -0
- data/lib/origen/features/feature.rb +22 -0
- data/lib/origen/features.rb +104 -0
- data/lib/origen/file_handler.rb +429 -0
- data/lib/origen/generator/comparator.rb +56 -0
- data/lib/origen/generator/compiler.rb +277 -0
- data/lib/origen/generator/flow.rb +49 -0
- data/lib/origen/generator/job.rb +131 -0
- data/lib/origen/generator/pattern.rb +356 -0
- data/lib/origen/generator/pattern_finder.rb +155 -0
- data/lib/origen/generator/pattern_iterator.rb +55 -0
- data/lib/origen/generator/renderer.rb +113 -0
- data/lib/origen/generator/resources.rb +40 -0
- data/lib/origen/generator/stage.rb +89 -0
- data/lib/origen/generator.rb +85 -0
- data/lib/origen/global_methods.rb +205 -0
- data/lib/origen/import_manager.rb +596 -0
- data/lib/origen/location/base.rb +116 -0
- data/lib/origen/location/map.rb +83 -0
- data/lib/origen/location.rb +6 -0
- data/lib/origen/log.rb +217 -0
- data/lib/origen/logger_methods.rb +56 -0
- data/lib/origen/mode.rb +61 -0
- data/lib/origen/model.rb +267 -0
- data/lib/origen/model_initializer.rb +45 -0
- data/lib/origen/nvm/block_array.rb +72 -0
- data/lib/origen/nvm.rb +6 -0
- data/lib/origen/parameters/live.rb +22 -0
- data/lib/origen/parameters/missing.rb +28 -0
- data/lib/origen/parameters/set.rb +144 -0
- data/lib/origen/parameters.rb +107 -0
- data/lib/origen/pdm.rb +218 -0
- data/lib/origen/pins/function_proxy.rb +36 -0
- data/lib/origen/pins/ground_pin.rb +6 -0
- data/lib/origen/pins/pin.rb +860 -0
- data/lib/origen/pins/pin_bank.rb +349 -0
- data/lib/origen/pins/pin_clock.rb +124 -0
- data/lib/origen/pins/pin_collection.rb +492 -0
- data/lib/origen/pins/pin_common.rb +206 -0
- data/lib/origen/pins/port.rb +268 -0
- data/lib/origen/pins/power_pin.rb +30 -0
- data/lib/origen/pins.rb +696 -0
- data/lib/origen/registers/bit.rb +562 -0
- data/lib/origen/registers/bit_collection.rb +787 -0
- data/lib/origen/registers/container.rb +288 -0
- data/lib/origen/registers/domain.rb +16 -0
- data/lib/origen/registers/reg.rb +1406 -0
- data/lib/origen/registers/reg_collection.rb +24 -0
- data/lib/origen/registers.rb +652 -0
- data/lib/origen/regression_manager.rb +251 -0
- data/lib/origen/remote_manager.rb +340 -0
- data/lib/origen/revision_control/base.rb +257 -0
- data/lib/origen/revision_control/design_sync.rb +276 -0
- data/lib/origen/revision_control/git.rb +243 -0
- data/lib/origen/revision_control/subversion.rb +6 -0
- data/lib/origen/revision_control.rb +44 -0
- data/lib/origen/ruby_version_check.rb +131 -0
- data/lib/origen/site_config.rb +61 -0
- data/lib/origen/specs/checkers.rb +103 -0
- data/lib/origen/specs/creation_info.rb +17 -0
- data/lib/origen/specs/doc_resource.rb +91 -0
- data/lib/origen/specs/exhibit.rb +17 -0
- data/lib/origen/specs/mode_select.rb +16 -0
- data/lib/origen/specs/note.rb +17 -0
- data/lib/origen/specs/override.rb +21 -0
- data/lib/origen/specs/power_supply.rb +13 -0
- data/lib/origen/specs/spec.rb +226 -0
- data/lib/origen/specs/version_history.rb +14 -0
- data/lib/origen/specs.rb +552 -0
- data/lib/origen/sub_blocks.rb +298 -0
- data/lib/origen/tester/api.rb +277 -0
- data/lib/origen/tester/bdm/bdm.rb +25 -0
- data/lib/origen/tester/command_based_tester.rb +46 -0
- data/lib/origen/tester/doc/doc.rb +226 -0
- data/lib/origen/tester/doc/generator/flow.rb +71 -0
- data/lib/origen/tester/doc/generator/flow_line.rb +203 -0
- data/lib/origen/tester/doc/generator/test.rb +68 -0
- data/lib/origen/tester/doc/generator/test_group.rb +66 -0
- data/lib/origen/tester/doc/generator/tests.rb +47 -0
- data/lib/origen/tester/doc/generator.rb +126 -0
- data/lib/origen/tester/doc/model.rb +162 -0
- data/lib/origen/tester/generator/flow_control_api.rb +606 -0
- data/lib/origen/tester/generator/identity_map.rb +25 -0
- data/lib/origen/tester/generator/placeholder.rb +13 -0
- data/lib/origen/tester/generator/test_numberer.rb +25 -0
- data/lib/origen/tester/generator.rb +271 -0
- data/lib/origen/tester/interface.rb +154 -0
- data/lib/origen/tester/j750/files.rb +45 -0
- data/lib/origen/tester/j750/generator/flow.rb +123 -0
- data/lib/origen/tester/j750/generator/flow_line.rb +288 -0
- data/lib/origen/tester/j750/generator/patgroup.rb +111 -0
- data/lib/origen/tester/j750/generator/patgroups.rb +41 -0
- data/lib/origen/tester/j750/generator/patset.rb +111 -0
- data/lib/origen/tester/j750/generator/patsets.rb +41 -0
- data/lib/origen/tester/j750/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/j750/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/j750/generator/test_instance.rb +846 -0
- data/lib/origen/tester/j750/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/j750/generator/test_instances.rb +182 -0
- data/lib/origen/tester/j750/generator.rb +203 -0
- data/lib/origen/tester/j750/j750.rb +845 -0
- data/lib/origen/tester/j750/j750_hpt.rb +35 -0
- data/lib/origen/tester/j750/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/j750/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/j750/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/j750/parser/descriptions.rb +340 -0
- data/lib/origen/tester/j750/parser/flow.rb +111 -0
- data/lib/origen/tester/j750/parser/flow_line.rb +207 -0
- data/lib/origen/tester/j750/parser/flows.rb +23 -0
- data/lib/origen/tester/j750/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/j750/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/j750/parser/test_instance.rb +322 -0
- data/lib/origen/tester/j750/parser/test_instances.rb +26 -0
- data/lib/origen/tester/j750/parser/timeset.rb +15 -0
- data/lib/origen/tester/j750/parser/timesets.rb +0 -0
- data/lib/origen/tester/j750/parser.rb +104 -0
- data/lib/origen/tester/jlink/jlink.rb +33 -0
- data/lib/origen/tester/parser/description_lookup.rb +64 -0
- data/lib/origen/tester/parser/searchable_array.rb +32 -0
- data/lib/origen/tester/parser/searchable_hash.rb +32 -0
- data/lib/origen/tester/parser.rb +24 -0
- data/lib/origen/tester/time.rb +338 -0
- data/lib/origen/tester/timing.rb +253 -0
- data/lib/origen/tester/ultraflex/files.rb +45 -0
- data/lib/origen/tester/ultraflex/generator/flow.rb +119 -0
- data/lib/origen/tester/ultraflex/generator/flow_line.rb +269 -0
- data/lib/origen/tester/ultraflex/generator/patgroup.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patgroups.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/patset.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patsets.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/ultraflex/generator/test_instance.rb +622 -0
- data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/ultraflex/generator/test_instances.rb +174 -0
- data/lib/origen/tester/ultraflex/generator.rb +200 -0
- data/lib/origen/tester/ultraflex/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/ultraflex/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/ultraflex/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/ultraflex/parser/descriptions.rb +342 -0
- data/lib/origen/tester/ultraflex/parser/flow.rb +111 -0
- data/lib/origen/tester/ultraflex/parser/flow_line.rb +207 -0
- data/lib/origen/tester/ultraflex/parser/flows.rb +23 -0
- data/lib/origen/tester/ultraflex/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/ultraflex/parser/test_instance.rb +262 -0
- data/lib/origen/tester/ultraflex/parser/test_instances.rb +26 -0
- data/lib/origen/tester/ultraflex/parser/timeset.rb +15 -0
- data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
- data/lib/origen/tester/ultraflex/parser.rb +104 -0
- data/lib/origen/tester/ultraflex/ultraflex.rb +759 -0
- data/lib/origen/tester/v93k/generator/flow.rb +63 -0
- data/lib/origen/tester/v93k/generator/flow_node/print.rb +10 -0
- data/lib/origen/tester/v93k/generator/flow_node.rb +17 -0
- data/lib/origen/tester/v93k/generator/pattern.rb +16 -0
- data/lib/origen/tester/v93k/generator/pattern_master.rb +54 -0
- data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +6 -0
- data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +11 -0
- data/lib/origen/tester/v93k/generator/templates/template.flow.erb +121 -0
- data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +9 -0
- data/lib/origen/tester/v93k/generator/test_function.rb +103 -0
- data/lib/origen/tester/v93k/generator/test_functions.rb +79 -0
- data/lib/origen/tester/v93k/generator/test_method.rb +46 -0
- data/lib/origen/tester/v93k/generator/test_methods.rb +75 -0
- data/lib/origen/tester/v93k/generator/test_suite.rb +54 -0
- data/lib/origen/tester/v93k/generator/test_suites.rb +65 -0
- data/lib/origen/tester/v93k/generator.rb +80 -0
- data/lib/origen/tester/v93k/v93k.rb +420 -0
- data/lib/origen/tester/vector.rb +86 -0
- data/lib/origen/tester/vector_generator.rb +633 -0
- data/lib/origen/tester/vector_pipeline.rb +150 -0
- data/lib/origen/tester.rb +56 -0
- data/lib/origen/top_level.rb +134 -0
- data/lib/origen/users/ldap.rb +65 -0
- data/lib/origen/users/user.rb +149 -0
- data/lib/origen/users.rb +30 -0
- data/lib/origen/utility/block_args.rb +93 -0
- data/lib/origen/utility/csv_data.rb +110 -0
- data/lib/origen/utility/design_sync.rb +494 -0
- data/lib/origen/utility/diff.rb +158 -0
- data/lib/origen/utility/input_capture.rb +121 -0
- data/lib/origen/utility/mailer.rb +143 -0
- data/lib/origen/utility/s_record.rb +205 -0
- data/lib/origen/utility/time_and_date.rb +30 -0
- data/lib/origen/utility.rb +12 -0
- data/lib/origen/version_checker.rb +117 -0
- data/lib/origen/version_string.rb +356 -0
- data/lib/origen.rb +648 -0
- data/lib/tasks/gem.rake +27 -22
- data/origen_site_config.yml +36 -0
- data/source_setup +17 -0
- data/spec/format/rgen_formatter.rb +14 -0
- data/templates/api_doc/README.txt.erb +24 -0
- data/templates/code_generators/gemfile_app.rb +4 -0
- data/templates/code_generators/gemfile_plugin.rb +6 -0
- data/templates/code_generators/gemspec.rb +33 -0
- data/templates/code_generators/rakefile.rb +10 -0
- data/templates/code_generators/spec_helper.rb +49 -0
- data/templates/code_generators/version.rb +8 -0
- data/templates/code_generators/version_time.rb +3 -0
- data/templates/git/gitignore.erb +33 -0
- data/templates/j750/_vt_flow.txt.erb +8 -0
- data/templates/j750/_vt_instances.txt.erb +4 -0
- data/templates/j750/program_sheet.txt.erb +9 -0
- data/templates/nanoc/Rules +74 -0
- data/templates/nanoc/config.yaml +77 -0
- data/templates/nanoc/content/favicon.ico +0 -0
- data/templates/nanoc/layouts/bootstrap.html.erb +63 -0
- data/templates/nanoc/layouts/bootstrap3.html.erb +71 -0
- data/templates/nanoc/layouts/freescale.html.erb +79 -0
- data/templates/nanoc/lib/bootstrap_filter.rb +49 -0
- data/templates/nanoc/lib/codeblocks_filter.rb +41 -0
- data/templates/nanoc/lib/default.rb +2 -0
- data/templates/nanoc/lib/gzip_filter.rb +16 -0
- data/templates/nanoc/lib/haml_code_filter.rb +41 -0
- data/templates/nanoc/lib/helpers.rb +1 -0
- data/templates/nanoc/lib/search_filter.rb +62 -0
- data/templates/nanoc_dynamic/content/search.js.erb +92 -0
- data/templates/shared/web/_logo.html +10 -0
- data/templates/test/_inline_sub.txt.erb +2 -0
- data/templates/test/environment.txt.erb +1 -0
- data/templates/test/inline.txt.erb +11 -0
- data/templates/test/inspections.txt.erb +19 -0
- data/templates/test/set1/_sub1.txt.erb +12 -0
- data/templates/test/set1/_sub4.txt.erb +1 -0
- data/templates/test/set1/_sub5.txt.erb +1 -0
- data/templates/test/set1/main.txt.erb +53 -0
- data/templates/test/set1/sub_dir/_sub2.txt.erb +20 -0
- data/templates/test/set1/sub_dir/_sub3.txt.erb +12 -0
- data/templates/test/set1/sub_dir/main2.txt.erb +4 -0
- data/templates/test/set2/template_with_no_erb_1.txt +9 -0
- data/templates/test/set2/template_with_no_erb_2.txt +9 -0
- data/templates/test/set3/_layout.html.erb +4 -0
- data/templates/test/set3/content.html.erb +6 -0
- data/templates/time/filter.rb.erb +15 -0
- data/templates/time/rules.rb.erb +45 -0
- 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
|