xcode-archive-cache 0.0.7 → 0.0.8.pre.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95a23e762c8efb7296e5d0faa4387c4ed39f4e373a821437f0440e7bdf759d8f
4
- data.tar.gz: 933fae20075b13c5447217e38f917a35c8b42b9999076316ffdb264043e6b532
3
+ metadata.gz: 153bd48a6899fb06dd35f7e7a6d45e81e31b10addee748cf5cd5ba56ad82ba17
4
+ data.tar.gz: 485fca1a778dfffe38d7d4a09315dda122c0dcc08c828999f2559bf35d750c52
5
5
  SHA512:
6
- metadata.gz: 926f44d73815c5bdaf3e535bbb01e0c3d7aaa8a1c1e813baf054d85e1ab08904b2066975be0866c51f6e474a7ce3a2236c044c1a06486adc480b4eaf90d9ba2b
7
- data.tar.gz: 81d379f00051d87a5c6440a9f5c6648fedad99d75c36f39f21f59443c786de4b614e2ecd37f7d2014643b99bac9e8a2dbcb0637decdb114772d59f9779e23e43
6
+ metadata.gz: 154fa88f04f1e01f0faae4155ff4f0dd558de0c2dce805728bd42ff77fbe5944c84d16fd8a4221279183e22c3a9eb0741429382c834ce1a2662413fcc83fdca7
7
+ data.tar.gz: 6ba834613e56bd982e2d36bd5a7828b6f527b743fc40b7d577b3af69e573c7ebdb3aa506c51b1a222fcb7122a58e40be8ec3ef7702614d7729d1cd6066d1bda6
@@ -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.select(&:rebuild).map(&:name).join(", ")
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.rebuild}
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
@@ -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 = graph.node_by_name(display_name)
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 = []
@@ -29,6 +29,10 @@ module XcodeArchiveCache
29
29
  nodes.select {|node| node.name == name}.first
30
30
  end
31
31
 
32
+ def add_multiple_nodes(new_nodes)
33
+ @nodes += new_nodes
34
+ end
35
+
32
36
  # @return [XcodeArchiveCache::BuildGraph::Node]
33
37
  #
34
38
  def root_node
@@ -10,9 +10,9 @@ module XcodeArchiveCache
10
10
  #
11
11
  attr_reader :is_root
12
12
 
13
- # @return [Bool] should target be rebuilt
13
+ # @return [Symbol] should target be rebuilt
14
14
  #
15
- attr_accessor :rebuild
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\trebuild: #{rebuild}\n\tdependent: #{dependent_names}\n\tdependencies: #{dependency_names}"
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.rebuild != nil
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
- node.rebuild = cache_storage.cached_artifact_path(node) == nil
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.new] 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| settings[path] == nil}
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
- settings[project_path] = extractor.extract_per_target(all_targets_settings)
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
- return nil unless settings[project_path]
74
+ project_settings = get_project_settings(project_path)
75
+ return nil unless project_settings
75
76
 
76
- settings[project_path][target_name]
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
- # @return [Hash{String => Hash}]
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
- attr_reader :settings
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
@@ -20,7 +20,7 @@ module XcodeArchiveCache
20
20
  # @param [XcodeArchiveCache::BuildGraph::Graph] graph
21
21
  #
22
22
  def perform_internal_injection(graph)
23
- inject_cached(graph.nodes)
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 inject_cached(nodes)
95
- cached_nodes = nodes.select {|node| !node.rebuild}
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 {|node| node.rebuild}
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 {|node| node.rebuild}
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)
@@ -46,7 +46,9 @@ module XcodeArchiveCache
46
46
  .strip
47
47
  end
48
48
  end
49
+
50
+ nil
49
51
  end
50
52
  end
51
53
  end
52
- end
54
+ end
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
- extract_cached_artifacts(graph)
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 extract_cached_artifacts(graph)
112
- graph.nodes.each do |node|
113
- next if node.rebuild
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.each do |node|
131
- next unless node.rebuild
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
@@ -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.7
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-22 00:00:00.000000000 Z
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: '0'
127
+ version: 1.3.1
128
128
  requirements: []
129
129
  rubygems_version: 3.0.4
130
130
  signing_key: