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 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: