origen 0.2.6 → 0.3.0

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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/bin/origen +3 -1
  3. data/config/boot.rb +1 -7
  4. data/config/commands.rb +0 -1
  5. data/config/version.rb +2 -2
  6. data/lib/c99/{j750_interface.rb → ate_interface.rb} +3 -11
  7. data/lib/c99/doc_interface.rb +1 -1
  8. data/lib/origen.rb +9 -30
  9. data/lib/origen/application.rb +10 -8
  10. data/lib/origen/application/configuration.rb +13 -26
  11. data/lib/origen/application/plugins.rb +122 -0
  12. data/lib/origen/application/plugins_manager.rb +16 -254
  13. data/lib/origen/application/release.rb +2 -2
  14. data/lib/origen/application/runner.rb +2 -4
  15. data/lib/origen/chips.rb +0 -0
  16. data/lib/origen/chips/chip.rb +0 -0
  17. data/lib/origen/chips/design_entry.rb +0 -0
  18. data/lib/origen/chips/doc_entry.rb +0 -0
  19. data/lib/origen/chips/note.rb +0 -0
  20. data/lib/origen/commands.rb +4 -44
  21. data/lib/origen/commands/compile.rb +1 -2
  22. data/lib/origen/commands/generate.rb +1 -1
  23. data/lib/origen/commands/interactive.rb +1 -2
  24. data/lib/origen/commands/plugin.rb +49 -56
  25. data/lib/origen/commands/program.rb +1 -1
  26. data/lib/origen/commands/rc.rb +2 -2
  27. data/lib/origen/commands/version.rb +2 -17
  28. data/lib/origen/commands_global.rb +3 -0
  29. data/lib/origen/file_handler.rb +10 -10
  30. data/lib/origen/generator.rb +1 -1
  31. data/lib/origen/generator/job.rb +1 -1
  32. data/lib/origen/generator/pattern.rb +2 -2
  33. data/lib/origen/generator/pattern_finder.rb +10 -9
  34. data/lib/origen/pins/pin.rb +0 -0
  35. data/lib/origen/regression_manager.rb +0 -0
  36. data/lib/origen/remote_manager.rb +2 -8
  37. data/lib/origen/revision_control/design_sync.rb +0 -0
  38. data/lib/origen/revision_control/git.rb +0 -0
  39. data/lib/origen/specs.rb +0 -0
  40. data/lib/origen/specs/checkers.rb +0 -0
  41. data/lib/origen/specs/creation_info.rb +0 -0
  42. data/lib/origen/specs/exhibit.rb +0 -0
  43. data/lib/origen/specs/spec.rb +0 -0
  44. data/lib/origen/utility.rb +0 -1
  45. data/lib/origen/utility/diff.rb +0 -0
  46. metadata +42 -119
  47. data/lib/origen/import_manager.rb +0 -596
  48. data/lib/origen/nvm.rb +0 -6
  49. data/lib/origen/nvm/block_array.rb +0 -72
  50. data/lib/origen/tester.rb +0 -56
  51. data/lib/origen/tester/api.rb +0 -277
  52. data/lib/origen/tester/bdm/bdm.rb +0 -25
  53. data/lib/origen/tester/doc/doc.rb +0 -226
  54. data/lib/origen/tester/doc/generator.rb +0 -126
  55. data/lib/origen/tester/doc/generator/flow.rb +0 -71
  56. data/lib/origen/tester/doc/generator/flow_line.rb +0 -203
  57. data/lib/origen/tester/doc/generator/test.rb +0 -68
  58. data/lib/origen/tester/doc/generator/test_group.rb +0 -66
  59. data/lib/origen/tester/doc/generator/tests.rb +0 -47
  60. data/lib/origen/tester/doc/model.rb +0 -162
  61. data/lib/origen/tester/generator.rb +0 -271
  62. data/lib/origen/tester/generator/flow_control_api.rb +0 -606
  63. data/lib/origen/tester/generator/identity_map.rb +0 -25
  64. data/lib/origen/tester/generator/placeholder.rb +0 -13
  65. data/lib/origen/tester/generator/test_numberer.rb +0 -25
  66. data/lib/origen/tester/interface.rb +0 -154
  67. data/lib/origen/tester/j750/files.rb +0 -45
  68. data/lib/origen/tester/j750/generator.rb +0 -203
  69. data/lib/origen/tester/j750/generator/flow.rb +0 -123
  70. data/lib/origen/tester/j750/generator/flow_line.rb +0 -288
  71. data/lib/origen/tester/j750/generator/patgroup.rb +0 -111
  72. data/lib/origen/tester/j750/generator/patgroups.rb +0 -41
  73. data/lib/origen/tester/j750/generator/patset.rb +0 -111
  74. data/lib/origen/tester/j750/generator/patsets.rb +0 -41
  75. data/lib/origen/tester/j750/generator/templates/flow.txt.erb +0 -9
  76. data/lib/origen/tester/j750/generator/templates/instances.txt.erb +0 -16
  77. data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +0 -8
  78. data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +0 -10
  79. data/lib/origen/tester/j750/generator/test_instance.rb +0 -846
  80. data/lib/origen/tester/j750/generator/test_instance_group.rb +0 -60
  81. data/lib/origen/tester/j750/generator/test_instances.rb +0 -182
  82. data/lib/origen/tester/j750/j750.rb +0 -845
  83. data/lib/origen/tester/j750/j750_hpt.rb +0 -35
  84. data/lib/origen/tester/j750/parser.rb +0 -104
  85. data/lib/origen/tester/j750/parser/ac_spec.rb +0 -11
  86. data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
  87. data/lib/origen/tester/j750/parser/dc_spec.rb +0 -36
  88. data/lib/origen/tester/j750/parser/dc_specs.rb +0 -50
  89. data/lib/origen/tester/j750/parser/descriptions.rb +0 -340
  90. data/lib/origen/tester/j750/parser/flow.rb +0 -111
  91. data/lib/origen/tester/j750/parser/flow_line.rb +0 -207
  92. data/lib/origen/tester/j750/parser/flows.rb +0 -23
  93. data/lib/origen/tester/j750/parser/pattern_set.rb +0 -94
  94. data/lib/origen/tester/j750/parser/pattern_sets.rb +0 -33
  95. data/lib/origen/tester/j750/parser/test_instance.rb +0 -322
  96. data/lib/origen/tester/j750/parser/test_instances.rb +0 -26
  97. data/lib/origen/tester/j750/parser/timeset.rb +0 -15
  98. data/lib/origen/tester/j750/parser/timesets.rb +0 -0
  99. data/lib/origen/tester/jlink/jlink.rb +0 -33
  100. data/lib/origen/tester/parser.rb +0 -24
  101. data/lib/origen/tester/parser/description_lookup.rb +0 -64
  102. data/lib/origen/tester/parser/searchable_array.rb +0 -32
  103. data/lib/origen/tester/parser/searchable_hash.rb +0 -32
  104. data/lib/origen/tester/time.rb +0 -338
  105. data/lib/origen/tester/timing.rb +0 -253
  106. data/lib/origen/tester/ultraflex/files.rb +0 -45
  107. data/lib/origen/tester/ultraflex/generator.rb +0 -200
  108. data/lib/origen/tester/ultraflex/generator/flow.rb +0 -119
  109. data/lib/origen/tester/ultraflex/generator/flow_line.rb +0 -269
  110. data/lib/origen/tester/ultraflex/generator/patgroup.rb +0 -111
  111. data/lib/origen/tester/ultraflex/generator/patgroups.rb +0 -41
  112. data/lib/origen/tester/ultraflex/generator/patset.rb +0 -111
  113. data/lib/origen/tester/ultraflex/generator/patsets.rb +0 -41
  114. data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +0 -9
  115. data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +0 -16
  116. data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +0 -8
  117. data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +0 -10
  118. data/lib/origen/tester/ultraflex/generator/test_instance.rb +0 -622
  119. data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +0 -60
  120. data/lib/origen/tester/ultraflex/generator/test_instances.rb +0 -174
  121. data/lib/origen/tester/ultraflex/parser.rb +0 -104
  122. data/lib/origen/tester/ultraflex/parser/ac_spec.rb +0 -11
  123. data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
  124. data/lib/origen/tester/ultraflex/parser/dc_spec.rb +0 -36
  125. data/lib/origen/tester/ultraflex/parser/dc_specs.rb +0 -50
  126. data/lib/origen/tester/ultraflex/parser/descriptions.rb +0 -342
  127. data/lib/origen/tester/ultraflex/parser/flow.rb +0 -111
  128. data/lib/origen/tester/ultraflex/parser/flow_line.rb +0 -207
  129. data/lib/origen/tester/ultraflex/parser/flows.rb +0 -23
  130. data/lib/origen/tester/ultraflex/parser/pattern_set.rb +0 -94
  131. data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +0 -33
  132. data/lib/origen/tester/ultraflex/parser/test_instance.rb +0 -262
  133. data/lib/origen/tester/ultraflex/parser/test_instances.rb +0 -26
  134. data/lib/origen/tester/ultraflex/parser/timeset.rb +0 -15
  135. data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
  136. data/lib/origen/tester/ultraflex/ultraflex.rb +0 -759
  137. data/lib/origen/tester/v93k/generator.rb +0 -80
  138. data/lib/origen/tester/v93k/generator/flow.rb +0 -63
  139. data/lib/origen/tester/v93k/generator/flow_node.rb +0 -17
  140. data/lib/origen/tester/v93k/generator/flow_node/print.rb +0 -10
  141. data/lib/origen/tester/v93k/generator/pattern.rb +0 -16
  142. data/lib/origen/tester/v93k/generator/pattern_master.rb +0 -54
  143. data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +0 -6
  144. data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +0 -11
  145. data/lib/origen/tester/v93k/generator/templates/template.flow.erb +0 -121
  146. data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +0 -9
  147. data/lib/origen/tester/v93k/generator/test_function.rb +0 -103
  148. data/lib/origen/tester/v93k/generator/test_functions.rb +0 -79
  149. data/lib/origen/tester/v93k/generator/test_method.rb +0 -46
  150. data/lib/origen/tester/v93k/generator/test_methods.rb +0 -75
  151. data/lib/origen/tester/v93k/generator/test_suite.rb +0 -54
  152. data/lib/origen/tester/v93k/generator/test_suites.rb +0 -65
  153. data/lib/origen/tester/v93k/v93k.rb +0 -420
  154. data/lib/origen/tester/vector.rb +0 -86
  155. data/lib/origen/tester/vector_generator.rb +0 -637
  156. data/lib/origen/tester/vector_pipeline.rb +0 -150
  157. data/lib/origen/utility/design_sync.rb +0 -494
  158. data/lib/origen/version_checker.rb +0 -117
@@ -1,150 +0,0 @@
1
- module Origen
2
- module Tester
3
- class VectorPipeline
4
- attr_reader :group_size, :pipeline
5
-
6
- def initialize(group_size)
7
- @group_size = group_size
8
- @pipeline = []
9
- end
10
-
11
- # Add a vector/comment to the pipeline
12
- def <<(vector)
13
- if vector.is_a?(Vector)
14
- consume_comments(vector)
15
- if vector.repeat > 1
16
- add_repeat_vector(vector)
17
- else
18
- pipeline << vector
19
- end
20
- else
21
- comments << vector
22
- end
23
- end
24
-
25
- # If there are complete groups sitting at the top of the pipeline
26
- # then this will yield them back line by line, stopping when after the last
27
- # complete group and leaving any remaining single vectors in the pipeline
28
- # If there are no complete groups present then it will just return
29
- def flush
30
- while lead_group_finalized?
31
- lead_group.each do |vector|
32
- vector.comments.each do |comment|
33
- yield comment
34
- end
35
- yield vector
36
- end
37
- pipeline.shift(group_size)
38
- end
39
- end
40
-
41
- # Call at the end to force a flush out of any remaining vectors
42
- def empty
43
- if !pipeline.empty? || !comments.empty?
44
- pipeline.each do |vector|
45
- vector.comments.each do |comment|
46
- yield comment
47
- end
48
- yield vector
49
- end
50
- comments.each do |comment|
51
- yield comment
52
- end
53
- @pipeline = []
54
- @comments = []
55
- end
56
- end
57
-
58
- private
59
-
60
- # Pushes a duplicate of the given vector with its repeat set to 1
61
- # Also clears any comments associated with the vector with the rationale that we only
62
- # want to see them the first time
63
- def push_duplicate(vector)
64
- v = vector.dup
65
- v.repeat = 1
66
- pipeline << v
67
- vector.comments = []
68
- end
69
-
70
- def add_repeat_vector(vector)
71
- count = vector.repeat
72
- # Align to the start of a new group by splitting off single vectors
73
- # to complete the current group
74
- while !aligned? && count > 0
75
- push_duplicate(vector)
76
- count -= 1
77
- end
78
- if count > group_size
79
- remainder = count % group_size
80
- # Create a group with the required repeat
81
- group_size.times do
82
- push_duplicate(vector)
83
- end
84
- pipeline.last.repeat = (count - remainder) / group_size
85
- # Then expand out any leftover
86
- remainder.times do
87
- push_duplicate(vector)
88
- end
89
- # For small repeats that fit within the group just expand them
90
- else
91
- while count > 0
92
- push_duplicate(vector)
93
- count -= 1
94
- end
95
- end
96
- end
97
-
98
- # Returns true of the next vector to be added to the pipeline will
99
- # be at the start of a new group
100
- def aligned?
101
- (pipeline.size % group_size) == 0
102
- end
103
-
104
- def consume_comments(vector)
105
- vector.comments = comments
106
- @comments = []
107
- end
108
-
109
- def comments
110
- @comments ||= []
111
- end
112
-
113
- # When true the lead group is complete and a further repeat of it is not possible
114
- # Calling this will compress the 2nd group into the 1st if possible
115
- def lead_group_finalized?
116
- if lead_group.size == group_size
117
- if second_group_present?
118
- i = -1
119
- if second_group.all? do |vector|
120
- i += 1
121
- pipeline[i] == vector
122
- end
123
- pipeline[group_size - 1].repeat += 1
124
- group_size.times { pipeline.delete_at(group_size) }
125
- false
126
- else
127
- true
128
- end
129
- else
130
- false
131
- end
132
- else
133
- false
134
- end
135
- end
136
-
137
- def second_group_present?
138
- second_group.size == group_size
139
- end
140
-
141
- def lead_group
142
- pipeline[0..group_size - 1]
143
- end
144
-
145
- def second_group
146
- pipeline[group_size..(group_size * 2) - 1]
147
- end
148
- end
149
- end
150
- end
@@ -1,494 +0,0 @@
1
- module Origen
2
- module Utility
3
- # Ruby API to interface with Design Sync
4
- class DesignSync
5
- # Tag the target which is an absolute path to a file or directory.
6
- #
7
- # ==== Options
8
- #
9
- # * :rec # Recursive, false by default
10
- # * :delete # Delete the given tag from the target, false by default
11
- # * :replace # Replace any existing version of the given tag, false by default
12
- # * :exclude # Supply filenames to exclude or wildcard, e.g. "*.lst,*.S19"
13
- #
14
- # ==== Example
15
- #
16
- # tag(Origen.root, "my_release_001", :rec => true)
17
- # tag("#{Origen.root}/top/top_block.rb", "my_release_001")
18
- def tag(target, tag, options = {})
19
- options = { rec: false, # Set true to tag recursively
20
- delete: false,
21
- replace: false
22
- }.merge(options)
23
- cmd = "dssc tag #{tag} #{exclude(options)} #{options[:replace] ? '-replace' : ''} #{rec(options)} #{options[:delete] ? '-delete' : ''} #{target}"
24
- if options[:debug]
25
- puts '**** DesignSync Debug ****'
26
- puts cmd
27
- else
28
- system(cmd)
29
- end
30
- end
31
-
32
- # Import a file to the local workspace from another vault, where the vault
33
- # argument must include the full path to the requested file. You can optionally
34
- # supply a destination for where you want the file to end up, if no destination
35
- # is supplied the file will end up in the PWD.
36
- #
37
- # ==== Example
38
- #
39
- # # Import this file and save it in Origen.root
40
- # file = "design_sync.rb"
41
- # vault = "sync://sync-15088:15088/Projects/common_tester_blocks/origen/lib/sys"
42
- # version = "v0.1.0" # Version can be any valid DS identifier, e.g. a version number or tag
43
- #
44
- # import(file, vault, version, Origen.root)
45
- def import(file, vault, version, destination = false)
46
- puts 'Importing from DesignSync...'
47
- puts "#{vault}/#{file} #{version}"
48
- unless sys("dssc import -version #{version} -force #{vault} #{file}")[0] =~ /Success/
49
- fail "Error importing #{file} from Design Sync"
50
- end
51
- if Origen.running_on_windows?
52
- sys("move /Y #{file} #{destination}/.") if destination
53
- else
54
- sys("mv -f #{file} #{destination}/.") if destination
55
- end
56
- end
57
-
58
- # Check out a specific target which should be an absolute path to the target file, or
59
- # wildcard expression.
60
- #
61
- # ==== Options:
62
- #
63
- # * :rec # Do a recursive checkout, false by default
64
- # * :lock # Check out with a lock (overrides get option due to DesignSync get/lock incompatibility)
65
- # * :version # Specific tag or version number, will get latest by default
66
- # * :force # Force check out, false by default
67
- # * :verbose # Display output to terminal, false by default
68
- # * :get # Fetch locally editable copies, true by default (unless lock is set)
69
- #
70
- # ==== Example
71
- #
72
- # # Checkout everything in Origen.root
73
- # check_out("#{Origen.root}/*", :rec => true)
74
- def check_out(target, options = {})
75
- options = {
76
- get: true
77
- }.merge(options)
78
- cmd = "dssc co #{rec(options)} #{get(options)} #{loc(options)} #{ver(options)} #{force(options)} -nocomment #{target}"
79
- launch(cmd, options[:verbose])
80
- end
81
-
82
- # Check in a specific target which should be an absolute path to the target file, or
83
- # wildcard expression.
84
- #
85
- # ==== Options:
86
- #
87
- # * :rec # Do a recursive check-in, false by default
88
- # * :comment # Supply a comment to go with the check-in
89
- # * :new # Allow check in of new files (i.e. add the file to revision control)
90
- # * :verbose # Display output to terminal, false by default
91
- # * :skip # Allow check in to skip over a newer version of the file if it exists
92
- # * :keep # Keep editable copy of the files post check-in, false by default
93
- #
94
- # ==== Example
95
- #
96
- # # Check-in everything in Origen.root
97
- # check_in("#{Origen.root}/*", :rec => true, :com => "Periodic checkin, still in development")
98
- def check_in(target, options = {})
99
- options = {
100
- keep: true
101
- }.merge(options)
102
- # FYI: for debug use '-dryrun' option to 'dssc ci' command
103
- cmd = "dssc ci #{keep(options)} #{rec(options)} #{new(options)} #{com(options)} #{branch(options)} #{options[:skip] ? '-skip' : ''} #{target}"
104
- launch(cmd, options[:verbose])
105
- end
106
-
107
- # Check in the contents of the given directory to a remote vault location, that is a vault location
108
- # that is not associated with the workspace that the given files are in.
109
- #
110
- # Anything found in the given directory will be checked in, even files which are not currently under
111
- # revision control.
112
- #
113
- # No attempt will be made to merge the current vault contents with the local data, the local data
114
- # will always be checked in as lastest.
115
- #
116
- # A tag can be optionally supplied and if present will be applied to the files post check in.
117
- #
118
- # @example
119
- #
120
- # ds.remote_check_in("#{Origen.root}/output/j750", :vault => "sync://sync-15088:15088/Projects/common_tester_blocks/origen_training/j750", :tag => Origen.app.version)
121
- def remote_check_in(dir, options = {})
122
- Origen.deprecate 'Use Origen::RevisionControl::DesignSync.remote_check_in instead'
123
- options = {
124
- verbose: true,
125
- rec: true,
126
- keep: true,
127
- new: true,
128
- skip: true,
129
- replace: true
130
- }.merge(options)
131
-
132
- dir = Pathname.new(dir)
133
- fail "Directory does not exist: #{dir}" unless dir.exist?
134
- fail "Only directories are supported by remote_check_in, this is not a directory: #{dir}" unless dir.directory?
135
- fail 'No vault option supplied to remote_check_in!' unless options[:vault]
136
- scratch = Pathname.new("#{Origen.app.workspace_manager.imports_directory}/design_sync/scratch")
137
- FileUtils.rm_rf(scratch) if scratch.exist?
138
- FileUtils.mkdir_p(scratch)
139
- FileUtils.cp_r("#{dir}/.", scratch)
140
- remove_dot_syncs!(scratch)
141
- launch("dssc setvault #{options[:vault]} #{scratch}", options[:verbose])
142
- check_in(scratch, options)
143
- tag(scratch, options[:tag], options) if options[:tag]
144
- FileUtils.rm_rf(scratch)
145
- end
146
-
147
- # Recursively remove all .SYNC directories from the given directory
148
- def remove_dot_syncs!(dir, _options = {})
149
- Origen.deprecate 'Use Origen::RevisionControl::DesignSync.remove_dot_syncs! instead'
150
- dir = Pathname.new(dir)
151
- fail "Directory does not exist: #{dir}" unless dir.exist?
152
- fail "Only directories are supported by remove_dot_syncs, this is not a directory: #{dir}" unless dir.directory?
153
- Dir.glob("#{dir}/**/.SYNC").sort.each do |dot_sync|
154
- FileUtils.rm_rf(dot_sync)
155
- end
156
- end
157
-
158
- # Cancel a checkout of a specific target which should be an absolute path to the target file,
159
- # or wildcard expression
160
- #
161
- # ==== Options:
162
- #
163
- # * :rec # Do a recursive cancel, false by default
164
- # * :force # Force cancel (overwrite local edits), false by default
165
- # * :exclude # Supply filenames to exclude or wildcard, e.g. "*.lst,*.S19"
166
- # * :keep # Keep editable copy of the files post cancel, false by default
167
- #
168
- # ==== Example
169
- #
170
- # # Cancel every checkout in Origen.root
171
- # cancel("#{Origen.root}/*", :rec => true, :force => true)
172
- def cancel(_target, options = {})
173
- # Note "-verbose" is not a valid option for dssc cancel
174
- cmd = "dssc cancel #{keep(options)} #{rec(options)} #{force(options)} #{exclude(options)}"
175
- launch(cmd)
176
- end
177
-
178
- # Almost the same as DesignSync#check_out but accepts some different options.
179
- #
180
- # ==== Options:
181
- #
182
- # * :rec # Do a recursive populate, false by default
183
- # * :version # Specific tag or version number, will get latest by default
184
- # * :force # Force populate (overwrite local edits), false by default
185
- # * :unify # Unify the workspace (remove any retired files you currently have checked out)
186
- # * :exclude # Supply filenames to exclude or wildcard, e.g. "*.lst,*.S19"
187
- # * :verbose # Display output to terminal, false by default
188
- # * :get # Fetch locally editable copies, true by default
189
- # * :merge # Merge local edits into latest files, false by default
190
- def populate(target, options = {})
191
- options = { unify: true,
192
- incremental: false,
193
- replace: false,
194
- get: true,
195
- merge: false
196
- }.merge(options)
197
- inc = options[:incremental] ? '-inc' : ''
198
- replace = options[:replace] ? '-replace' : ''
199
- cmd = "dssc pop #{inc} #{replace} #{rec(options)} #{force(options)} #{merge(options)} #{get(options)} #{ver(options)} #{uni(options)} #{exclude(options)} #{target}"
200
- successful = launch(cmd, options[:verbose])
201
- unless successful
202
- fail "Something went wrong when populating #{target} from DesignSync!"
203
- end
204
- end
205
-
206
- # Check if the supplied directory has any modified objects, will reflect the result from the
207
- # last call unless :refresh => true. Returns true or false.
208
- # See DesignSync#modified_objects for available options.
209
- #
210
- # ==== Example
211
- #
212
- # modified_objects? # Takes a while to run while the workspace is queried
213
- # modified_objects? # Runs very quickly and returns the cached answer
214
- # modified_objects?(:refresh => true) # Takes a while to run while the workspace is queried
215
- def modified_objects?(*args)
216
- modified_objects(*args).size > 0
217
- end
218
-
219
- # Returns the selector for the given object, which should be an absolute path to a
220
- # file or directory
221
- def selector(target)
222
- sys("dssc url selector #{target}")[0]
223
- end
224
-
225
- # Returns an array of paths to modified files, caches result for performance, set :refresh => true
226
- # to clear cache. The target should be an absolute path to the directory you want to query.
227
- #
228
- # ==== Options:
229
- #
230
- # * :rec # Do a recursive search, false by default
231
- # * :exclude # Supply filenames to exclude or wildcard, e.g. "*.lst,*.S19"
232
- # * :refresh # Force a new search, false by default
233
- #
234
- # ==== Example
235
- #
236
- # # Get all modified files in my project workspace
237
- # files = modified_objects(Origen.root, :rec => true)
238
- #
239
- # NOTE: -unmanaged and -managed are mutually exclusive, specifying both does neither!
240
- # -unmanaged : show only objects not under revision control
241
- # -managed : show only objects under revision control
242
- # -modified : show locally modified files in workspace (includes unmanaged objects)
243
- # -changed : shows not up-to-date files. Includes both locally modified and newer verions in vault.
244
- # Overrides -modified.
245
-
246
- def modified_objects(target, options = {})
247
- options = {
248
- managed: true, # by default handle managed (to permit for unmanaged case)
249
- remote: false, # includes files possibly modified by others in repository
250
- }.merge(options)
251
- # The result of this method is cached for future calls (method called twice actually)
252
- @objects = nil if options[:refresh]
253
- @needs_update_objects = nil if options[:refresh]
254
-
255
- if options[:remote]
256
- return @needs_update_objects if @needs_update_objects
257
- else
258
- return @objects if @objects
259
- end
260
-
261
- # Since DesignSync does not supply an option to only list files that need update (!), have to run with
262
- # -changed option then again without and difference the 2 arrays!
263
- if options[:remote]
264
- all_objects = sys("dssc ls #{rec(options)} #{exclude(options)} #{managed(options)} #{dssc_path(options)} -report N -modified #{unmanaged(options)} -changed -format text #{target}").reject do |item|
265
- # removes extraneous lines
266
- item =~ /^(Name|Directory|---)/
267
- end
268
- all_objects.map! do |object|
269
- object.strip! # Strip off any whitespace from all objects
270
- object.sub!(/^#{full_path_prefix}/, '')
271
- object.sub('|', ':')
272
- end
273
- end
274
-
275
- @objects = sys("dssc ls #{rec(options)} #{exclude(options)} #{managed(options)} #{dssc_path(options)} -report N -modified #{unmanaged(options)} -format text #{target}").reject do |item|
276
- # removes extraneous lines
277
- item =~ /^(Name|Directory|---)/
278
- end
279
- @objects.map! do |object|
280
- object.strip! # Strip off any whitespace from all objects
281
- object.sub!(/^#{full_path_prefix}/, '')
282
- object.sub('|', ':')
283
- end
284
-
285
- # Now difference the lists if remote desired
286
- if options[:remote]
287
- return @needs_update_objects = all_objects - @objects
288
- else
289
- return @objects
290
- end
291
- end
292
-
293
- def full_path_prefix
294
- @full_path_prefix ||= begin
295
- if Origen.running_on_windows?
296
- 'file:///'
297
- else
298
- 'file://'
299
- end
300
- end
301
- end
302
-
303
- # Check if the supplied directory has any changed objects vs the previous tag
304
- # See DesignSync#changed_objects for available options.
305
- def changed_objects?(*args)
306
- objects = changed_objects(*args)
307
- objects[:added].size > 0 || objects[:removed].size > 0 || objects[:changed].size > 0
308
- end
309
-
310
- # Returns a hash containing files that have changed vs. the previous tag, this is
311
- # organized as follows:
312
- #
313
- # {
314
- # :added => [], # Paths to files that have been added since the previous tag
315
- # :removed => [], # Paths to files that have been removed since the previous tag
316
- # :changed => [], # Paths to files that have changed since the previous tag
317
- # }
318
- def changed_objects(target, previous_tag, options = {})
319
- options = {
320
- }.merge(options)
321
- # We need to parse the following data from the output, ignore everything else
322
- # which will mostly refer to un-managed files.
323
- #
324
- # Added since previous version...
325
- # 1.12 First only source_setup
326
- # Removed since previous version...
327
- # 1.13 Second only lib/history
328
- # Modified since previous version...
329
- # 1.32 1.31 Different versions lib/origen/application.rb
330
- # Modified since previous version including a local edit...
331
- # 1.7 (Locally Modified) 1.7 Different states lib/origen/commands/rc.rb
332
- objects = {
333
- added: [], removed: [], changed: []
334
- }
335
- sys("dssc compare -rec -path -report silent -selector #{previous_tag} #{target}").each do |line|
336
- unless line =~ /Unmanaged/
337
- # http://www.rubular.com/r/GoNYB75upB
338
- if line =~ /\s*(\S+)\s+First only\s+(\S+)\s*/
339
- objects[:added] << Regexp.last_match[2]
340
- # http://www.rubular.com/r/Xvh32Lm4hS
341
- elsif line =~ /\s*(\S+)\s+Second only\s+(\S+)\s*/
342
- objects[:removed] << Regexp.last_match[2]
343
- # http://www.rubular.com/r/tvTHod9Mye
344
- elsif line =~ /\s*\S+\s+(\(Locally Modified\))?\s*(\S+)\s+Different (versions|states)\s+(\S+)\s*/
345
- objects[:changed] << Regexp.last_match[4]
346
- end
347
- end
348
- end
349
- objects
350
- end
351
-
352
- def diff_cmd(options = {})
353
- if options[:version]
354
- "dssc diff -gui -ver #{options[:version]}"
355
- else
356
- 'dssc diff -gui'
357
- end
358
- end
359
-
360
- # Returns true if the given file is known to Design Sync
361
- #
362
- # ==== Example
363
- #
364
- # managed_by_design_sync?("#{Origen.root}/config/application.rb")
365
- def managed_by_design_sync?(path, _options = {})
366
- res = sys "dssc url vault #{path}"
367
- if res.empty?
368
- false
369
- else
370
- if res.first =~ /^file:/ || res.first =~ /There is no object with that name/
371
- false
372
- else
373
- true
374
- end
375
- end
376
- end
377
-
378
- # Will recursively move back up the directory tree from the given
379
- # directory and return the first one that is not part of a Design Sync
380
- # workspace.
381
- #
382
- # The supplied pathname should be an absolute Pathname instance.
383
- def container_directory(pathname)
384
- if managed_by_design_sync?(pathname)
385
- container_directory(pathname.parent)
386
- else
387
- pathname
388
- end
389
- end
390
-
391
- # Initializes the given directory with the given vault reference
392
- def initialize_dir(dir, vault)
393
- Dir.chdir dir do
394
- sys "dssc setvault #{vault} ."
395
- end
396
- end
397
-
398
- # Returns the vault reference to give local file or directory
399
- def vault(file_or_dir)
400
- (sys "dssc url vault #{file_or_dir}").first
401
- end
402
-
403
- private
404
-
405
- # This will return true if the command has run successfully without errors
406
- def launch(cmd, verbose = false) # :nodoc:
407
- if verbose
408
- $stdout.sync = true
409
- puts cmd
410
- system cmd
411
- else
412
- `#{cmd}`
413
- $CHILD_STATUS.success?
414
- end
415
- end
416
-
417
- # Make a sys call, returning the output in an array
418
- def sys(call) # :nodoc:
419
- output = `#{call}`.split("\n")
420
- # Screen out some common redundant DS output before handing back
421
- output.reject do |item|
422
- item =~ /^Logging/ || item == '' ||
423
- item =~ /V(\d+\.\d+-\d+|\d.\d+)/ # Screen out something like "V5.1-1205" or "V6R2010"
424
- end
425
- end
426
-
427
- def exclude(options) # :nodoc:
428
- options[:exclude] ? "-exclude '#{options[:exclude]}'" : ''
429
- end
430
-
431
- def rec(options) # :nodoc:
432
- options[:rec] ? '-rec' : ''
433
- end
434
-
435
- def force(options) # :nodoc:
436
- options[:force] ? '-force' : ''
437
- end
438
-
439
- def uni(options) # :nodoc:
440
- (options[:uni] || options[:unify]) ? '-uni' : ''
441
- end
442
-
443
- def get(options) # :nodoc:
444
- # lock option overrides get option
445
- # due to incompatibility in DesignSync
446
- if !(options[:lock] || options[:loc])
447
- options[:get] ? '-get' : ''
448
- else
449
- ''
450
- end
451
- end
452
-
453
- def loc(options) # :nodoc:
454
- (options[:lock] || options[:loc]) ? '-loc' : '-get'
455
- end
456
-
457
- def keep(options) # :nodoc:
458
- (options[:keep]) ? '-keep' : ''
459
- end
460
-
461
- def merge(options) # :nodoc:
462
- (options[:merge]) ? '-merge' : ''
463
- end
464
-
465
- def ver(options) # :nodoc:
466
- options[:version] ? "-ver #{options[:version]}" : ''
467
- end
468
-
469
- def branch(options) # :nodoc:
470
- options[:branch] ? "-branch #{options[:branch]}" : ''
471
- end
472
-
473
- def new(options) # :nodoc:
474
- options[:new] ? '-new' : ''
475
- end
476
-
477
- def com(options) # :nodoc:
478
- options[:comment] ? "-com \"#{options[:comment]}\"" : '-comment /null'
479
- end
480
-
481
- def unmanaged(options) # :nodoc:
482
- options[:unmanaged] ? '-unmanaged' : ''
483
- end
484
-
485
- def managed(options) # :nodoc:
486
- options[:managed] ? '-managed' : ''
487
- end
488
-
489
- def dssc_path(options) # :nodoc:
490
- options[:fullpath] ? '-fullpath' : '-path'
491
- end
492
- end
493
- end
494
- end