branch_io_cli 0.12.2 → 0.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/branch_io_cli/cli.rb +1 -1
  3. data/lib/branch_io_cli/command/command.rb +5 -3
  4. data/lib/branch_io_cli/command/report_command.rb +12 -7
  5. data/lib/branch_io_cli/command/setup_command.rb +66 -48
  6. data/lib/branch_io_cli/configuration.rb +3 -0
  7. data/lib/branch_io_cli/configuration/configuration.rb +9 -2
  8. data/lib/branch_io_cli/configuration/report_configuration.rb +0 -80
  9. data/lib/branch_io_cli/configuration/report_options.rb +86 -0
  10. data/lib/branch_io_cli/configuration/setup_configuration.rb +1 -146
  11. data/lib/branch_io_cli/configuration/setup_options.rb +152 -0
  12. data/lib/branch_io_cli/configuration/validate_configuration.rb +0 -31
  13. data/lib/branch_io_cli/configuration/validate_options.rb +38 -0
  14. data/lib/branch_io_cli/configuration/xcode_settings.rb +12 -7
  15. data/lib/branch_io_cli/core_ext.rb +1 -0
  16. data/lib/branch_io_cli/core_ext/io.rb +34 -11
  17. data/lib/branch_io_cli/core_ext/regexp.rb +4 -0
  18. data/lib/branch_io_cli/{helper/xcodeproj_ext.rb → core_ext/xcodeproj.rb} +0 -0
  19. data/lib/branch_io_cli/format/markdown_format.rb +1 -3
  20. data/lib/branch_io_cli/format/shell_format.rb +1 -3
  21. data/lib/branch_io_cli/helper.rb +1 -1
  22. data/lib/branch_io_cli/helper/branch_helper.rb +0 -8
  23. data/lib/branch_io_cli/helper/ios_helper.rb +0 -319
  24. data/lib/branch_io_cli/helper/methods.rb +15 -11
  25. data/lib/branch_io_cli/helper/patch_helper.rb +6 -6
  26. data/lib/branch_io_cli/helper/report_helper.rb +5 -7
  27. data/lib/branch_io_cli/helper/tool_helper.rb +329 -0
  28. data/lib/branch_io_cli/rake_task.rb +14 -35
  29. data/lib/branch_io_cli/version.rb +1 -1
  30. metadata +22 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fdec6cc2dfb747d21b5289bb907cdc3a0726d9b09cc489e7fa1d345da843745
4
- data.tar.gz: af5b660dceb286f2f0d2b923944cfd447812d2be25243dfeef4beabbabf68a4c
3
+ metadata.gz: 2e5aed004a45c8ab9ba1551d603e972affbc07660351c1495d378e9d08492452
4
+ data.tar.gz: 54786f9bcb72a71855dab1575482a964b26779c6a3b6fd4a8053cbe553c33507
5
5
  SHA512:
6
- metadata.gz: c134396f2768b91d8a157967f524136cd10a4d3b4b8358ce15830a6c99250af358fdb606c7192092dda158bed11d69ca94d9a9dcd30b78985e325ee9155514ba
7
- data.tar.gz: 734523ffb51d4615e456056b81f8ecdff2c73278970f1114487a7b9765ba32a94348d1921d6c2148374d94796f411f98800a599ebd1f7b95efa346000fd4d9da
6
+ metadata.gz: 434932c0f1da70515c63b5d069a2171ea5bac2109cd47ad405b3a057a98bad4a145c52316616a12ff31bd8cff84761373ea47e5b51b918160070f9c3c418ae36
7
+ data.tar.gz: 4cfdc82ca1e78119bb0e3fa9a1d1a5c0b82eba4e38292f443aee726900e6f709cde5f22959aebf60637bee42ede08d00a81d0bc57a1ac9a025ca1dab0ed90185
@@ -61,7 +61,7 @@ module BranchIOCLI
61
61
 
62
62
  def class_for_command(name, type)
63
63
  type_name = type.to_s.capitalize
64
- type_module = Object.const_get("BranchIOCLI").const_get(type_name)
64
+ type_module = BranchIOCLI.const_get(type_name)
65
65
  candidate = type_module.const_get("#{name.to_s.capitalize}#{type_name}")
66
66
  return nil unless candidate
67
67
 
@@ -10,9 +10,7 @@ module BranchIOCLI
10
10
  def configuration_class
11
11
  root = command_name.capitalize
12
12
 
13
- Object.const_get("BranchIOCLI")
14
- .const_get("Configuration")
15
- .const_get("#{root}Configuration")
13
+ BranchIOCLI::Configuration.const_get("#{root}Configuration")
16
14
  end
17
15
 
18
16
  def available_options
@@ -47,6 +45,10 @@ module BranchIOCLI
47
45
  def patch_helper
48
46
  Helper::PatchHelper
49
47
  end
48
+
49
+ def tool_helper
50
+ Helper::ToolHelper
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -40,13 +40,13 @@ module BranchIOCLI
40
40
  report_helper.pod_install_if_required report
41
41
 
42
42
  # run xcodebuild -list
43
- report.log_command "#{report_helper.base_xcodebuild_cmd} -list"
43
+ report.sh(*report_helper.base_xcodebuild_cmd, "-list")
44
44
 
45
45
  # If using a workspace, -list all the projects as well
46
46
  if config.workspace_path
47
47
  config.workspace.file_references.map(&:path).each do |project_path|
48
48
  path = File.join File.dirname(config.workspace_path), project_path
49
- report.log_command ["xcodebuild", "-list", "-project", path]
49
+ report.sh "xcodebuild", "-list", "-project", path
50
50
  end
51
51
  end
52
52
 
@@ -57,13 +57,18 @@ module BranchIOCLI
57
57
 
58
58
  base_cmd = report_helper.base_xcodebuild_cmd
59
59
  # Add more options for the rest of the commands
60
- base_cmd += " -scheme #{Shellwords.escape config.scheme}"
61
- base_cmd += " -configuration #{Shellwords.escape(config.configuration || config.configurations_from_scheme.first)}"
62
- base_cmd += " -sdk #{Shellwords.escape config.sdk}"
60
+ base_cmd += [
61
+ "-scheme",
62
+ config.scheme,
63
+ "-configuration",
64
+ config.configuration || config.configurations_from_scheme.first,
65
+ "-sdk",
66
+ config.sdk
67
+ ]
63
68
 
64
69
  if config.clean
65
70
  say "Cleaning"
66
- if report.log_command("#{base_cmd} clean").success?
71
+ if report.sh(*base_cmd, "clean").success?
67
72
  say "Done ✅"
68
73
  else
69
74
  say "Clean failed."
@@ -71,7 +76,7 @@ module BranchIOCLI
71
76
  end
72
77
 
73
78
  say "Building"
74
- if report.log_command("#{base_cmd} -verbose").success?
79
+ if report.sh(*base_cmd, "-verbose").success?
75
80
  say "Done ✅"
76
81
  else
77
82
  say "Build failed."
@@ -11,103 +11,119 @@ module BranchIOCLI
11
11
  @domains = config.all_domains
12
12
  end
13
13
 
14
- # rubocop: disable Metrics/PerceivedComplexity
15
14
  def run!
16
15
  # Make sure the user stashes or commits before continuing.
17
- check_repo_status
16
+ return 1 unless check_repo_status
18
17
 
19
- xcodeproj = config.xcodeproj
20
-
21
- is_app_target = !config.target.extension_target_type?
22
-
23
- if is_app_target && config.validate &&
24
- !helper.validate_team_and_bundle_ids_from_aasa_files(@domains)
25
- say "Universal Link configuration failed validation."
26
- helper.errors.each { |error| say " #{error}" }
27
- return 1 unless config.force
28
- elsif is_app_target && config.validate
29
- say "Universal Link configuration passed validation. ✅"
18
+ # Validate Universal Link configuration in an application target.
19
+ if config.validate && config.target.symbol_type == :application
20
+ valid = validate_universal_links
21
+ return 1 unless valid || config.force
30
22
  end
31
23
 
24
+ # Make sure we can resolve all build settings in a project using
25
+ # CocoaPods.
32
26
  if config.podfile_path && File.exist?(config.podfile_path) && config.pod_install_required?
33
- helper.verify_cocoapods
27
+ tool_helper.verify_cocoapods
34
28
  say "Installing pods to resolve current build settings"
35
- Dir.chdir(File.dirname(config.podfile_path)) do
36
- # We haven't modified anything yet. Don't use --repo-update at this stage.
37
- # This is unlikely to fail.
38
- sh "pod install"
39
- end
29
+ # We haven't modified anything yet. Don't use --repo-update at this stage.
30
+ # This is unlikely to fail.
31
+ sh "pod install", chdir: File.dirname(config.podfile_path)
40
32
  end
41
33
 
42
- helper.add_custom_build_setting if config.setting
34
+ # Add SDK via CocoaPods, Carthage or direct download (no-op if disabled).
35
+ add_sdk
43
36
 
44
- helper.add_keys_to_info_plist @keys
45
- helper.add_branch_universal_link_domains_to_info_plist @domains if is_app_target
46
- helper.ensure_uri_scheme_in_info_plist if is_app_target # does nothing if already present
37
+ # Set up Universal Links and Branch key(s)
38
+ update_project_settings
47
39
 
48
- if is_app_target
49
- config.xcodeproj.build_configurations.each do |c|
50
- new_path = helper.add_universal_links_to_project @domains, false, c.name
51
- sh ["git", "add", new_path] if config.commit && new_path
52
- end
40
+ # Patch source code if so instructed.
41
+ patch_helper.patch_source config.xcodeproj if config.patch_source
42
+
43
+ # Commit changes if so instructed.
44
+ commit_changes if config.commit
45
+
46
+ # Return success.
47
+ 0
48
+ end
49
+
50
+ def validate_universal_links
51
+ valid = helper.validate_team_and_bundle_ids_from_aasa_files @domains
52
+ if valid
53
+ say "Universal Link configuration passed validation. ✅"
54
+ else
55
+ say "Universal Link configuration failed validation."
56
+ helper.errors.each { |error| say " #{error}" }
53
57
  end
58
+ valid
59
+ end
54
60
 
55
- config_helper.target.add_system_frameworks config.frameworks unless config.frameworks.nil? || config.frameworks.empty?
61
+ def update_project_settings
62
+ helper.add_custom_build_setting if config.setting
63
+ helper.add_keys_to_info_plist @keys
64
+ config.target.add_system_frameworks config.frameworks unless config.frameworks.blank?
65
+
66
+ return unless config.target.symbol_type == :application
56
67
 
57
- xcodeproj.save
68
+ helper.add_branch_universal_link_domains_to_info_plist @domains
69
+ helper.ensure_uri_scheme_in_info_plist
70
+ config.xcodeproj.build_configurations.each do |c|
71
+ new_path = helper.add_universal_links_to_project @domains, false, c.name
72
+ sh "git", "add", new_path if config.commit && new_path
73
+ end
74
+ ensure
75
+ config.xcodeproj.save
76
+ end
58
77
 
78
+ def add_sdk
59
79
  case config.sdk_integration_mode
60
80
  when :cocoapods
61
81
  if File.exist? config.podfile_path
62
- helper.update_podfile config
82
+ tool_helper.update_podfile config
63
83
  else
64
- helper.add_cocoapods config
84
+ tool_helper.add_cocoapods config
65
85
  end
66
86
  when :carthage
67
87
  if File.exist? config.cartfile_path
68
- helper.update_cartfile config, xcodeproj
88
+ tool_helper.update_cartfile config, config.xcodeproj
69
89
  else
70
- helper.add_carthage config
90
+ tool_helper.add_carthage config
71
91
  end
72
92
  when :direct
73
- helper.add_direct config
93
+ tool_helper.add_direct config
74
94
  end
95
+ end
75
96
 
76
- patch_helper.patch_source xcodeproj if config.patch_source
77
-
78
- return 0 unless config.commit
79
-
97
+ def commit_changes
80
98
  changes = helper.changes.to_a.map { |c| Pathname.new(File.expand_path(c)).relative_path_from(Pathname.pwd).to_s }
81
99
 
82
100
  commit_message = config.commit if config.commit.kind_of?(String)
83
101
  commit_message ||= "[branch_io_cli] Branch SDK integration #{config.relative_path(config.xcodeproj_path)} (#{config.target.name})"
84
102
 
85
- sh ["git", "commit", "-qm", commit_message, *changes]
86
-
87
- 0
103
+ sh "git", "commit", "-qm", commit_message, *changes
88
104
  end
89
- # rubocop: enable Metrics/PerceivedComplexity
90
105
 
91
106
  def check_repo_status
92
107
  # If the git command is not installed, there's not much we can do.
93
108
  # Don't want to use verify_git here, which will insist on installing
94
109
  # the command. The logic of that method could change.
95
- return if `which git`.empty? || !config.confirm
110
+ return true if `which git`.empty? || !config.confirm
96
111
 
97
112
  unless Dir.exist? ".git"
98
113
  `git rev-parse --git-dir > /dev/null 2>&1`
99
114
  # Not a git repo
100
- return unless $?.success?
115
+ return true unless $?.success?
101
116
  end
102
117
 
103
118
  `git diff-index --quiet HEAD --`
104
- return if $?.success?
119
+ return true if $?.success?
105
120
 
106
121
  # Show the user
107
122
  sh "git status"
108
123
 
109
124
  choice = choose do |menu|
110
125
  menu.header = "There are uncommitted changes in this repo. It's best to stash or commit them before continuing."
126
+ menu.readline = true
111
127
  menu.choice "Stash"
112
128
  menu.choice "Commit (You will be prompted for a commit message.)"
113
129
  menu.choice "Quit"
@@ -120,11 +136,13 @@ module BranchIOCLI
120
136
  sh "git stash -q"
121
137
  when /^Commit/
122
138
  message = ask "Please enter a commit message: "
123
- sh ["git", "commit", "-aqm", message]
139
+ sh "git", "commit", "-aqm", message
124
140
  when /^Quit/
125
141
  say "Please stash or commit your changes before continuing."
126
- exit(-1)
142
+ return false
127
143
  end
144
+
145
+ true
128
146
  end
129
147
  end
130
148
  end
@@ -2,6 +2,9 @@ require "branch_io_cli/configuration/configuration"
2
2
  require "branch_io_cli/configuration/option"
3
3
  require "branch_io_cli/configuration/option_wrapper"
4
4
  require "branch_io_cli/configuration/report_configuration"
5
+ require "branch_io_cli/configuration/report_options"
5
6
  require "branch_io_cli/configuration/setup_configuration"
7
+ require "branch_io_cli/configuration/setup_options"
6
8
  require "branch_io_cli/configuration/validate_configuration"
9
+ require "branch_io_cli/configuration/validate_options"
7
10
  require "branch_io_cli/configuration/xcode_settings"
@@ -1,3 +1,4 @@
1
+ require "artii"
1
2
  require "cocoapods-core"
2
3
  require "pathname"
3
4
  require "xcodeproj"
@@ -24,6 +25,11 @@ module BranchIOCLI
24
25
  end
25
26
  end
26
27
 
28
+ def available_options
29
+ root = name.gsub(/^.*::(\w+)Configuration$/, '\1')
30
+ BranchIOCLI::Configuration.const_get("#{root.capitalize}Options").available_options
31
+ end
32
+
27
33
  def absolute_path(path)
28
34
  return path unless current
29
35
  current.absolute_path path
@@ -92,6 +98,7 @@ EOF
92
98
  say <<EOF
93
99
  <%= color("branch_io #{self.class.name.sub(/^.*::(.*?)Configuration$/, '\1').downcase} v. #{VERSION}", BOLD) %>
94
100
 
101
+ #{Artii::Base.new.asciify 'Branch'}
95
102
  EOF
96
103
  end
97
104
 
@@ -322,8 +329,8 @@ EOF
322
329
  objc_paths = all_paths.grep(/\.m$/)
323
330
  objc_paths += objc_paths.map { |p| p.sub(/\.m$/, '.h') }.select { |f| File.exist? f }
324
331
 
325
- path = swift_paths.find { |f| /class.*:\s+MSMessagesAppViewController\s*{\n/m.match_file f } ||
326
- objc_paths.find { |f| /@interface.*:\s+MSMessagesAppViewController/.match_file f }
332
+ path = swift_paths.find { |f| /class.*:\s+MSMessagesAppViewController\s*{\n/m.match_file? f } ||
333
+ objc_paths.find { |f| /@interface.*:\s+MSMessagesAppViewController/.match_file? f }
327
334
 
328
335
  # If we found a .h, patch the corresponding .m.
329
336
  path && path.sub(/\.h$/, '.m')
@@ -3,91 +3,11 @@ require "xcodeproj"
3
3
 
4
4
  module BranchIOCLI
5
5
  module Configuration
6
- # rubocop: disable Metrics/ClassLength
7
6
  class ReportConfiguration < Configuration
8
7
  class << self
9
8
  def summary
10
9
  "Generate and optionally submit a build diagnostic report."
11
10
  end
12
-
13
- def available_options
14
- [
15
- Option.new(
16
- name: :workspace,
17
- description: "Path to an Xcode workspace",
18
- type: String,
19
- example: "MyProject.xcworkspace"
20
- ),
21
- Option.new(
22
- name: :xcodeproj,
23
- description: "Path to an Xcode project",
24
- type: String,
25
- example: "MyProject.xcodeproj"
26
- ),
27
- Option.new(
28
- name: :scheme,
29
- description: "A scheme from the project or workspace to build",
30
- type: String,
31
- example: "MyProjectScheme"
32
- ),
33
- Option.new(
34
- name: :target,
35
- description: "A target to build",
36
- type: String,
37
- example: "MyProjectTarget"
38
- ),
39
- Option.new(
40
- name: :configuration,
41
- description: "The build configuration to use (default: Scheme-dependent)",
42
- type: String,
43
- example: "Debug/Release/CustomConfigName"
44
- ),
45
- Option.new(
46
- name: :sdk,
47
- description: "Passed as -sdk to xcodebuild",
48
- type: String,
49
- example: "iphoneos",
50
- default_value: "iphonesimulator"
51
- ),
52
- Option.new(
53
- name: :podfile,
54
- description: "Path to the Podfile for the project",
55
- type: String,
56
- example: "/path/to/Podfile"
57
- ),
58
- Option.new(
59
- name: :cartfile,
60
- description: "Path to the Cartfile for the project",
61
- type: String,
62
- example: "/path/to/Cartfile"
63
- ),
64
- Option.new(
65
- name: :clean,
66
- description: "Clean before attempting to build",
67
- default_value: true
68
- ),
69
- Option.new(
70
- name: :header_only,
71
- description: "Write a report header to standard output and exit",
72
- default_value: false,
73
- aliases: "-H"
74
- ),
75
- Option.new(
76
- name: :pod_repo_update,
77
- description: "Update the local podspec repo before installing",
78
- default_value: true
79
- ),
80
- Option.new(
81
- name: :out,
82
- description: "Report output path",
83
- default_value: "./report.txt",
84
- aliases: "-o",
85
- example: "./report.txt",
86
- type: String,
87
- env_name: "BRANCH_REPORT_PATH"
88
- )
89
- ]
90
- end
91
11
  end
92
12
 
93
13
  attr_reader :report_path
@@ -0,0 +1,86 @@
1
+ module BranchIOCLI
2
+ module Configuration
3
+ class ReportOptions
4
+ class << self
5
+ def available_options
6
+ [
7
+ Option.new(
8
+ name: :workspace,
9
+ description: "Path to an Xcode workspace",
10
+ type: String,
11
+ example: "MyProject.xcworkspace"
12
+ ),
13
+ Option.new(
14
+ name: :xcodeproj,
15
+ description: "Path to an Xcode project",
16
+ type: String,
17
+ example: "MyProject.xcodeproj"
18
+ ),
19
+ Option.new(
20
+ name: :scheme,
21
+ description: "A scheme from the project or workspace to build",
22
+ type: String,
23
+ example: "MyProjectScheme"
24
+ ),
25
+ Option.new(
26
+ name: :target,
27
+ description: "A target to build",
28
+ type: String,
29
+ example: "MyProjectTarget"
30
+ ),
31
+ Option.new(
32
+ name: :configuration,
33
+ description: "The build configuration to use (default: Scheme-dependent)",
34
+ type: String,
35
+ example: "Debug/Release/CustomConfigName"
36
+ ),
37
+ Option.new(
38
+ name: :sdk,
39
+ description: "Passed as -sdk to xcodebuild",
40
+ type: String,
41
+ example: "iphoneos",
42
+ default_value: "iphonesimulator"
43
+ ),
44
+ Option.new(
45
+ name: :podfile,
46
+ description: "Path to the Podfile for the project",
47
+ type: String,
48
+ example: "/path/to/Podfile"
49
+ ),
50
+ Option.new(
51
+ name: :cartfile,
52
+ description: "Path to the Cartfile for the project",
53
+ type: String,
54
+ example: "/path/to/Cartfile"
55
+ ),
56
+ Option.new(
57
+ name: :clean,
58
+ description: "Clean before attempting to build",
59
+ default_value: true
60
+ ),
61
+ Option.new(
62
+ name: :header_only,
63
+ description: "Write a report header to standard output and exit",
64
+ default_value: false,
65
+ aliases: "-H"
66
+ ),
67
+ Option.new(
68
+ name: :pod_repo_update,
69
+ description: "Update the local podspec repo before installing",
70
+ default_value: true
71
+ ),
72
+ Option.new(
73
+ name: :out,
74
+ description: "Report output path",
75
+ default_value: "./report.txt",
76
+ aliases: "-o",
77
+ example: "./report.txt",
78
+ type: String,
79
+ env_name: "BRANCH_REPORT_PATH"
80
+ )
81
+ ]
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end