xcode-archive-cache 0.0.7 → 0.0.8.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/build/performer.rb +7 -3
- data/lib/build_graph/builder.rb +5 -8
- data/lib/build_graph/graph.rb +4 -0
- data/lib/build_graph/node.rb +16 -3
- data/lib/build_graph/rebuild_evaluator.rb +6 -2
- data/lib/build_settings/loader.rb +30 -8
- data/lib/injection/injector.rb +5 -5
- data/lib/injection/pods_script_fixer.rb +3 -1
- data/lib/runner/runner.rb +10 -8
- data/lib/xcodebuild/executor.rb +6 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 153bd48a6899fb06dd35f7e7a6d45e81e31b10addee748cf5cd5ba56ad82ba17
|
4
|
+
data.tar.gz: 485fca1a778dfffe38d7d4a09315dda122c0dcc08c828999f2559bf35d750c52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 154fa88f04f1e01f0faae4155ff4f0dd558de0c2dce805728bd42ff77fbe5944c84d16fd8a4221279183e22c3a9eb0741429382c834ce1a2662413fcc83fdca7
|
7
|
+
data.tar.gz: 6ba834613e56bd982e2d36bd5a7828b6f527b743fc40b7d577b3af69e573c7ebdb3aa506c51b1a222fcb7122a58e40be8ec3ef7702614d7729d1cd6066d1bda6
|
data/lib/build/performer.rb
CHANGED
@@ -11,14 +11,16 @@ module XcodeArchiveCache
|
|
11
11
|
@derived_data_path = derived_data_path
|
12
12
|
end
|
13
13
|
|
14
|
-
# @param [String] configuration
|
15
14
|
# @param [Xcodeproj::Project::Object::PBXNativeTarget] target
|
16
15
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
17
16
|
#
|
18
17
|
def rebuild_missing(target, graph)
|
19
18
|
should_rebuild_anything = should_rebuild?(graph)
|
20
19
|
if should_rebuild_anything
|
21
|
-
rebuild_list = graph.nodes
|
20
|
+
rebuild_list = graph.nodes
|
21
|
+
.select(&:waiting_for_rebuild)
|
22
|
+
.map(&:name)
|
23
|
+
.join(", ")
|
22
24
|
info("going to rebuild:\n#{rebuild_list}")
|
23
25
|
|
24
26
|
build_result = xcodebuild_executor.build(target.project.path, target.name, derived_data_path)
|
@@ -33,7 +35,7 @@ module XcodeArchiveCache
|
|
33
35
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
34
36
|
#
|
35
37
|
def should_rebuild?(graph)
|
36
|
-
graph.nodes.reduce(false) {|rebuild, node| rebuild || node.
|
38
|
+
graph.nodes.reduce(false) {|rebuild, node| rebuild || node.waiting_for_rebuild}
|
37
39
|
end
|
38
40
|
|
39
41
|
private
|
@@ -42,6 +44,8 @@ module XcodeArchiveCache
|
|
42
44
|
#
|
43
45
|
attr_reader :derived_data_path
|
44
46
|
|
47
|
+
# @return [XcodeArchiveCache::Xcodebuild::Executor]
|
48
|
+
#
|
45
49
|
attr_reader :xcodebuild_executor
|
46
50
|
end
|
47
51
|
end
|
data/lib/build_graph/builder.rb
CHANGED
@@ -20,7 +20,6 @@ module XcodeArchiveCache
|
|
20
20
|
native_target_finder.set_platform_name_filter(dependency_target.platform_name)
|
21
21
|
|
22
22
|
graph = Graph.new(dependency_target.project)
|
23
|
-
|
24
23
|
add_to_graph(dependency_target, graph, true)
|
25
24
|
load_settings(graph, dependent_target)
|
26
25
|
calculate_shas(graph)
|
@@ -30,6 +29,8 @@ module XcodeArchiveCache
|
|
30
29
|
|
31
30
|
private
|
32
31
|
|
32
|
+
ALL_NODES = []
|
33
|
+
|
33
34
|
# @return [XcodeArchiveCache::BuildSettings::Loader]
|
34
35
|
#
|
35
36
|
attr_accessor :build_settings_loader
|
@@ -58,25 +59,21 @@ module XcodeArchiveCache
|
|
58
59
|
end
|
59
60
|
|
60
61
|
display_name = target.display_name
|
61
|
-
existing_node = graph.node_by_name(display_name)
|
62
|
-
if existing_node
|
63
|
-
debug("already added this one")
|
64
|
-
return existing_node
|
65
|
-
end
|
66
|
-
|
67
62
|
if target_stack.include?(display_name)
|
68
63
|
target_stack.push(display_name)
|
69
64
|
raise Informative, "Circular dependency detected: #{target_stack.join(" -> ")}"
|
70
65
|
end
|
71
66
|
|
72
|
-
node =
|
67
|
+
node = ALL_NODES.select {|node| node.native_target.uuid == target.uuid && node.native_target.project == target.project}.first
|
73
68
|
if node
|
74
69
|
debug("already traversed this one")
|
70
|
+
graph.add_multiple_nodes(node.subgraph) unless graph.nodes.include?(node)
|
75
71
|
return node
|
76
72
|
else
|
77
73
|
debug("adding new node")
|
78
74
|
node = Node.new(display_name, target, is_root)
|
79
75
|
graph.nodes.push(node)
|
76
|
+
ALL_NODES.push(node)
|
80
77
|
end
|
81
78
|
|
82
79
|
dependencies = []
|
data/lib/build_graph/graph.rb
CHANGED
data/lib/build_graph/node.rb
CHANGED
@@ -10,9 +10,9 @@ module XcodeArchiveCache
|
|
10
10
|
#
|
11
11
|
attr_reader :is_root
|
12
12
|
|
13
|
-
# @return [
|
13
|
+
# @return [Symbol] should target be rebuilt
|
14
14
|
#
|
15
|
-
attr_accessor :
|
15
|
+
attr_accessor :state
|
16
16
|
|
17
17
|
# @return [String] sha256 of (input files + build settings + dependency shas)
|
18
18
|
#
|
@@ -44,6 +44,7 @@ module XcodeArchiveCache
|
|
44
44
|
@is_root = is_root
|
45
45
|
@dependent = []
|
46
46
|
@dependencies = []
|
47
|
+
@state = :unknown
|
47
48
|
end
|
48
49
|
|
49
50
|
def has_framework_product?
|
@@ -89,6 +90,18 @@ module XcodeArchiveCache
|
|
89
90
|
(dependent + dependent.map(&:all_dependent_nodes)).flatten.uniq
|
90
91
|
end
|
91
92
|
|
93
|
+
# @return [Array<Node>]
|
94
|
+
#
|
95
|
+
def subgraph
|
96
|
+
([self] + dependencies + dependencies.map(&:subgraph)).flatten.uniq
|
97
|
+
end
|
98
|
+
|
99
|
+
# @return [Bool]
|
100
|
+
#
|
101
|
+
def waiting_for_rebuild
|
102
|
+
state == :waiting_for_rebuild
|
103
|
+
end
|
104
|
+
|
92
105
|
def ==(other_node)
|
93
106
|
other_node && native_target.uuid == other_node.native_target.uuid && native_target.project == other_node.native_target.project
|
94
107
|
end
|
@@ -97,7 +110,7 @@ module XcodeArchiveCache
|
|
97
110
|
sha_string = sha ? sha : "<none>"
|
98
111
|
dependent_names = dependent.length > 0 ? dependent.map(&:name).join(", ") : "<none>"
|
99
112
|
dependency_names = dependencies.length > 0 ? dependencies.map(&:name).join(", ") : "<none>"
|
100
|
-
"#{name}\n\troot: #{is_root}\n\tproduct: #{product_file_name}\n\tsha: #{sha_string}\n\
|
113
|
+
"#{name}\n\troot: #{is_root}\n\tproduct: #{product_file_name}\n\tsha: #{sha_string}\n\tstate: #{state}\n\tdependent: #{dependent_names}\n\tdependencies: #{dependency_names}"
|
101
114
|
end
|
102
115
|
end
|
103
116
|
end
|
@@ -11,13 +11,17 @@ module XcodeArchiveCache
|
|
11
11
|
# @param [XcodeArchiveCache::BuildGraph::Node] node
|
12
12
|
#
|
13
13
|
def evaluate(node)
|
14
|
-
return if node.
|
14
|
+
return if node.state != :unknown
|
15
15
|
|
16
16
|
# we include dependency shas in every node sha calculation,
|
17
17
|
# so if some dependency changes, that change propagates
|
18
18
|
# all the way to the top level
|
19
19
|
#
|
20
|
-
|
20
|
+
if cache_storage.cached_artifact_path(node) == nil
|
21
|
+
node.state = :waiting_for_rebuild
|
22
|
+
else
|
23
|
+
node.state = :exists_in_cache
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
@@ -39,18 +39,17 @@ module XcodeArchiveCache
|
|
39
39
|
|
40
40
|
class Loader
|
41
41
|
|
42
|
-
# @param [Xcodebuild::Executor
|
42
|
+
# @param [Xcodebuild::Executor] executor
|
43
43
|
#
|
44
44
|
def initialize(executor)
|
45
45
|
@executor = executor
|
46
46
|
@extractor = Extractor.new
|
47
|
-
@settings = Hash.new
|
48
47
|
end
|
49
48
|
|
50
49
|
# @param [Array<String>] project_paths
|
51
50
|
#
|
52
51
|
def load_settings(project_paths)
|
53
|
-
paths_without_settings = project_paths.select {|path|
|
52
|
+
paths_without_settings = project_paths.select {|path| get_project_settings(path) == nil}
|
54
53
|
|
55
54
|
threads = paths_without_settings.map do |path|
|
56
55
|
Thread.new(path) do |project_path|
|
@@ -61,7 +60,8 @@ module XcodeArchiveCache
|
|
61
60
|
|
62
61
|
threads.each do |thread|
|
63
62
|
project_path, all_targets_settings = thread.value
|
64
|
-
|
63
|
+
per_target_settings = extractor.extract_per_target(all_targets_settings)
|
64
|
+
set_project_settings(project_path, per_target_settings)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -71,13 +71,16 @@ module XcodeArchiveCache
|
|
71
71
|
# @return [Hash{String => String}] build settings for target or nil
|
72
72
|
#
|
73
73
|
def get_settings(project_path, target_name)
|
74
|
-
|
74
|
+
project_settings = get_project_settings(project_path)
|
75
|
+
return nil unless project_settings
|
75
76
|
|
76
|
-
|
77
|
+
project_settings[target_name]
|
77
78
|
end
|
78
79
|
|
79
80
|
private
|
80
81
|
|
82
|
+
SETTINGS = Hash.new
|
83
|
+
|
81
84
|
# @return [XcodeArchiveCache::Xcodebuild::Executor]
|
82
85
|
#
|
83
86
|
attr_reader :executor
|
@@ -86,9 +89,28 @@ module XcodeArchiveCache
|
|
86
89
|
#
|
87
90
|
attr_reader :extractor
|
88
91
|
|
89
|
-
# @
|
92
|
+
# @param [String] path
|
93
|
+
#
|
94
|
+
# @return [Hash]
|
95
|
+
#
|
96
|
+
def get_project_settings(path)
|
97
|
+
SETTINGS[get_project_key(path)]
|
98
|
+
end
|
99
|
+
|
100
|
+
# @param [String] path
|
101
|
+
# @param [Hash] per_target_settings
|
102
|
+
#
|
103
|
+
def set_project_settings(path, per_target_settings)
|
104
|
+
SETTINGS[get_project_key(path)] = per_target_settings
|
105
|
+
end
|
106
|
+
|
107
|
+
# @param [String] project_path
|
90
108
|
#
|
91
|
-
|
109
|
+
# @return [String]
|
110
|
+
#
|
111
|
+
def get_project_key(project_path)
|
112
|
+
"#{project_path}-#{executor.arguments_state}"
|
113
|
+
end
|
92
114
|
end
|
93
115
|
end
|
94
116
|
end
|
data/lib/injection/injector.rb
CHANGED
@@ -20,7 +20,7 @@ module XcodeArchiveCache
|
|
20
20
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
21
21
|
#
|
22
22
|
def perform_internal_injection(graph)
|
23
|
-
|
23
|
+
inject_unpacked(graph.nodes)
|
24
24
|
add_header_paths(graph.nodes)
|
25
25
|
save_graph_projects(graph)
|
26
26
|
end
|
@@ -91,8 +91,8 @@ module XcodeArchiveCache
|
|
91
91
|
|
92
92
|
# @param [Array<XcodeArchiveCache::BuildGraph::Node>] nodes
|
93
93
|
#
|
94
|
-
def
|
95
|
-
cached_nodes = nodes.select {|node|
|
94
|
+
def inject_unpacked(nodes)
|
95
|
+
cached_nodes = nodes.select {|node| node.state == :unpacked}
|
96
96
|
cached_nodes.each do |node|
|
97
97
|
headers_mover.prepare_headers_for_injection(node)
|
98
98
|
add_as_prebuilt_to_dependents(node)
|
@@ -105,7 +105,7 @@ module XcodeArchiveCache
|
|
105
105
|
header_storage_paths = storage.get_all_headers_storage_paths
|
106
106
|
|
107
107
|
nodes
|
108
|
-
.select
|
108
|
+
.select(&:waiting_for_rebuild)
|
109
109
|
.each {|node| add_header_paths_to_target(node.native_target, header_storage_paths)}
|
110
110
|
end
|
111
111
|
|
@@ -130,7 +130,7 @@ module XcodeArchiveCache
|
|
130
130
|
def add_as_prebuilt_to_dependents(prebuilt_node)
|
131
131
|
dependent_to_rebuild = prebuilt_node
|
132
132
|
.all_dependent_nodes
|
133
|
-
.select
|
133
|
+
.select(&:waiting_for_rebuild)
|
134
134
|
dependent_to_rebuild.each do |dependent_node|
|
135
135
|
should_link = prebuilt_node.dependent.include?(dependent_node)
|
136
136
|
add_as_prebuilt_dependency(prebuilt_node, dependent_node.native_target, should_link)
|
data/lib/runner/runner.rb
CHANGED
@@ -93,7 +93,7 @@ module XcodeArchiveCache
|
|
93
93
|
graph = graph_builder.build_graph(target, dependency_target)
|
94
94
|
|
95
95
|
evaluate_for_rebuild(graph)
|
96
|
-
|
96
|
+
unpack_cached_artifacts(graph)
|
97
97
|
rebuild_if_needed(xcodebuild_executor, dependency_target, graph)
|
98
98
|
@injector.perform_outgoing_injection(graph, target)
|
99
99
|
end
|
@@ -108,12 +108,13 @@ module XcodeArchiveCache
|
|
108
108
|
|
109
109
|
# @param [XcodeArchiveCache::BuildGraph::Graph] graph
|
110
110
|
#
|
111
|
-
def
|
112
|
-
graph.nodes
|
113
|
-
|
114
|
-
|
111
|
+
def unpack_cached_artifacts(graph)
|
112
|
+
graph.nodes
|
113
|
+
.select {|node| node.state == :exists_in_cache}
|
114
|
+
.each do |node|
|
115
115
|
destination = @injection_storage.prepare_storage(node)
|
116
116
|
@artifact_extractor.unpack(node, destination)
|
117
|
+
node.state = :unpacked
|
117
118
|
end
|
118
119
|
end
|
119
120
|
|
@@ -127,12 +128,13 @@ module XcodeArchiveCache
|
|
127
128
|
@injector.perform_internal_injection(graph)
|
128
129
|
rebuild_performer.rebuild_missing(root_target, graph)
|
129
130
|
|
130
|
-
graph.nodes
|
131
|
-
|
132
|
-
|
131
|
+
graph.nodes
|
132
|
+
.select(&:waiting_for_rebuild)
|
133
|
+
.each do |node|
|
133
134
|
file_paths = @product_extractor.list_product_contents(root_target.name, node)
|
134
135
|
@injection_storage.store_products(node, file_paths)
|
135
136
|
@cache_storage.store(node, @injection_storage.get_storage_path(node))
|
137
|
+
node.state = :rebuilt_and_cached
|
136
138
|
end
|
137
139
|
end
|
138
140
|
end
|
data/lib/xcodebuild/executor.rb
CHANGED
@@ -4,6 +4,11 @@ module XcodeArchiveCache
|
|
4
4
|
GENERIC_DESTINATION = "generic"
|
5
5
|
|
6
6
|
class Executor
|
7
|
+
|
8
|
+
# @return [String]
|
9
|
+
#
|
10
|
+
attr_reader :arguments_state
|
11
|
+
|
7
12
|
# @param [String] configuration
|
8
13
|
# @param [String] platform
|
9
14
|
# @param [String] destination
|
@@ -17,6 +22,7 @@ module XcodeArchiveCache
|
|
17
22
|
@action = action
|
18
23
|
@args = args
|
19
24
|
@shell_executor = XcodeArchiveCache::Shell::Executor.new
|
25
|
+
@arguments_state = "#{configuration}-#{platform}-#{destination}-#{action}-#{args}"
|
20
26
|
end
|
21
27
|
|
22
28
|
# @param [String] project_path
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcode-archive-cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Dyakonov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xcodeproj
|
@@ -122,9 +122,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
122
|
version: 2.0.0
|
123
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
124
|
requirements:
|
125
|
-
- - "
|
125
|
+
- - ">"
|
126
126
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
127
|
+
version: 1.3.1
|
128
128
|
requirements: []
|
129
129
|
rubygems_version: 3.0.4
|
130
130
|
signing_key:
|