fastlane 2.69.0.beta.20171207010003 → 2.69.0.beta.20171208010004
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 +4 -4
- data/fastlane/lib/fastlane/action.rb +2 -2
- data/fastlane/lib/fastlane/actions/git_branch.rb +1 -1
- data/fastlane/lib/fastlane/actions/sh.rb +1 -1
- data/fastlane/lib/fastlane/fast_file.rb +3 -4
- data/fastlane/lib/fastlane/helper/sh_helper.rb +52 -11
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/frameit/lib/frameit/editor.rb +54 -1
- data/frameit/lib/frameit/trim_box.rb +33 -0
- data/frameit/lib/frameit.rb +1 -0
- data/spaceship/lib/spaceship/client.rb +7 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b3c2b5cbef74d7bad0828ec4fe2decf402fc5fa
|
4
|
+
data.tar.gz: d0ac8dcc81ba78412ed83ca48a65028dd763b919
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f09cb8afd547b0c4f3750774e6ac16c2054feda350ab4dab37ff32cbf58c39f320d0f4112c10c100b76ec86ea2d7b63717b07546420442a4371986d468c53f0
|
7
|
+
data.tar.gz: cca562e98a5de53bc8de2287ed060ede6a441dabf9348d614896ebc8ddfa703192780137d5a899bf20e105a19a28218fdff81a06e1564ad2cebc95e1d6cedbda
|
@@ -94,8 +94,8 @@ module Fastlane
|
|
94
94
|
end
|
95
95
|
|
96
96
|
# to allow a simple `sh` in the custom actions
|
97
|
-
def self.sh(command, print_command: true, print_command_output: true, error_callback: nil)
|
98
|
-
Fastlane::Actions.sh_control_output(command, print_command: print_command, print_command_output: print_command_output, error_callback: error_callback)
|
97
|
+
def self.sh(*command, print_command: true, print_command_output: true, error_callback: nil)
|
98
|
+
Fastlane::Actions.sh_control_output(*command, print_command: print_command, print_command_output: print_command_output, error_callback: error_callback)
|
99
99
|
end
|
100
100
|
|
101
101
|
# Documentation category, available values defined in AVAILABLE_CATEGORIES
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
3
|
module SharedValues
|
4
|
-
GIT_BRANCH_ENV_VARS = %w(GIT_BRANCH BRANCH_NAME TRAVIS_BRANCH BITRISE_GIT_BRANCH CI_BUILD_REF_NAME CI_COMMIT_REF_NAME WERCKER_GIT_BRANCH).freeze
|
4
|
+
GIT_BRANCH_ENV_VARS = %w(GIT_BRANCH BRANCH_NAME TRAVIS_BRANCH BITRISE_GIT_BRANCH CI_BUILD_REF_NAME CI_COMMIT_REF_NAME WERCKER_GIT_BRANCH BUILDKITE_BRANCH).freeze
|
5
5
|
end
|
6
6
|
|
7
7
|
class GitBranchAction < Action
|
@@ -174,11 +174,10 @@ module Fastlane
|
|
174
174
|
end
|
175
175
|
|
176
176
|
# Execute shell command
|
177
|
-
def sh(command, log: true, error_callback: nil)
|
178
|
-
|
179
|
-
command_header = log ? command : "shell command"
|
177
|
+
def sh(*command, log: true, error_callback: nil)
|
178
|
+
command_header = log ? Actions.shell_command_from_args(*command) : "shell command"
|
180
179
|
Actions.execute_action(command_header) do
|
181
|
-
Actions.sh_no_action(command, log: log, error_callback: error_callback)
|
180
|
+
Actions.sh_no_action(*command, log: log, error_callback: error_callback)
|
182
181
|
end
|
183
182
|
end
|
184
183
|
|
@@ -8,32 +8,41 @@ module Fastlane
|
|
8
8
|
# When running this in tests, it will return the actual command instead of executing it
|
9
9
|
# @param log [Boolean] should fastlane print out the executed command
|
10
10
|
# @param error_callback [Block] a callback invoked with the command output if there is a non-zero exit status
|
11
|
-
def self.sh(command, log: true, error_callback: nil)
|
12
|
-
sh_control_output(command, print_command: log, print_command_output: log, error_callback: error_callback)
|
11
|
+
def self.sh(*command, log: true, error_callback: nil)
|
12
|
+
sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback)
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.sh_no_action(command, log: true, error_callback: nil)
|
16
|
-
sh_control_output(command, print_command: log, print_command_output: log, error_callback: error_callback)
|
15
|
+
def self.sh_no_action(*command, log: true, error_callback: nil)
|
16
|
+
sh_control_output(*command, print_command: log, print_command_output: log, error_callback: error_callback)
|
17
17
|
end
|
18
18
|
|
19
|
-
# @param command
|
19
|
+
# @param command The command to be executed (variadic)
|
20
20
|
# @param print_command [Boolean] Should we print the command that's being executed
|
21
21
|
# @param print_command_output [Boolean] Should we print the command output during execution
|
22
22
|
# @param error_callback [Block] A block that's called if the command exits with a non-zero status
|
23
|
-
def self.sh_control_output(command, print_command: true, print_command_output: true, error_callback: nil)
|
23
|
+
def self.sh_control_output(*command, print_command: true, print_command_output: true, error_callback: nil)
|
24
24
|
print_command = print_command_output = true if $troubleshoot
|
25
25
|
# Set the encoding first, the user might have set it wrong
|
26
26
|
previous_encoding = [Encoding.default_external, Encoding.default_internal]
|
27
27
|
Encoding.default_external = Encoding::UTF_8
|
28
28
|
Encoding.default_internal = Encoding::UTF_8
|
29
29
|
|
30
|
-
|
31
|
-
UI.command(
|
30
|
+
shell_command = shell_command_from_args(*command)
|
31
|
+
UI.command(shell_command) if print_command
|
32
32
|
|
33
33
|
result = ''
|
34
34
|
if Helper.sh_enabled?
|
35
35
|
exit_status = nil
|
36
|
-
|
36
|
+
|
37
|
+
# The argument list is passed directly to Open3.popen2e, which
|
38
|
+
# handles the variadic argument list in the same way as Kernel#spawn.
|
39
|
+
# (http://ruby-doc.org/core-2.4.2/Kernel.html#method-i-spawn) or
|
40
|
+
# Process.spawn (http://ruby-doc.org/core-2.4.2/Process.html#method-c-spawn).
|
41
|
+
#
|
42
|
+
# sh "ls -la /Applications/Xcode\ 7.3.1.app"
|
43
|
+
# sh "ls", "-la", "/Applications/Xcode 7.3.1.app"
|
44
|
+
# sh({ "FOO" => "Hello" }, "echo $FOO")
|
45
|
+
Open3.popen2e(*command) do |stdin, io, thread|
|
37
46
|
io.sync = true
|
38
47
|
io.each do |line|
|
39
48
|
UI.command_output(line.strip) if print_command_output
|
@@ -44,7 +53,7 @@ module Fastlane
|
|
44
53
|
|
45
54
|
if exit_status != 0
|
46
55
|
message = if print_command
|
47
|
-
"Exit status of command '#{
|
56
|
+
"Exit status of command '#{shell_command}' was #{exit_status} instead of 0."
|
48
57
|
else
|
49
58
|
"Shell command exited with exit status #{exit_status} instead of 0."
|
50
59
|
end
|
@@ -58,7 +67,7 @@ module Fastlane
|
|
58
67
|
end
|
59
68
|
end
|
60
69
|
else
|
61
|
-
result <<
|
70
|
+
result << shell_command # only for the tests
|
62
71
|
end
|
63
72
|
|
64
73
|
result
|
@@ -68,5 +77,37 @@ module Fastlane
|
|
68
77
|
Encoding.default_external = previous_encoding.first
|
69
78
|
Encoding.default_internal = previous_encoding.last
|
70
79
|
end
|
80
|
+
|
81
|
+
# Used to produce a shell command string from a list of arguments that may
|
82
|
+
# be passed to methods such as Kernel#system, Kernel#spawn and Open3.popen2e
|
83
|
+
# in order to print the command to the terminal. The same *args are passed
|
84
|
+
# directly to a system call (Open3.popen2e). This interpretation is not
|
85
|
+
# used when executing a command.
|
86
|
+
#
|
87
|
+
# @param args Any number of arguments used to construct a command
|
88
|
+
# @raise [ArgumentError] If no arguments passed
|
89
|
+
# @return [String] A shell command representing the arguments passed in
|
90
|
+
def self.shell_command_from_args(*args)
|
91
|
+
raise ArgumentError, "sh requires at least one argument" unless args.count > 0
|
92
|
+
|
93
|
+
command = ""
|
94
|
+
|
95
|
+
# Optional initial environment Hash
|
96
|
+
if args.first.kind_of?(Hash)
|
97
|
+
command = args.shift.map { |k, v| "#{k}=#{v.shellescape}" }.join(" ") + " "
|
98
|
+
end
|
99
|
+
|
100
|
+
# Support [ "/usr/local/bin/foo", "foo" ], "-x", ...
|
101
|
+
if args.first.kind_of?(Array)
|
102
|
+
command += args.shift.first.shellescape + " " + args.shelljoin
|
103
|
+
command.chomp! " "
|
104
|
+
elsif args.count == 1 && args.first.kind_of?(String)
|
105
|
+
command += args.first
|
106
|
+
else
|
107
|
+
command += args.shelljoin
|
108
|
+
end
|
109
|
+
|
110
|
+
command
|
111
|
+
end
|
71
112
|
end
|
72
113
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.69.0.beta.
|
2
|
+
VERSION = '2.69.0.beta.20171208010004'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -318,6 +318,9 @@ module Frameit
|
|
318
318
|
def build_title_images(max_width, max_height)
|
319
319
|
words = [:keyword, :title].keep_if { |a| fetch_text(a) } # optional keyword/title
|
320
320
|
results = {}
|
321
|
+
trim_boxes = {}
|
322
|
+
top_vertical_trim_offset = Float::INFINITY # Init at a large value, as the code will search for a minimal value.
|
323
|
+
bottom_vertical_trim_offset = 0
|
321
324
|
words.each do |key|
|
322
325
|
# Create empty background
|
323
326
|
empty_path = File.join(Frameit::ROOT, "lib/assets/empty.png")
|
@@ -347,10 +350,60 @@ module Frameit
|
|
347
350
|
i.interline_spacing interline_spacing if interline_spacing
|
348
351
|
i.fill fetch_config[key.to_s]['color']
|
349
352
|
end
|
350
|
-
title_image.trim # remove white space
|
351
353
|
|
352
354
|
results[key] = title_image
|
355
|
+
|
356
|
+
# Natively trimming the image with .trim will result in the loss of the common baseline between the text in all images.
|
357
|
+
# Hence retrieve the calculated trim bounding box without actually trimming:
|
358
|
+
calculated_trim_box = title_image.identify do |b|
|
359
|
+
b.format("%@") # CALCULATED: trim bounding box (without actually trimming), see: http://www.imagemagick.org/script/escape.php
|
360
|
+
end
|
361
|
+
|
362
|
+
# Create a Trimbox object from the MiniMagick .identify string with syntax "<width>x<height>+<offset_x>+<offset_y>":
|
363
|
+
trim_box = Frameit::Trimbox.new(calculated_trim_box)
|
364
|
+
|
365
|
+
# Get the minimum top offset of the trim box:
|
366
|
+
if trim_box.offset_y < top_vertical_trim_offset
|
367
|
+
top_vertical_trim_offset = trim_box.offset_y
|
368
|
+
end
|
369
|
+
|
370
|
+
# Get the maximum bottom offset of the trimbox, this is the top offset + height:
|
371
|
+
if (trim_box.offset_y + trim_box.height) > bottom_vertical_trim_offset
|
372
|
+
bottom_vertical_trim_offset = trim_box.offset_y + trim_box.height
|
373
|
+
end
|
374
|
+
|
375
|
+
# Store for the crop action:
|
376
|
+
trim_boxes[key] = trim_box
|
353
377
|
end
|
378
|
+
|
379
|
+
# Crop images based on top_vertical_trim_offset and bottom_vertical_trim_offset to maintain text baseline:
|
380
|
+
words.each do |key|
|
381
|
+
# Get matching trim box:
|
382
|
+
trim_box = trim_boxes[key]
|
383
|
+
|
384
|
+
# Determine the trim area by maintaining the same vertical top offset based on the smallest value from all trim boxes (top_vertical_trim_offset).
|
385
|
+
# When the vertical top offset is larger than the smallest vertical top offset, the trim box needs to be adjusted:
|
386
|
+
if trim_box.offset_y > top_vertical_trim_offset
|
387
|
+
# Increase the height of the trim box with the difference in vertical top offset:
|
388
|
+
trim_box.height += trim_box.offset_y - top_vertical_trim_offset
|
389
|
+
# Change the vertical top offset to match that of the others:
|
390
|
+
trim_box.offset_y = top_vertical_trim_offset
|
391
|
+
|
392
|
+
UI.verbose("Trim box for key \"#{key}\" is adjusted to align top: #{trim_box}\n")
|
393
|
+
end
|
394
|
+
|
395
|
+
# Check if the height needs to be adjusted to reach the bottom offset:
|
396
|
+
if (trim_box.offset_y + trim_box.height) < bottom_vertical_trim_offset
|
397
|
+
# Set the height of the trim box to the difference between vertical bottom and top offset:
|
398
|
+
trim_box.height = bottom_vertical_trim_offset - trim_box.offset_y
|
399
|
+
|
400
|
+
UI.verbose("Trim box for key \"#{key}\" is adjusted to align bottom: #{trim_box}\n")
|
401
|
+
end
|
402
|
+
|
403
|
+
# Crop image with adjusted trim box parameters in MiniMagick string format:
|
404
|
+
results[key].crop(trim_box.string_format)
|
405
|
+
end
|
406
|
+
|
354
407
|
results
|
355
408
|
end
|
356
409
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Frameit
|
2
|
+
# Represents the MiniMagick trim bounding box for cropping a text image
|
3
|
+
class Trimbox
|
4
|
+
attr_accessor :width # width of the trim box
|
5
|
+
attr_accessor :height # height of the trim box
|
6
|
+
attr_accessor :offset_x # horizontal offset from the canvas to the trim box
|
7
|
+
attr_accessor :offset_y # vertical offset from the canvas to the trim box
|
8
|
+
|
9
|
+
# identify_string: A string with syntax "<width>x<height>+<offset_x>+<offset_y>". This is returned by MiniMagick when using function .identify with format("%@"). It is also required for the MiniMagick .crop function.
|
10
|
+
def initialize(identify_string)
|
11
|
+
UI.user_error!("Trimbox can not be initialised with an empty 'identify_string'.") unless identify_string.length > 0
|
12
|
+
|
13
|
+
# Parse the input syntax "<width>x<height>+<offset_x>+<offset_y>".
|
14
|
+
# Extract these 4 parameters into an integer array, by using multiple string separators: "x" and "+":
|
15
|
+
trim_values = identify_string.split(/[x+]/).map(&:to_i)
|
16
|
+
|
17
|
+
# If 'identify_string' doesn't have the expected syntax with 4 parameters, show error:
|
18
|
+
UI.user_error!("Trimbox is initialised with an invalid value for 'identify_string'.") unless trim_values.length == 4
|
19
|
+
|
20
|
+
# Assign instance variables:
|
21
|
+
@width = trim_values[0]
|
22
|
+
@height = trim_values[1]
|
23
|
+
@offset_x = trim_values[2]
|
24
|
+
@offset_y = trim_values[3]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the trimbox parameters in the MiniMagick string format
|
28
|
+
def string_format
|
29
|
+
# Convert trim box parameters to string with syntax: "<width>x<height>+<offset_x>+<offset_y>":
|
30
|
+
return "#{@width}x#{@height}+#{@offset_x}+#{@offset_y}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/frameit/lib/frameit.rb
CHANGED
@@ -436,8 +436,15 @@ module Spaceship
|
|
436
436
|
# We use the olympus session to determine if the old session is still valid
|
437
437
|
# As this will raise an exception if the old session has expired
|
438
438
|
# If the old session is still valid, we don't have to do anything else in this method
|
439
|
+
# that's why we return true
|
439
440
|
return true if fetch_olympus_session.count > 0
|
440
441
|
rescue
|
442
|
+
# If the `fetch_olympus_session` method raises an exception
|
443
|
+
# we'll land here, and therefore continue doing a full login process
|
444
|
+
# This happens if the session we loaded from the cache isn't valid any more
|
445
|
+
# which is common, as the session automatically invalidates after x hours (we don't know x)
|
446
|
+
# In this case we don't actually care about the exact exception, and why it was failing
|
447
|
+
# because either way, we'll have to do a fresh login, where we do the actual error handling
|
441
448
|
end
|
442
449
|
end
|
443
450
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.69.0.beta.
|
4
|
+
version: 2.69.0.beta.20171208010004
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-12-
|
18
|
+
date: 2017-12-08 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|
@@ -1260,6 +1260,7 @@ files:
|
|
1260
1260
|
- frameit/lib/frameit/screenshot.rb
|
1261
1261
|
- frameit/lib/frameit/strings_parser.rb
|
1262
1262
|
- frameit/lib/frameit/template_finder.rb
|
1263
|
+
- frameit/lib/frameit/trim_box.rb
|
1263
1264
|
- gym/README.md
|
1264
1265
|
- gym/lib/assets/GymfileTemplate
|
1265
1266
|
- gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh
|