xcodeproj 1.7.0 → 1.8.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.
- checksums.yaml +5 -5
- data/lib/xcodeproj/gem_version.rb +1 -1
- data/lib/xcodeproj/project.rb +18 -1
- data/lib/xcodeproj/project/object/build_phase.rb +3 -5
- data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +7 -3
- data/lib/xcodeproj/project/object/native_target.rb +21 -3
- data/lib/xcodeproj/project/uuid_generator.rb +29 -19
- data/lib/xcodeproj/scheme.rb +3 -3
- data/lib/xcodeproj/scheme/launch_action.rb +34 -0
- data/lib/xcodeproj/scheme/test_action.rb +16 -0
- data/lib/xcodeproj/workspace/file_reference.rb +13 -0
- data/lib/xcodeproj/workspace/group_reference.rb +14 -6
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dd5a8807aed9829a9a1e355790100434f4df1fd7
|
4
|
+
data.tar.gz: 15e7c38281fb55f32e2a473e1badf6d806d9063e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae80f793ecc1635660a7802304547540c9a1e3eb2e8b54a0572acfa8eb3c3069edd3c0302360393041da28026eb77bbf3a5f3e263f72c040ce0c149fb621c2c4
|
7
|
+
data.tar.gz: 531fa9d52e9be2918b113f6603f7d5382ff00eb707de7cc34b70ed956c65f759420292cb4552611d839ad8bb6031d028c4bc91fc1ac3894ee46e40bf6b3a86fb
|
data/lib/xcodeproj/project.rb
CHANGED
@@ -388,7 +388,24 @@ module Xcodeproj
|
|
388
388
|
# @return [void]
|
389
389
|
#
|
390
390
|
def predictabilize_uuids
|
391
|
-
UUIDGenerator.new(self).generate!
|
391
|
+
UUIDGenerator.new([self]).generate!
|
392
|
+
end
|
393
|
+
|
394
|
+
# Replaces all the UUIDs in the list of provided projects with deterministic MD5 checksums.
|
395
|
+
#
|
396
|
+
# @param [Array<Project>] projects
|
397
|
+
#
|
398
|
+
# @note The current sorting of the project is taken into account when
|
399
|
+
# generating the new UUIDs.
|
400
|
+
#
|
401
|
+
# @note This method should only be used for entirely machine-generated
|
402
|
+
# projects, as true UUIDs are useful for tracking changes in the
|
403
|
+
# project.
|
404
|
+
#
|
405
|
+
# @return [void]
|
406
|
+
#
|
407
|
+
def self.predictabilize_uuids(projects)
|
408
|
+
UUIDGenerator.new(projects).generate!
|
392
409
|
end
|
393
410
|
|
394
411
|
public
|
@@ -279,16 +279,14 @@ module Xcodeproj
|
|
279
279
|
|
280
280
|
# @return [String] the actual script to perform.
|
281
281
|
#
|
282
|
-
# @note Defaults to
|
282
|
+
# @note Defaults to a comment string.
|
283
283
|
#
|
284
|
-
attribute :shell_script, String,
|
284
|
+
attribute :shell_script, String, "# Type a script or drag a script file from your workspace to insert its path.\n"
|
285
285
|
|
286
286
|
# @return [String] whether or not the ENV variables should be shown in
|
287
287
|
# the build log.
|
288
288
|
#
|
289
|
-
|
290
|
-
#
|
291
|
-
attribute :show_env_vars_in_log, String, '1'
|
289
|
+
attribute :show_env_vars_in_log, String
|
292
290
|
end
|
293
291
|
|
294
292
|
#-----------------------------------------------------------------------#
|
@@ -177,9 +177,7 @@ module Xcodeproj
|
|
177
177
|
ref = new_file_reference(group, path, source_tree)
|
178
178
|
ref.include_in_index = nil
|
179
179
|
|
180
|
-
product_group_ref = group
|
181
|
-
product_group_ref.name = 'Products'
|
182
|
-
product_group_ref.source_tree = '<group>'
|
180
|
+
product_group_ref = find_products_group_ref(group, true)
|
183
181
|
|
184
182
|
subproj = Project.open(path)
|
185
183
|
subproj.products_group.files.each do |product_reference|
|
@@ -230,6 +228,12 @@ module Xcodeproj
|
|
230
228
|
end
|
231
229
|
end
|
232
230
|
|
231
|
+
def find_products_group_ref(group, should_create = false)
|
232
|
+
product_group_ref =
|
233
|
+
(group.project.root_object.product_ref_group ||= group.project.main_group.find_subpath('Products', should_create))
|
234
|
+
product_group_ref
|
235
|
+
end
|
236
|
+
|
233
237
|
#-------------------------------------------------------------------#
|
234
238
|
end
|
235
239
|
end
|
@@ -356,7 +356,7 @@ module Xcodeproj
|
|
356
356
|
end
|
357
357
|
alias_method :add_system_frameworks, :add_system_framework
|
358
358
|
|
359
|
-
# Adds a file reference for one or more system libraries to the project
|
359
|
+
# Adds a file reference for one or more system dylib libraries to the project
|
360
360
|
# if needed and adds them to the Frameworks build phases.
|
361
361
|
#
|
362
362
|
# @param [Array<String>, String] name
|
@@ -365,8 +365,13 @@ module Xcodeproj
|
|
365
365
|
# @return [void]
|
366
366
|
#
|
367
367
|
def add_system_library(names)
|
368
|
+
add_system_library_extension(names, 'dylib')
|
369
|
+
end
|
370
|
+
alias_method :add_system_libraries, :add_system_library
|
371
|
+
|
372
|
+
def add_system_library_extension(names, extension)
|
368
373
|
Array(names).each do |name|
|
369
|
-
path = "usr/lib/lib#{name}
|
374
|
+
path = "usr/lib/lib#{name}.#{extension}"
|
370
375
|
files = project.frameworks_group.files
|
371
376
|
unless reference = files.find { |ref| ref.path == path }
|
372
377
|
reference = project.frameworks_group.new_file(path, :sdk_root)
|
@@ -375,7 +380,20 @@ module Xcodeproj
|
|
375
380
|
reference
|
376
381
|
end
|
377
382
|
end
|
378
|
-
|
383
|
+
private :add_system_library_extension
|
384
|
+
|
385
|
+
# Adds a file reference for one or more system tbd libraries to the project
|
386
|
+
# if needed and adds them to the Frameworks build phases.
|
387
|
+
#
|
388
|
+
# @param [Array<String>, String] name
|
389
|
+
# The name or the list of the names of the libraries.
|
390
|
+
#
|
391
|
+
# @return [void]
|
392
|
+
#
|
393
|
+
def add_system_library_tbd(names)
|
394
|
+
add_system_library_extension(names, 'tbd')
|
395
|
+
end
|
396
|
+
alias_method :add_system_libraries_tbd, :add_system_library_tbd
|
379
397
|
|
380
398
|
public
|
381
399
|
|
@@ -3,45 +3,55 @@ module Xcodeproj
|
|
3
3
|
class UUIDGenerator
|
4
4
|
require 'digest'
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
8
|
-
@new_objects_by_uuid = {}
|
6
|
+
def initialize(projects)
|
7
|
+
@projects = Array(projects)
|
9
8
|
@paths_by_object = {}
|
10
9
|
end
|
11
10
|
|
12
11
|
def generate!
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@
|
12
|
+
generate_all_paths_by_objects(@projects)
|
13
|
+
|
14
|
+
new_objects_by_project = Hash[@projects.map do |project|
|
15
|
+
[project, switch_uuids(project)]
|
16
|
+
end]
|
17
|
+
all_new_objects_by_project = new_objects_by_project.values.flat_map(&:values)
|
18
|
+
all_objects_by_uuid = @projects.map(&:objects_by_uuid).inject(:merge)
|
19
|
+
all_objects = @projects.flat_map(&:objects)
|
20
|
+
verify_no_duplicates!(all_objects, all_new_objects_by_project)
|
21
|
+
@projects.each { |project| fixup_uuid_references(project, all_objects_by_uuid) }
|
22
|
+
new_objects_by_project.each do |project, new_objects_by_uuid|
|
23
|
+
project.instance_variable_set(:@generated_uuids, project.instance_variable_get(:@available_uuids))
|
24
|
+
project.instance_variable_set(:@objects_by_uuid, new_objects_by_uuid)
|
25
|
+
end
|
20
26
|
end
|
21
27
|
|
22
28
|
private
|
23
29
|
|
24
30
|
UUID_ATTRIBUTES = [:remote_global_id_string, :container_portal, :target_proxy].freeze
|
25
31
|
|
26
|
-
def verify_no_duplicates!(all_objects)
|
27
|
-
duplicates = all_objects -
|
32
|
+
def verify_no_duplicates!(all_objects, all_new_objects)
|
33
|
+
duplicates = all_objects - all_new_objects
|
28
34
|
UserInterface.warn "[Xcodeproj] Generated duplicate UUIDs:\n\n" <<
|
29
35
|
duplicates.map { |d| "#{d.isa} -- #{@paths_by_object[d]}" }.join("\n") unless duplicates.empty?
|
30
36
|
end
|
31
37
|
|
32
|
-
def fixup_uuid_references
|
38
|
+
def fixup_uuid_references(target_project, all_objects_by_uuid)
|
33
39
|
fixup = ->(object, attr) do
|
34
|
-
if object.respond_to?(attr) && link =
|
40
|
+
if object.respond_to?(attr) && link = all_objects_by_uuid[object.send(attr)]
|
35
41
|
object.send(:"#{attr}=", link.uuid)
|
36
42
|
end
|
37
43
|
end
|
38
|
-
|
44
|
+
target_project.objects.each do |object|
|
39
45
|
UUID_ATTRIBUTES.each do |attr|
|
40
46
|
fixup[object, attr]
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
44
50
|
|
51
|
+
def generate_all_paths_by_objects(projects)
|
52
|
+
projects.each { |project| generate_paths(project.root_object, project.path.basename.to_s) }
|
53
|
+
end
|
54
|
+
|
45
55
|
def generate_paths(object, path = '')
|
46
56
|
existing = @paths_by_object[object] || path
|
47
57
|
return existing if @paths_by_object.key?(object)
|
@@ -67,13 +77,13 @@ module Xcodeproj
|
|
67
77
|
end
|
68
78
|
end
|
69
79
|
|
70
|
-
def switch_uuids(
|
71
|
-
|
72
|
-
objects.
|
80
|
+
def switch_uuids(project)
|
81
|
+
project.mark_dirty!
|
82
|
+
project.objects.each_with_object({}) do |object, hash|
|
73
83
|
next unless path = @paths_by_object[object]
|
74
84
|
uuid = uuid_for_path(path)
|
75
85
|
object.instance_variable_set(:@uuid, uuid)
|
76
|
-
|
86
|
+
hash[uuid] = object
|
77
87
|
end
|
78
88
|
end
|
79
89
|
|
data/lib/xcodeproj/scheme.rb
CHANGED
@@ -193,9 +193,9 @@ module Xcodeproj
|
|
193
193
|
|
194
194
|
entry.build_for_testing = true
|
195
195
|
entry.build_for_running = build_for_running
|
196
|
-
entry.build_for_profiling =
|
197
|
-
entry.build_for_archiving =
|
198
|
-
entry.build_for_analyzing =
|
196
|
+
entry.build_for_profiling = build_for_running
|
197
|
+
entry.build_for_archiving = build_for_running
|
198
|
+
entry.build_for_analyzing = build_for_running
|
199
199
|
|
200
200
|
build_action.add_entry(entry)
|
201
201
|
end
|
@@ -47,6 +47,40 @@ module Xcodeproj
|
|
47
47
|
@xml_element.attributes['allowLocationSimulation'] = bool_to_string(flag)
|
48
48
|
end
|
49
49
|
|
50
|
+
# @return [Bool]
|
51
|
+
# Whether this Build Action should disable detection of UI API misuse
|
52
|
+
# from background threads
|
53
|
+
#
|
54
|
+
def disable_main_thread_checker?
|
55
|
+
string_to_bool(@xml_element.attributes['disableMainThreadChecker'])
|
56
|
+
end
|
57
|
+
|
58
|
+
# @param [Bool] flag
|
59
|
+
# Set whether this Build Action should disable detection of UI API misuse
|
60
|
+
# from background threads
|
61
|
+
#
|
62
|
+
def disable_main_thread_checker=(flag)
|
63
|
+
@xml_element.attributes['disableMainThreadChecker'] = bool_to_string(flag)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [Bool]
|
67
|
+
# Whether UI API misuse from background threads detection should pause execution.
|
68
|
+
# This flag is ignored when the thread checker disabled
|
69
|
+
# ([disable_main_thread_checker] flag).
|
70
|
+
#
|
71
|
+
def stop_on_every_main_thread_checker_issue?
|
72
|
+
string_to_bool(@xml_element.attributes['stopOnEveryMainThreadCheckerIssue'])
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param [Bool] flag
|
76
|
+
# Set whether UI API misuse from background threads detection should pause execution.
|
77
|
+
# This flag is ignored when the thread checker disabled
|
78
|
+
# ([disable_main_thread_checker] flag).
|
79
|
+
#
|
80
|
+
def stop_on_every_main_thread_checker_issue=(flag)
|
81
|
+
@xml_element.attributes['stopOnEveryMainThreadCheckerIssue'] = bool_to_string(flag)
|
82
|
+
end
|
83
|
+
|
50
84
|
# @return [String]
|
51
85
|
# The launch automatically substyle
|
52
86
|
#
|
@@ -35,6 +35,22 @@ module Xcodeproj
|
|
35
35
|
@xml_element.attributes['shouldUseLaunchSchemeArgsEnv'] = bool_to_string(flag)
|
36
36
|
end
|
37
37
|
|
38
|
+
# @return [Bool]
|
39
|
+
# Whether this Test Action should disable detection of UI API misuse
|
40
|
+
# from background threads
|
41
|
+
#
|
42
|
+
def disable_main_thread_checker?
|
43
|
+
string_to_bool(@xml_element.attributes['disableMainThreadChecker'])
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [Bool] flag
|
47
|
+
# Set whether this Test Action should disable detection of UI API misuse
|
48
|
+
# from background threads
|
49
|
+
#
|
50
|
+
def disable_main_thread_checker=(flag)
|
51
|
+
@xml_element.attributes['disableMainThreadChecker'] = bool_to_string(flag)
|
52
|
+
end
|
53
|
+
|
38
54
|
# @return [Bool]
|
39
55
|
# Whether Clang Code Coverage is enabled ('Gather coverage data' turned ON)
|
40
56
|
#
|
@@ -47,9 +47,22 @@ module Xcodeproj
|
|
47
47
|
#
|
48
48
|
def self.from_node(xml_node)
|
49
49
|
type, path = xml_node.attribute('location').value.split(':', 2)
|
50
|
+
path = prepend_parent_path(xml_node, path)
|
50
51
|
new(path, type)
|
51
52
|
end
|
52
53
|
|
54
|
+
def self.prepend_parent_path(xml_node, path)
|
55
|
+
if !xml_node.parent.nil? && (xml_node.parent.name == 'Group')
|
56
|
+
group = GroupReference.from_node(xml_node.parent)
|
57
|
+
if !group.location.nil? && !group.location.empty?
|
58
|
+
path = '' if path.nil?
|
59
|
+
path = File.join(group.location, path)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
path
|
64
|
+
end
|
65
|
+
|
53
66
|
# @return [REXML::Element] the XML representation of the file reference.
|
54
67
|
#
|
55
68
|
def to_node
|
@@ -17,25 +17,31 @@ module Xcodeproj
|
|
17
17
|
#
|
18
18
|
attr_reader :type
|
19
19
|
|
20
|
+
# @return [String] the location of the group on disk
|
21
|
+
#
|
22
|
+
attr_reader :location
|
23
|
+
|
20
24
|
# @param [#to_s] name @see name
|
21
25
|
# @param [#to_s] type @see type
|
26
|
+
# @param [#to_s] location @see location
|
22
27
|
#
|
23
|
-
def initialize(name, type = 'container')
|
28
|
+
def initialize(name, type = 'container', location = '')
|
24
29
|
@name = name.to_s
|
25
30
|
@type = type.to_s
|
31
|
+
@location = location.to_s
|
26
32
|
end
|
27
33
|
|
28
34
|
# @return [Bool] Whether a group reference is equal to another.
|
29
35
|
#
|
30
36
|
def ==(other)
|
31
|
-
name == other.name && type == other.type
|
37
|
+
name == other.name && type == other.type && location == other.location
|
32
38
|
end
|
33
39
|
alias_method :eql?, :==
|
34
40
|
|
35
41
|
# @return [Fixnum] A hash identical for equals objects.
|
36
42
|
#
|
37
43
|
def hash
|
38
|
-
[name, type].hash
|
44
|
+
[name, type, location].hash
|
39
45
|
end
|
40
46
|
|
41
47
|
# Returns a group reference given XML representation.
|
@@ -46,16 +52,18 @@ module Xcodeproj
|
|
46
52
|
# @return [GroupReference] The new group reference instance.
|
47
53
|
#
|
48
54
|
def self.from_node(xml_node)
|
49
|
-
|
55
|
+
location_array = xml_node.attribute('location').value.split(':', 2)
|
56
|
+
type = location_array.first
|
57
|
+
location = location_array[1] || ''
|
50
58
|
name = xml_node.attribute('name').value
|
51
|
-
new(name, type)
|
59
|
+
new(name, type, location)
|
52
60
|
end
|
53
61
|
|
54
62
|
# @return [REXML::Element] the XML representation of the group reference.
|
55
63
|
#
|
56
64
|
def to_node
|
57
65
|
REXML::Element.new('Group').tap do |element|
|
58
|
-
element.add_attribute('location', "#{type}
|
66
|
+
element.add_attribute('location', "#{type}:#{location}")
|
59
67
|
element.add_attribute('name', "#{name}")
|
60
68
|
end
|
61
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcodeproj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eloy Duran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: atomos
|
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
181
|
version: '0'
|
182
182
|
requirements: []
|
183
183
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.
|
184
|
+
rubygems_version: 2.6.14
|
185
185
|
signing_key:
|
186
186
|
specification_version: 3
|
187
187
|
summary: Create and modify Xcode projects from Ruby.
|