xcode-archive-cache 0.0.8.pre.2 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,18 +23,42 @@ module XcodeArchiveCache
23
23
  # @param [String] path
24
24
  # @param [Array<String>] file_paths
25
25
  #
26
- def store_headers(node, path, file_paths)
27
- storage_path = get_full_header_storage_path(path)
26
+ def store_headers(node, path, file_paths, save_path = true)
27
+ storage_path = Pathname.new(path).absolute? ? path : get_full_header_storage_path(path)
28
28
 
29
29
  unless File.exist?(storage_path)
30
30
  FileUtils.mkdir_p(storage_path)
31
31
  end
32
32
 
33
33
  file_paths.each do |file_path|
34
- FileUtils.cp(file_path, File.join(storage_path, File.basename(file_path)))
34
+ FileUtils.cp(file_path, get_stored_file_path(storage_path, file_path))
35
35
  end
36
36
 
37
- save_header_storage_path(storage_path, node)
37
+ save_header_storage_path(storage_path, node) if save_path
38
+ end
39
+
40
+ # @param [XcodeArchiveCache::BuildGraph::Node] node
41
+ # @param [Array<String>] file_paths
42
+ #
43
+ def store_default_headers(node, file_paths)
44
+ store_headers(node, get_default_headers_storage_path(node), file_paths)
45
+ end
46
+
47
+ def store_modulemap_headers(node, file_paths)
48
+ store_headers(node, get_storage_path(node), file_paths, false)
49
+ end
50
+
51
+ # @param [XcodeArchiveCache::BuildGraph::Node] node
52
+ #
53
+ # @return [String]
54
+ #
55
+ def get_modulemap_path(node)
56
+ modulemap_file_name = node.resulting_modulemap_file_name
57
+ return if modulemap_file_name == nil
58
+
59
+ storage_path = get_storage_path(node)
60
+ stored_modulemap_file_path = get_stored_file_path(storage_path, modulemap_file_name)
61
+ File.exist?(stored_modulemap_file_path) ? stored_modulemap_file_path : nil
38
62
  end
39
63
 
40
64
  # @param [XcodeArchiveCache::BuildGraph::Node] node
@@ -70,7 +94,7 @@ module XcodeArchiveCache
70
94
 
71
95
  # @param [XcodeArchiveCache::BuildGraph::Node] node
72
96
  #
73
- # @return [Array<String>]
97
+ # @return [String]
74
98
  #
75
99
  def get_headers_storage_paths(node)
76
100
  headers_storage_dir_paths[node.name]
@@ -78,11 +102,19 @@ module XcodeArchiveCache
78
102
 
79
103
  def get_all_headers_storage_paths
80
104
  headers_storage_dir_paths
81
- .map {|_, path| path}
105
+ .map { |_, path| path }
82
106
  .flatten
83
107
  .uniq
84
108
  end
85
109
 
110
+ # @param [XcodeArchiveCache::BuildGraph::Node] node
111
+ #
112
+ # @return [String]
113
+ #
114
+ def get_default_headers_storage_path(node)
115
+ "include/#{node.name}"
116
+ end
117
+
86
118
  private
87
119
 
88
120
  def prepare_container_dir
@@ -99,6 +131,15 @@ module XcodeArchiveCache
99
131
  File.absolute_path(path, container_dir_path)
100
132
  end
101
133
 
134
+ # @param [String] storage_path
135
+ # @param [String] file_path
136
+ #
137
+ # @return [String]
138
+ #
139
+ def get_stored_file_path(storage_path, file_path)
140
+ File.join(storage_path, File.basename(file_path))
141
+ end
142
+
102
143
  # @param [String] path
103
144
  # @param [XcodeArchiveCache::BuildGraph::Node] node
104
145
  #
@@ -0,0 +1,20 @@
1
+ module XcodeArchiveCache
2
+ module Modulemap
3
+ class FileHandler
4
+ # @param [String] modulemap_path
5
+ #
6
+ # @return [Array<String>]
7
+ #
8
+ def read_modulemap_lines(modulemap_path)
9
+ File.read(modulemap_path).split("\n")
10
+ end
11
+
12
+ # @param [Array<String>] lines
13
+ # @param [String] modulemap_path
14
+ #
15
+ def write_modulemap_lines(lines, modulemap_path)
16
+ File.open(modulemap_path, "w") { |file| file.puts lines.join("\n") }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,67 @@
1
+ module XcodeArchiveCache
2
+ module Modulemap
3
+ class HeaderPathDeclaration
4
+ # @return [String]
5
+ #
6
+ attr_reader :type
7
+
8
+ # @return [String]
9
+ #
10
+ attr_reader :path
11
+
12
+ # @param [String] type
13
+ # @param [String] path
14
+ #
15
+ def initialize(type, path)
16
+ @type = type
17
+ @path = path
18
+ end
19
+ end
20
+
21
+ class HeaderPathExtractor
22
+
23
+ include XcodeArchiveCache::Logs
24
+
25
+ # @param [String] modulemap_path
26
+ #
27
+ # @return [Array<String>]
28
+ #
29
+ def extract_all_paths(modulemap_path)
30
+ modulemap_dir = File.dirname(modulemap_path)
31
+ modulemap_lines = FileHandler.new.read_modulemap_lines(modulemap_path)
32
+ header_paths = []
33
+
34
+ modulemap_lines.each do |line|
35
+ header_declaration = extract_header_declaration(line)
36
+ if header_declaration
37
+ header_paths << get_full_header_path(modulemap_dir, header_declaration.path)
38
+ end
39
+ end
40
+
41
+ debug("modulemap header paths: #{header_paths}")
42
+
43
+ header_paths
44
+ end
45
+
46
+ # @param [String] modulemap_dir
47
+ # @param [String] path
48
+ #
49
+ # @return [String]
50
+ #
51
+ def get_full_header_path(modulemap_dir, path)
52
+ Pathname.new(path).absolute? ? path : File.join(modulemap_dir, path)
53
+ end
54
+
55
+ # @param [String] line
56
+ #
57
+ # @return [XcodeArchiveCache::Modulemap::HeaderPathDeclaration]
58
+ #
59
+ def extract_header_declaration(line)
60
+ if line.include?("header") && !line.include?("exclude")
61
+ components = line.split("\"")
62
+ HeaderPathDeclaration.new(components[0], components[1])
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,65 @@
1
+ module XcodeArchiveCache
2
+ module Modulemap
3
+ class HeaderPathFixer
4
+
5
+ include XcodeArchiveCache::Logs
6
+
7
+ # @param [Storage] storage
8
+ #
9
+ def initialize(storage)
10
+ @storage = storage
11
+ @header_path_extractor = HeaderPathExtractor.new
12
+ end
13
+
14
+ # @param [XcodeArchiveCache::BuildGraph::Node] node
15
+ #
16
+ def fix_modulemap(node)
17
+ return unless node.has_static_library_product?
18
+
19
+ injected_modulemap_file_path = storage.get_modulemap_path(node)
20
+ return if injected_modulemap_file_path == nil
21
+
22
+ file_handler = FileHandler.new
23
+
24
+ modulemap_dir = File.dirname(injected_modulemap_file_path)
25
+ modulemap_lines = file_handler.read_modulemap_lines(injected_modulemap_file_path)
26
+
27
+ updated_lines = modulemap_lines.map do |line|
28
+ declaration = header_path_extractor.extract_header_declaration(line)
29
+ next line unless declaration
30
+
31
+ # absolute paths depend on machine and derived data dir
32
+ #
33
+ full_header_path = header_path_extractor.get_full_header_path(modulemap_dir, declaration.path)
34
+ should_replace = Pathname.new(declaration.path).absolute? || !File.exist?(full_header_path)
35
+ next line unless should_replace
36
+
37
+ header_file_name = File.basename(declaration.path)
38
+ injected_header_path = File.join(modulemap_dir, header_file_name)
39
+ next line if injected_header_path == declaration.path
40
+
41
+ if File.exist?(injected_header_path)
42
+ debug("substituting #{declaration.path} with #{injected_header_path} in #{File.basename(injected_modulemap_file_path)}")
43
+ "#{declaration.type}\"#{injected_header_path}\""
44
+ else
45
+ error("failed to substitute missing header #{declaration.path} with another missing header in #{File.basename(injected_modulemap_file_path)}")
46
+ error("leaving the path as it is")
47
+ line
48
+ end
49
+ end
50
+
51
+ file_handler.write_modulemap_lines(updated_lines, injected_modulemap_file_path)
52
+ end
53
+
54
+ private
55
+
56
+ # @return [Storage]
57
+ #
58
+ attr_accessor :storage
59
+
60
+ # @return [XcodeArchiveCache::Modulemap::HeaderPathExtractor]
61
+ #
62
+ attr_accessor :header_path_extractor
63
+ end
64
+ end
65
+ end
@@ -68,42 +68,49 @@ module XcodeArchiveCache
68
68
  raise Informative, "Target not found for #{target_config.name}"
69
69
  end
70
70
 
71
+ xcodebuild_executor = XcodeArchiveCache::Xcodebuild::Executor.new(config.active_configuration.build_configuration,
72
+ target.platform_name,
73
+ config.settings.destination,
74
+ config.active_configuration.action,
75
+ config.active_configuration.xcodebuild_args)
76
+ graph_builder = XcodeArchiveCache::BuildGraph::Builder.new(@native_target_finder, xcodebuild_executor)
77
+
78
+ dependency_targets = Hash.new
79
+ build_graphs = Hash.new
80
+
81
+ target_config.dependencies.each do |dependency_name|
82
+ info("creating build graph for #{dependency_name}")
83
+
84
+ dependency_target = find_dependency_target(target, dependency_name)
85
+ dependency_targets[dependency_name] = dependency_target
86
+ build_graphs[dependency_name] = graph_builder.build_graph(target, dependency_target)
87
+ end
88
+
71
89
  target_config.dependencies.each do |dependency_name|
72
- handle_dependency(target, dependency_name)
90
+ info("processing #{dependency_name}")
91
+
92
+ dependency_target = dependency_targets[dependency_name]
93
+ build_graph = build_graphs[dependency_name]
94
+
95
+ @rebuild_evaluator.evaluate_build_graph(build_graph)
96
+ unpack_cached_artifacts(build_graph)
97
+ rebuild_if_needed(xcodebuild_executor, dependency_target, build_graph)
98
+ @injector.perform_outgoing_injection(build_graph, target)
73
99
  end
74
100
  end
75
101
 
76
102
  # @param [Xcodeproj::Project::Object::PBXNativeTarget] target
77
103
  # @param [String] dependency_name
78
104
  #
79
- def handle_dependency(target, dependency_name)
80
- info("checking #{dependency_name}")
81
-
105
+ # @return [Xcodeproj::Project::Object::PBXNativeTarget]
106
+ #
107
+ def find_dependency_target(target, dependency_name)
82
108
  dependency_target = @native_target_finder.find_for_product_name(dependency_name)
83
109
  unless dependency_target
84
110
  raise Informative, "Target not found for #{dependency_name} of #{target.display_name}"
85
111
  end
86
112
 
87
- xcodebuild_executor = XcodeArchiveCache::Xcodebuild::Executor.new(config.active_configuration.build_configuration,
88
- dependency_target.platform_name,
89
- config.settings.destination,
90
- config.active_configuration.action,
91
- config.active_configuration.xcodebuild_args)
92
- graph_builder = XcodeArchiveCache::BuildGraph::Builder.new(@native_target_finder, xcodebuild_executor)
93
- graph = graph_builder.build_graph(target, dependency_target)
94
-
95
- evaluate_for_rebuild(graph)
96
- unpack_cached_artifacts(graph)
97
- rebuild_if_needed(xcodebuild_executor, dependency_target, graph)
98
- @injector.perform_outgoing_injection(graph, target)
99
- end
100
-
101
- # @param [XcodeArchiveCache::BuildGraph::Graph] graph
102
- #
103
- def evaluate_for_rebuild(graph)
104
- graph.nodes.each do |node|
105
- @rebuild_evaluator.evaluate(node)
106
- end
113
+ dependency_target
107
114
  end
108
115
 
109
116
  # @param [XcodeArchiveCache::BuildGraph::Graph] graph
@@ -57,12 +57,12 @@ module XcodeArchiveCache
57
57
  # @return [String]
58
58
  #
59
59
  def pipefail_flags(print_command)
60
- flags = %w(e o)
60
+ flags = ["e", "o pipefail"]
61
61
  if print_command
62
62
  flags.insert(1, "x")
63
63
  end
64
64
 
65
- "-" + flags.join("")
65
+ "-" + flags.join(" -")
66
66
  end
67
67
  end
68
68
  end
@@ -46,6 +46,10 @@ require 'injection/headers_mover'
46
46
  require 'injection/storage'
47
47
  require 'injection/framework_embedder'
48
48
 
49
+ require 'modulemap/file_handler'
50
+ require 'modulemap/header_path_extractor'
51
+ require 'modulemap/header_path_fixer'
52
+
49
53
  require 'runner/runner'
50
54
 
51
55
  require 'shell/executor'
@@ -55,6 +55,10 @@ module XcodeArchiveCache
55
55
  shell_executor.execute(command, true)
56
56
  end
57
57
 
58
+ def set_up_for_simulator?
59
+ destination_flag.include?("Simulator")
60
+ end
61
+
58
62
  private
59
63
 
60
64
  # @return [String]
metadata CHANGED
@@ -1,43 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcode-archive-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8.pre.2
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Dyakonov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-02 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: '1.7'
22
+ version: '2.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '1.7'
29
+ version: '1.10'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rubyzip
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '1.2'
39
+ version: '1.3'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '2.0'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
39
48
  - !ruby/object:Gem::Version
40
- version: '1.2'
49
+ version: '1.3'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.0'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: xcpretty
43
55
  requirement: !ruby/object:Gem::Requirement
@@ -66,8 +78,8 @@ dependencies:
66
78
  - - "~>"
67
79
  - !ruby/object:Gem::Version
68
80
  version: '1.0'
69
- description:
70
- email:
81
+ description:
82
+ email:
71
83
  executables:
72
84
  - xcode-archive-cache
73
85
  extensions: []
@@ -103,6 +115,9 @@ files:
103
115
  - lib/injection/pods_script_fixer.rb
104
116
  - lib/injection/storage.rb
105
117
  - lib/logs/logs.rb
118
+ - lib/modulemap/file_handler.rb
119
+ - lib/modulemap/header_path_extractor.rb
120
+ - lib/modulemap/header_path_fixer.rb
106
121
  - lib/runner/runner.rb
107
122
  - lib/shell/executor.rb
108
123
  - lib/xcode-archive-cache.rb
@@ -111,7 +126,7 @@ homepage: https://github.com/sweatco/xcode-archive-cache
111
126
  licenses:
112
127
  - MIT
113
128
  metadata: {}
114
- post_install_message:
129
+ post_install_message:
115
130
  rdoc_options: []
116
131
  require_paths:
117
132
  - lib
@@ -122,12 +137,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
137
  version: 2.0.0
123
138
  required_rubygems_version: !ruby/object:Gem::Requirement
124
139
  requirements:
125
- - - ">"
140
+ - - ">="
126
141
  - !ruby/object:Gem::Version
127
- version: 1.3.1
142
+ version: '0'
128
143
  requirements: []
129
144
  rubygems_version: 3.0.4
130
- signing_key:
145
+ signing_key:
131
146
  specification_version: 4
132
147
  summary: Native targets cache for Xcode archive builds.
133
148
  test_files: []