From 3d4b604f4f9f6275c5dd825d57c31e3bfde548aa Mon Sep 17 00:00:00 2001
From: Jerome Lacoste
Date: Fri, 11 Sep 2015 08:29:19 +0200
Subject: [PATCH 001/176] Little refactoring
---
lib/gym/runner.rb | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 4a4fc9e..47dbc64 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -120,9 +120,11 @@ def compress_and_move_dsym
# Moves over the binary and dsym file to the output directory
# @return (String) The path to the resulting ipa file
def move_ipa
- FileUtils.mv(PackageCommandGenerator.ipa_path, Gym.config[:output_directory], force: true)
+ ipa_path = BuildCommandGenerator.archive_path
- ipa_path = File.join(Gym.config[:output_directory], File.basename(PackageCommandGenerator.ipa_path))
+ FileUtils.mv(ipa_path, Gym.config[:output_directory], force: true)
+
+ ipa_path = File.join(Gym.config[:output_directory], File.basename(ipa_path))
Helper.log.info "Successfully exported and signed the ipa file:".green
Helper.log.info ipa_path
From 28674a357e1ddda4a380b62e2c06d06411b4c5ee Mon Sep 17 00:00:00 2001
From: Jerome Lacoste
Date: Fri, 11 Sep 2015 06:44:16 +0200
Subject: [PATCH 002/176] Updated gym to use the new xcodebuild API (reapplied
1bb6302869f720ccf4674e8f1c54b9ab0b320a52 manually)
---
lib/gym.rb | 5 -----
lib/gym/package_command_generator.rb | 28 ++++------------------------
lib/gym/runner.rb | 13 +------------
3 files changed, 5 insertions(+), 41 deletions(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index 7c1167a..6244522 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -9,11 +9,6 @@
require 'gym/options'
require 'gym/detect_values'
-# Import all the fixes
-require 'gym/xcodebuild_fixes/swift_fix'
-require 'gym/xcodebuild_fixes/watchkit_fix'
-require 'gym/xcodebuild_fixes/package_application_fix'
-
require 'fastlane_core'
require 'terminal-table'
diff --git a/lib/gym/package_command_generator.rb b/lib/gym/package_command_generator.rb
index ddcb9f4..51e1967 100644
--- a/lib/gym/package_command_generator.rb
+++ b/lib/gym/package_command_generator.rb
@@ -8,7 +8,7 @@ module Gym
class PackageCommandGenerator
class << self
def generate
- parts = ["/usr/bin/xcrun #{XcodebuildFixes.patch_package_application} -v"]
+ parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
parts += pipe
@@ -18,17 +18,9 @@ def generate
def options
options = []
- options << Shellwords.escape(appfile_path)
- options << "-o '#{ipa_path}'"
- options << "exportFormat ipa"
-
- if Gym.config[:provisioning_profile_path]
- options << "--embed '#{Gym.config[:provisioning_profile_path]}'"
- end
-
- if Gym.config[:codesigning_identity]
- options << "--sign '#{Gym.config[:codesigning_identity]}'"
- end
+ options << "-exportOptionsPlist /tmp/config.plist"
+ options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
+ options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
options
end
@@ -37,18 +29,6 @@ def pipe
[""]
end
- def appfile_path
- path = Dir.glob("#{BuildCommandGenerator.archive_path}/Products/Applications/*.app").first
- path ||= Dir[BuildCommandGenerator.archive_path + "/**/*.app"].last
-
- return path
- end
-
- # We export it to the temporary folder and move it over to the actual output once it's finished and valid
- def ipa_path
- File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
- end
-
# The path the the dsym file for this app. Might be nil
def dsym_path
Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 47dbc64..2364fd3 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -6,7 +6,6 @@ module Gym
class Runner
# @return (String) The path to the resulting ipa
def run
- clear_old_files
build_app
verify_archive
@@ -14,10 +13,6 @@ def run
if Gym.project.ios?
package_app
- Gym::XcodebuildFixes.swift_library_fix
- Gym::XcodebuildFixes.watchkit_fix
- Gym::XcodebuildFixes.clear_patched_package_application
-
compress_and_move_dsym
move_ipa
elsif Gym.project.mac?
@@ -59,12 +54,6 @@ def print_command(command, title)
# @!group The individual steps
#####################################################
- def clear_old_files
- if File.exist? PackageCommandGenerator.ipa_path
- File.delete(PackageCommandGenerator.ipa_path)
- end
- end
-
# Builds the app and prepares the archive
def build_app
command = BuildCommandGenerator.generate
@@ -120,7 +109,7 @@ def compress_and_move_dsym
# Moves over the binary and dsym file to the output directory
# @return (String) The path to the resulting ipa file
def move_ipa
- ipa_path = BuildCommandGenerator.archive_path
+ ipa_path = Dir.glob(File.join(BuildCommandGenerator.build_path, "*.ipa")).last
FileUtils.mv(ipa_path, Gym.config[:output_directory], force: true)
From 185d26f8b256c2cfed4ddc6723800eeea602df8e Mon Sep 17 00:00:00 2001
From: Jerome Lacoste
Date: Fri, 11 Sep 2015 08:27:00 +0200
Subject: [PATCH 003/176] Support both V6 and V7
---
lib/gym.rb | 25 ++++++
lib/gym/package_command_generator.rb | 101 +++++++++++++++++++++++-
lib/gym/runner.rb | 28 ++++++-
spec/package_command_generator_spec.rb | 16 ++--
spec/xcodebuild_fixes/swift_fix_spec.rb | 4 +
5 files changed, 164 insertions(+), 10 deletions(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index 6244522..065c4be 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -30,7 +30,32 @@ def gymfile_name
def xcode_path
@path ||= `xcode-select --print-path`.strip
end
+
+ def xcode_version
+ @version ||= parse_version
+ end
+
+ private def parse_version
+ output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
+ return '0.0' if output.nil?
+ output.split("\n").first.split(' ')[1]
+ end
+
+ def pre_7?
+ v = xcode_version
+ is_pre = v.split('.')[0].to_i < 7
+ is_pre
+ end
+
+ def init_libs
+ return unless pre_7?
+ # Import all the fixes
+ require 'gym/xcodebuild_fixes/swift_fix'
+ require 'gym/xcodebuild_fixes/watchkit_fix'
+ require 'gym/xcodebuild_fixes/package_application_fix'
+ end
end
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
+ Gym.init_libs
end
diff --git a/lib/gym/package_command_generator.rb b/lib/gym/package_command_generator.rb
index 51e1967..8ffd518 100644
--- a/lib/gym/package_command_generator.rb
+++ b/lib/gym/package_command_generator.rb
@@ -1,24 +1,119 @@
require 'shellwords'
module Gym
- # Responsible for building the fully working xcodebuild command
+ class PackageCommandGenerator
+ class << self
+ def generate
+ generator.generate
+ end
+
+ def appfile_path
+ generator.appfile_path
+ end
+
+ def ipa_path
+ generator.ipa_path
+ end
+
+ def dsym_path
+ generator.dsym_path
+ end
+
+ private
+
+ def generator
+ Gym.pre_7? ? PackageCommandGeneratorPre7 : PackageCommandGeneratorV7
+ end
+ end
+ end
+
+ # Responsible for building the fully working xcodebuild command on xcode < 7
#
# Because of a known bug in PackageApplication Perl script used by Xcode the packaging process is performed with
# a patched version of the script.
- class PackageCommandGenerator
+ class PackageCommandGeneratorPre7
+ class << self
+ def generate
+ parts = ["/usr/bin/xcrun #{XcodebuildFixes.patch_package_application} -v"]
+ parts += options
+ parts += pipe
+
+ parts
+ end
+
+ def options
+ options = []
+
+ options << Shellwords.escape(appfile_path)
+ options << "-o '#{ipa_path}'"
+ options << "exportFormat ipa"
+
+ if Gym.config[:provisioning_profile_path]
+ options << "--embed '#{Gym.config[:provisioning_profile_path]}'"
+ end
+
+ if Gym.config[:codesigning_identity]
+ options << "--sign '#{Gym.config[:codesigning_identity]}'"
+ end
+
+ options
+ end
+
+ def pipe
+ [""]
+ end
+
+ def appfile_path
+ path = Dir.glob("#{BuildCommandGenerator.archive_path}/Products/Applications/*.app").first
+ path ||= Dir[BuildCommandGenerator.archive_path + "/**/*.app"].last
+
+ return path
+ end
+
+ # We export it to the temporary folder and move it over to the actual output once it's finished and valid
+ def ipa_path
+ File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
+ end
+
+ # The path the the dsym file for this app. Might be nil
+ def dsym_path
+ Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
+ end
+ end
+ end
+
+ # Responsible for building the fully working xcodebuild command
+ class PackageCommandGeneratorV7
+ @config_content = %(
+
+
+
+ method
+ app-store
+ uploadSymbols
+
+ uploadBitcode
+
+
+
+)
+ @config_path = '/tmp/config.plist'
+
class << self
def generate
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
parts += pipe
+ File.write(@config_path, @config_content) # overwrite everytime. Could be optimized
+
parts
end
def options
options = []
- options << "-exportOptionsPlist /tmp/config.plist"
+ options << "-exportOptionsPlist #{@config_path}"
options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 2364fd3..d823ac8 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -6,6 +6,7 @@ module Gym
class Runner
# @return (String) The path to the resulting ipa
def run
+ clear_old_files
build_app
verify_archive
@@ -13,6 +14,7 @@ def run
if Gym.project.ios?
package_app
+ fix_package
compress_and_move_dsym
move_ipa
elsif Gym.project.mac?
@@ -54,6 +56,20 @@ def print_command(command, title)
# @!group The individual steps
#####################################################
+ def clear_old_files
+ return unless Gym.pre_7?
+ if File.exist? PackageCommandGenerator.ipa_path
+ File.delete(PackageCommandGenerator.ipa_path)
+ end
+ end
+
+ def fix_package
+ return unless Gym.pre_7?
+ Gym::XcodebuildFixes.swift_library_fix
+ Gym::XcodebuildFixes.watchkit_fix
+ Gym::XcodebuildFixes.clear_patched_package_application
+ end
+
# Builds the app and prepares the archive
def build_app
command = BuildCommandGenerator.generate
@@ -109,7 +125,7 @@ def compress_and_move_dsym
# Moves over the binary and dsym file to the output directory
# @return (String) The path to the resulting ipa file
def move_ipa
- ipa_path = Dir.glob(File.join(BuildCommandGenerator.build_path, "*.ipa")).last
+ ipa_path = find_archive_path
FileUtils.mv(ipa_path, Gym.config[:output_directory], force: true)
@@ -132,5 +148,15 @@ def move_mac_app
Helper.log.info app_path
app_path
end
+
+ private
+
+ def find_archive_path
+ if Gym.pre_7?
+ BuildCommandGenerator.archive_path
+ else
+ Dir.glob(File.join(BuildCommandGenerator.build_path, "*.ipa")).last
+ end
+ end
end
end
diff --git a/spec/package_command_generator_spec.rb b/spec/package_command_generator_spec.rb
index 73a24ad..8d82f34 100644
--- a/spec/package_command_generator_spec.rb
+++ b/spec/package_command_generator_spec.rb
@@ -1,14 +1,18 @@
+require 'gym/xcodebuild_fixes/swift_fix'
+require 'gym/xcodebuild_fixes/watchkit_fix'
+require 'gym/xcodebuild_fixes/package_application_fix'
+
describe Gym do
- describe Gym::PackageCommandGenerator do
+ describe Gym::PackageCommandGeneratorPre7 do
it "works with the example project with no additional parameters" do
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
- result = Gym::PackageCommandGenerator.generate
+ result = Gym::PackageCommandGeneratorPre7.generate
expect(result).to eq([
"/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
"''",
- "-o '#{Gym::PackageCommandGenerator.ipa_path}'",
+ "-o '#{Gym::PackageCommandGeneratorPre7.ipa_path}'",
"exportFormat ipa",
""
])
@@ -18,13 +22,13 @@
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
- allow(Gym::PackageCommandGenerator).to receive(:appfile_path).and_return("Krause's App")
+ allow(Gym::PackageCommandGeneratorPre7).to receive(:appfile_path).and_return("Krause's App")
- result = Gym::PackageCommandGenerator.generate
+ result = Gym::PackageCommandGeneratorPre7.generate
expect(result).to eq([
"/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
"Krause\\'s\\ App",
- "-o '#{Gym::PackageCommandGenerator.ipa_path}'",
+ "-o '#{Gym::PackageCommandGeneratorPre7.ipa_path}'",
"exportFormat ipa",
""
])
diff --git a/spec/xcodebuild_fixes/swift_fix_spec.rb b/spec/xcodebuild_fixes/swift_fix_spec.rb
index ee2467e..dbb1ea8 100644
--- a/spec/xcodebuild_fixes/swift_fix_spec.rb
+++ b/spec/xcodebuild_fixes/swift_fix_spec.rb
@@ -1,3 +1,7 @@
+require 'gym/xcodebuild_fixes/swift_fix'
+require 'gym/xcodebuild_fixes/watchkit_fix'
+require 'gym/xcodebuild_fixes/package_application_fix'
+
describe Gym do
describe Gym::XcodebuildFixes do
class FakePackageCommandGenerator
From 86a780c9b97106206f5d02b01ba305ebb0a2b106 Mon Sep 17 00:00:00 2001
From: Jerome Lacoste
Date: Sat, 12 Sep 2015 11:45:16 +0200
Subject: [PATCH 004/176] Code style compatibility with 2.0.0
---
lib/gym.rb | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index 065c4be..d5ac827 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -35,12 +35,6 @@ def xcode_version
@version ||= parse_version
end
- private def parse_version
- output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
- return '0.0' if output.nil?
- output.split("\n").first.split(' ')[1]
- end
-
def pre_7?
v = xcode_version
is_pre = v.split('.')[0].to_i < 7
@@ -54,6 +48,14 @@ def init_libs
require 'gym/xcodebuild_fixes/watchkit_fix'
require 'gym/xcodebuild_fixes/package_application_fix'
end
+
+ private
+
+ def parse_version
+ output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
+ return '0.0' if output.nil?
+ output.split("\n").first.split(' ')[1]
+ end
end
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
From 7c60a482267208a25509568dc8a6808fa35bffe9 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 10:01:46 -0700
Subject: [PATCH 005/176] Verification thta provisioning profile is used
Fixes https://github.com/fastlane/gym/issues/69
---
spec/package_command_generator_spec.rb | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/spec/package_command_generator_spec.rb b/spec/package_command_generator_spec.rb
index 73a24ad..332d9b7 100644
--- a/spec/package_command_generator_spec.rb
+++ b/spec/package_command_generator_spec.rb
@@ -29,5 +29,25 @@
""
])
end
+
+ it "supports passing a path to a provisioning profile" do
+ # Profile Installation
+ expect(FastlaneCore::ProvisioningProfile).to receive(:install).with("./spec/fixtures/dummy.mobileprovision")
+ options = {
+ project: "./examples/standard/Example.xcodeproj",
+ provisioning_profile_path: "./spec/fixtures/dummy.mobileprovision"
+ }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+
+ result = Gym::PackageCommandGenerator.generate
+ expect(result).to eq([
+ "/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
+ "''",
+ "-o '#{Gym::PackageCommandGenerator.ipa_path}'",
+ "exportFormat ipa",
+ "--embed './spec/fixtures/dummy.mobileprovision'",
+ ""
+ ])
+ end
end
end
From c9c6f18248880f951686731833c630e0487ab293 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 10:03:38 -0700
Subject: [PATCH 006/176] Version Bump by fastlane
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 62f772a..7f221a3 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.4.6"
+ VERSION = "0.5.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 77fffcff0803c484c5d314df69fcb75f3f670901 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 10:03:55 -0700
Subject: [PATCH 007/176] Added provisioning profile fixture
---
spec/fixtures/dummy.mobileprovision | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 spec/fixtures/dummy.mobileprovision
diff --git a/spec/fixtures/dummy.mobileprovision b/spec/fixtures/dummy.mobileprovision
new file mode 100644
index 0000000..e69de29
From ee3f916c9cd210bc48196086d65f45e82a877f45 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 10:44:26 -0700
Subject: [PATCH 008/176] Refactored the new package command generator
Added new Xcode class
Updated tests
---
lib/gym.rb | 30 +---
lib/gym/generators/README.md | 1 +
.../build_command_generator.rb | 0
.../generators/package_command_generator.rb | 34 +++++
.../package_command_generator_legacy.rb | 56 ++++++++
.../package_command_generator_xcode7.rb | 54 +++++++
lib/gym/manager.rb | 2 +-
lib/gym/package_command_generator.rb | 133 ------------------
lib/gym/runner.rb | 10 +-
lib/gym/xcode.rb | 30 ++++
.../package_application_fix.rb | 2 +-
lib/gym/xcodebuild_fixes/swift_fix.rb | 2 +-
lib/gym/xcodebuild_fixes/watchkit_fix.rb | 2 +-
... package_command_generator_legacy_spec.rb} | 16 +--
spec/package_command_generator_xcode7_spec.rb | 0
15 files changed, 197 insertions(+), 175 deletions(-)
create mode 100644 lib/gym/generators/README.md
rename lib/gym/{ => generators}/build_command_generator.rb (100%)
create mode 100644 lib/gym/generators/package_command_generator.rb
create mode 100644 lib/gym/generators/package_command_generator_legacy.rb
create mode 100644 lib/gym/generators/package_command_generator_xcode7.rb
delete mode 100644 lib/gym/package_command_generator.rb
create mode 100644 lib/gym/xcode.rb
rename spec/{package_command_generator_spec.rb => package_command_generator_legacy_spec.rb} (76%)
create mode 100644 spec/package_command_generator_xcode7_spec.rb
diff --git a/lib/gym.rb b/lib/gym.rb
index d5ac827..ba75c62 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -2,12 +2,13 @@
require 'gym/version'
require 'gym/manager'
require 'gym/project'
-require 'gym/build_command_generator'
-require 'gym/package_command_generator'
+require 'gym/generators/build_command_generator'
+require 'gym/generators/package_command_generator'
require 'gym/runner'
require 'gym/error_handler'
require 'gym/options'
require 'gym/detect_values'
+require 'gym/xcode'
require 'fastlane_core'
require 'terminal-table'
@@ -27,37 +28,16 @@ def gymfile_name
"Gymfile"
end
- def xcode_path
- @path ||= `xcode-select --print-path`.strip
- end
-
- def xcode_version
- @version ||= parse_version
- end
-
- def pre_7?
- v = xcode_version
- is_pre = v.split('.')[0].to_i < 7
- is_pre
- end
-
def init_libs
- return unless pre_7?
+ return unless Xcode.pre_7?
# Import all the fixes
require 'gym/xcodebuild_fixes/swift_fix'
require 'gym/xcodebuild_fixes/watchkit_fix'
require 'gym/xcodebuild_fixes/package_application_fix'
end
-
- private
-
- def parse_version
- output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
- return '0.0' if output.nil?
- output.split("\n").first.split(' ')[1]
- end
end
Helper = FastlaneCore::Helper # you gotta love Ruby: Helper.* should use the Helper class contained in FastlaneCore
+
Gym.init_libs
end
diff --git a/lib/gym/generators/README.md b/lib/gym/generators/README.md
new file mode 100644
index 0000000..4d7905e
--- /dev/null
+++ b/lib/gym/generators/README.md
@@ -0,0 +1 @@
+All the classes that generate commands we want to execute
diff --git a/lib/gym/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
similarity index 100%
rename from lib/gym/build_command_generator.rb
rename to lib/gym/generators/build_command_generator.rb
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
new file mode 100644
index 0000000..fa20b95
--- /dev/null
+++ b/lib/gym/generators/package_command_generator.rb
@@ -0,0 +1,34 @@
+require 'shellwords'
+
+# The concrete implementations
+require 'gym/generators/package_command_generator_legacy'
+require 'gym/generators/package_command_generator_xcode7'
+
+module Gym
+ class PackageCommandGenerator
+ class << self
+ def generate
+ generator.generate
+ end
+
+ def appfile_path
+ generator.appfile_path
+ end
+
+ def ipa_path
+ generator.ipa_path
+ end
+
+ def dsym_path
+ generator.dsym_path
+ end
+
+ private
+
+ # The generator we need to use for the currently used Xcode version
+ def generator
+ Xcode.pre_7? ? PackageCommandGeneratorLegacy : PackageCommandGeneratorXcode7
+ end
+ end
+ end
+end
diff --git a/lib/gym/generators/package_command_generator_legacy.rb b/lib/gym/generators/package_command_generator_legacy.rb
new file mode 100644
index 0000000..690bc88
--- /dev/null
+++ b/lib/gym/generators/package_command_generator_legacy.rb
@@ -0,0 +1,56 @@
+module Gym
+ # Responsible for building the fully working xcodebuild command on Xcode < 7
+ #
+ # Because of a known bug in PackageApplication Perl script used by Xcode the packaging process is performed with
+ # a patched version of the script.
+ class PackageCommandGeneratorLegacy
+ class << self
+ def generate
+ parts = ["/usr/bin/xcrun #{XcodebuildFixes.patch_package_application} -v"]
+ parts += options
+ parts += pipe
+
+ parts
+ end
+
+ def options
+ options = []
+
+ options << Shellwords.escape(appfile_path)
+ options << "-o '#{ipa_path}'"
+ options << "exportFormat ipa"
+
+ if Gym.config[:provisioning_profile_path]
+ options << "--embed '#{Gym.config[:provisioning_profile_path]}'"
+ end
+
+ if Gym.config[:codesigning_identity]
+ options << "--sign '#{Gym.config[:codesigning_identity]}'"
+ end
+
+ options
+ end
+
+ def pipe
+ [""]
+ end
+
+ def appfile_path
+ path = Dir.glob("#{BuildCommandGenerator.archive_path}/Products/Applications/*.app").first
+ path ||= Dir[BuildCommandGenerator.archive_path + "/**/*.app"].last
+
+ return path
+ end
+
+ # We export it to the temporary folder and move it over to the actual output once it's finished and valid
+ def ipa_path
+ File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
+ end
+
+ # The path the the dsym file for this app. Might be nil
+ def dsym_path
+ Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
+ end
+ end
+ end
+end
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
new file mode 100644
index 0000000..7d765d6
--- /dev/null
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -0,0 +1,54 @@
+module Gym
+ # Responsible for building the fully working xcodebuild command
+ class PackageCommandGeneratorXcode7
+ @config_content = %(
+
+
+
+ method
+ app-store
+ uploadSymbols
+
+ uploadBitcode
+
+
+
+)
+ @config_path = '/tmp/config.plist'
+
+ class << self
+ def generate
+ parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
+ parts += options
+ parts += pipe
+
+ File.write(@config_path, @config_content) # overwrite everytime. Could be optimized
+
+ parts
+ end
+
+ def options
+ options = []
+
+ options << "-exportOptionsPlist #{@config_path}"
+ options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
+ options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
+
+ options
+ end
+
+ def pipe
+ [""]
+ end
+
+ def ipa_path
+ File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
+ end
+
+ # The path the the dsym file for this app. Might be nil
+ def dsym_path
+ Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
+ end
+ end
+ end
+end
diff --git a/lib/gym/manager.rb b/lib/gym/manager.rb
index 9f4d499..43e5019 100644
--- a/lib/gym/manager.rb
+++ b/lib/gym/manager.rb
@@ -19,7 +19,7 @@ def print_summary
rows << ["Configuration", config[:configuration]] if config[:configuration]
rows << ["Archive Path", config[:archive_path]] if config[:archive_path]
rows << ["Platform", Gym.project.ios? ? "iOS" : "Mac"]
- rows << ["Xcode Path", Gym.xcode_path.gsub("/Contents/Developer", "")]
+ rows << ["Xcode Path", Xcode.xcode_path.gsub("/Contents/Developer", "")]
puts ""
puts Terminal::Table.new(
diff --git a/lib/gym/package_command_generator.rb b/lib/gym/package_command_generator.rb
deleted file mode 100644
index 8ffd518..0000000
--- a/lib/gym/package_command_generator.rb
+++ /dev/null
@@ -1,133 +0,0 @@
-require 'shellwords'
-
-module Gym
- class PackageCommandGenerator
- class << self
- def generate
- generator.generate
- end
-
- def appfile_path
- generator.appfile_path
- end
-
- def ipa_path
- generator.ipa_path
- end
-
- def dsym_path
- generator.dsym_path
- end
-
- private
-
- def generator
- Gym.pre_7? ? PackageCommandGeneratorPre7 : PackageCommandGeneratorV7
- end
- end
- end
-
- # Responsible for building the fully working xcodebuild command on xcode < 7
- #
- # Because of a known bug in PackageApplication Perl script used by Xcode the packaging process is performed with
- # a patched version of the script.
- class PackageCommandGeneratorPre7
- class << self
- def generate
- parts = ["/usr/bin/xcrun #{XcodebuildFixes.patch_package_application} -v"]
- parts += options
- parts += pipe
-
- parts
- end
-
- def options
- options = []
-
- options << Shellwords.escape(appfile_path)
- options << "-o '#{ipa_path}'"
- options << "exportFormat ipa"
-
- if Gym.config[:provisioning_profile_path]
- options << "--embed '#{Gym.config[:provisioning_profile_path]}'"
- end
-
- if Gym.config[:codesigning_identity]
- options << "--sign '#{Gym.config[:codesigning_identity]}'"
- end
-
- options
- end
-
- def pipe
- [""]
- end
-
- def appfile_path
- path = Dir.glob("#{BuildCommandGenerator.archive_path}/Products/Applications/*.app").first
- path ||= Dir[BuildCommandGenerator.archive_path + "/**/*.app"].last
-
- return path
- end
-
- # We export it to the temporary folder and move it over to the actual output once it's finished and valid
- def ipa_path
- File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
- end
-
- # The path the the dsym file for this app. Might be nil
- def dsym_path
- Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
- end
- end
- end
-
- # Responsible for building the fully working xcodebuild command
- class PackageCommandGeneratorV7
- @config_content = %(
-
-
-
- method
- app-store
- uploadSymbols
-
- uploadBitcode
-
-
-
-)
- @config_path = '/tmp/config.plist'
-
- class << self
- def generate
- parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
- parts += options
- parts += pipe
-
- File.write(@config_path, @config_content) # overwrite everytime. Could be optimized
-
- parts
- end
-
- def options
- options = []
-
- options << "-exportOptionsPlist #{@config_path}"
- options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
- options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
-
- options
- end
-
- def pipe
- [""]
- end
-
- # The path the the dsym file for this app. Might be nil
- def dsym_path
- Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
- end
- end
- end
-end
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index d823ac8..f5b5f6b 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -57,14 +57,14 @@ def print_command(command, title)
#####################################################
def clear_old_files
- return unless Gym.pre_7?
- if File.exist? PackageCommandGenerator.ipa_path
+ return unless Xcode.pre_7?
+ if File.exist?(PackageCommandGenerator.ipa_path)
File.delete(PackageCommandGenerator.ipa_path)
end
end
def fix_package
- return unless Gym.pre_7?
+ return unless Xcode.pre_7?
Gym::XcodebuildFixes.swift_library_fix
Gym::XcodebuildFixes.watchkit_fix
Gym::XcodebuildFixes.clear_patched_package_application
@@ -119,7 +119,7 @@ def compress_and_move_dsym
puts "" # new line
- Helper.log.info "Successfully exported and compressed dSYM file.".green
+ Helper.log.info "Successfully exported and compressed dSYM file".green
end
# Moves over the binary and dsym file to the output directory
@@ -152,7 +152,7 @@ def move_mac_app
private
def find_archive_path
- if Gym.pre_7?
+ if Xcode.pre_7?
BuildCommandGenerator.archive_path
else
Dir.glob(File.join(BuildCommandGenerator.build_path, "*.ipa")).last
diff --git a/lib/gym/xcode.rb b/lib/gym/xcode.rb
new file mode 100644
index 0000000..6c53409
--- /dev/null
+++ b/lib/gym/xcode.rb
@@ -0,0 +1,30 @@
+module Gym
+ class Xcode
+ class << self
+ # Path to the Xcode installation we're using
+ def xcode_path
+ @path ||= `xcode-select --print-path`.strip
+ end
+
+ # Version of Xcode, e.g. 7.0
+ def xcode_version
+ @version ||= parse_version
+ end
+
+ # Below Xcode 7 (which offers a new nice API to sign the app)
+ def pre_7?
+ v = xcode_version
+ is_pre = v.split('.')[0].to_i < 7
+ is_pre
+ end
+
+ private
+
+ def parse_version
+ output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
+ return '0.0' if output.nil?
+ output.split("\n").first.split(' ')[1]
+ end
+ end
+ end
+end
diff --git a/lib/gym/xcodebuild_fixes/package_application_fix.rb b/lib/gym/xcodebuild_fixes/package_application_fix.rb
index 3b894ed..4bcaa0a 100644
--- a/lib/gym/xcodebuild_fixes/package_application_fix.rb
+++ b/lib/gym/xcodebuild_fixes/package_application_fix.rb
@@ -18,7 +18,7 @@ def patch_package_application
expected_md5 = File.read(path)
# If that location changes, search it using xcrun --sdk iphoneos -f PackageApplication
- package_application_path = "#{Gym.xcode_path}/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"
+ package_application_path = "#{Xcode.xcode_path}/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication"
raise "Unable to patch the `PackageApplication` script bundled in XCode. This is not supported." unless expected_md5 == Digest::MD5.file(package_application_path).hexdigest
diff --git a/lib/gym/xcodebuild_fixes/swift_fix.rb b/lib/gym/xcodebuild_fixes/swift_fix.rb
index eeffba4..051265f 100644
--- a/lib/gym/xcodebuild_fixes/swift_fix.rb
+++ b/lib/gym/xcodebuild_fixes/swift_fix.rb
@@ -23,7 +23,7 @@ def swift_library_fix
ipa_swift_frameworks.each do |path|
framework = File.basename(path)
- FileUtils.copy_file("#{Gym.xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/#{framework}", File.join(swift_support, framework))
+ FileUtils.copy_file("#{Xcode.xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/#{framework}", File.join(swift_support, framework))
end
# Add "SwiftSupport" to the .ipa archive
diff --git a/lib/gym/xcodebuild_fixes/watchkit_fix.rb b/lib/gym/xcodebuild_fixes/watchkit_fix.rb
index b9100d7..dd37d20 100644
--- a/lib/gym/xcodebuild_fixes/watchkit_fix.rb
+++ b/lib/gym/xcodebuild_fixes/watchkit_fix.rb
@@ -13,7 +13,7 @@ def watchkit_fix
Dir.mkdir(watchkit_support)
# Copy WK from Xcode into WatchKitSupport
- FileUtils.copy_file("#{Gym.xcode_path}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/Library/Application Support/WatchKit/WK", File.join(watchkit_support, "WK"))
+ FileUtils.copy_file("#{Xcode.xcode_path}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/Library/Application Support/WatchKit/WK", File.join(watchkit_support, "WK"))
# Add "WatchKitSupport" to the .ipa archive
Dir.chdir(tmpdir) do
diff --git a/spec/package_command_generator_spec.rb b/spec/package_command_generator_legacy_spec.rb
similarity index 76%
rename from spec/package_command_generator_spec.rb
rename to spec/package_command_generator_legacy_spec.rb
index 34be09b..40a7b67 100644
--- a/spec/package_command_generator_spec.rb
+++ b/spec/package_command_generator_legacy_spec.rb
@@ -3,16 +3,16 @@
require 'gym/xcodebuild_fixes/package_application_fix'
describe Gym do
- describe Gym::PackageCommandGeneratorPre7 do
+ describe Gym::PackageCommandGeneratorLegacy, now: true do
it "works with the example project with no additional parameters" do
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
- result = Gym::PackageCommandGeneratorPre7.generate
+ result = Gym::PackageCommandGeneratorLegacy.generate
expect(result).to eq([
"/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
"''",
- "-o '#{Gym::PackageCommandGeneratorPre7.ipa_path}'",
+ "-o '#{Gym::PackageCommandGeneratorLegacy.ipa_path}'",
"exportFormat ipa",
""
])
@@ -22,13 +22,13 @@
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
- allow(Gym::PackageCommandGeneratorPre7).to receive(:appfile_path).and_return("Krause's App")
+ allow(Gym::PackageCommandGeneratorLegacy).to receive(:appfile_path).and_return("Krause's App")
- result = Gym::PackageCommandGeneratorPre7.generate
+ result = Gym::PackageCommandGeneratorLegacy.generate
expect(result).to eq([
"/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
"Krause\\'s\\ App",
- "-o '#{Gym::PackageCommandGeneratorPre7.ipa_path}'",
+ "-o '#{Gym::PackageCommandGeneratorLegacy.ipa_path}'",
"exportFormat ipa",
""
])
@@ -43,11 +43,11 @@
}
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
- result = Gym::PackageCommandGenerator.generate
+ result = Gym::PackageCommandGeneratorLegacy.generate
expect(result).to eq([
"/usr/bin/xcrun /tmp/PackageApplication4Gym -v",
"''",
- "-o '#{Gym::PackageCommandGenerator.ipa_path}'",
+ "-o '#{Gym::PackageCommandGeneratorLegacy.ipa_path}'",
"exportFormat ipa",
"--embed './spec/fixtures/dummy.mobileprovision'",
""
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
new file mode 100644
index 0000000..e69de29
From 3e4832c4fddd59d742def2310c056cc51cb84d1d Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 11:48:31 -0700
Subject: [PATCH 009/176] Dynamic generation of plist files & options for
symbols and bitcode
---
gym.gemspec | 1 +
.../package_command_generator_xcode7.rb | 38 ++++++++++---------
lib/gym/options.rb | 10 +++++
3 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/gym.gemspec b/gym.gemspec
index 77ccd0b..8805c7a 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
spec.add_dependency 'fastlane_core', '>= 0.16.1', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
+ spec.add_dependency 'plist' # Generate the Xcode config plist file
spec.add_dependency 'rubyzip', '>= 1.1.7' # fix swift/ipa
# Development only
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 7d765d6..10d3d2d 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -1,28 +1,13 @@
module Gym
# Responsible for building the fully working xcodebuild command
class PackageCommandGeneratorXcode7
- @config_content = %(
-
-
-
- method
- app-store
- uploadSymbols
-
- uploadBitcode
-
-
-
-)
- @config_path = '/tmp/config.plist'
-
class << self
def generate
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
parts += pipe
- File.write(@config_path, @config_content) # overwrite everytime. Could be optimized
+ File.write(config_path, config_content) # overwrite everytime. Could be optimized
parts
end
@@ -30,7 +15,7 @@ def generate
def options
options = []
- options << "-exportOptionsPlist #{@config_path}"
+ options << "-exportOptionsPlist #{config_path}"
options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
@@ -49,6 +34,25 @@ def ipa_path
def dsym_path
Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
end
+
+ private
+
+ def config_path
+ @config_path ||= "/tmp/gym_config_#{Time.now.to_i}.plist"
+ return @config_path
+ end
+
+ def config_content
+ require 'plist'
+ symbols = (Gym.config[:skip_symbols] ? false : true)
+ bitcode = (Gym.config[:upload_bitcode] ? true : false)
+
+ {
+ method: 'app-store',
+ uploadSymbols: symbols,
+ uploadBitcode: bitcode
+ }.to_plist
+ end
end
end
end
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 1d9b406..81cbbcf 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -101,6 +101,16 @@ def self.plain_options
verify_block: proc do |value|
raise "File not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
end),
+ FastlaneCore::ConfigItem.new(key: :skip_symbols,
+ short_option: "-m",
+ env_name: "GYM_SKIP_SYMBOLS",
+ description: "Should the ipa file *not* include symbols?",
+ default_value: true),
+ FastlaneCore::ConfigItem.new(key: :upload_bitcode,
+ short_option: "-z",
+ env_name: "GYM_UPLOAD_BITCODE",
+ description: "Should the ipa include bitcode?",
+ default_value: false),
FastlaneCore::ConfigItem.new(key: :provisioning_profile_path,
short_option: "-e",
env_name: "GYM_PROVISIONING_PROFILE_PATH",
From c6802e5d7c1692167087c53f243515368079f47a Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 11:50:55 -0700
Subject: [PATCH 010/176] Simplified legacy build command generator specs
---
spec/package_command_generator_legacy_spec.rb | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/spec/package_command_generator_legacy_spec.rb b/spec/package_command_generator_legacy_spec.rb
index 40a7b67..0b6eab3 100644
--- a/spec/package_command_generator_legacy_spec.rb
+++ b/spec/package_command_generator_legacy_spec.rb
@@ -1,9 +1,5 @@
-require 'gym/xcodebuild_fixes/swift_fix'
-require 'gym/xcodebuild_fixes/watchkit_fix'
-require 'gym/xcodebuild_fixes/package_application_fix'
-
describe Gym do
- describe Gym::PackageCommandGeneratorLegacy, now: true do
+ describe Gym::PackageCommandGeneratorLegacy do
it "works with the example project with no additional parameters" do
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
From 117386fe43150c6fdb9f54b97ce5eee94cfd27a3 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 12:04:23 -0700
Subject: [PATCH 011/176] Finished Xcode 7 usage and added tests
---
.../package_command_generator_xcode7.rb | 15 +++++++++++----
spec/package_command_generator_xcode7_spec.rb | 17 +++++++++++++++++
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 10d3d2d..6da0f2e 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -3,6 +3,12 @@ module Gym
class PackageCommandGeneratorXcode7
class << self
def generate
+ if Gym.config[:provisioning_profile_path]
+ Helper.log.info "You're using Xcode 7, the `provisioning_profile_path` value will be ignored".yellow
+ Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
+ end
+
+
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
parts += pipe
@@ -15,7 +21,7 @@ def generate
def options
options = []
- options << "-exportOptionsPlist #{config_path}"
+ options << "-exportOptionsPlist '#{config_path}'"
options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
@@ -27,7 +33,7 @@ def pipe
end
def ipa_path
- File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
+ raise "You can't just access the path to the ipa in Xcode 7"
end
# The path the the dsym file for this app. Might be nil
@@ -35,13 +41,14 @@ def dsym_path
Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
end
- private
-
+ # The path the config file we use to sign our app
def config_path
@config_path ||= "/tmp/gym_config_#{Time.now.to_i}.plist"
return @config_path
end
+ private
+
def config_content
require 'plist'
symbols = (Gym.config[:skip_symbols] ? false : true)
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
index e69de29..bb5658c 100644
--- a/spec/package_command_generator_xcode7_spec.rb
+++ b/spec/package_command_generator_xcode7_spec.rb
@@ -0,0 +1,17 @@
+describe Gym do
+ describe Gym::PackageCommandGeneratorXcode7, now: true do
+ it "works with the example project with no additional parameters" do
+ options = { project: "./examples/standard/Example.xcodeproj" }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+
+ result = Gym::PackageCommandGeneratorXcode7.generate
+ expect(result).to eq([
+ "/usr/bin/xcrun xcodebuild -exportArchive",
+ "-exportOptionsPlist '#{Gym::PackageCommandGeneratorXcode7.config_path}'",
+ "-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
+ "-exportPath '#{Gym::BuildCommandGenerator.build_path}'",
+ ""
+ ])
+ end
+ end
+end
From 7d1ba3cffea6682e3e2f15636b6c132563db5087 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 12:05:46 -0700
Subject: [PATCH 012/176] Improved code style
---
lib/gym/generators/package_command_generator_xcode7.rb | 1 -
spec/package_command_generator_xcode7_spec.rb | 10 +++++-----
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 6da0f2e..b199f3e 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -8,7 +8,6 @@ def generate
Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
end
-
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
parts += pipe
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
index bb5658c..ec03b41 100644
--- a/spec/package_command_generator_xcode7_spec.rb
+++ b/spec/package_command_generator_xcode7_spec.rb
@@ -1,15 +1,15 @@
describe Gym do
- describe Gym::PackageCommandGeneratorXcode7, now: true do
+ describe Gym::PackageCommandGeneratorXcode7 do
it "works with the example project with no additional parameters" do
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
result = Gym::PackageCommandGeneratorXcode7.generate
expect(result).to eq([
- "/usr/bin/xcrun xcodebuild -exportArchive",
- "-exportOptionsPlist '#{Gym::PackageCommandGeneratorXcode7.config_path}'",
- "-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
- "-exportPath '#{Gym::BuildCommandGenerator.build_path}'",
+ "/usr/bin/xcrun xcodebuild -exportArchive",
+ "-exportOptionsPlist '#{Gym::PackageCommandGeneratorXcode7.config_path}'",
+ "-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
+ "-exportPath '#{Gym::BuildCommandGenerator.build_path}'",
""
])
end
From f7811196a9b6c137431e3e4a9fe9a7d329f77cb4 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 12:08:00 -0700
Subject: [PATCH 013/176] Updated README
---
README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/README.md b/README.md
index 03d2877..90a22c3 100644
--- a/README.md
+++ b/README.md
@@ -125,6 +125,11 @@ If you run into any issues, use the `verbose` mode to get more information
gym --verbose
+To pass boolean parameters make sure to use `gym` like this:
+
+ gym --upload_bitcode true --skip_symbols true
+
+
# Gymfile
Since you might want to manually trigger a new build but don't want to specify all the parameters every time, you can store your defaults in a so called `Gymfile`.
From 88d76a33ca59ea50bb92ff76c94cb0a000bdef35 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 16 Sep 2015 14:29:45 -0700
Subject: [PATCH 014/176] Fixed not generating an ipa file with Xcode 7
---
lib/gym/generators/package_command_generator_xcode7.rb | 2 +-
lib/gym/runner.rb | 6 ++----
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index b199f3e..a3b2dc9 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -32,7 +32,7 @@ def pipe
end
def ipa_path
- raise "You can't just access the path to the ipa in Xcode 7"
+ File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
end
# The path the the dsym file for this app. Might be nil
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index f5b5f6b..85977ae 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -125,11 +125,9 @@ def compress_and_move_dsym
# Moves over the binary and dsym file to the output directory
# @return (String) The path to the resulting ipa file
def move_ipa
- ipa_path = find_archive_path
+ FileUtils.mv(PackageCommandGenerator.ipa_path, Gym.config[:output_directory], force: true)
- FileUtils.mv(ipa_path, Gym.config[:output_directory], force: true)
-
- ipa_path = File.join(Gym.config[:output_directory], File.basename(ipa_path))
+ ipa_path = File.join(Gym.config[:output_directory], File.basename(PackageCommandGenerator.ipa_path))
Helper.log.info "Successfully exported and signed the ipa file:".green
Helper.log.info ipa_path
From 91e7cc780fe229ec3f46e4b1cfee9a8e0a11b248 Mon Sep 17 00:00:00 2001
From: Jesse Crocker
Date: Thu, 17 Sep 2015 09:49:36 -0600
Subject: [PATCH 015/176] Change sdk in GymfileTemplate
xcodebuild does not think 9.0 is a valid value, but it does like iphoneos9.0
---
lib/assets/GymfileTemplate | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/assets/GymfileTemplate b/lib/assets/GymfileTemplate
index b0fa0fe..bf74edd 100644
--- a/lib/assets/GymfileTemplate
+++ b/lib/assets/GymfileTemplate
@@ -9,6 +9,6 @@
# scheme "Example"
-# sdk "9.0"
+# sdk "iphoneos9.0"
output_directory "./"
From 4ee337bc6d481ce9adf6143a8ce2963a9ef97868 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 17 Sep 2015 10:13:36 -0700
Subject: [PATCH 016/176] Changed from skip_symbols to upload_symbols
---
README.md | 2 +-
lib/gym/generators/package_command_generator_xcode7.rb | 2 +-
lib/gym/options.rb | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 90a22c3..3112bd3 100644
--- a/README.md
+++ b/README.md
@@ -127,7 +127,7 @@ If you run into any issues, use the `verbose` mode to get more information
To pass boolean parameters make sure to use `gym` like this:
- gym --upload_bitcode true --skip_symbols true
+ gym --upload_bitcode true --upload_symbols true
# Gymfile
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index a3b2dc9..06b9123 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -50,7 +50,7 @@ def config_path
def config_content
require 'plist'
- symbols = (Gym.config[:skip_symbols] ? false : true)
+ symbols = (Gym.config[:upload_symbols] ? true : false)
bitcode = (Gym.config[:upload_bitcode] ? true : false)
{
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 81cbbcf..287a155 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -101,10 +101,10 @@ def self.plain_options
verify_block: proc do |value|
raise "File not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
end),
- FastlaneCore::ConfigItem.new(key: :skip_symbols,
+ FastlaneCore::ConfigItem.new(key: :upload_symbols,
short_option: "-m",
- env_name: "GYM_SKIP_SYMBOLS",
- description: "Should the ipa file *not* include symbols?",
+ env_name: "GYM_UPLOAD_SYMBOLS",
+ description: "Should the ipa file include symbols?",
default_value: true),
FastlaneCore::ConfigItem.new(key: :upload_bitcode,
short_option: "-z",
From 95e3a08e95043f43a990fb90344b252a9d64351e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 17 Sep 2015 10:14:08 -0700
Subject: [PATCH 017/176] Moved xcode path detection into fastlane_core helper
---
gym.gemspec | 2 +-
lib/gym/xcode.rb | 18 ------------------
2 files changed, 1 insertion(+), 19 deletions(-)
diff --git a/gym.gemspec b/gym.gemspec
index 8805c7a..b13c5bd 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.16.1', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.17.0', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
diff --git a/lib/gym/xcode.rb b/lib/gym/xcode.rb
index 6c53409..e3b0fd6 100644
--- a/lib/gym/xcode.rb
+++ b/lib/gym/xcode.rb
@@ -1,30 +1,12 @@
module Gym
class Xcode
class << self
- # Path to the Xcode installation we're using
- def xcode_path
- @path ||= `xcode-select --print-path`.strip
- end
-
- # Version of Xcode, e.g. 7.0
- def xcode_version
- @version ||= parse_version
- end
-
# Below Xcode 7 (which offers a new nice API to sign the app)
def pre_7?
v = xcode_version
is_pre = v.split('.')[0].to_i < 7
is_pre
end
-
- private
-
- def parse_version
- output = `DEVELOPER_DIR='' "#{xcode_path}/usr/bin/xcodebuild" -version`
- return '0.0' if output.nil?
- output.split("\n").first.split(' ')[1]
- end
end
end
end
From e6ba98b417221167bf8723cc2e2382a3902291af Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 17 Sep 2015 10:27:50 -0700
Subject: [PATCH 018/176] Added new helper methods to Xcode class
---
lib/gym/xcode.rb | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/lib/gym/xcode.rb b/lib/gym/xcode.rb
index e3b0fd6..ab7f7d4 100644
--- a/lib/gym/xcode.rb
+++ b/lib/gym/xcode.rb
@@ -1,6 +1,14 @@
module Gym
class Xcode
class << self
+ def xcode_path
+ Helper.xcode_path
+ end
+
+ def xcode_version
+ Helper.xcode_version
+ end
+
# Below Xcode 7 (which offers a new nice API to sign the app)
def pre_7?
v = xcode_version
From 3a72dac127a6867a847096bc47b1ba53d150f624 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 11:28:13 -0700
Subject: [PATCH 019/176] Added encoding fix for `swift_fix
---
lib/gym/xcodebuild_fixes/swift_fix.rb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/gym/xcodebuild_fixes/swift_fix.rb b/lib/gym/xcodebuild_fixes/swift_fix.rb
index 051265f..2a59680 100644
--- a/lib/gym/xcodebuild_fixes/swift_fix.rb
+++ b/lib/gym/xcodebuild_fixes/swift_fix.rb
@@ -1,3 +1,7 @@
+# encoding: utf-8
+# from http://stackoverflow.com/a/9857493/445598
+# because of
+# `incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)`
require 'zip'
module Gym
From 3fa40ca3023a2ed5040d4e535572509cdaa25d50 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 11:35:32 -0700
Subject: [PATCH 020/176] Added information abut the Xcode version to use
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index 3112bd3..57c23bc 100644
--- a/README.md
+++ b/README.md
@@ -116,6 +116,10 @@ That's all you need to build your application. If you want more control, here ar
gym --workspace "Example.xcworkspace" --scheme "AppName" --clean
+If you need to use a different xcode install, use xcode-select or define DEVELOPER_DIR:
+
+ DEVELOPER_DIR=/Applications/Xcode6.2.app gym
+
For a list of all available parameters use
gym --help
From 15fbd007ffbb2ab0af83871572c49064921ef14f Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 11:37:33 -0700
Subject: [PATCH 021/176] Fixed code style
---
lib/gym/xcodebuild_fixes/swift_fix.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/xcodebuild_fixes/swift_fix.rb b/lib/gym/xcodebuild_fixes/swift_fix.rb
index 2a59680..def9377 100644
--- a/lib/gym/xcodebuild_fixes/swift_fix.rb
+++ b/lib/gym/xcodebuild_fixes/swift_fix.rb
@@ -1,6 +1,6 @@
# encoding: utf-8
# from http://stackoverflow.com/a/9857493/445598
-# because of
+# because of
# `incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)`
require 'zip'
From e857d3f02a2adc8d82581cc7180ca0f69ffcf336 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 12:37:25 -0700
Subject: [PATCH 022/176] Added test for XML config file for new Xcode 7
---
spec/package_command_generator_xcode7_spec.rb | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
index ec03b41..701bcc0 100644
--- a/spec/package_command_generator_xcode7_spec.rb
+++ b/spec/package_command_generator_xcode7_spec.rb
@@ -13,5 +13,20 @@
""
])
end
+
+ it "generates a valid plist file we need" do
+ options = { project: "./examples/standard/Example.xcodeproj" }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+
+ result = Gym::PackageCommandGeneratorXcode7.generate
+ config_path = Gym::PackageCommandGeneratorXcode7.config_path
+
+ require 'plist'
+ expect(Plist.parse_xml(config_path)).to eq({
+ 'method' => "app-store",
+ 'uploadBitcode' => false,
+ 'uploadSymbols' => true
+ })
+ end
end
end
From 4fbee87148d4ab3f6052891dfbf2896667358a7a Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 12:38:53 -0700
Subject: [PATCH 023/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 7f221a3..3edebfc 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.5.0"
+ VERSION = "0.6.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From cec3c0f69fd5437823f9975dcd095757eb2256a3 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 12:39:26 -0700
Subject: [PATCH 024/176] Added quotes around env variable example
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 57c23bc..6f0eb77 100644
--- a/README.md
+++ b/README.md
@@ -118,7 +118,7 @@ That's all you need to build your application. If you want more control, here ar
If you need to use a different xcode install, use xcode-select or define DEVELOPER_DIR:
- DEVELOPER_DIR=/Applications/Xcode6.2.app gym
+ DEVELOPER_DIR="/Applications/Xcode6.2.app" gym
For a list of all available parameters use
From 86dae668b5ac3d984e68b1c2c36828999e5909c1 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 13:37:23 -0700
Subject: [PATCH 025/176] Changed from `upload` to `include`
---
README.md | 2 +-
lib/gym/generators/package_command_generator_xcode7.rb | 4 ++--
lib/gym/options.rb | 8 ++++----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 6f0eb77..bcccc7f 100644
--- a/README.md
+++ b/README.md
@@ -131,7 +131,7 @@ If you run into any issues, use the `verbose` mode to get more information
To pass boolean parameters make sure to use `gym` like this:
- gym --upload_bitcode true --upload_symbols true
+ gym --include_bitcode true --include_symbols true
# Gymfile
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 06b9123..5f0abae 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -50,8 +50,8 @@ def config_path
def config_content
require 'plist'
- symbols = (Gym.config[:upload_symbols] ? true : false)
- bitcode = (Gym.config[:upload_bitcode] ? true : false)
+ symbols = (Gym.config[:include_symbols] ? true : false)
+ bitcode = (Gym.config[:include_bitcode] ? true : false)
{
method: 'app-store',
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 287a155..922d404 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -101,14 +101,14 @@ def self.plain_options
verify_block: proc do |value|
raise "File not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
end),
- FastlaneCore::ConfigItem.new(key: :upload_symbols,
+ FastlaneCore::ConfigItem.new(key: :include_symbols,
short_option: "-m",
- env_name: "GYM_UPLOAD_SYMBOLS",
+ env_name: "GYM_INCLUDE_SYMBOLS",
description: "Should the ipa file include symbols?",
default_value: true),
- FastlaneCore::ConfigItem.new(key: :upload_bitcode,
+ FastlaneCore::ConfigItem.new(key: :include_bitcode,
short_option: "-z",
- env_name: "GYM_UPLOAD_BITCODE",
+ env_name: "GYM_INCLUDE_BITCODE",
description: "Should the ipa include bitcode?",
default_value: false),
FastlaneCore::ConfigItem.new(key: :provisioning_profile_path,
From d8513bc1675d687b2d1afe06eebb0d7a0c8524a4 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 13:37:46 -0700
Subject: [PATCH 026/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 3edebfc..8678f8a 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.6.0"
+ VERSION = "0.6.1"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From bedd24bedfdda558fe12044700bc81689ce01182 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 14:57:40 -0700
Subject: [PATCH 027/176] Improved ipa file detection with Xcode 7
Added new tests
---
lib/gym/generators/package_command_generator.rb | 1 +
.../package_command_generator_xcode7.rb | 15 +++++++++++++--
spec/package_command_generator_xcode7_spec.rb | 10 +++++++++-
3 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index fa20b95..e1b61c0 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -15,6 +15,7 @@ def appfile_path
generator.appfile_path
end
+ # The path in which the ipa file will be available after executing the command
def ipa_path
generator.ipa_path
end
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 5f0abae..b033b84 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -22,7 +22,7 @@ def options
options << "-exportOptionsPlist '#{config_path}'"
options << "-archivePath '#{BuildCommandGenerator.archive_path}'"
- options << "-exportPath '#{BuildCommandGenerator.build_path}'" # we move it once the binary is finished
+ options << "-exportPath '#{temporary_output_path}'"
options
end
@@ -31,8 +31,19 @@ def pipe
[""]
end
+ # We export the ipa into this directory, as we can't specify the ipa file directly
+ def temporary_output_path
+ @temporary_output_path ||= File.join("/tmp", Time.now.to_i.to_s)
+ end
+
def ipa_path
- File.join(BuildCommandGenerator.build_path, "#{Gym.config[:output_name]}.ipa")
+ unless @ipa_path
+ path = Dir[File.join(temporary_output_path, "*.ipa")].last
+
+ @ipa_path = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
+ FileUtils.mv(path, @ipa_path)
+ end
+ @ipa_path
end
# The path the the dsym file for this app. Might be nil
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
index 701bcc0..84eb1f2 100644
--- a/spec/package_command_generator_xcode7_spec.rb
+++ b/spec/package_command_generator_xcode7_spec.rb
@@ -9,7 +9,7 @@
"/usr/bin/xcrun xcodebuild -exportArchive",
"-exportOptionsPlist '#{Gym::PackageCommandGeneratorXcode7.config_path}'",
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
- "-exportPath '#{Gym::BuildCommandGenerator.build_path}'",
+ "-exportPath '#{Gym::PackageCommandGeneratorXcode7.temporary_output_path}'",
""
])
end
@@ -28,5 +28,13 @@
'uploadSymbols' => true
})
end
+
+ it "uses a temporary folder to store the resulting ipa file" do
+ options = { project: "./examples/standard/Example.xcodeproj" }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+
+ result = Gym::PackageCommandGeneratorXcode7.generate
+ expect(Gym::PackageCommandGeneratorXcode7.temporary_output_path).to match(%r{/tmp/\d+})
+ end
end
end
From abf253b7a314af5c446b57156e1a5aa2296840a1 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 14:57:48 -0700
Subject: [PATCH 028/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 8678f8a..ff6782c 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.6.1"
+ VERSION = "0.6.2"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 5743b53283e052af5eefaaf1ca4110c86f7cdf94 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Fri, 18 Sep 2015 15:41:34 -0700
Subject: [PATCH 029/176] Fixed parameter types for `include` parameters
---
lib/gym/options.rb | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 922d404..93a0d65 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -105,12 +105,14 @@ def self.plain_options
short_option: "-m",
env_name: "GYM_INCLUDE_SYMBOLS",
description: "Should the ipa file include symbols?",
- default_value: true),
+ default_value: true,
+ is_string: false),
FastlaneCore::ConfigItem.new(key: :include_bitcode,
short_option: "-z",
env_name: "GYM_INCLUDE_BITCODE",
description: "Should the ipa include bitcode?",
- default_value: false),
+ default_value: false,
+ is_string: false),
FastlaneCore::ConfigItem.new(key: :provisioning_profile_path,
short_option: "-e",
env_name: "GYM_PROVISIONING_PROFILE_PATH",
From 486c60448ab0debc8377f8c22d9b2055291b2ae1 Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sat, 19 Sep 2015 20:45:35 -0700
Subject: [PATCH 030/176] Added new `export_method` option for non appstore
builds
---
.../package_command_generator_xcode7.rb | 17 +++++++++--------
lib/gym/options.rb | 10 ++++++++++
spec/package_command_generator_xcode7_spec.rb | 13 +++++++++++++
3 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index b033b84..2cbb68b 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -61,14 +61,15 @@ def config_path
def config_content
require 'plist'
- symbols = (Gym.config[:include_symbols] ? true : false)
- bitcode = (Gym.config[:include_bitcode] ? true : false)
-
- {
- method: 'app-store',
- uploadSymbols: symbols,
- uploadBitcode: bitcode
- }.to_plist
+
+ hash = { method: Gym.config[:export_method] }
+
+ if Gym.config[:export_method] == 'app-store'
+ hash[:uploadSymbols] = (Gym.config[:include_symbols] ? true : false)
+ hash[:uploadBitcode] = (Gym.config[:include_bitcode] ? true : false)
+ end
+
+ hash.to_plist
end
end
end
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 93a0d65..bad8cbe 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -113,6 +113,16 @@ def self.plain_options
description: "Should the ipa include bitcode?",
default_value: false,
is_string: false),
+ FastlaneCore::ConfigItem.new(key: :export_method,
+ short_option: "-j",
+ env_name: "GYM_EXPORT_METHOD",
+ description: "How should gym export the archive?",
+ default_value: "app-store",
+ is_string: true,
+ verify_block: proc do |value|
+ av = %w(app-store ad-hoc package enterprise development developer-id)
+ raise "Unsupported export_method, must be: #{av}" unless av.include?(value)
+ end),
FastlaneCore::ConfigItem.new(key: :provisioning_profile_path,
short_option: "-e",
env_name: "GYM_PROVISIONING_PROFILE_PATH",
diff --git a/spec/package_command_generator_xcode7_spec.rb b/spec/package_command_generator_xcode7_spec.rb
index 84eb1f2..c49aa9b 100644
--- a/spec/package_command_generator_xcode7_spec.rb
+++ b/spec/package_command_generator_xcode7_spec.rb
@@ -29,6 +29,19 @@
})
end
+ it "doesn't store bitcode/symbols information for non app-store builds" do
+ options = { project: "./examples/standard/Example.xcodeproj", export_method: 'ad-hoc' }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+
+ result = Gym::PackageCommandGeneratorXcode7.generate
+ config_path = Gym::PackageCommandGeneratorXcode7.config_path
+
+ require 'plist'
+ expect(Plist.parse_xml(config_path)).to eq({
+ 'method' => "ad-hoc"
+ })
+ end
+
it "uses a temporary folder to store the resulting ipa file" do
options = { project: "./examples/standard/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
From 44d9b5ce12f281c60a4a76f2aa1bce791b7e9e2e Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sat, 19 Sep 2015 20:50:54 -0700
Subject: [PATCH 031/176] Improved output when using legacy parameters
---
.../package_command_generator_xcode7.rb | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 2cbb68b..829839e 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -3,10 +3,7 @@ module Gym
class PackageCommandGeneratorXcode7
class << self
def generate
- if Gym.config[:provisioning_profile_path]
- Helper.log.info "You're using Xcode 7, the `provisioning_profile_path` value will be ignored".yellow
- Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
- end
+ print_legacy_information
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
@@ -71,6 +68,18 @@ def config_content
hash.to_plist
end
+
+ def print_legacy_information
+ if Gym.config[:provisioning_profile_path]
+ Helper.log.info "You're using Xcode 7, the `provisioning_profile_path` value will be ignored".yellow
+ Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
+ end
+
+ if Gym.config[:codesigning_identity]
+ Helper.log.info "You're using Xcode 7, the `codesigning_identity` value will be ignored".yellow
+ Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
+ end
+ end
end
end
end
From 288e998cc768da1bc15998434aca1467a22f354e Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sat, 19 Sep 2015 20:54:37 -0700
Subject: [PATCH 032/176] Added support for code signing identity option while
building
---
lib/gym/generators/build_command_generator.rb | 4 +++-
lib/gym/generators/package_command_generator_xcode7.rb | 5 -----
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index e1ef677..f58c3db 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -57,7 +57,9 @@ def actions
end
def suffix
- []
+ suffix = []
+ suffix << "CODE_SIGN_IDENTITY='#{Gym.config[:codesigning_identity]}'" if Gym.config[:codesigning_identity]
+ suffix
end
def pipe
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 829839e..903484f 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -74,11 +74,6 @@ def print_legacy_information
Helper.log.info "You're using Xcode 7, the `provisioning_profile_path` value will be ignored".yellow
Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
end
-
- if Gym.config[:codesigning_identity]
- Helper.log.info "You're using Xcode 7, the `codesigning_identity` value will be ignored".yellow
- Helper.log.info "Please follow the Code Signing Guide: https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md".yellow
- end
end
end
end
From 5bbc95c32e609c02d277b83d7836c50d2969fd0c Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sat, 19 Sep 2015 20:54:40 -0700
Subject: [PATCH 033/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index ff6782c..b491321 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.6.2"
+ VERSION = "0.7.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 705f395de19d5e5579aaa8fd0d09e4fec818b644 Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sat, 19 Sep 2015 21:03:09 -0700
Subject: [PATCH 034/176] Fixed bug where `gym` tries to move a file which we
don't need
---
lib/gym/generators/package_command_generator_xcode7.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 903484f..7eec9d5 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -38,7 +38,7 @@ def ipa_path
path = Dir[File.join(temporary_output_path, "*.ipa")].last
@ipa_path = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
- FileUtils.mv(path, @ipa_path)
+ FileUtils.mv(path, @ipa_path) if File.expand_path(path) != File.expand_path(@ipa_path)
end
@ipa_path
end
From 29ceb64c310cae588139909fa689079f2291267b Mon Sep 17 00:00:00 2001
From: Nicolae Ghimbovschi
Date: Sun, 20 Sep 2015 11:16:56 +0300
Subject: [PATCH 035/176] Generate xcodebuild.log for more details
---
lib/gym/generators/build_command_generator.rb | 2 +-
spec/build_command_generator_spec.rb | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index f58c3db..99f3d95 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -63,7 +63,7 @@ def suffix
end
def pipe
- ["| xcpretty"]
+ ["| tee 'xcodebuild-#{Gym.config[:scheme]}.log' | xcpretty"]
end
# The path to set the Derived Data to
diff --git a/spec/build_command_generator_spec.rb b/spec/build_command_generator_spec.rb
index dec9edf..c2a9287 100644
--- a/spec/build_command_generator_spec.rb
+++ b/spec/build_command_generator_spec.rb
@@ -26,7 +26,7 @@
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
"DEBUG=1 BUNDLE_NAME=Example\\ App",
:archive,
- "| xcpretty"
+ "| tee 'xcodebuild-Example.log' | xcpretty"
])
end
@@ -47,7 +47,7 @@
"-destination 'generic/platform=iOS'",
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
:archive,
- "| xcpretty"
+ "| tee 'xcodebuild-Example.log' | xcpretty"
])
end
From 7afcf58581b510f580092b62374aaa913f5a198c Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 09:29:35 -0700
Subject: [PATCH 036/176] Added Xcode 7 information
---
README.md | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index bcccc7f..759b4db 100644
--- a/README.md
+++ b/README.md
@@ -190,9 +190,25 @@ xcodebuild -scheme 'Example' \
archive | xcpretty
```
-
After building the archive it is being checked by `gym`. If it's valid, it gets packaged up and signed into an `ipa` file.
+`gym` automatically chooses a different packaging method depending on the version of Xcode you're using.
+
+### Xcode 7 and above
+
+```
+/usr/bin/xcrun xcodebuild -exportArchive \
+-exportOptionsPlist '/tmp/gym_config_1442852529.plist' \
+-archivePath '/Users/fkrause/Library/Developer/Xcode/Archives/2015-09-21/App 2015-09-21 09.21.56.xcarchive' \
+-exportPath '/tmp/1442852529'
+```
+
+`gym` makes use of the new Xcode 7 API which allows us to specify the export options using a `plist` file. You can find more information about the available options by running `xcodebuild --help`.
+
+Using this method there are no workarounds for WatchKit or Swift required, as it uses the same technique Xcode uses when exporting your binary.
+
+### Xcode 6 and below
+
```
/usr/bin/xcrun /path/to/PackageApplication4Gym -v \
'/Users/felixkrause/Library/Developer/Xcode/Archives/2015-08-11/ExampleProductName 2015-08-11 18.15.30.xcarchive/Products/Applications/name.app' -o \
From 31e0f1b69b7ceaad0321cce209d61afe21fee70a Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 09:54:52 -0700
Subject: [PATCH 037/176] Don't delete patched file after running `gym`
Fixes https://github.com/fastlane/gym/issues/95
---
lib/gym/runner.rb | 1 -
lib/gym/xcodebuild_fixes/package_application_fix.rb | 13 ++-----------
2 files changed, 2 insertions(+), 12 deletions(-)
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 85977ae..a9ba09d 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -67,7 +67,6 @@ def fix_package
return unless Xcode.pre_7?
Gym::XcodebuildFixes.swift_library_fix
Gym::XcodebuildFixes.watchkit_fix
- Gym::XcodebuildFixes.clear_patched_package_application
end
# Builds the app and prepares the archive
diff --git a/lib/gym/xcodebuild_fixes/package_application_fix.rb b/lib/gym/xcodebuild_fixes/package_application_fix.rb
index 4bcaa0a..61d7c95 100644
--- a/lib/gym/xcodebuild_fixes/package_application_fix.rb
+++ b/lib/gym/xcodebuild_fixes/package_application_fix.rb
@@ -7,8 +7,8 @@ def patch_package_application
# Initialization
@patched_package_application_path = File.join("/tmp", "PackageApplication4Gym")
- # Remove any previous patched PackageApplication
- FileUtils.rm @patched_package_application_path if File.exist?(@patched_package_application_path)
+
+ return if File.exist?(@patched_package_application_path)
Dir.mktmpdir do |tmpdir|
# Check current PackageApplication MD5
@@ -42,15 +42,6 @@ def patch_package_application
return @patched_package_application_path # Return path to the patched PackageApplication
end
-
- # Remove the patched script after it was used
- def clear_patched_package_application
- if @patched_package_application_path and File.exist?(@patched_package_application_path)
- Helper.log.debug "Removing patched PackageApplication file at path '#{@patched_package_application_path}'" if $verbose
- # force in the unlikely event that the file was deleted (e.g. by a concurrent job)
- FileUtils.rm @patched_package_application_path, force: true
- end
- end
end
end
end
From 2a0c1732ba18888b05bd495ac490c726be500920 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 10:06:10 -0700
Subject: [PATCH 038/176] Fixed not returning the patched path if it already
exists
---
lib/gym/xcodebuild_fixes/package_application_fix.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/xcodebuild_fixes/package_application_fix.rb b/lib/gym/xcodebuild_fixes/package_application_fix.rb
index 61d7c95..681a82e 100644
--- a/lib/gym/xcodebuild_fixes/package_application_fix.rb
+++ b/lib/gym/xcodebuild_fixes/package_application_fix.rb
@@ -8,7 +8,7 @@ def patch_package_application
# Initialization
@patched_package_application_path = File.join("/tmp", "PackageApplication4Gym")
- return if File.exist?(@patched_package_application_path)
+ return @patched_package_application_path if File.exist?(@patched_package_application_path)
Dir.mktmpdir do |tmpdir|
# Check current PackageApplication MD5
From d8629e975c7d6e1b1d6af2cef3cfff991bee0f00 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 12:25:15 -0700
Subject: [PATCH 039/176] Added temporary use_legacy_build_api option
---
lib/gym/generators/package_command_generator.rb | 6 +++++-
lib/gym/options.rb | 12 ++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index e1b61c0..5a72e22 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -28,7 +28,11 @@ def dsym_path
# The generator we need to use for the currently used Xcode version
def generator
- Xcode.pre_7? ? PackageCommandGeneratorLegacy : PackageCommandGeneratorXcode7
+ if Xcode.pre_7? and !Gym.config[:use_legacy_build_api]
+ PackageCommandGeneratorLegacy
+ else
+ PackageCommandGeneratorXcode7
+ end
end
end
end
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index bad8cbe..34ffbde 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -1,6 +1,7 @@
require "fastlane_core"
require "credentials_manager"
+# rubocop:disable Metrics/AbcSize
module Gym
class Options
def self.available_options
@@ -113,6 +114,16 @@ def self.plain_options
description: "Should the ipa include bitcode?",
default_value: false,
is_string: false),
+ FastlaneCore::ConfigItem.new(key: :use_legacy_build_api,
+ env_name: "GYM_USE_LEGACY_BUILD_API",
+ description: "Don't use the new API because of https://openradar.appspot.com/radar?id=4952000420642816",
+ default_value: false,
+ is_string: false,
+ verify_block: proc do |value|
+ if value
+ Helper.log.info "Using legacy build system - waiting for radar to be fixed: https://openradar.appspot.com/radar?id=4952000420642816".red
+ end
+ end),
FastlaneCore::ConfigItem.new(key: :export_method,
short_option: "-j",
env_name: "GYM_EXPORT_METHOD",
@@ -136,3 +147,4 @@ def self.plain_options
end
end
end
+# rubocop:enable Metrics/AbcSize
From 2e17e8506f8ac1cd34c7b03dc1b9a6dda7489a7e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 12:25:38 -0700
Subject: [PATCH 040/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index b491321..464c818 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.7.0"
+ VERSION = "0.7.1"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From a4d61829da26effbdbbce9adec58945d664c39dd Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 12:48:36 -0700
Subject: [PATCH 041/176] Added auto-detect of the export issue with
instructions how to solve it
---
lib/gym/error_handler.rb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/gym/error_handler.rb b/lib/gym/error_handler.rb
index 767d977..78d7828 100644
--- a/lib/gym/error_handler.rb
+++ b/lib/gym/error_handler.rb
@@ -80,6 +80,10 @@ def handle_package_error(output)
when /Codesign check fails/
print "A general code signing error occurred. Make sure you passed a valid"
print "provisioning profile and code signing identity."
+ when /expected one of \{\}/
+ print "It seems like you ran into this radar"
+ print "https://openradar.appspot.com/radar?id=4952000420642816"
+ print "You can temporary use the :use_legacy_build_api option to get the build to work again"
end
raise "Error packaging up the application".red
end
From a2f1fbcfb7847b7a6029530d7de3100060665c01 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 13:58:35 -0700
Subject: [PATCH 042/176] Fixed use_legacy_build_api flag
---
lib/gym.rb | 1 -
lib/gym/generators/package_command_generator.rb | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index ba75c62..64e6aa4 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -29,7 +29,6 @@ def gymfile_name
end
def init_libs
- return unless Xcode.pre_7?
# Import all the fixes
require 'gym/xcodebuild_fixes/swift_fix'
require 'gym/xcodebuild_fixes/watchkit_fix'
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index 5a72e22..27c870b 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -28,7 +28,7 @@ def dsym_path
# The generator we need to use for the currently used Xcode version
def generator
- if Xcode.pre_7? and !Gym.config[:use_legacy_build_api]
+ if Xcode.pre_7? or Gym.config[:use_legacy_build_api]
PackageCommandGeneratorLegacy
else
PackageCommandGeneratorXcode7
From 3901023dd0fbced2cc8514f1a7857f386d79940e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 13:58:58 -0700
Subject: [PATCH 043/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 464c818..5651928 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.7.1"
+ VERSION = "0.7.2"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From bfebecbdcc473dc644456af9a1628cef5954b967 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 21 Sep 2015 15:00:50 -0700
Subject: [PATCH 044/176] Updated bundle identifiers of example projects
---
.../WatchKit.xcodeproj/project.pbxproj | 9 +-
.../xcshareddata/WatchKit.xcscmblueprint | 30 ++++
...ication - WatchKit WatchKit 1 App.xcscheme | 145 ++++++++++++++++++
.../WatchKit WatchKit 1 App.xcscheme | 141 +++++++++++++++++
.../xcschemes/WatchKit.xcscheme | 91 +++++++++++
.../xcschemes/xcschememanagement.plist | 37 +++++
.../Example.xcodeproj/project.pbxproj | 8 +-
.../xcschemes/xcschememanagement.plist | 24 +++
.../xcshareddata/Example.xcscmblueprint | 30 ++++
.../xcschemes/xcschememanagement.plist | 19 +++
.../Example.xcodeproj/project.pbxproj | 8 +-
.../xcshareddata/Example.xcscmblueprint | 30 ++++
.../xcschemes/xcschememanagement.plist | 24 +++
.../Example.xcodeproj/project.pbxproj | 8 +-
.../xcshareddata/Example.xcscmblueprint | 30 ++++
.../xcschemes/xcschememanagement.plist | 24 +++
.../today/Example.xcodeproj/project.pbxproj | 12 +-
.../xcshareddata/Example.xcscmblueprint | 30 ++++
.../xcschemes/xcschememanagement.plist | 24 +++
.../With Spaces.xcodeproj/project.pbxproj | 9 +-
.../xcshareddata/With Spaces.xcscmblueprint | 30 ++++
...tion - With Spaces WatchKit 1 App.xcscheme | 117 ++++++++++++++
.../With Spaces WatchKit 1 App.xcscheme | 113 ++++++++++++++
.../xcschemes/With Spaces.xcscheme | 91 +++++++++++
.../xcschemes/xcschememanagement.plist | 37 +++++
25 files changed, 1097 insertions(+), 24 deletions(-)
create mode 100644 examples/WatchKit/WatchKit.xcodeproj/project.xcworkspace/xcshareddata/WatchKit.xcscmblueprint
create mode 100644 examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - WatchKit WatchKit 1 App.xcscheme
create mode 100644 examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit WatchKit 1 App.xcscheme
create mode 100644 examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit.xcscheme
create mode 100644 examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/cocoapods/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/cocoapods/Example.xcworkspace/xcshareddata/Example.xcscmblueprint
create mode 100644 examples/cocoapods/Pods/Pods.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/multipleSchemes/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
create mode 100644 examples/multipleSchemes/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/standard/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
create mode 100644 examples/standard/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/today/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
create mode 100644 examples/today/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 examples/with spaces/With Spaces.xcodeproj/project.xcworkspace/xcshareddata/With Spaces.xcscmblueprint
create mode 100644 examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - With Spaces WatchKit 1 App.xcscheme
create mode 100644 examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces WatchKit 1 App.xcscheme
create mode 100644 examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces.xcscheme
create mode 100644 examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
diff --git a/examples/WatchKit/WatchKit.xcodeproj/project.pbxproj b/examples/WatchKit/WatchKit.xcodeproj/project.pbxproj
index 6db1529..b593aec 100644
--- a/examples/WatchKit/WatchKit.xcodeproj/project.pbxproj
+++ b/examples/WatchKit/WatchKit.xcodeproj/project.pbxproj
@@ -445,9 +445,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = WatchKit/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.WatchKit;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
@@ -456,9 +457,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = WatchKit/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.WatchKit;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
@@ -534,6 +536,7 @@
CA461FED1B84738C0037A37B /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
CA46200F1B8473930037A37B /* Build configuration list for PBXNativeTarget "WatchKit WatchKit 1 App" */ = {
isa = XCConfigurationList;
@@ -542,6 +545,7 @@
CA4620111B8473930037A37B /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
CA4620121B8473930037A37B /* Build configuration list for PBXNativeTarget "WatchKit WatchKit 1 Extension" */ = {
isa = XCConfigurationList;
@@ -550,6 +554,7 @@
CA4620141B8473930037A37B /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
diff --git a/examples/WatchKit/WatchKit.xcodeproj/project.xcworkspace/xcshareddata/WatchKit.xcscmblueprint b/examples/WatchKit/WatchKit.xcodeproj/project.xcworkspace/xcshareddata/WatchKit.xcscmblueprint
new file mode 100644
index 0000000..229e29b
--- /dev/null
+++ b/examples/WatchKit/WatchKit.xcodeproj/project.xcworkspace/xcshareddata/WatchKit.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "384272E4-7D16-4230-B482-A546F8BD54A7",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "WatchKit",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/WatchKit\/WatchKit.xcodeproj",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - WatchKit WatchKit 1 App.xcscheme b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - WatchKit WatchKit 1 App.xcscheme
new file mode 100644
index 0000000..9a91d5e
--- /dev/null
+++ b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - WatchKit WatchKit 1 App.xcscheme
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit WatchKit 1 App.xcscheme b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit WatchKit 1 App.xcscheme
new file mode 100644
index 0000000..91825a7
--- /dev/null
+++ b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit WatchKit 1 App.xcscheme
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit.xcscheme b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit.xcscheme
new file mode 100644
index 0000000..257cf89
--- /dev/null
+++ b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/WatchKit.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..708572f
--- /dev/null
+++ b/examples/WatchKit/WatchKit.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,37 @@
+
+
+
+
+ SchemeUserState
+
+ Notification - WatchKit WatchKit 1 App.xcscheme
+
+ orderHint
+ 2
+
+ WatchKit WatchKit 1 App.xcscheme
+
+ orderHint
+ 1
+
+ WatchKit.xcscheme
+
+ orderHint
+ 0
+
+
+ SuppressBuildableAutocreation
+
+ CA461FD31B84738C0037A37B
+
+ primary
+
+
+ CA4620001B8473930037A37B
+
+ primary
+
+
+
+
+
diff --git a/examples/cocoapods/Example.xcodeproj/project.pbxproj b/examples/cocoapods/Example.xcodeproj/project.pbxproj
index 7431d27..b0026d0 100644
--- a/examples/cocoapods/Example.xcodeproj/project.pbxproj
+++ b/examples/cocoapods/Example.xcodeproj/project.pbxproj
@@ -471,10 +471,10 @@
baseConfigurationReference = ACCA4067A20AE82A13A55B4D /* Pods-Example.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
@@ -485,10 +485,10 @@
baseConfigurationReference = 7F17E2E4DB202336112485AA /* Pods-Example.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
diff --git a/examples/cocoapods/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/cocoapods/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..642a1dd
--- /dev/null
+++ b/examples/cocoapods/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ SuppressBuildableAutocreation
+
+ CAC1E1971B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1B01B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1BB1B6A326200A8B23A
+
+ primary
+
+
+
+
+
diff --git a/examples/cocoapods/Example.xcworkspace/xcshareddata/Example.xcscmblueprint b/examples/cocoapods/Example.xcworkspace/xcshareddata/Example.xcscmblueprint
new file mode 100644
index 0000000..818935e
--- /dev/null
+++ b/examples/cocoapods/Example.xcworkspace/xcshareddata/Example.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "B0B54A05-D112-479E-84BB-D9FA30D6062E",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "Example",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/cocoapods\/Example.xcworkspace",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/cocoapods/Pods/Pods.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/cocoapods/Pods/Pods.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..c2d7cb5
--- /dev/null
+++ b/examples/cocoapods/Pods/Pods.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,19 @@
+
+
+
+
+ SuppressBuildableAutocreation
+
+ 8E46265702A9FA999EF6AC4B2576B14F
+
+ primary
+
+
+ FB2714B8EF1C625F78C19E0D0EF6E5A8
+
+ primary
+
+
+
+
+
diff --git a/examples/multipleSchemes/Example.xcodeproj/project.pbxproj b/examples/multipleSchemes/Example.xcodeproj/project.pbxproj
index f4ca25b..ef00a57 100644
--- a/examples/multipleSchemes/Example.xcodeproj/project.pbxproj
+++ b/examples/multipleSchemes/Example.xcodeproj/project.pbxproj
@@ -411,10 +411,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
@@ -424,10 +424,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
diff --git a/examples/multipleSchemes/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint b/examples/multipleSchemes/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
new file mode 100644
index 0000000..1255ee2
--- /dev/null
+++ b/examples/multipleSchemes/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "FF59B69C-C47E-4AB7-80E3-C9D623C3D37B",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "Example",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/multipleSchemes\/Example.xcodeproj",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/multipleSchemes/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/multipleSchemes/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..642a1dd
--- /dev/null
+++ b/examples/multipleSchemes/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ SuppressBuildableAutocreation
+
+ CAC1E1971B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1B01B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1BB1B6A326200A8B23A
+
+ primary
+
+
+
+
+
diff --git a/examples/standard/Example.xcodeproj/project.pbxproj b/examples/standard/Example.xcodeproj/project.pbxproj
index f4ca25b..ef00a57 100644
--- a/examples/standard/Example.xcodeproj/project.pbxproj
+++ b/examples/standard/Example.xcodeproj/project.pbxproj
@@ -411,10 +411,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
@@ -424,10 +424,10 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
PROVISIONING_PROFILE = "";
};
diff --git a/examples/standard/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint b/examples/standard/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
new file mode 100644
index 0000000..4f6a956
--- /dev/null
+++ b/examples/standard/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "F3078953-4758-46C3-AC3D-87FEF88956AF",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "Example",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/standard\/Example.xcodeproj",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/standard/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/standard/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..642a1dd
--- /dev/null
+++ b/examples/standard/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ SuppressBuildableAutocreation
+
+ CAC1E1971B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1B01B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1BB1B6A326200A8B23A
+
+ primary
+
+
+
+
+
diff --git a/examples/today/Example.xcodeproj/project.pbxproj b/examples/today/Example.xcodeproj/project.pbxproj
index 17ca18f..ef00a57 100644
--- a/examples/today/Example.xcodeproj/project.pbxproj
+++ b/examples/today/Example.xcodeproj/project.pbxproj
@@ -411,12 +411,12 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
- PROVISIONING_PROFILE = "067a4fdf-f03d-4fb8-8dc9-f9dfb6dbd";
+ PROVISIONING_PROFILE = "";
};
name = Debug;
};
@@ -424,12 +424,12 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CODE_SIGN_IDENTITY = "iPhone Distribution: SunApps GmbH (5A997XSHK2)";
+ CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = Example/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)ProductName";
- PROVISIONING_PROFILE = "067a4fdf-f03d-4fb8-8dc9-f9dfb6dbd";
+ PROVISIONING_PROFILE = "";
};
name = Release;
};
diff --git a/examples/today/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint b/examples/today/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
new file mode 100644
index 0000000..52370e6
--- /dev/null
+++ b/examples/today/Example.xcodeproj/project.xcworkspace/xcshareddata/Example.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "40549047-3043-4E27-90B2-4497ECB8EE80",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "Example",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/today\/Example.xcodeproj",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/today/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/today/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..642a1dd
--- /dev/null
+++ b/examples/today/Example.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ SuppressBuildableAutocreation
+
+ CAC1E1971B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1B01B6A326100A8B23A
+
+ primary
+
+
+ CAC1E1BB1B6A326200A8B23A
+
+ primary
+
+
+
+
+
diff --git a/examples/with spaces/With Spaces.xcodeproj/project.pbxproj b/examples/with spaces/With Spaces.xcodeproj/project.pbxproj
index 1276cd0..3c60f1b 100644
--- a/examples/with spaces/With Spaces.xcodeproj/project.pbxproj
+++ b/examples/with spaces/With Spaces.xcodeproj/project.pbxproj
@@ -362,9 +362,9 @@
CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = "With Spaces/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE = "675dcbd2-06a8-4a38-91a9-33ad0faf22b1";
+ PROVISIONING_PROFILE = "";
};
name = Debug;
};
@@ -375,9 +375,9 @@
CODE_SIGN_IDENTITY = "iPhone Distribution";
INFOPLIST_FILE = "With Spaces/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- PRODUCT_BUNDLE_IDENTIFIER = net.sunapps.9;
+ PRODUCT_BUNDLE_IDENTIFIER = tools.fastlane.app;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE = "675dcbd2-06a8-4a38-91a9-33ad0faf22b1";
+ PROVISIONING_PROFILE = "";
};
name = Release;
};
@@ -443,6 +443,7 @@
CAB109241B7A641500F53B5F /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
diff --git a/examples/with spaces/With Spaces.xcodeproj/project.xcworkspace/xcshareddata/With Spaces.xcscmblueprint b/examples/with spaces/With Spaces.xcodeproj/project.xcworkspace/xcshareddata/With Spaces.xcscmblueprint
new file mode 100644
index 0000000..c515232
--- /dev/null
+++ b/examples/with spaces/With Spaces.xcodeproj/project.xcworkspace/xcshareddata/With Spaces.xcscmblueprint
@@ -0,0 +1,30 @@
+{
+ "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
+
+ },
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : 0,
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : 0
+ },
+ "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "DAED6B94-01EB-4907-BDCD-FC15F46055DF",
+ "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
+ "92E86429DF370BECD7A1A0FC00BA6FF984F9710D" : "gym\/",
+ "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF" : ""
+ },
+ "DVTSourceControlWorkspaceBlueprintNameKey" : "With Spaces",
+ "DVTSourceControlWorkspaceBlueprintVersion" : 204,
+ "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "examples\/with spaces\/With Spaces.xcodeproj",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/fastlane\/countdown",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11BD64E841BB6AC3A48BA84DC911C1D4F58BDACF"
+ },
+ {
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/krausefx\/gym",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
+ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "92E86429DF370BECD7A1A0FC00BA6FF984F9710D"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - With Spaces WatchKit 1 App.xcscheme b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - With Spaces WatchKit 1 App.xcscheme
new file mode 100644
index 0000000..543a4fe
--- /dev/null
+++ b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/Notification - With Spaces WatchKit 1 App.xcscheme
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces WatchKit 1 App.xcscheme b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces WatchKit 1 App.xcscheme
new file mode 100644
index 0000000..a3abf36
--- /dev/null
+++ b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces WatchKit 1 App.xcscheme
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces.xcscheme b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces.xcscheme
new file mode 100644
index 0000000..e2a92f1
--- /dev/null
+++ b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/With Spaces.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..12872a3
--- /dev/null
+++ b/examples/with spaces/With Spaces.xcodeproj/xcuserdata/fkrause.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,37 @@
+
+
+
+
+ SchemeUserState
+
+ Notification - With Spaces WatchKit 1 App.xcscheme
+
+ orderHint
+ 2
+
+ With Spaces WatchKit 1 App.xcscheme
+
+ orderHint
+ 1
+
+ With Spaces.xcscheme
+
+ orderHint
+ 0
+
+
+ SuppressBuildableAutocreation
+
+ CAA5624F1B7A5A39007AECEF
+
+ primary
+
+
+ CAB109121B7A641500F53B5F
+
+ primary
+
+
+
+
+
From 69d3cf8dffd714bcc96341ddf1e4d27572451e11 Mon Sep 17 00:00:00 2001
From: Jerome Lacoste
Date: Tue, 22 Sep 2015 07:16:06 +0200
Subject: [PATCH 045/176] Reuse Project.mac? to detect project destination on
Xcode 6.4
---
lib/gym/detect_values.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index 6fe2671..c14635f 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -132,7 +132,7 @@ def self.detect_scheme
# Is it an iOS device or a Mac?
def self.detect_platform
return if Gym.config[:destination]
- platform = Gym.project.build_settings(key: "PLATFORM_DISPLAY_NAME") || "iOS" # either `iOS` or `OS X`
+ platform = Gym.project.mac? ? "OS X" : "iOS" # either `iOS` or `OS X`
Gym.config[:destination] = "generic/platform=#{platform}"
end
From d97410d8f24e23520a6e4a5eb6155e3f1eca0b47 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 22 Sep 2015 15:44:24 -0700
Subject: [PATCH 046/176] Hide legacy note when value is automatically set via
fastlane
---
lib/gym/generators/package_command_generator_xcode7.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 7eec9d5..022a319 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -3,7 +3,7 @@ module Gym
class PackageCommandGeneratorXcode7
class << self
def generate
- print_legacy_information
+ print_legacy_information unless Helper.fastlane_enabled?
parts = ["/usr/bin/xcrun xcodebuild -exportArchive"]
parts += options
From 76a18509b7546712d7aaa6ac61ca585a2c905aa6 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 22 Sep 2015 17:36:31 -0700
Subject: [PATCH 047/176] Added raw xcodebuild logs in logs folder
Added note in README
---
README.md | 1 +
lib/gym/generators/build_command_generator.rb | 7 ++++++-
spec/build_command_generator_spec.rb | 8 ++++++--
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 759b4db..7848fee 100644
--- a/README.md
+++ b/README.md
@@ -133,6 +133,7 @@ To pass boolean parameters make sure to use `gym` like this:
gym --include_bitcode true --include_symbols true
+To access the raw `xcodebuild` output open `~/Library/Logs` and search for files starting with `xcodebuild`
# Gymfile
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index 99f3d95..5e2d47a 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -63,7 +63,12 @@ def suffix
end
def pipe
- ["| tee 'xcodebuild-#{Gym.config[:scheme]}.log' | xcpretty"]
+ ["| tee '#{xcodebuild_log_path}' | xcpretty"]
+ end
+
+ def xcodebuild_log_path
+ file_name = "xcodebuild-#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
+ return File.expand_path("~/Library/Logs/#{file_name}")
end
# The path to set the Derived Data to
diff --git a/spec/build_command_generator_spec.rb b/spec/build_command_generator_spec.rb
index c2a9287..cd8b029 100644
--- a/spec/build_command_generator_spec.rb
+++ b/spec/build_command_generator_spec.rb
@@ -7,6 +7,8 @@
end
it "supports additional parameters" do
+ log_path = File.expand_path("~/Library/Logs/xcodebuild-ExampleProductName-Example.log")
+
xcargs_hash = { DEBUG: "1", BUNDLE_NAME: "Example App" }
xcargs = xcargs_hash.map do |k, v|
"#{k.to_s.shellescape}=#{v.shellescape}"
@@ -26,7 +28,7 @@
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
"DEBUG=1 BUNDLE_NAME=Example\\ App",
:archive,
- "| tee 'xcodebuild-Example.log' | xcpretty"
+ "| tee '#{log_path}' | xcpretty"
])
end
@@ -37,6 +39,8 @@
end
it "uses the correct build command with the example project with no additional parameters" do
+ log_path = File.expand_path("~/Library/Logs/xcodebuild-ExampleProductName-Example.log")
+
result = Gym::BuildCommandGenerator.generate
expect(result).to eq([
"set -o pipefail &&",
@@ -47,7 +51,7 @@
"-destination 'generic/platform=iOS'",
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
:archive,
- "| tee 'xcodebuild-Example.log' | xcpretty"
+ "| tee '#{log_path}' | xcpretty"
])
end
From 2e3c45c34379af93aa395ff8bf3eeb207b5ef6f6 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 22 Sep 2015 17:41:04 -0700
Subject: [PATCH 048/176] Raw xcodebuild logs are now stored in gym subfolder
---
README.md | 2 +-
lib/gym/generators/build_command_generator.rb | 7 +++++--
spec/build_command_generator_spec.rb | 4 ++--
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 7848fee..f9464bc 100644
--- a/README.md
+++ b/README.md
@@ -133,7 +133,7 @@ To pass boolean parameters make sure to use `gym` like this:
gym --include_bitcode true --include_symbols true
-To access the raw `xcodebuild` output open `~/Library/Logs` and search for files starting with `xcodebuild`
+To access the raw `xcodebuild` output open `~/Library/Logs/gym`
# Gymfile
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index 5e2d47a..43b02dc 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -67,8 +67,11 @@ def pipe
end
def xcodebuild_log_path
- file_name = "xcodebuild-#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
- return File.expand_path("~/Library/Logs/#{file_name}")
+ file_name = "#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
+ containing = File.expand_path("~/Library/Logs/gym")
+ FileUtils.mkdir_p(containing)
+
+ return File.join(containing, file_name)
end
# The path to set the Derived Data to
diff --git a/spec/build_command_generator_spec.rb b/spec/build_command_generator_spec.rb
index cd8b029..067b392 100644
--- a/spec/build_command_generator_spec.rb
+++ b/spec/build_command_generator_spec.rb
@@ -7,7 +7,7 @@
end
it "supports additional parameters" do
- log_path = File.expand_path("~/Library/Logs/xcodebuild-ExampleProductName-Example.log")
+ log_path = File.expand_path("~/Library/Logs/gym/ExampleProductName-Example.log")
xcargs_hash = { DEBUG: "1", BUNDLE_NAME: "Example App" }
xcargs = xcargs_hash.map do |k, v|
@@ -39,7 +39,7 @@
end
it "uses the correct build command with the example project with no additional parameters" do
- log_path = File.expand_path("~/Library/Logs/xcodebuild-ExampleProductName-Example.log")
+ log_path = File.expand_path("~/Library/Logs/gym/ExampleProductName-Example.log")
result = Gym::BuildCommandGenerator.generate
expect(result).to eq([
From d3b2d3f9d9faa258877bd77aa8bcb5687872f730 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 22 Sep 2015 17:41:32 -0700
Subject: [PATCH 049/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 5651928..ef4ac00 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.7.2"
+ VERSION = "0.7.3"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From c7ab17c51e265d283f4ed76027925d591d645ce7 Mon Sep 17 00:00:00 2001
From: Nicolae Ghimbovschi
Date: Wed, 23 Sep 2015 04:58:44 +0300
Subject: [PATCH 050/176] Added buildlog_path option to change the location of
the xcodebuild logs
---
lib/gym/generators/build_command_generator.rb | 4 +++-
lib/gym/options.rb | 5 +++++
spec/build_command_generator_spec.rb | 12 ++++++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index 43b02dc..0ef5992 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -68,7 +68,9 @@ def pipe
def xcodebuild_log_path
file_name = "#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
- containing = File.expand_path("~/Library/Logs/gym")
+ file_dir = Gym.config[:buildlog_path]
+ file_dir ||= "~/Library/Logs/gym"
+ containing = File.expand_path(file_dir)
FileUtils.mkdir_p(containing)
return File.join(containing, file_name)
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 34ffbde..e04b79b 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -63,6 +63,11 @@ def self.plain_options
verify_block: proc do |value|
value.gsub!(".ipa", "")
end),
+ FastlaneCore::ConfigItem.new(key: :buildlog_path,
+ short_option: "-l",
+ env_name: "GYM_BUILDLOG_PATH",
+ description: "The directory were to store the build log",
+ optional: true),
FastlaneCore::ConfigItem.new(key: :sdk,
short_option: "-k",
env_name: "GYM_SDK",
diff --git a/spec/build_command_generator_spec.rb b/spec/build_command_generator_spec.rb
index 067b392..27ef922 100644
--- a/spec/build_command_generator_spec.rb
+++ b/spec/build_command_generator_spec.rb
@@ -71,6 +71,18 @@
regex = %r{Library/Developer/Xcode/Archives/\d\d\d\d\-\d\d\-\d\d/ExampleProductName \d\d\d\d\-\d\d\-\d\d \d\d\.\d\d\.\d\d.xcarchive}
expect(result).to match(regex)
end
+
+ it "#buildlog_path is used when provided" do
+ options = { project: "./examples/standard/Example.xcodeproj", buildlog_path: "/tmp/my/path" }
+ Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
+ result = Gym::BuildCommandGenerator.xcodebuild_log_path
+ expect(result).to include("/tmp/my/path")
+ end
+
+ it "#buildlog_path is not used when not provided" do
+ result = Gym::BuildCommandGenerator.xcodebuild_log_path
+ expect(result.to_s).to include("Library/Logs/gym")
+ end
end
end
end
From e9ba16a98c82ce88692c776b871fae9aecd9d6e4 Mon Sep 17 00:00:00 2001
From: Nicolae Ghimbovschi
Date: Wed, 23 Sep 2015 05:37:23 +0300
Subject: [PATCH 051/176] Simplified the buildlog_path implementation
---
lib/gym/generators/build_command_generator.rb | 4 +---
lib/gym/options.rb | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index 0ef5992..60d70e4 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -68,9 +68,7 @@ def pipe
def xcodebuild_log_path
file_name = "#{Gym.project.app_name}-#{Gym.config[:scheme]}.log"
- file_dir = Gym.config[:buildlog_path]
- file_dir ||= "~/Library/Logs/gym"
- containing = File.expand_path(file_dir)
+ containing = File.expand_path(Gym.config[:buildlog_path])
FileUtils.mkdir_p(containing)
return File.join(containing, file_name)
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index e04b79b..6b1eea2 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -67,7 +67,7 @@ def self.plain_options
short_option: "-l",
env_name: "GYM_BUILDLOG_PATH",
description: "The directory were to store the build log",
- optional: true),
+ default_value: "~/Library/Logs/gym"),
FastlaneCore::ConfigItem.new(key: :sdk,
short_option: "-k",
env_name: "GYM_SDK",
From 7837fe18265ee6de2ca2ad05ae64a46e3e5dc221 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 09:52:54 -0700
Subject: [PATCH 052/176] Added showing of export method in build summary
---
lib/gym/generators/package_command_generator.rb | 2 --
lib/gym/manager.rb | 5 +++++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index 27c870b..d75ef77 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -24,8 +24,6 @@ def dsym_path
generator.dsym_path
end
- private
-
# The generator we need to use for the currently used Xcode version
def generator
if Xcode.pre_7? or Gym.config[:use_legacy_build_api]
diff --git a/lib/gym/manager.rb b/lib/gym/manager.rb
index 43e5019..2d6b3d5 100644
--- a/lib/gym/manager.rb
+++ b/lib/gym/manager.rb
@@ -17,6 +17,11 @@ def print_summary
rows << ["Workspace", config[:workspace]] if config[:workspace]
rows << ["Scheme", config[:scheme]] if config[:scheme]
rows << ["Configuration", config[:configuration]] if config[:configuration]
+
+ if PackageCommandGenerator.generator == PackageCommandGeneratorXcode7
+ rows << ["Export Method", config[:export_method]]
+ end
+
rows << ["Archive Path", config[:archive_path]] if config[:archive_path]
rows << ["Platform", Gym.project.ios? ? "iOS" : "Mac"]
rows << ["Xcode Path", Xcode.xcode_path.gsub("/Contents/Developer", "")]
From 928d28275350aab583ad4ce2ff7362a95f961a50 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 09:53:00 -0700
Subject: [PATCH 053/176] Improved code style
---
.rubocop_general.yml | 9 +++++----
lib/gym/options.rb | 2 --
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/.rubocop_general.yml b/.rubocop_general.yml
index 4283c8c..fee75a1 100644
--- a/.rubocop_general.yml
+++ b/.rubocop_general.yml
@@ -51,6 +51,11 @@ Metrics/MethodLength:
Exclude:
- 'lib/*/options.rb'
+Metrics/AbcSize:
+ Max: 60
+ Exclude:
+ - 'lib/*/options.rb'
+
# Both string notations are okay
Style/StringLiterals:
Enabled: false
@@ -83,10 +88,6 @@ Style/AlignHash:
Style/AndOr:
Enabled: false
-# Offense count: 20
-Metrics/AbcSize:
- Max: 60
-
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 320
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 34ffbde..42dcd16 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -1,7 +1,6 @@
require "fastlane_core"
require "credentials_manager"
-# rubocop:disable Metrics/AbcSize
module Gym
class Options
def self.available_options
@@ -147,4 +146,3 @@ def self.plain_options
end
end
end
-# rubocop:enable Metrics/AbcSize
From d8b111e97aac672c4801b8c6427d2c2e56a01be5 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 10:15:13 -0700
Subject: [PATCH 054/176] Fixed problem with case sensitivity
Fixes https://github.com/fastlane/gym/issues/101
---
lib/gym/generators/package_command_generator_xcode7.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 022a319..bb2af2d 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -38,7 +38,7 @@ def ipa_path
path = Dir[File.join(temporary_output_path, "*.ipa")].last
@ipa_path = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
- FileUtils.mv(path, @ipa_path) if File.expand_path(path) != File.expand_path(@ipa_path)
+ FileUtils.mv(path, @ipa_path) if File.expand_path(path).downcase != File.expand_path(@ipa_path).downcase
end
@ipa_path
end
From 1f83a30eab85275894b4300e1ad961cd74c82278 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 11:22:43 -0700
Subject: [PATCH 055/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index ef4ac00..ee5a8ff 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.7.3"
+ VERSION = "0.8.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 9a68848bf15b0e9707581f7cca6c24a321f17536 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 13:42:56 -0700
Subject: [PATCH 056/176] export_method will be determined at a later point
---
lib/gym/detect_values.rb | 3 +++
lib/gym/options.rb | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index c14635f..ef5a33d 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -30,6 +30,9 @@ def self.set_additional_default_values
config[:output_name] ||= Gym.project.app_name
+ # we do it here, since the value is optional and should be pre-filled by fastlane if necessary
+ config[:export_method] ||= "app-store"
+
return config
end
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index c362f71..127a5a2 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -132,8 +132,8 @@ def self.plain_options
short_option: "-j",
env_name: "GYM_EXPORT_METHOD",
description: "How should gym export the archive?",
- default_value: "app-store",
is_string: true,
+ optional: true,
verify_block: proc do |value|
av = %w(app-store ad-hoc package enterprise development developer-id)
raise "Unsupported export_method, must be: #{av}" unless av.include?(value)
From 6cba18d693933eb212e78d75064074a655edcc4c Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 13:43:45 -0700
Subject: [PATCH 057/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index ee5a8ff..ebf39fa 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.0"
+ VERSION = "0.8.1"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 5635574d492847ed78c34aee6ce80310218813af Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 16:45:14 -0700
Subject: [PATCH 058/176] Fixed gym paths when running gym multiple times in
one lane
---
lib/gym.rb | 5 ++++-
lib/gym/generators/build_command_generator.rb | 16 ++++++++--------
.../package_command_generator_xcode7.rb | 14 +++++++-------
3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index 64e6aa4..d2af068 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -19,10 +19,13 @@ class << self
attr_accessor :project
+ attr_accessor :cache
+
def config=(value)
@config = value
DetectValues.set_additional_default_values
- end
+ @cache = {}
+ end
def gymfile_name
"Gymfile"
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index 60d70e4..e941b45 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -76,22 +76,22 @@ def xcodebuild_log_path
# The path to set the Derived Data to
def build_path
- unless @build_path
+ unless Gym.cache[:build_path]
day = Time.now.strftime("%F") # e.g. 2015-08-07
- @build_path = File.expand_path("~/Library/Developer/Xcode/Archives/#{day}/")
- FileUtils.mkdir_p @build_path
+ Gym.cache[:build_path] = File.expand_path("~/Library/Developer/Xcode/Archives/#{day}/")
+ FileUtils.mkdir_p Gym.cache[:build_path]
end
- @build_path
+ Gym.cache[:build_path]
end
def archive_path
- @archive_path ||= Gym.config[:archive_path]
- unless @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
- @archive_path = File.join(build_path, file_name.join(" ") + ".xcarchive")
+ Gym.cache[:archive_path] = File.join(build_path, file_name.join(" ") + ".xcarchive")
end
- return @archive_path
+ return Gym.cache[:archive_path]
end
end
end
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index bb2af2d..08114b3 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -30,17 +30,17 @@ def pipe
# We export the ipa into this directory, as we can't specify the ipa file directly
def temporary_output_path
- @temporary_output_path ||= File.join("/tmp", Time.now.to_i.to_s)
+ Gym.cache[:temporary_output_path] ||= File.join("/tmp", Time.now.to_i.to_s)
end
def ipa_path
- unless @ipa_path
+ unless Gym.cache[:ipa_path]
path = Dir[File.join(temporary_output_path, "*.ipa")].last
- @ipa_path = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
- FileUtils.mv(path, @ipa_path) if File.expand_path(path).downcase != File.expand_path(@ipa_path).downcase
+ Gym.cache[:ipa_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
+ FileUtils.mv(path, Gym.cache[:ipa_path]) if File.expand_path(path).downcase != File.expand_path(Gym.cache[:ipa_path]).downcase
end
- @ipa_path
+ Gym.cache[:ipa_path]
end
# The path the the dsym file for this app. Might be nil
@@ -50,8 +50,8 @@ def dsym_path
# The path the config file we use to sign our app
def config_path
- @config_path ||= "/tmp/gym_config_#{Time.now.to_i}.plist"
- return @config_path
+ Gym.cache[:config_path] ||= "/tmp/gym_config_#{Time.now.to_i}.plist"
+ return Gym.cache[:config_path]
end
private
From f6dcf319766c1e65017313036145c6160139231e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 16:45:27 -0700
Subject: [PATCH 059/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index ebf39fa..5010c75 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.1"
+ VERSION = "0.8.2"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 3fc6cbf9b4494e6e2e1d3f6cab283b2b0902f85e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 23 Sep 2015 16:46:27 -0700
Subject: [PATCH 060/176] Fixed code style
---
lib/gym.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym.rb b/lib/gym.rb
index d2af068..1449c02 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -25,7 +25,7 @@ def config=(value)
@config = value
DetectValues.set_additional_default_values
@cache = {}
- end
+ end
def gymfile_name
"Gymfile"
From 93eda014e14d1d480876a1d8cf4999db304c3bcc Mon Sep 17 00:00:00 2001
From: Max Goedjen
Date: Sun, 27 Sep 2015 02:03:57 -0700
Subject: [PATCH 061/176] Check use_legacy_api instead of direct Xcode 7 check
---
lib/gym/runner.rb | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index a9ba09d..5ef65d1 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -57,14 +57,14 @@ def print_command(command, title)
#####################################################
def clear_old_files
- return unless Xcode.pre_7?
+ return unless Gym.config[:use_legacy_build_api]
if File.exist?(PackageCommandGenerator.ipa_path)
File.delete(PackageCommandGenerator.ipa_path)
end
end
def fix_package
- return unless Xcode.pre_7?
+ return unless Gym.config[:use_legacy_build_api]
Gym::XcodebuildFixes.swift_library_fix
Gym::XcodebuildFixes.watchkit_fix
end
@@ -149,7 +149,7 @@ def move_mac_app
private
def find_archive_path
- if Xcode.pre_7?
+ if Gym.config[:use_legacy_build_api]
BuildCommandGenerator.archive_path
else
Dir.glob(File.join(BuildCommandGenerator.build_path, "*.ipa")).last
From 921b94be0fd814df5cfb9235b6ee2c2b6ddae9eb Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sun, 27 Sep 2015 13:20:47 -0700
Subject: [PATCH 062/176] Automatic setting of legacy_build_api when using an
old version of Xcode
---
lib/gym/detect_values.rb | 2 ++
lib/gym/generators/package_command_generator.rb | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index ef5a33d..244e4e3 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -24,6 +24,8 @@ def self.set_additional_default_values
config.load_configuration_file(Gym.gymfile_name)
end
+ config[:use_legacy_build_api] = true if Xcode.pre_7?
+
detect_scheme
detect_platform # we can only do that *after* we have the scheme
detect_configuration
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index d75ef77..6f34813 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -26,7 +26,7 @@ def dsym_path
# The generator we need to use for the currently used Xcode version
def generator
- if Xcode.pre_7? or Gym.config[:use_legacy_build_api]
+ if Gym.config[:use_legacy_build_api]
PackageCommandGeneratorLegacy
else
PackageCommandGeneratorXcode7
From cabecce746e670c579aa20c9a6ff83996d3a9386 Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Sun, 27 Sep 2015 13:24:13 -0700
Subject: [PATCH 063/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 5010c75..49931b8 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.2"
+ VERSION = "0.8.3"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From 9505b6b88e0dc71e9e1444bd0d4a416124171a1b Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:50:37 -0700
Subject: [PATCH 064/176] Updated documentation for provisioning profile
---
lib/gym/error_handler.rb | 2 --
1 file changed, 2 deletions(-)
diff --git a/lib/gym/error_handler.rb b/lib/gym/error_handler.rb
index 78d7828..0a00662 100644
--- a/lib/gym/error_handler.rb
+++ b/lib/gym/error_handler.rb
@@ -69,8 +69,6 @@ def handle_package_error(output)
print "Could not find provisioning profile with the name '#{$1}'"
print "Make sure the name of the provisioning profile is correct"
print "and it matches a locally installed profile"
- print "You can pass the name of the provisioning profile using the"
- print "`--provisioning_profile_path` option"
when /mismatch between specified provisioning profile and signing identity/
print "Mismatch between provisioning profile and code signing identity"
print "This means, the specified provisioning profile was not created using"
From 96c7530491dbb3482d6953bfd31b14c53c875379 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:50:54 -0700
Subject: [PATCH 065/176] No more automatic 'Release' configuration
Fixes https://github.com/KrauseFx/fastlane/issues/176
---
lib/gym/detect_values.rb | 19 -------------------
1 file changed, 19 deletions(-)
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index 244e4e3..36bb59e 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -155,25 +155,6 @@ def self.detect_configuration
config[:configuration] = nil
end
end
-
- # Usually we want `Release`
- # We prefer `Release` to export the DSYM file as well
- config[:configuration] ||= "Release" if configurations.include?("Release")
-
- return if config[:configuration].to_s.length > 0
-
- if configurations.count == 1
- config[:configuration] = configurations.last
- else
- if Helper.is_ci?
- Helper.log.error "Multiple configurations found but you haven't specified one.".red
- Helper.log.error "Since this is a CI, please pass one using the `configuration` option".red
- raise "Multiple configurations found".red
- else
- puts "Select Configuration: "
- config[:configuration] = choose(*(configurations))
- end
- end
end
end
end
From 83b383db5e2ef2e782d679a48e42ddbcf1852456 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:51:02 -0700
Subject: [PATCH 066/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 49931b8..49b9b87 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.3"
+ VERSION = "0.8.4"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From a12e17822f0194d63ee8f85848f2d916a249341c Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:51:53 -0700
Subject: [PATCH 067/176] Updated fastlane_core dependency
---
gym.gemspec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gym.gemspec b/gym.gemspec
index b13c5bd..60033cf 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.17.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.18.2', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
From 2be29362d60b8bd7eaf1c756599d16aa2db3dd8c Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:54:19 -0700
Subject: [PATCH 068/176] Added new rake push task
---
Rakefile | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Rakefile b/Rakefile
index ed2a05e..195f9ce 100644
--- a/Rakefile
+++ b/Rakefile
@@ -7,3 +7,7 @@ task default: :spec
task :test do
sh "../fastlane/bin/fastlane test"
end
+
+task :push do
+ sh "../fastlane/bin/fastlane release"
+end
From 90d90a2f79f0f4f7fa3e61a130cd8dbf2d3331fe Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Wed, 30 Sep 2015 13:56:23 -0700
Subject: [PATCH 069/176] Updated tests
---
spec/build_command_generator_spec.rb | 2 --
1 file changed, 2 deletions(-)
diff --git a/spec/build_command_generator_spec.rb b/spec/build_command_generator_spec.rb
index 27ef922..59bc718 100644
--- a/spec/build_command_generator_spec.rb
+++ b/spec/build_command_generator_spec.rb
@@ -22,7 +22,6 @@
"xcodebuild",
"-scheme 'Example'",
"-project './examples/standard/Example.xcodeproj'",
- "-configuration 'Release'",
"-sdk '9.0'",
"-destination 'generic/platform=iOS'",
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
@@ -47,7 +46,6 @@
"xcodebuild",
"-scheme 'Example'",
"-project './examples/standard/Example.xcodeproj'",
- "-configuration 'Release'",
"-destination 'generic/platform=iOS'",
"-archivePath '#{Gym::BuildCommandGenerator.archive_path}'",
:archive,
From 128f35d7a18e28b4ba8d768da786d4a4e757a9ca Mon Sep 17 00:00:00 2001
From: KrauseFx
Date: Thu, 1 Oct 2015 16:04:35 -0700
Subject: [PATCH 070/176] Updated fastlane_core dependency
---
gym.gemspec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gym.gemspec b/gym.gemspec
index b13c5bd..fd6731f 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.17.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.19.0', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
From 5c6dbf7c8392de2e92c4d72b03ebd615a1ff80c5 Mon Sep 17 00:00:00 2001
From: Brian Michel
Date: Tue, 6 Oct 2015 11:22:28 -0400
Subject: [PATCH 071/176] Zip all dSYM files together
When building an application with many frameworks, each framework
will produce it's own dSYM file. These need to be included in the
dSYM zip file to allow for symbolication of crashes in these
frameworks.
Really we just need the archive path, but this will allow for
easy backward compatibility with existing code.
---
lib/gym/runner.rb | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 5ef65d1..8e958a3 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -108,10 +108,13 @@ def compress_and_move_dsym
# Compress and move the dsym file
containing_directory = File.expand_path("..", PackageCommandGenerator.dsym_path)
- file_name = File.basename(PackageCommandGenerator.dsym_path)
+
+ available_dsyms = Dir.glob("#{containing_directory}/*.dSYM")
+
+ Helper.log.info "Compressing #{available_dsyms.count} dSYM(s)"
output_path = File.expand_path(File.join(Gym.config[:output_directory], Gym.config[:output_name] + ".app.dSYM.zip"))
- command = "cd '#{containing_directory}' && zip -r '#{output_path}' '#{file_name}'"
+ command = "cd '#{containing_directory}' && zip -r '#{output_path}' '*.dSYM'"
Helper.log.info command.yellow unless Gym.config[:silent]
command_result = `#{command}`
Helper.log.info command_result if $verbose
From 2c89a228bd538a0874cfd336d952e872bdaa5680 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 6 Oct 2015 17:31:26 -0400
Subject: [PATCH 072/176] Stop detecting the project if we already have a
workspace
Fixes https://github.com/KrauseFx/fastlane/issues/659
---
lib/gym/detect_values.rb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index 36bb59e..1619d12 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -61,6 +61,8 @@ def self.detect_provisioning_profile
end
def self.detect_projects
+ return if Gym.config[:project].to_s.length > 0
+
if Gym.config[:workspace].to_s.length == 0
workspace = Dir["./*.xcworkspace"]
if workspace.count > 1
@@ -71,6 +73,8 @@ def self.detect_projects
end
end
+ return if Gym.config[:workspace].to_s.length > 0
+
if Gym.config[:workspace].to_s.length == 0 and Gym.config[:project].to_s.length == 0
project = Dir["./*.xcodeproj"]
if project.count > 1
From eeada548b7a77357ba8271009071a7563b01b911 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 6 Oct 2015 17:33:48 -0400
Subject: [PATCH 073/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 49b9b87..450a0b6 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.4"
+ VERSION = "0.8.5"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From a515f049b03730235c3c5c9a7f37adf35195bedd Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 6 Oct 2015 22:34:20 -0400
Subject: [PATCH 074/176] Updated travis configuration
---
.travis.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.travis.yml b/.travis.yml
index 9167d41..db8d8c5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,4 +3,6 @@ osx_image: xcode6.4
before_install: gem update --system
rvm:
- 2.0.0
+ - 2.1.6
+ - 2.2.2
script: bundle exec fastlane test
From 38f9d625dd418c12bd4f3341cc392a6fbea09b5e Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 6 Oct 2015 22:40:26 -0400
Subject: [PATCH 075/176] Updated travis configuration
---
.travis.yml | 2 --
1 file changed, 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index db8d8c5..9167d41 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,6 +3,4 @@ osx_image: xcode6.4
before_install: gem update --system
rvm:
- 2.0.0
- - 2.1.6
- - 2.2.2
script: bundle exec fastlane test
From a651d761839dd64b3345a73ce1e26065e98da034 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 8 Oct 2015 11:48:38 -0400
Subject: [PATCH 076/176] Disbabled web requests for tests
---
spec/spec_helper.rb | 2 ++
1 file changed, 2 insertions(+)
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 40d7abd..3de06be 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -6,3 +6,5 @@ module SpecHelper
end
require 'gym'
+
+WebMock.disable_net_connect!(allow: 'coveralls.io')
From f3f2a371e85ce7b72104cf3b10bddadc3798b812 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 8 Oct 2015 11:48:51 -0400
Subject: [PATCH 077/176] `gym init` now creates the configuration in the
fastlane folder if exists
---
lib/gym/commands_generator.rb | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/lib/gym/commands_generator.rb b/lib/gym/commands_generator.rb
index 425f49a..bb209ed 100644
--- a/lib/gym/commands_generator.rb
+++ b/lib/gym/commands_generator.rb
@@ -46,10 +46,12 @@ def run
c.syntax = "gym init"
c.description = "Creates a new Gymfile for you"
c.action do |_args, options|
- raise "Gymfile already exists" if File.exist?(Gym.gymfile_name)
+ containing = (File.directory?("fastlane") ? 'fastlane' : '.')
+ path = File.join(containing, Gym.gymfile_name)
+ raise "Gymfile already exists" if File.exist?(path)
template = File.read("#{Helper.gem_path('gym')}/lib/assets/GymfileTemplate")
- File.write(Gym.gymfile_name, template)
- Helper.log.info "Successfully created '#{Gym.gymfile_name}'. Open the file using a code editor.".green
+ File.write(path, template)
+ Helper.log.info "Successfully created '#{path}'. Open the file using a code editor.".green
end
end
From 7ce04e7656f00f58588eade2a27e813f6e78505b Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 8 Oct 2015 12:05:15 -0400
Subject: [PATCH 078/176] Added webmock
---
spec/spec_helper.rb | 2 ++
1 file changed, 2 insertions(+)
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 3de06be..29bfebe 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,6 +1,8 @@
require "coveralls"
Coveralls.wear! unless ENV["FASTLANE_SKIP_UPDATE_CHECK"]
+require 'webmock'
+
# This module is only used to check the environment is currently a testing env
module SpecHelper
end
From 99a82293c70467295074fcc1a0ffefdcffaf7a46 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sat, 10 Oct 2015 20:22:56 -0400
Subject: [PATCH 079/176] Moved Project class to fastlane core
---
gym.gemspec | 2 +-
lib/gym.rb | 1 -
lib/gym/detect_values.rb | 33 +--------
lib/gym/options.rb | 2 +-
lib/gym/project.rb | 155 ---------------------------------------
spec/gymfile_spec.rb | 2 +-
spec/project_spec.rb | 84 ---------------------
7 files changed, 5 insertions(+), 274 deletions(-)
delete mode 100644 lib/gym/project.rb
delete mode 100644 spec/project_spec.rb
diff --git a/gym.gemspec b/gym.gemspec
index fd6731f..1593daa 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.19.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.20.0', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
diff --git a/lib/gym.rb b/lib/gym.rb
index 1449c02..27f6365 100644
--- a/lib/gym.rb
+++ b/lib/gym.rb
@@ -1,7 +1,6 @@
require 'json'
require 'gym/version'
require 'gym/manager'
-require 'gym/project'
require 'gym/generators/build_command_generator'
require 'gym/generators/package_command_generator'
require 'gym/runner'
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index 1619d12..0fe1fab 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -16,7 +16,7 @@ def self.set_additional_default_values
raise "No project/workspace found in the current directory.".red
end
- Gym.project = Project.new(config)
+ Gym.project = FastlaneCore::Project.new(config)
detect_provisioning_profile
# Go into the project's folder
@@ -106,36 +106,7 @@ def self.choose_project
end
def self.detect_scheme
- config = Gym.config
- proj_schemes = Gym.project.schemes
-
- if config[:scheme].to_s.length > 0
- # Verify the scheme is available
- unless proj_schemes.include?(config[:scheme].to_s)
- Helper.log.error "Couldn't find specified scheme '#{config[:scheme]}'.".red
- config[:scheme] = nil
- end
- end
-
- return if config[:scheme].to_s.length > 0
-
- if proj_schemes.count == 1
- config[:scheme] = proj_schemes.last
- elsif proj_schemes.count > 1
- if Helper.is_ci?
- Helper.log.error "Multiple schemes found but you haven't specified one.".red
- Helper.log.error "Since this is a CI, please pass one using the `scheme` option".red
- raise "Multiple schemes found".red
- else
- puts "Select Scheme: "
- config[:scheme] = choose(*(proj_schemes))
- end
- else
- Helper.log.error "Couldn't find any schemes in this project, make sure that the scheme is shared if you are using a workspace".red
- Helper.log.error "Open Xcode, click on `Manage Schemes` and check the `Shared` box for the schemes you want to use".red
-
- raise "No Schemes found".red
- end
+ Gym.project.select_scheme
end
# Is it an iOS device or a Mac?
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 127a5a2..6fd9b2a 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -65,7 +65,7 @@ def self.plain_options
FastlaneCore::ConfigItem.new(key: :buildlog_path,
short_option: "-l",
env_name: "GYM_BUILDLOG_PATH",
- description: "The directory were to store the build log",
+ description: "The directory where to store the build log",
default_value: "~/Library/Logs/gym"),
FastlaneCore::ConfigItem.new(key: :sdk,
short_option: "-k",
diff --git a/lib/gym/project.rb b/lib/gym/project.rb
deleted file mode 100644
index f98975e..0000000
--- a/lib/gym/project.rb
+++ /dev/null
@@ -1,155 +0,0 @@
-module Gym
- # Represents the Xcode project/workspace
- class Project
- # Path to the project/workspace
- attr_accessor :path
-
- attr_accessor :is_workspace
-
- def initialize(options)
- self.path = File.expand_path(options[:workspace] || options[:project])
- self.is_workspace = (options[:workspace].to_s.length > 0)
-
- if !path or !File.directory? path
- raise "Could not find project at path '#{path}'".red
- end
- end
-
- def workspace?
- self.is_workspace
- end
-
- # Get all available schemes in an array
- def schemes
- results = []
- output = raw_info.split("Schemes:").last.split(":").first
-
- if raw_info.include?("There are no schemes in workspace") or raw_info.include?("This project contains no schemes")
- return results
- end
-
- output.split("\n").each do |current|
- current = current.strip
-
- next if current.length == 0
- results << current
- end
-
- results
- end
-
- # Get all available configurations in an array
- def configurations
- results = []
- splitted = raw_info.split("Configurations:")
- return [] if splitted.count != 2 # probably a CocoaPods project
-
- output = splitted.last.split(":").first
- output.split("\n").each_with_index do |current, index|
- current = current.strip
-
- if current.length == 0
- next if index == 0
- break # as we want to break on the empty line
- end
-
- results << current
- end
-
- results
- end
-
- def app_name
- # WRAPPER_NAME: Example.app
- # WRAPPER_SUFFIX: .app
- name = build_settings(key: "WRAPPER_NAME")
-
- return name.gsub(build_settings(key: "WRAPPER_SUFFIX"), "") if name
- return "App" # default value
- end
-
- def mac?
- # Some projects have different values... we have to look for all of them
- return true if build_settings(key: "PLATFORM_NAME") == "macosx"
- return true if build_settings(key: "PLATFORM_DISPLAY_NAME") == "OS X"
- false
- end
-
- def ios?
- !mac?
- end
-
- #####################################################
- # @!group Raw Access
- #####################################################
-
- # Get the build settings for our project
- # this is used to properly get the DerivedData folder
- # @param [String] The key of which we want the value for (e.g. "PRODUCT_NAME")
- def build_settings(key: nil, optional: true)
- unless @build_settings
- # We also need to pass the workspace and scheme to this command
- command = "xcrun xcodebuild -showBuildSettings #{BuildCommandGenerator.project_path_array.join(' ')}"
- Helper.log.info command.yellow unless Gym.config[:silent]
- @build_settings = `#{command}`
- end
-
- begin
- result = @build_settings.split("\n").find { |c| c.include? key }
- return result.split(" = ").last
- rescue => ex
- return nil if optional # an optional value, we really don't care if something goes wrong
-
- Helper.log.error caller.join("\n\t")
- Helper.log.error "Could not fetch #{key} from project file: #{ex}"
- end
-
- nil
- end
-
- def raw_info
- # Examples:
-
- # Standard:
- #
- # Information about project "Example":
- # Targets:
- # Example
- # ExampleUITests
- #
- # Build Configurations:
- # Debug
- # Release
- #
- # If no build configuration is specified and -scheme is not passed then "Release" is used.
- #
- # Schemes:
- # Example
- # ExampleUITests
-
- # CococaPods
- #
- # Example.xcworkspace
- # Information about workspace "Example":
- # Schemes:
- # Example
- # HexColors
- # Pods-Example
-
- return @raw if @raw
-
- # Unfortunately since we pass the workspace we also get all the
- # schemes generated by CocoaPods
-
- options = BuildCommandGenerator.project_path_array.delete_if { |a| a.to_s.include? "scheme" }
- command = "xcrun xcodebuild -list #{options.join(' ')}"
- Helper.log.info command.yellow unless Gym.config[:silent]
-
- @raw = `#{command}`.to_s
-
- raise "Error parsing xcode file using `#{command}`".red if @raw.length == 0
-
- return @raw
- end
- end
-end
diff --git a/spec/gymfile_spec.rb b/spec/gymfile_spec.rb
index 9b8a0cc..55d7300 100644
--- a/spec/gymfile_spec.rb
+++ b/spec/gymfile_spec.rb
@@ -4,7 +4,7 @@
options = { project: "./examples/multipleSchemes/Example.xcodeproj" }
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options,
options)
- @project = Gym::Project.new(Gym.config)
+ @project = FastlaneCore::Project.new(Gym.config)
end
it "#schemes returns all available schemes" do
diff --git a/spec/project_spec.rb b/spec/project_spec.rb
deleted file mode 100644
index 302839e..0000000
--- a/spec/project_spec.rb
+++ /dev/null
@@ -1,84 +0,0 @@
-describe Gym do
- describe Gym::Project do
- it "raises an exception if path was not found" do
- expect do
- Gym::Project.new(project: "/tmp/notHere123")
- end.to raise_error "Could not find project at path '/tmp/notHere123'".red
- end
-
- describe "Valid Standard Project" do
- before do
- options = { project: "./examples/standard/Example.xcodeproj" }
- Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
-
- @project = Gym::Project.new(Gym.config)
- end
-
- it "#path" do
- expect(@project.path).to eq(File.expand_path("./examples/standard/Example.xcodeproj"))
- end
-
- it "#is_workspace" do
- expect(@project.is_workspace).to eq(false)
- end
-
- it "#schemes returns all available schemes" do
- expect(@project.schemes).to eq(["Example"])
- end
-
- it "#configurations returns all available configurations" do
- expect(@project.configurations).to eq(["Debug", "Release"])
- end
-
- it "#app_name" do
- expect(@project.app_name).to eq("ExampleProductName")
- end
-
- it "#mac?" do
- expect(@project.mac?).to eq(false)
- end
-
- it "#ios?" do
- expect(@project.ios?).to eq(true)
- end
- end
-
- describe "Valid CocoaPods Project" do
- before do
- options = { workspace: "./examples/cocoapods/Example.xcworkspace", scheme: "Example" }
- Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
-
- @workspace = Gym::Project.new(Gym.config)
- end
-
- it "#schemes returns all schemes" do
- expect(@workspace.schemes).to eq(["Example", "HexColors", "Pods-Example"])
- end
-
- it "#schemes returns all configurations" do
- expect(@workspace.configurations).to eq([])
- end
- end
-
- describe "Mac Project" do
- before do
- options = { project: "./examples/Mac/Mac.xcodeproj" }
- Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, options)
-
- @project = Gym::Project.new(Gym.config)
- end
-
- it "#mac?" do
- expect(@project.mac?).to eq(true)
- end
-
- it "#ios?" do
- expect(@project.ios?).to eq(false)
- end
-
- it "schemes" do
- expect(@project.schemes).to eq(["Mac"])
- end
- end
- end
-end
From 663ac30c881aae55ff3b5b1c604a9e2f5958b7fc Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sun, 11 Oct 2015 08:19:27 -0400
Subject: [PATCH 080/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 450a0b6..d1fd9c0 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.8.5"
+ VERSION = "0.9.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From c24e2d310e5fd015bd27cf56f4fd6f741a75ee24 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sun, 11 Oct 2015 15:43:29 -0700
Subject: [PATCH 081/176] Added more ruby versions
---
.travis.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.travis.yml b/.travis.yml
index 9167d41..db8d8c5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,4 +3,6 @@ osx_image: xcode6.4
before_install: gem update --system
rvm:
- 2.0.0
+ - 2.1.6
+ - 2.2.2
script: bundle exec fastlane test
From 53fd161432a2a60673e71451db59af631e68d32a Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sun, 11 Oct 2015 15:55:34 -0700
Subject: [PATCH 082/176] Moved project discovery to fastlane_core
---
gym.gemspec | 2 +-
lib/gym/detect_values.rb | 55 +---------------------------------------
2 files changed, 2 insertions(+), 55 deletions(-)
diff --git a/gym.gemspec b/gym.gemspec
index 1593daa..7876b8e 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.20.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.21.0', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
diff --git a/lib/gym/detect_values.rb b/lib/gym/detect_values.rb
index 0fe1fab..a7eedab 100644
--- a/lib/gym/detect_values.rb
+++ b/lib/gym/detect_values.rb
@@ -6,15 +6,7 @@ class DetectValues
def self.set_additional_default_values
config = Gym.config
- detect_projects
-
- if config[:workspace].to_s.length > 0 and config[:project].to_s.length > 0
- raise "You can only pass either a workspace or a project path, not both".red
- end
-
- if config[:workspace].to_s.length == 0 and config[:project].to_s.length == 0
- raise "No project/workspace found in the current directory.".red
- end
+ FastlaneCore::Project.detect_projects(config)
Gym.project = FastlaneCore::Project.new(config)
detect_provisioning_profile
@@ -60,51 +52,6 @@ def self.detect_provisioning_profile
end
end
- def self.detect_projects
- return if Gym.config[:project].to_s.length > 0
-
- if Gym.config[:workspace].to_s.length == 0
- workspace = Dir["./*.xcworkspace"]
- if workspace.count > 1
- puts "Select Workspace: "
- Gym.config[:workspace] = choose(*(workspace))
- else
- Gym.config[:workspace] = workspace.first # this will result in nil if no files were found
- end
- end
-
- return if Gym.config[:workspace].to_s.length > 0
-
- if Gym.config[:workspace].to_s.length == 0 and Gym.config[:project].to_s.length == 0
- project = Dir["./*.xcodeproj"]
- if project.count > 1
- puts "Select Project: "
- Gym.config[:project] = choose(*(project))
- else
- Gym.config[:project] = project.first # this will result in nil if no files were found
- end
- end
- end
-
- def self.choose_project
- loop do
- path = ask("Couldn't automatically detect the project file, please provide a path: ".yellow).strip
- if File.directory? path
- if path.end_with? ".xcworkspace"
- config[:workspace] = path
- break
- elsif path.end_with? ".xcodeproj"
- config[:project] = path
- break
- else
- Helper.log.error "Path must end with either .xcworkspace or .xcodeproj"
- end
- else
- Helper.log.error "Couldn't find project at path '#{File.expand_path(path)}'".red
- end
- end
- end
-
def self.detect_scheme
Gym.project.select_scheme
end
From 58222ea81493266dce3fc3bd79092bbc674e1b04 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sun, 11 Oct 2015 17:49:24 -0700
Subject: [PATCH 083/176] Updated travis file to install bundler
---
.travis.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index db8d8c5..86a16f3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,8 @@
language: objective-c
osx_image: xcode6.4
-before_install: gem update --system
+before_install:
+ - gem update --system
+ - gem install bundler
rvm:
- 2.0.0
- 2.1.6
From 63ea7c2573f688eb289a32eccc37335f73f08795 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Sun, 11 Oct 2015 17:51:13 -0700
Subject: [PATCH 084/176] Updated build_command_generator to use new Project
API
---
lib/gym/generators/build_command_generator.rb | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/lib/gym/generators/build_command_generator.rb b/lib/gym/generators/build_command_generator.rb
index e941b45..82f1c88 100644
--- a/lib/gym/generators/build_command_generator.rb
+++ b/lib/gym/generators/build_command_generator.rb
@@ -21,12 +21,7 @@ def prefix
# This will also include the scheme (if given)
# @return [Array] The array with all the components to join
def project_path_array
- config = Gym.config
- proj = []
- proj << "-workspace '#{config[:workspace]}'" if config[:workspace]
- proj << "-scheme '#{config[:scheme]}'" if config[:scheme]
- proj << "-project '#{config[:project]}'" if config[:project]
-
+ proj = Gym.project.xcodebuild_parameters
return proj if proj.count > 0
raise "No project/workspace found"
end
From 5ddbc5a73ba37eb91cd15a62c7a324be1a727170 Mon Sep 17 00:00:00 2001
From: Christopher Bowns
Date: Mon, 12 Oct 2015 18:13:37 -0700
Subject: [PATCH 085/176] Update README.md
Fix the broken example Gymfile's "9.0" SDK.
(I wish I'd used `gym init` instead of copying and pasting this example.)
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index f9464bc..110fc57 100644
--- a/README.md
+++ b/README.md
@@ -144,7 +144,7 @@ Run `gym init` to create a new configuration file. Example:
```ruby
scheme "Example"
-sdk "9.0"
+sdk "iphoneos9.0"
clean true
From 016f89cab6948fedbf2f1a9f8ffc16694a4c46e9 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 13 Oct 2015 14:34:46 -0700
Subject: [PATCH 086/176] Removed outdated information in documentation
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index f9464bc..673dad6 100644
--- a/README.md
+++ b/README.md
@@ -100,8 +100,6 @@ gym
# Installation
-This tool is still work in progress. You can already try it by cloning the repo and running
-
sudo gem install gym
Make sure, you have the latest version of the Xcode command line tools installed:
From 7db8c3c257a07d859327583614d1f332e2c882cb Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 13 Oct 2015 18:28:37 -0700
Subject: [PATCH 087/176] Fixed regex encoding issues
---
lib/gym/generators/package_command_generator.rb | 5 +++++
lib/gym/generators/package_command_generator_legacy.rb | 5 +++++
lib/gym/generators/package_command_generator_xcode7.rb | 5 +++++
3 files changed, 15 insertions(+)
diff --git a/lib/gym/generators/package_command_generator.rb b/lib/gym/generators/package_command_generator.rb
index 6f34813..30e03fe 100644
--- a/lib/gym/generators/package_command_generator.rb
+++ b/lib/gym/generators/package_command_generator.rb
@@ -1,3 +1,8 @@
+# encoding: utf-8
+# from http://stackoverflow.com/a/9857493/445598
+# because of
+# `incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)`
+
require 'shellwords'
# The concrete implementations
diff --git a/lib/gym/generators/package_command_generator_legacy.rb b/lib/gym/generators/package_command_generator_legacy.rb
index 690bc88..25b2a7e 100644
--- a/lib/gym/generators/package_command_generator_legacy.rb
+++ b/lib/gym/generators/package_command_generator_legacy.rb
@@ -1,3 +1,8 @@
+# encoding: utf-8
+# from http://stackoverflow.com/a/9857493/445598
+# because of
+# `incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)`
+
module Gym
# Responsible for building the fully working xcodebuild command on Xcode < 7
#
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 08114b3..008f1fa 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -1,3 +1,8 @@
+# encoding: utf-8
+# from http://stackoverflow.com/a/9857493/445598
+# because of
+# `incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)`
+
module Gym
# Responsible for building the fully working xcodebuild command
class PackageCommandGeneratorXcode7
From 3050ab1e5a9eae5ddce167b59cf985508877e9b5 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 13 Oct 2015 18:28:40 -0700
Subject: [PATCH 088/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index d1fd9c0..4d40e3d 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.9.0"
+ VERSION = "0.9.1"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From f2c913224e3bd0b6b4cfa1e18ec00c55f8caf267 Mon Sep 17 00:00:00 2001
From: Brian Michel
Date: Thu, 15 Oct 2015 17:07:57 -0400
Subject: [PATCH 089/176] Don't use string linteral for glob
---
lib/gym/runner.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/runner.rb b/lib/gym/runner.rb
index 8e958a3..a03ed99 100644
--- a/lib/gym/runner.rb
+++ b/lib/gym/runner.rb
@@ -114,7 +114,7 @@ def compress_and_move_dsym
Helper.log.info "Compressing #{available_dsyms.count} dSYM(s)"
output_path = File.expand_path(File.join(Gym.config[:output_directory], Gym.config[:output_name] + ".app.dSYM.zip"))
- command = "cd '#{containing_directory}' && zip -r '#{output_path}' '*.dSYM'"
+ command = "cd '#{containing_directory}' && zip -r '#{output_path}' *.dSYM"
Helper.log.info command.yellow unless Gym.config[:silent]
command_result = `#{command}`
Helper.log.info command_result if $verbose
From 731bb2486f627448e5ff4d9d8e6e00a061ac1b37 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 15 Oct 2015 14:47:39 -0700
Subject: [PATCH 090/176] Improvements
---
lib/assets/GymfileTemplate | 3 +--
lib/gym/commands_generator.rb | 2 +-
lib/gym/error_handler.rb | 5 +++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/lib/assets/GymfileTemplate b/lib/assets/GymfileTemplate
index bf74edd..223f931 100644
--- a/lib/assets/GymfileTemplate
+++ b/lib/assets/GymfileTemplate
@@ -4,8 +4,7 @@
# In general, you can use the options available
# gym --help
-# Remove the # in front of the line to enable this
-# particular option
+# Remove the # in front of the line to enable the option
# scheme "Example"
diff --git a/lib/gym/commands_generator.rb b/lib/gym/commands_generator.rb
index bb209ed..d626b74 100644
--- a/lib/gym/commands_generator.rb
+++ b/lib/gym/commands_generator.rb
@@ -48,7 +48,7 @@ def run
c.action do |_args, options|
containing = (File.directory?("fastlane") ? 'fastlane' : '.')
path = File.join(containing, Gym.gymfile_name)
- raise "Gymfile already exists" if File.exist?(path)
+ raise "Gymfile already exists".yellow if File.exist?(path)
template = File.read("#{Helper.gem_path('gym')}/lib/assets/GymfileTemplate")
File.write(path, template)
Helper.log.info "Successfully created '#{path}'. Open the file using a code editor.".green
diff --git a/lib/gym/error_handler.rb b/lib/gym/error_handler.rb
index 0a00662..d0a14c4 100644
--- a/lib/gym/error_handler.rb
+++ b/lib/gym/error_handler.rb
@@ -2,7 +2,7 @@ module Gym
# This classes methods are called when something goes wrong in the building process
class ErrorHandler
class << self
- # @param [Array] The output of the errored build (line by line)
+ # @param [String] The output of the errored build
# This method should raise an exception in any case, as the return code indicated a failed build
def handle_build_error(output)
# The order of the handling below is import
@@ -47,7 +47,7 @@ def handle_build_error(output)
print "You'll have to restart your shell session after updating the file."
print "If you are using zshell or another shell, make sure to edit the correct bash file."
print "For more information visit this stackoverflow answer:"
- print "http://stackoverflow.com/a/17031697/445598"
+ print "https://stackoverflow.com/a/17031697/445598"
end
raise "Error building the application - see the log above".red
end
@@ -90,6 +90,7 @@ def handle_empty_archive
print "The generated archive is invalid, this can have various reasons:"
print "Usually it's caused by the `Skip Install` option in Xcode, set it to `NO`"
print "For more information visit https://developer.apple.com/library/ios/technotes/tn2215/_index.html"
+ print "Also, make sure to have a valid code signing identity and provisioning profile installed"
raise "Archive invalid"
end
From 35918a954bee93e7f549329ad89e25cfce9d7b12 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 15 Oct 2015 17:51:04 -0700
Subject: [PATCH 091/176] Updated fastlane_core dependency
---
gym.gemspec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gym.gemspec b/gym.gemspec
index 7876b8e..fd21a47 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.21.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'fastlane_core', '>= 0.22.3', '< 1.0.0' # all shared code and dependencies
spec.add_dependency 'xcpretty' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
From 1945c0c6edbb353e25a869411525bce64dc0fd39 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Thu, 15 Oct 2015 17:51:24 -0700
Subject: [PATCH 092/176] Improved handling when archive is invalid due to
wrong code signing
---
lib/gym/error_handler.rb | 1 +
lib/gym/generators/package_command_generator_xcode7.rb | 1 +
2 files changed, 2 insertions(+)
diff --git a/lib/gym/error_handler.rb b/lib/gym/error_handler.rb
index d0a14c4..0970722 100644
--- a/lib/gym/error_handler.rb
+++ b/lib/gym/error_handler.rb
@@ -91,6 +91,7 @@ def handle_empty_archive
print "Usually it's caused by the `Skip Install` option in Xcode, set it to `NO`"
print "For more information visit https://developer.apple.com/library/ios/technotes/tn2215/_index.html"
print "Also, make sure to have a valid code signing identity and provisioning profile installed"
+ print "Follow this guide to setup code signing https://github.com/KrauseFx/fastlane/blob/master/docs/CodeSigning.md"
raise "Archive invalid"
end
diff --git a/lib/gym/generators/package_command_generator_xcode7.rb b/lib/gym/generators/package_command_generator_xcode7.rb
index 008f1fa..6ba17dc 100644
--- a/lib/gym/generators/package_command_generator_xcode7.rb
+++ b/lib/gym/generators/package_command_generator_xcode7.rb
@@ -41,6 +41,7 @@ def temporary_output_path
def ipa_path
unless Gym.cache[:ipa_path]
path = Dir[File.join(temporary_output_path, "*.ipa")].last
+ ErrorHandler.handle_empty_archive unless path
Gym.cache[:ipa_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
FileUtils.mv(path, Gym.cache[:ipa_path]) if File.expand_path(path).downcase != File.expand_path(Gym.cache[:ipa_path]).downcase
From 27f876d0e6adcad041879ecedef9c99b1e2610c9 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 19 Oct 2015 15:16:55 -0700
Subject: [PATCH 093/176] Updated dependencies
---
gym.gemspec | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/gym.gemspec b/gym.gemspec
index fd21a47..927dfbd 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
- spec.add_dependency 'fastlane_core', '>= 0.22.3', '< 1.0.0' # all shared code and dependencies
- spec.add_dependency 'xcpretty' # pretty xcodebuild output
+ spec.add_dependency 'fastlane_core', '>= 0.25.0', '< 1.0.0' # all shared code and dependencies
+ spec.add_dependency 'xcpretty', '~> 0.1' # pretty xcodebuild output
spec.add_dependency 'terminal-table' # print out build information
spec.add_dependency 'plist' # Generate the Xcode config plist file
spec.add_dependency 'rubyzip', '>= 1.1.7' # fix swift/ipa
From b1fdb8892439e10cb47657eccfddd860846e52ce Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 19 Oct 2015 15:20:32 -0700
Subject: [PATCH 094/176] Changed the order of the available options
---
lib/gym/options.rb | 69 +++++++++++++++++++++++-----------------------
1 file changed, 35 insertions(+), 34 deletions(-)
diff --git a/lib/gym/options.rb b/lib/gym/options.rb
index 6fd9b2a..8743e2b 100644
--- a/lib/gym/options.rb
+++ b/lib/gym/options.rb
@@ -49,11 +49,6 @@ def self.plain_options
env_name: "GYM_OUTPUT_DIRECTORY",
description: "The directory in which the ipa file should be stored in",
default_value: "."),
- FastlaneCore::ConfigItem.new(key: :archive_path,
- short_option: "-b",
- env_name: "GYM_ARCHIVE_PATH",
- description: "The directory in which the archive file should be stored in",
- optional: true),
FastlaneCore::ConfigItem.new(key: :output_name,
short_option: "-n",
env_name: "GYM_OUTPUT_NAME",
@@ -62,16 +57,6 @@ def self.plain_options
verify_block: proc do |value|
value.gsub!(".ipa", "")
end),
- FastlaneCore::ConfigItem.new(key: :buildlog_path,
- short_option: "-l",
- env_name: "GYM_BUILDLOG_PATH",
- description: "The directory where to store the build log",
- default_value: "~/Library/Logs/gym"),
- FastlaneCore::ConfigItem.new(key: :sdk,
- short_option: "-k",
- env_name: "GYM_SDK",
- description: "The SDK that should be used for building the application",
- optional: true),
FastlaneCore::ConfigItem.new(key: :configuration,
short_option: "-q",
env_name: "GYM_CONFIGURATION",
@@ -88,24 +73,6 @@ def self.plain_options
env_name: "GYM_CODE_SIGNING_IDENTITY",
description: "The name of the code signing identity to use. It has to match the name exactly. e.g. 'iPhone Distribution: SunApps GmbH'",
optional: true),
- FastlaneCore::ConfigItem.new(key: :destination,
- short_option: "-d",
- env_name: "GYM_DESTINATION",
- description: "Use a custom destination for building the app",
- optional: true),
- FastlaneCore::ConfigItem.new(key: :xcargs,
- short_option: "-x",
- env_name: "GYM_XCARGS",
- description: "Pass additional arguments to xcodebuild. Be sure to quote the setting names and values e.g. OTHER_LDFLAGS=\"-ObjC -lstdc++\"",
- optional: true),
- FastlaneCore::ConfigItem.new(key: :xcconfig,
- short_option: "-y",
- env_name: "GYM_XCCONFIG",
- description: "Use an extra XCCONFIG file to build your app",
- optional: true,
- verify_block: proc do |value|
- raise "File not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
- end),
FastlaneCore::ConfigItem.new(key: :include_symbols,
short_option: "-m",
env_name: "GYM_INCLUDE_SYMBOLS",
@@ -138,6 +105,23 @@ def self.plain_options
av = %w(app-store ad-hoc package enterprise development developer-id)
raise "Unsupported export_method, must be: #{av}" unless av.include?(value)
end),
+
+ # Very optional
+ FastlaneCore::ConfigItem.new(key: :archive_path,
+ short_option: "-b",
+ env_name: "GYM_ARCHIVE_PATH",
+ description: "The directory in which the archive file should be stored in",
+ optional: true),
+ FastlaneCore::ConfigItem.new(key: :buildlog_path,
+ short_option: "-l",
+ env_name: "GYM_BUILDLOG_PATH",
+ description: "The directory where to store the build log",
+ default_value: "~/Library/Logs/gym"),
+ FastlaneCore::ConfigItem.new(key: :sdk,
+ short_option: "-k",
+ env_name: "GYM_SDK",
+ description: "The SDK that should be used for building the application",
+ optional: true),
FastlaneCore::ConfigItem.new(key: :provisioning_profile_path,
short_option: "-e",
env_name: "GYM_PROVISIONING_PROFILE_PATH",
@@ -145,8 +129,25 @@ def self.plain_options
optional: true,
verify_block: proc do |value|
raise "Provisioning profile not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
+ end),
+ FastlaneCore::ConfigItem.new(key: :destination,
+ short_option: "-d",
+ env_name: "GYM_DESTINATION",
+ description: "Use a custom destination for building the app",
+ optional: true),
+ FastlaneCore::ConfigItem.new(key: :xcargs,
+ short_option: "-x",
+ env_name: "GYM_XCARGS",
+ description: "Pass additional arguments to xcodebuild. Be sure to quote the setting names and values e.g. OTHER_LDFLAGS=\"-ObjC -lstdc++\"",
+ optional: true),
+ FastlaneCore::ConfigItem.new(key: :xcconfig,
+ short_option: "-y",
+ env_name: "GYM_XCCONFIG",
+ description: "Use an extra XCCONFIG file to build your app",
+ optional: true,
+ verify_block: proc do |value|
+ raise "File not found at path '#{File.expand_path(value)}'".red unless File.exist?(value)
end)
-
]
end
end
From 9a90676adfaa2f5217bf33c487d009778cba7eef Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 19 Oct 2015 15:20:47 -0700
Subject: [PATCH 095/176] Version bump
---
lib/gym/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/gym/version.rb b/lib/gym/version.rb
index 4d40e3d..5178614 100644
--- a/lib/gym/version.rb
+++ b/lib/gym/version.rb
@@ -1,4 +1,4 @@
module Gym
- VERSION = "0.9.1"
+ VERSION = "1.0.0"
DESCRIPTION = "Building your iOS apps has never been easier"
end
From f4c35320c7828b6d8fba566d8d6c63555a7957d4 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Mon, 19 Oct 2015 15:26:50 -0700
Subject: [PATCH 096/176] Updated fastlane dependency
---
gym.gemspec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gym.gemspec b/gym.gemspec
index 927dfbd..3d48009 100644
--- a/gym.gemspec
+++ b/gym.gemspec
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
# Development only
spec.add_development_dependency "bundler"
- spec.add_development_dependency "fastlane", ">= 1.25.0" # yes, we use fastlane for testing
+ spec.add_development_dependency "fastlane", ">= 1.33.0" # yes, we use fastlane for testing
spec.add_development_dependency "rake"
spec.add_development_dependency "rubocop"
spec.add_development_dependency "rspec", "~> 3.1.0"
From 2a73bee04b1dec2df9f5e52d6cdc84ded1360a58 Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 20 Oct 2015 14:33:33 -0700
Subject: [PATCH 097/176] Added scan
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 234dea7..3f79903 100644
--- a/README.md
+++ b/README.md
@@ -10,14 +10,14 @@
snapshot •
frameit •
PEM •
- sigh •
+ sigh •
produce •
cert •
- codes •
spaceship •
pilot •
boarding •
- gym
+ gym •
+ scan
-------
@@ -229,10 +229,10 @@ Afterwards the `ipa` file is moved to the output folder. The `dSYM` file is comp
- [`PEM`](https://github.com/KrauseFx/pem): Automatically generate and renew your push notification profiles
- [`produce`](https://github.com/KrauseFx/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
- [`cert`](https://github.com/KrauseFx/cert): Automatically create and maintain iOS code signing certificates
-- [`codes`](https://github.com/KrauseFx/codes): Create promo codes for iOS Apps using the command line
- [`spaceship`](https://github.com/fastlane/spaceship): Ruby library to access the Apple Dev Center and iTunes Connect
- [`pilot`](https://github.com/fastlane/pilot): The best way to manage your TestFlight testers and builds from your terminal
- [`boarding`](https://github.com/fastlane/boarding): The easiest way to invite your TestFlight beta testers
+- [`scan`](https://github.com/fastlane/scan): The easiest way to run tests of your iOS and Mac app
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
From c92cec3dfb703125d2d582a86d661509710459ce Mon Sep 17 00:00:00 2001
From: Felix Krause
Date: Tue, 20 Oct 2015 14:43:01 -0700
Subject: [PATCH 098/176] Added new logo
---
README.md | 2 +-
assets/gym.png | Bin 4267 -> 39004 bytes
assets/gym.pxm | Bin 281830 -> 0 bytes
assets/gymFullSize.png | Bin 17600 -> 0 bytes
4 files changed, 1 insertion(+), 1 deletion(-)
delete mode 100644 assets/gym.pxm
delete mode 100644 assets/gymFullSize.png
diff --git a/README.md b/README.md
index 3f79903..ad1555d 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@
-------
-
+
gym
diff --git a/assets/gym.png b/assets/gym.png
index 97d7532211921baf9f303e305e9ca411cc9d1708..8a3d16ef14d072766d1da2c5b9edc736ff6ad47c 100644
GIT binary patch
literal 39004
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
crjcKEqjaxcTyk;{ElpEJhFYtj_$w8S*Zj
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
LbG=4gP{RKK3CV1-
diff --git a/assets/gym.pxm b/assets/gym.pxm
deleted file mode 100644
index 3bf7158267a0623f38865c0cbcc9782a061f488e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 281830
zcmeEv2S8I-+y6QD-YiB)0A;wM3>RP)5VVS6N<~11f}k-Z0U{w_5>y2Ax<`lBw$@hL
zDq3r`)oxpBTWj~Sigqu%ZEO45;oIH*pL3Hyf?#bw-f#SS)5<;f-ZP&w?s?96&hJ-L
zJ}qlncB%d=5kl2XHmlR6RGz{V%?N}WHkQXOusEF7MtgZ|WA!|X$>pqwH9AanR(M<*
z>uPKYMR@i012VNpJWi=nYqZHJsk*fB6E2%LDSfg&BQq;|N@3B=N<+1!&N{EYWpQg;
z`;wKbREZWGRQPVrFjj;T1#GGPNSp2=*loUt)^)f
zmodZYau!(}nT-uijdqLOm1nPMB>$#bS`4zWeTB+uG&MJX?-J``OPBAYzI+#3oQ<|-
z7f8Cy4#{-|7}r;TTt{PbQ@*hUswcCt*_|maLy3Kb$ZWJVI-E^Llcm7e(48e^U;d%k
z4aQ!R7}-}4$iTuzhq*iZqxHqQs=f+a(A-dMaTL~cwV>{T^qH&f+M3pAw%EEFM4wXXZb4ms!<_+vIl0@}sLs60
zr{>Rc_f9+1O1axz3^CK_a^eMD4jncr-6Se%{+FUUffCP|f~f{I(SwyK~c%W5Jc
zn$gkHv8JF*m6V*M0uP!bbqTn^(^Xd+WMN&k+wFVjRci{kdWZ4EV%B@UHz%&yRO)DK
zbg>wTksL*%7?g7a|1GS)K=t^`g+Ku+0z35J~AKi`aMfalz(L?AEI*cAeN6=C9
z6nX}|iQY!T4f1z*Ccj!F&0sVx2!76OP8}U*6Efq%F@u;P%m^liiDSkv$;>2X8Z(`#V5*r~#>UKNoJ=#b
zkZECB8J1bkT*+L`T+7_X+`-(-9AqA54l_?MPcqLl$C%^HN6aV8XUsX~2j(~C4*?d?
z0)apz2o{70