plasmo_xcodeproj 1.21.1

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 (69) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +95 -0
  4. data/bin/xcodeproj +10 -0
  5. data/lib/xcodeproj/command/config_dump.rb +91 -0
  6. data/lib/xcodeproj/command/project_diff.rb +56 -0
  7. data/lib/xcodeproj/command/show.rb +60 -0
  8. data/lib/xcodeproj/command/sort.rb +44 -0
  9. data/lib/xcodeproj/command/target_diff.rb +43 -0
  10. data/lib/xcodeproj/command.rb +63 -0
  11. data/lib/xcodeproj/config/other_linker_flags_parser.rb +73 -0
  12. data/lib/xcodeproj/config.rb +386 -0
  13. data/lib/xcodeproj/constants.rb +465 -0
  14. data/lib/xcodeproj/differ.rb +239 -0
  15. data/lib/xcodeproj/gem_version.rb +5 -0
  16. data/lib/xcodeproj/helper.rb +30 -0
  17. data/lib/xcodeproj/plist.rb +94 -0
  18. data/lib/xcodeproj/project/case_converter.rb +90 -0
  19. data/lib/xcodeproj/project/object/build_configuration.rb +255 -0
  20. data/lib/xcodeproj/project/object/build_file.rb +84 -0
  21. data/lib/xcodeproj/project/object/build_phase.rb +369 -0
  22. data/lib/xcodeproj/project/object/build_rule.rb +109 -0
  23. data/lib/xcodeproj/project/object/configuration_list.rb +117 -0
  24. data/lib/xcodeproj/project/object/container_item_proxy.rb +116 -0
  25. data/lib/xcodeproj/project/object/file_reference.rb +338 -0
  26. data/lib/xcodeproj/project/object/group.rb +506 -0
  27. data/lib/xcodeproj/project/object/helpers/build_settings_array_settings_by_object_version.rb +72 -0
  28. data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +245 -0
  29. data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +260 -0
  30. data/lib/xcodeproj/project/object/native_target.rb +751 -0
  31. data/lib/xcodeproj/project/object/reference_proxy.rb +86 -0
  32. data/lib/xcodeproj/project/object/root_object.rb +100 -0
  33. data/lib/xcodeproj/project/object/swift_package_product_dependency.rb +29 -0
  34. data/lib/xcodeproj/project/object/swift_package_remote_reference.rb +33 -0
  35. data/lib/xcodeproj/project/object/target_dependency.rb +94 -0
  36. data/lib/xcodeproj/project/object.rb +534 -0
  37. data/lib/xcodeproj/project/object_attributes.rb +522 -0
  38. data/lib/xcodeproj/project/object_dictionary.rb +210 -0
  39. data/lib/xcodeproj/project/object_list.rb +223 -0
  40. data/lib/xcodeproj/project/project_helper.rb +341 -0
  41. data/lib/xcodeproj/project/uuid_generator.rb +132 -0
  42. data/lib/xcodeproj/project.rb +874 -0
  43. data/lib/xcodeproj/scheme/abstract_scheme_action.rb +100 -0
  44. data/lib/xcodeproj/scheme/analyze_action.rb +19 -0
  45. data/lib/xcodeproj/scheme/archive_action.rb +59 -0
  46. data/lib/xcodeproj/scheme/build_action.rb +298 -0
  47. data/lib/xcodeproj/scheme/buildable_product_runnable.rb +55 -0
  48. data/lib/xcodeproj/scheme/buildable_reference.rb +129 -0
  49. data/lib/xcodeproj/scheme/command_line_arguments.rb +162 -0
  50. data/lib/xcodeproj/scheme/environment_variables.rb +170 -0
  51. data/lib/xcodeproj/scheme/execution_action.rb +86 -0
  52. data/lib/xcodeproj/scheme/launch_action.rb +179 -0
  53. data/lib/xcodeproj/scheme/location_scenario_reference.rb +49 -0
  54. data/lib/xcodeproj/scheme/macro_expansion.rb +34 -0
  55. data/lib/xcodeproj/scheme/profile_action.rb +57 -0
  56. data/lib/xcodeproj/scheme/remote_runnable.rb +92 -0
  57. data/lib/xcodeproj/scheme/send_email_action_content.rb +84 -0
  58. data/lib/xcodeproj/scheme/shell_script_action_content.rb +77 -0
  59. data/lib/xcodeproj/scheme/test_action.rb +394 -0
  60. data/lib/xcodeproj/scheme/xml_element_wrapper.rb +82 -0
  61. data/lib/xcodeproj/scheme.rb +375 -0
  62. data/lib/xcodeproj/user_interface.rb +22 -0
  63. data/lib/xcodeproj/workspace/file_reference.rb +79 -0
  64. data/lib/xcodeproj/workspace/group_reference.rb +67 -0
  65. data/lib/xcodeproj/workspace/reference.rb +40 -0
  66. data/lib/xcodeproj/workspace.rb +277 -0
  67. data/lib/xcodeproj/xcodebuild_helper.rb +108 -0
  68. data/lib/xcodeproj.rb +29 -0
  69. metadata +208 -0
@@ -0,0 +1,375 @@
1
+ require 'rexml/document'
2
+
3
+ require 'xcodeproj/scheme/build_action'
4
+ require 'xcodeproj/scheme/test_action'
5
+ require 'xcodeproj/scheme/launch_action'
6
+ require 'xcodeproj/scheme/profile_action'
7
+ require 'xcodeproj/scheme/analyze_action'
8
+ require 'xcodeproj/scheme/archive_action'
9
+
10
+ require 'xcodeproj/scheme/buildable_product_runnable'
11
+ require 'xcodeproj/scheme/buildable_reference'
12
+ require 'xcodeproj/scheme/location_scenario_reference'
13
+ require 'xcodeproj/scheme/execution_action'
14
+ require 'xcodeproj/scheme/macro_expansion'
15
+ require 'xcodeproj/scheme/remote_runnable'
16
+ require 'xcodeproj/scheme/send_email_action_content'
17
+ require 'xcodeproj/scheme/shell_script_action_content'
18
+
19
+ module Xcodeproj
20
+ # This class represents a Scheme document represented by a ".xcscheme" file
21
+ # usually stored in a xcuserdata or xcshareddata (for a shared scheme)
22
+ # folder.
23
+ #
24
+ class XCScheme
25
+ # @return [REXML::Document] the XML object that will be manipulated to save
26
+ # the scheme file after.
27
+ #
28
+ attr_reader :doc
29
+
30
+ # Create a XCScheme either from scratch or using an existing file
31
+ #
32
+ # @param [String] file_path
33
+ # The path of the existing .xcscheme file. If nil will create an empty scheme
34
+ #
35
+ def initialize(file_path = nil)
36
+ if file_path
37
+ @file_path = file_path
38
+ @doc = File.open(file_path, 'r') do |f|
39
+ REXML::Document.new(f)
40
+ end
41
+ @doc.context[:attribute_quote] = :quote
42
+
43
+ @scheme = @doc.elements['Scheme']
44
+ else
45
+ @doc = REXML::Document.new
46
+ @doc.context[:attribute_quote] = :quote
47
+ @doc << REXML::XMLDecl.new(REXML::XMLDecl::DEFAULT_VERSION, 'UTF-8')
48
+
49
+ @scheme = @doc.add_element 'Scheme'
50
+ @scheme.attributes['LastUpgradeVersion'] = Constants::LAST_UPGRADE_CHECK
51
+ @scheme.attributes['version'] = Xcodeproj::Constants::XCSCHEME_FORMAT_VERSION
52
+
53
+ self.build_action = BuildAction.new
54
+ self.test_action = TestAction.new
55
+ self.launch_action = LaunchAction.new
56
+ self.profile_action = ProfileAction.new
57
+ self.analyze_action = AnalyzeAction.new
58
+ self.archive_action = ArchiveAction.new
59
+ end
60
+ end
61
+
62
+ # Convenience method to quickly add app and test targets to a new scheme.
63
+ #
64
+ # It will add the runnable_target to the Build, Launch and Profile actions
65
+ # and the test_target to the Build and Test actions
66
+ #
67
+ # @param [Xcodeproj::Project::Object::PBXAbstractTarget] runnable_target
68
+ # The target to use for the 'Run', 'Profile' and 'Analyze' actions
69
+ #
70
+ # @param [Xcodeproj::Project::Object::PBXAbstractTarget] test_target
71
+ # The target to use for the 'Test' action
72
+ #
73
+ # @param [Boolean] launch_target
74
+ # Determines if the runnable_target is launchable.
75
+ #
76
+ def configure_with_targets(runnable_target, test_target, launch_target: false)
77
+ if runnable_target
78
+ add_build_target(runnable_target)
79
+ set_launch_target(runnable_target) if launch_target
80
+ end
81
+ if test_target
82
+ add_build_target(test_target, false) if test_target != runnable_target
83
+ add_test_target(test_target)
84
+ end
85
+ end
86
+
87
+ public
88
+
89
+ # @!group Access Action nodes
90
+
91
+ # @return [XCScheme::BuildAction]
92
+ # The Build Action associated with this scheme
93
+ #
94
+ def build_action
95
+ @build_action ||= BuildAction.new(@scheme.elements['BuildAction'])
96
+ end
97
+
98
+ # @param [XCScheme::BuildAction] action
99
+ # The Build Action to associate to this scheme
100
+ #
101
+ def build_action=(action)
102
+ @scheme.delete_element('BuildAction')
103
+ @scheme.add_element(action.xml_element)
104
+ @build_action = action
105
+ end
106
+
107
+ # @return [XCScheme::TestAction]
108
+ # The Test Action associated with this scheme
109
+ #
110
+ def test_action
111
+ @test_action ||= TestAction.new(@scheme.elements['TestAction'])
112
+ end
113
+
114
+ # @param [XCScheme::TestAction] action
115
+ # The Test Action to associate to this scheme
116
+ #
117
+ def test_action=(action)
118
+ @scheme.delete_element('TestAction')
119
+ @scheme.add_element(action.xml_element)
120
+ @test_action = action
121
+ end
122
+
123
+ # @return [XCScheme::LaunchAction]
124
+ # The Launch Action associated with this scheme
125
+ #
126
+ def launch_action
127
+ @launch_action ||= LaunchAction.new(@scheme.elements['LaunchAction'])
128
+ end
129
+
130
+ # @param [XCScheme::LaunchAction] action
131
+ # The Launch Action to associate to this scheme
132
+ #
133
+ def launch_action=(action)
134
+ @scheme.delete_element('LaunchAction')
135
+ @scheme.add_element(action.xml_element)
136
+ @launch_action = action
137
+ end
138
+
139
+ # @return [XCScheme::ProfileAction]
140
+ # The Profile Action associated with this scheme
141
+ #
142
+ def profile_action
143
+ @profile_action ||= ProfileAction.new(@scheme.elements['ProfileAction'])
144
+ end
145
+
146
+ # @param [XCScheme::ProfileAction] action
147
+ # The Profile Action to associate to this scheme
148
+ #
149
+ def profile_action=(action)
150
+ @scheme.delete_element('ProfileAction')
151
+ @scheme.add_element(action.xml_element)
152
+ @profile_action = action
153
+ end
154
+
155
+ # @return [XCScheme::AnalyzeAction]
156
+ # The Analyze Action associated with this scheme
157
+ #
158
+ def analyze_action
159
+ @analyze_action ||= AnalyzeAction.new(@scheme.elements['AnalyzeAction'])
160
+ end
161
+
162
+ # @param [XCScheme::AnalyzeAction] action
163
+ # The Analyze Action to associate to this scheme
164
+ #
165
+ def analyze_action=(action)
166
+ @scheme.delete_element('AnalyzeAction')
167
+ @scheme.add_element(action.xml_element)
168
+ @analyze_action = action
169
+ end
170
+
171
+ # @return [XCScheme::ArchiveAction]
172
+ # The Archive Action associated with this scheme
173
+ #
174
+ def archive_action
175
+ @archive_action ||= ArchiveAction.new(@scheme.elements['ArchiveAction'])
176
+ end
177
+
178
+ # @param [XCScheme::ArchiveAction] action
179
+ # The Archive Action to associate to this scheme
180
+ #
181
+ def archive_action=(action)
182
+ @scheme.delete_element('ArchiveAction')
183
+ @scheme.add_element(action.xml_element)
184
+ @archive_action = action
185
+ end
186
+
187
+ # @!group Target methods
188
+
189
+ # Add a target to the list of targets to build in the build action.
190
+ #
191
+ # @param [Xcodeproj::Project::Object::AbstractTarget] build_target
192
+ # A target used by scheme in the build step.
193
+ #
194
+ # @param [Bool] build_for_running
195
+ # Whether to build this target in the launch action. Often false for test targets.
196
+ #
197
+ def add_build_target(build_target, build_for_running = true)
198
+ entry = BuildAction::Entry.new(build_target)
199
+
200
+ entry.build_for_testing = true
201
+ entry.build_for_running = build_for_running
202
+ entry.build_for_profiling = build_for_running
203
+ entry.build_for_archiving = build_for_running
204
+ entry.build_for_analyzing = build_for_running
205
+
206
+ build_action.add_entry(entry)
207
+ end
208
+
209
+ # Add a target to the list of targets to build in the build action.
210
+ #
211
+ # @param [Xcodeproj::Project::Object::AbstractTarget] test_target
212
+ # A target used by scheme in the test step.
213
+ #
214
+ def add_test_target(test_target)
215
+ testable = TestAction::TestableReference.new(test_target)
216
+ test_action.add_testable(testable)
217
+ end
218
+
219
+ # Sets a runnable target to be the target of the launch action of the scheme.
220
+ #
221
+ # @param [Xcodeproj::Project::Object::AbstractTarget] build_target
222
+ # A target used by scheme in the launch step.
223
+ #
224
+ def set_launch_target(build_target)
225
+ launch_runnable = BuildableProductRunnable.new(build_target, 0)
226
+ launch_action.buildable_product_runnable = launch_runnable
227
+
228
+ profile_runnable = BuildableProductRunnable.new(build_target, 0)
229
+ profile_action.buildable_product_runnable = profile_runnable
230
+
231
+ macro_exp = MacroExpansion.new(build_target)
232
+ test_action.add_macro_expansion(macro_exp)
233
+ end
234
+
235
+ # @!group Class methods
236
+
237
+ #-------------------------------------------------------------------------#
238
+
239
+ # Share a User Scheme. Basically this method move the xcscheme file from
240
+ # the xcuserdata folder to xcshareddata folder.
241
+ #
242
+ # @param [String] project_path
243
+ # Path of the .xcodeproj folder.
244
+ #
245
+ # @param [String] scheme_name
246
+ # The name of scheme that will be shared.
247
+ #
248
+ # @param [String] user
249
+ # The user name that have the scheme.
250
+ #
251
+ def self.share_scheme(project_path, scheme_name, user = nil)
252
+ to_folder = shared_data_dir(project_path)
253
+ to_folder.mkpath
254
+ to = to_folder + "#{scheme_name}.xcscheme"
255
+ from = user_data_dir(project_path, user) + "#{scheme_name}.xcscheme"
256
+ FileUtils.mv(from, to)
257
+ end
258
+
259
+ # @return [Pathname]
260
+ #
261
+ def self.shared_data_dir(project_path)
262
+ project_path = Pathname.new(project_path)
263
+ project_path + 'xcshareddata/xcschemes'
264
+ end
265
+
266
+ # @return [Pathname]
267
+ #
268
+ def self.user_data_dir(project_path, user = nil)
269
+ project_path = Pathname.new(project_path)
270
+ user ||= ENV['USER']
271
+ project_path + "xcuserdata/#{user}.xcuserdatad/xcschemes"
272
+ end
273
+
274
+ public
275
+
276
+ # @!group Serialization
277
+
278
+ #-------------------------------------------------------------------------#
279
+
280
+ # Serializes the current state of the object to a String.
281
+ #
282
+ # @note The goal of the string representation is to match Xcode output as
283
+ # close as possible to aide comparison.
284
+ #
285
+ # @return [String] the XML string value of the current state of the object.
286
+ #
287
+ def to_s
288
+ formatter = XMLFormatter.new(2)
289
+ formatter.compact = false
290
+ out = ''
291
+ formatter.write(@doc, out)
292
+ out.gsub!("<?xml version='1.0' encoding='UTF-8'?>", '<?xml version="1.0" encoding="UTF-8"?>')
293
+ out << "\n"
294
+ out
295
+ end
296
+
297
+ # Serializes the current state of the object to a ".xcscheme" file.
298
+ #
299
+ # @param [String, Pathname] project_path
300
+ # The path where the ".xcscheme" file should be stored.
301
+ #
302
+ # @param [String] name
303
+ # The name of the scheme, to have ".xcscheme" appended.
304
+ #
305
+ # @param [Boolean] shared
306
+ # true => if the scheme must be a shared scheme (default value)
307
+ # false => if the scheme must be a user scheme
308
+ #
309
+ # @return [void]
310
+ #
311
+ # @example Saving a scheme
312
+ # scheme.save_as('path/to/Project.xcodeproj') #=> true
313
+ #
314
+ def save_as(project_path, name, shared = true)
315
+ scheme_folder_path = if shared
316
+ self.class.shared_data_dir(project_path)
317
+ else
318
+ self.class.user_data_dir(project_path)
319
+ end
320
+ scheme_folder_path.mkpath
321
+ scheme_path = scheme_folder_path + "#{name}.xcscheme"
322
+ @file_path = scheme_path
323
+ File.open(scheme_path, 'w') do |f|
324
+ f.write(to_s)
325
+ end
326
+ end
327
+
328
+ # Serializes the current state of the object to the original ".xcscheme"
329
+ # file this XCScheme was created from, overriding the original file.
330
+ #
331
+ # Requires that the XCScheme object was initialized using a file path.
332
+ #
333
+ def save!
334
+ raise Informative, 'This XCScheme object was not initialized ' \
335
+ 'using a file path. Use save_as instead.' unless @file_path
336
+ File.open(@file_path, 'w') do |f|
337
+ f.write(to_s)
338
+ end
339
+ end
340
+
341
+ #-------------------------------------------------------------------------#
342
+
343
+ # XML formatter which closely mimics the output generated by Xcode.
344
+ #
345
+ class XMLFormatter < REXML::Formatters::Pretty
346
+ def write_element(node, output)
347
+ @indentation = 3
348
+ output << ' ' * @level
349
+ output << "<#{node.expanded_name}"
350
+
351
+ @level += @indentation
352
+ node.context = node.parent.context # HACK: to ensure strings are properly quoted
353
+ node.attributes.each_attribute do |attr|
354
+ output << "\n"
355
+ output << ' ' * @level
356
+ output << attr.to_string.sub(/=/, ' = ')
357
+ end unless node.attributes.empty?
358
+
359
+ output << '>'
360
+
361
+ output << "\n"
362
+ node.children.each do |child|
363
+ next if child.is_a?(REXML::Text) && child.to_s.strip.length == 0
364
+ write(child, output)
365
+ output << "\n"
366
+ end
367
+ @level -= @indentation
368
+ output << ' ' * @level
369
+ output << "</#{node.expanded_name}>"
370
+ end
371
+ end
372
+
373
+ #-------------------------------------------------------------------------#
374
+ end
375
+ end
@@ -0,0 +1,22 @@
1
+ module Xcodeproj
2
+ # Manages the UI output so clients can customize it.
3
+ #
4
+ module UserInterface
5
+ # Prints a message to standard output.
6
+ #
7
+ # @return [void]
8
+ #
9
+ def self.puts(message)
10
+ STDOUT.puts message
11
+ end
12
+
13
+ # Prints a message to standard error.
14
+ #
15
+ # @return [void]
16
+ #
17
+ def self.warn(message)
18
+ STDERR.puts message
19
+ end
20
+ end
21
+ UI = UserInterface
22
+ end
@@ -0,0 +1,79 @@
1
+ require 'xcodeproj/workspace/reference'
2
+
3
+ module Xcodeproj
4
+ class Workspace
5
+ # Describes a file reference of a Workspace.
6
+ #
7
+ class FileReference < Reference
8
+ # @return [String] the path to the project
9
+ #
10
+ attr_reader :path
11
+
12
+ # @param [#to_s] path @see path
13
+ # @param [#to_s] type @see type
14
+ #
15
+ def initialize(path, type = 'group')
16
+ @path = Pathname.new(path.to_s).cleanpath.to_s
17
+ @type = type.to_s
18
+ end
19
+
20
+ # @return [Bool] Wether a file reference is equal to another.
21
+ #
22
+ def ==(other)
23
+ path == other.path && type == other.type
24
+ end
25
+ alias_method :eql?, :==
26
+
27
+ # @return [Fixnum] A hash identical for equals objects.
28
+ #
29
+ def hash
30
+ [path, type].hash
31
+ end
32
+
33
+ # Returns a file reference given XML representation.
34
+ #
35
+ # @param [REXML::Element] xml_node
36
+ # the XML representation.
37
+ #
38
+ # @return [FileReference] The new file reference instance.
39
+ #
40
+ def self.from_node(xml_node)
41
+ type, path = xml_node.attribute('location').value.split(':', 2)
42
+ if type == 'group'
43
+ path = prepend_parent_path(xml_node, path)
44
+ end
45
+ new(path, type)
46
+ end
47
+
48
+ # @return [REXML::Element] the XML representation of the file reference.
49
+ #
50
+ def to_node
51
+ REXML::Element.new('FileRef').tap do |element|
52
+ element.add_attribute('location', "#{type}:#{path}")
53
+ end
54
+ end
55
+
56
+ # Returns the absolute path of a file reference given the path of the
57
+ # directory containing workspace.
58
+ #
59
+ # @param [#to_s] workspace_dir_path
60
+ # The Path of the directory containing the workspace.
61
+ #
62
+ # @return [String] The absolute path to the project.
63
+ #
64
+ def absolute_path(workspace_dir_path)
65
+ workspace_dir_path = workspace_dir_path.to_s
66
+ case type
67
+ when 'group', 'container', 'self'
68
+ File.expand_path(File.join(workspace_dir_path, path))
69
+ when 'absolute'
70
+ File.expand_path(path)
71
+ when 'developer'
72
+ raise "Developer workspace file reference type is not yet supported (#{path})"
73
+ else
74
+ raise "Unsupported workspace file reference type `#{type}`"
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,67 @@
1
+ require 'xcodeproj/workspace/reference'
2
+
3
+ module Xcodeproj
4
+ class Workspace
5
+ # Describes a group reference of a Workspace.
6
+ #
7
+ class GroupReference < Reference
8
+ # @return [String] the name of the group
9
+ #
10
+ attr_reader :name
11
+
12
+ # @return [String] the location of the group on disk
13
+ #
14
+ attr_reader :location
15
+
16
+ # @param [#to_s] name @see name
17
+ # @param [#to_s] type @see type
18
+ # @param [#to_s] location @see location
19
+ #
20
+ def initialize(name, type = 'container', location = '')
21
+ @name = name.to_s
22
+ @type = type.to_s
23
+ @location = location.to_s
24
+ end
25
+
26
+ # @return [Bool] Whether a group reference is equal to another.
27
+ #
28
+ def ==(other)
29
+ name == other.name && type == other.type && location == other.location
30
+ end
31
+ alias_method :eql?, :==
32
+
33
+ # @return [Fixnum] A hash identical for equals objects.
34
+ #
35
+ def hash
36
+ [name, type, location].hash
37
+ end
38
+
39
+ # Returns a group reference given XML representation.
40
+ #
41
+ # @param [REXML::Element] xml_node
42
+ # the XML representation.
43
+ #
44
+ # @return [GroupReference] The new group reference instance.
45
+ #
46
+ def self.from_node(xml_node)
47
+ location_array = xml_node.attribute('location').value.split(':', 2)
48
+ type = location_array.first
49
+ location = location_array[1] || ''
50
+ if type == 'group'
51
+ location = prepend_parent_path(xml_node, location)
52
+ end
53
+ name = xml_node.attribute('name').value
54
+ new(name, type, location)
55
+ end
56
+
57
+ # @return [REXML::Element] the XML representation of the group reference.
58
+ #
59
+ def to_node
60
+ REXML::Element.new('Group').tap do |element|
61
+ element.add_attribute('location', "#{type}:#{location}")
62
+ element.add_attribute('name', "#{name}")
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,40 @@
1
+ module Xcodeproj
2
+ class Workspace
3
+ # Describes a file/group reference of a Workspace.
4
+ #
5
+ class Reference
6
+ # @return [String] the type of reference to the project
7
+ #
8
+ # This can be of the following values:
9
+ # - absolute
10
+ # - group
11
+ # - container
12
+ # - developer (unsupported)
13
+ #
14
+ attr_reader :type
15
+
16
+ # Returns the relative path to the parent group reference (if one exists)
17
+ # prepended to the passed in path.
18
+ #
19
+ # @param [REXML::Element] xml_node
20
+ # the XML representation.
21
+ #
22
+ # @param [String] path
23
+ # the path that will be prepended to.
24
+ #
25
+ # @return [String] the extended path including the parent node's path.
26
+ #
27
+ def self.prepend_parent_path(xml_node, path)
28
+ if !xml_node.parent.nil? && (xml_node.parent.name == 'Group')
29
+ group = GroupReference.from_node(xml_node.parent)
30
+ if !group.location.nil? && !group.location.empty?
31
+ path = '' if path.nil?
32
+ path = File.join(group.location, path)
33
+ end
34
+ end
35
+
36
+ path
37
+ end
38
+ end
39
+ end
40
+ end