Class: Gym::BuildCommandGenerator

Inherits:
Object
  • Object
show all
Defined in:
gym/lib/gym/generators/build_command_generator.rb

Overview

Responsible for building the fully working xcodebuild command

Class Method Summary collapse

Class Method Details

.archive_pathObject



171
172
173
174
175
176
177
178
179
180
181
182
# File 'gym/lib/gym/generators/build_command_generator.rb', line 171

def archive_path
  Gym.cache[:archive_path] ||= Gym.config[:archive_path]
  unless Gym.cache[:archive_path]
    file_name = [Gym.config[:output_name], Time.now.strftime("%F %H.%M.%S")] # e.g. 2015-08-07 14.49.12
    Gym.cache[:archive_path] = File.join(build_path, file_name.join(" ") + ".xcarchive")
  end

  if File.extname(Gym.cache[:archive_path]) != ".xcarchive"
    Gym.cache[:archive_path] += ".xcarchive"
  end
  return Gym.cache[:archive_path]
end

.build_pathObject

The path where archive will be created



163
164
165
166
167
168
169
# File 'gym/lib/gym/generators/build_command_generator.rb', line 163

def build_path
  unless Gym.cache[:build_path]
    Gym.cache[:build_path] = Gym.config[:build_path]
    FileUtils.mkdir_p(Gym.cache[:build_path])
  end
  Gym.cache[:build_path]
end

.buildactionsObject



52
53
54
55
56
57
58
59
60
61
# File 'gym/lib/gym/generators/build_command_generator.rb', line 52

def buildactions
  config = Gym.config

  buildactions = []
  buildactions << :clean if config[:clean]
  buildactions << :build if config[:skip_archive]
  buildactions << :archive unless config[:skip_archive]

  buildactions
end

.generateObject



8
9
10
11
12
13
14
15
16
17
# File 'gym/lib/gym/generators/build_command_generator.rb', line 8

def generate
  parts = prefix
  parts << Gym.config[:xcodebuild_command]
  parts += options
  parts += buildactions
  parts += setting
  parts += pipe

  parts
end

.legacy_xcpretty_optionsObject



108
109
110
111
112
113
114
115
116
117
118
119
# File 'gym/lib/gym/generators/build_command_generator.rb', line 108

def legacy_xcpretty_options
  options = []

  options << "xcpretty_test_format" if Gym.config[:xcpretty_test_format]
  options << "xcpretty_formatter" if Gym.config[:xcpretty_formatter]
  options << "xcpretty_report_junit" if Gym.config[:xcpretty_report_junit]
  options << "xcpretty_report_html" if Gym.config[:xcpretty_report_html]
  options << "xcpretty_report_json" if Gym.config[:xcpretty_report_json]
  options << "xcpretty_utf" if Gym.config[:xcpretty_utf]

  return options
end

.optionsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'gym/lib/gym/generators/build_command_generator.rb', line 32

def options
  config = Gym.config

  options = []
  options += project_path_array
  options << "-sdk '#{config[:sdk]}'" if config[:sdk]
  options << "-toolchain '#{config[:toolchain]}'" if config[:toolchain]
  options << "-destination '#{config[:destination]}'" if config[:destination]
  options << "-archivePath #{archive_path.shellescape}" unless config[:skip_archive]
  options << "-resultBundlePath '#{result_bundle_path}'" if config[:result_bundle]
  options << "-showBuildTimingSummary" if config[:build_timing_summary]
  if config[:use_system_scm] && !options.include?("-scmProvider system")
    options << "-scmProvider system"
  end
  options << config[:xcargs] if config[:xcargs]
  options << "OTHER_SWIFT_FLAGS=\"\\\$(value) -Xfrontend -debug-time-function-bodies\"" if config[:analyze_build_time]

  options
end

.pipeObject



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'gym/lib/gym/generators/build_command_generator.rb', line 73

def pipe
  pipe = []
  pipe << "| tee #{xcodebuild_log_path.shellescape}"

  formatter = Gym.config[:xcodebuild_formatter].chomp
  options = legacy_xcpretty_options

  if Gym.config[:disable_xcpretty] || formatter == ''
    UI.verbose("Not using an xcodebuild formatter")
  elsif !options.empty?
    UI.important("Detected legacy xcpretty being used, so formatting with xcpretty")
    UI.important("Option(s) used: #{options.join(', ')}")
    pipe += pipe_xcpretty
  elsif formatter == 'xcpretty'
    pipe += pipe_xcpretty
  elsif formatter == 'xcbeautify'
    pipe += pipe_xcbeautify
  else
    pipe << "| #{formatter}"
  end

  pipe << "> /dev/null" if Gym.config[:suppress_xcode_output]
  pipe
end

.pipe_xcbeautifyObject



98
99
100
101
102
103
104
105
106
# File 'gym/lib/gym/generators/build_command_generator.rb', line 98

def pipe_xcbeautify
  pipe = ['| xcbeautify']

  if FastlaneCore::Helper.colors_disabled?
    pipe << '--disable-colored-output'
  end

  return pipe
end

.pipe_xcprettyObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'gym/lib/gym/generators/build_command_generator.rb', line 121

def pipe_xcpretty
  pipe = []

  formatter = Gym.config[:xcpretty_formatter]
  pipe << "| xcpretty"
  pipe << " --test" if Gym.config[:xcpretty_test_format]
  pipe << " --no-color" if Helper.colors_disabled?
  pipe << " --formatter " if formatter
  pipe << formatter if formatter
  pipe << "--utf" if Gym.config[:xcpretty_utf]
  report_output_junit = Gym.config[:xcpretty_report_junit]
  report_output_html = Gym.config[:xcpretty_report_html]
  report_output_json = Gym.config[:xcpretty_report_json]
  if report_output_junit
    pipe << " --report junit --output "
    pipe << report_output_junit.shellescape
  elsif report_output_html
    pipe << " --report html --output "
    pipe << report_output_html.shellescape
  elsif report_output_json
    pipe << " --report json-compilation-database --output "
    pipe << report_output_json.shellescape
  end

  pipe
end

.post_buildObject



148
149
150
151
152
# File 'gym/lib/gym/generators/build_command_generator.rb', line 148

def post_build
  commands = []
  commands << %{grep -E '^[0-9.]+ms' #{xcodebuild_log_path.shellescape} | grep -vE '^0\.[0-9]' | sort -nr > culprits.txt} if Gym.config[:analyze_build_time]
  commands
end

.prefixObject



19
20
21
# File 'gym/lib/gym/generators/build_command_generator.rb', line 19

def prefix
  ["set -o pipefail &&"]
end

.project_path_arrayArray

Path to the project or workspace as parameter This will also include the scheme (if given)

Returns:

  • (Array)

    The array with all the components to join



26
27
28
29
30
# File 'gym/lib/gym/generators/build_command_generator.rb', line 26

def project_path_array
  proj = Gym.project.xcodebuild_parameters
  return proj if proj.count > 0
  UI.user_error!("No project/workspace found")
end

.result_bundle_pathObject



184
185
186
187
188
189
190
191
192
193
194
# File 'gym/lib/gym/generators/build_command_generator.rb', line 184

def result_bundle_path
  unless Gym.cache[:result_bundle_path]
    path = Gym.config[:result_bundle_path]
    path ||= File.join(Gym.config[:output_directory], Gym.config[:output_name] + ".xcresult")
    if File.directory?(path)
      FileUtils.remove_dir(path)
    end
    Gym.cache[:result_bundle_path] = path
  end
  return Gym.cache[:result_bundle_path]
end

.settingObject



63
64
65
66
67
68
69
70
71
# File 'gym/lib/gym/generators/build_command_generator.rb', line 63

def setting
  setting = []
  if Gym.config[:skip_codesigning]
    setting << "CODE_SIGN_IDENTITY='' CODE_SIGNING_REQUIRED=NO CODE_SIGN_ENTITLEMENTS='' CODE_SIGNING_ALLOWED=NO"
  elsif Gym.config[:codesigning_identity]
    setting << "CODE_SIGN_IDENTITY=#{Gym.config[:codesigning_identity].shellescape}"
  end
  setting
end

.xcodebuild_log_pathObject



154
155
156
157
158
159
160
# File 'gym/lib/gym/generators/build_command_generator.rb', line 154

def xcodebuild_log_path
  file_name = "#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
  containing = File.expand_path(Gym.config[:buildlog_path])
  FileUtils.mkdir_p(containing)

  return File.join(containing, file_name)
end