branch_io_cli 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +43 -17
- data/lib/branch_io_cli.rb +1 -1
- data/lib/branch_io_cli/cli.rb +32 -18
- data/lib/branch_io_cli/commands.rb +3 -0
- data/lib/branch_io_cli/commands/command.rb +23 -0
- data/lib/branch_io_cli/commands/setup_command.rb +67 -0
- data/lib/branch_io_cli/commands/validate_command.rb +46 -0
- data/lib/branch_io_cli/helper/branch_helper.rb +59 -0
- data/lib/branch_io_cli/helper/configuration_helper.rb +69 -235
- data/lib/branch_io_cli/helper/ios_helper.rb +224 -0
- data/lib/branch_io_cli/version.rb +1 -1
- metadata +5 -2
- data/lib/branch_io_cli/command.rb +0 -177
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f269c7f617c87a8f5850bbb836a909dd272fb0f
|
4
|
+
data.tar.gz: 91b44ebe0922c603e3e89a4725adae1917dce458
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72f42f3ae7b88c0491560360c93ca896c6c18da4d17edef7458df1f741375e50eda5b0bb2eeb6f57e86bdfd6ab38f8b641264ceeba2e91e651b8fcffff581a14
|
7
|
+
data.tar.gz: 0c2ddfedf72348323628c7fcd11b26a9cf30c1b7204b3da66c81c1ba106e8f404a5ab5a6a969837d790cf37dd56310c7e9c1c3b48d3977c754f6ae62919a6818
|
data/README.md
CHANGED
@@ -46,14 +46,14 @@ location.
|
|
46
46
|
|
47
47
|
If a Podfile or Cartfile is detected, the Branch SDK will be added to the relevant
|
48
48
|
configuration file and the dependencies updated to include the Branch framework.
|
49
|
-
This behavior may be suppressed using `--
|
49
|
+
This behavior may be suppressed using `--no-add-sdk`. If no Podfile or Cartfile
|
50
50
|
is found, and Branch.framework is not already among the project's dependencies,
|
51
51
|
you will be prompted for a number of choices, including setting up CocoaPods or
|
52
52
|
Carthage for the project or directly installing the Branch.framework.
|
53
53
|
|
54
54
|
By default, all supplied Universal Link domains are validated. If validation passes,
|
55
55
|
the setup continues. If validation fails, no further action is taken. Suppress
|
56
|
-
validation using `--
|
56
|
+
validation using `--no-validate` or force changes when validation fails using
|
57
57
|
`--force`.
|
58
58
|
|
59
59
|
By default, this command will look for the first app target in the project. Test
|
@@ -67,7 +67,7 @@ Optionally, if `--frameworks` is specified, this command can add a list of syste
|
|
67
67
|
frameworks to the target's dependencies (e.g., AdSupport, CoreSpotlight, SafariServices).
|
68
68
|
|
69
69
|
A language-specific patch is applied to the AppDelegate (Swift or Objective-C).
|
70
|
-
This can be suppressed using `--
|
70
|
+
This can be suppressed using `--no-patch-source`.
|
71
71
|
|
72
72
|
#### Prerequisites
|
73
73
|
|
@@ -86,26 +86,52 @@ command, respectively, available in your path.
|
|
86
86
|
|
87
87
|
|Option|Description|
|
88
88
|
|------|-----------|
|
89
|
-
|
90
|
-
|
91
|
-
|--
|
92
|
-
|
93
|
-
|
89
|
+
|-L, --live-key key_live_xxxx|Branch live key|
|
90
|
+
|-T, --test-key key_test_yyyy|Branch test key|
|
91
|
+
|--app-link-subdomain myapp|Branch app.link subdomain, e.g. myapp for myapp.app.link|
|
92
|
+
|-D, --domains example.com,www.example.com|Comma-separated list of custom domain(s) or non-Branch domain(s)|
|
93
|
+
|-U, --uri-scheme myurischeme[://]|Custom URI scheme used in the Branch Dashboard for this app|
|
94
94
|
|--xcodeproj MyProject.xcodeproj|Path to an Xcode project to update|
|
95
95
|
|--target MyAppTarget|Name of a target to modify in the Xcode project|
|
96
96
|
|--podfile /path/to/Podfile|Path to the Podfile for the project|
|
97
97
|
|--cartfile /path/to/Cartfile|Path to the Cartfile for the project|
|
98
98
|
|--frameworks AdSupport,CoreSpotlight,SafariServices|Comma-separated list of system frameworks to add to the project|
|
99
|
-
|--
|
100
|
-
|--
|
101
|
-
|--force|Update project even if Universal Link validation fails|
|
102
|
-
|--
|
103
|
-
|--
|
104
|
-
|--commit|Commit the results to Git|
|
99
|
+
|--[no-]pod-repo-update|Update the local podspec repo before installing (default: yes)|
|
100
|
+
|--[no-]validate|Validate Universal Link configuration (default: yes)|
|
101
|
+
|--[no-]force|Update project even if Universal Link validation fails (default: no)|
|
102
|
+
|--[no-]add-sdk|Add the Branch framework to the project (default: yes)|
|
103
|
+
|--[no-]patch-source|Add Branch SDK calls to the AppDelegate (default: yes)|
|
104
|
+
|--[no-]commit|Commit the results to Git (default: no)|
|
105
105
|
|
106
106
|
All parameters are optional. A live key or test key, or both is required, as well as at least one domain.
|
107
|
-
Specify --
|
108
|
-
specified, this command will prompt you for
|
107
|
+
Specify --live-key, --test-key or both and --app-link-subdomain, --domains or both. If these are not
|
108
|
+
specified, this command will prompt you for the information.
|
109
|
+
|
110
|
+
#### Examples
|
111
|
+
|
112
|
+
##### Test without validation (can use dummy keys and domains)
|
113
|
+
|
114
|
+
```bash
|
115
|
+
branch_io setup -L key_live_xxxx -D myapp.app.link --no-validate
|
116
|
+
```
|
117
|
+
|
118
|
+
##### Use both live and test keys
|
119
|
+
|
120
|
+
```bash
|
121
|
+
branch_io setup -L key_live_xxxx -T key_test_yyyy -D myapp.app.link
|
122
|
+
```
|
123
|
+
|
124
|
+
##### Use custom or non-Branch domains
|
125
|
+
|
126
|
+
```bash
|
127
|
+
branch_io setup -D myapp.app.link,example.com,www.example.com
|
128
|
+
```
|
129
|
+
|
130
|
+
##### Avoid pod repo update
|
131
|
+
|
132
|
+
```bash
|
133
|
+
branch_io setup --no-pod-repo-update
|
134
|
+
```
|
109
135
|
|
110
136
|
### Validate command
|
111
137
|
|
@@ -128,7 +154,7 @@ targets.
|
|
128
154
|
|
129
155
|
|Option|Description|
|
130
156
|
|------|-----------|
|
131
|
-
|
157
|
+
|-D, --domains example.com,www.example.com|Comma-separated list of domains. May include app.link subdomains.|
|
132
158
|
|--xcodeproj MyProject.xcodeproj|Path to an Xcode project to update|
|
133
159
|
|--target MyAppTarget|Name of a target to modify in the Xcode project|
|
134
160
|
|
data/lib/branch_io_cli.rb
CHANGED
data/lib/branch_io_cli/cli.rb
CHANGED
@@ -25,14 +25,14 @@ location.
|
|
25
25
|
|
26
26
|
If a Podfile or Cartfile is detected, the Branch SDK will be added to the relevant
|
27
27
|
configuration file and the dependencies updated to include the Branch framework.
|
28
|
-
This behavior may be suppressed using <%= color('--
|
28
|
+
This behavior may be suppressed using <%= color('--no-add-sdk', BOLD) %>. If no Podfile or Cartfile
|
29
29
|
is found, and Branch.framework is not already among the project's dependencies,
|
30
30
|
you will be prompted for a number of choices, including setting up CocoaPods or
|
31
31
|
Carthage for the project or directly installing the Branch.framework.
|
32
32
|
|
33
33
|
By default, all supplied Universal Link domains are validated. If validation passes,
|
34
34
|
the setup continues. If validation fails, no further action is taken. Suppress
|
35
|
-
validation using <%= color('--
|
35
|
+
validation using <%= color('--no-validate', BOLD) %> or force changes when validation fails using
|
36
36
|
<%= color('--force', BOLD) %>.
|
37
37
|
|
38
38
|
By default, this command will look for the first app target in the project. Test
|
@@ -46,7 +46,7 @@ Optionally, if <%= color('--frameworks', BOLD) %> is specified, this command can
|
|
46
46
|
frameworks to the target's dependencies (e.g., AdSupport, CoreSpotlight, SafariServices).
|
47
47
|
|
48
48
|
A language-specific patch is applied to the AppDelegate (Swift or Objective-C).
|
49
|
-
This can be suppressed using <%= color('--
|
49
|
+
This can be suppressed using <%= color('--no-patch-source', BOLD) %>.
|
50
50
|
|
51
51
|
<%= color('Prerequisites', BOLD) %>
|
52
52
|
|
@@ -64,7 +64,7 @@ To add the SDK with CocoaPods or Carthage, you must have the <%= color('pod', BO
|
|
64
64
|
command, respectively, available in your path.
|
65
65
|
|
66
66
|
All parameters are optional. A live key or test key, or both is required, as well
|
67
|
-
as at least one domain. Specify <%= color('--
|
67
|
+
as at least one domain. Specify <%= color('--live-key', BOLD) %>, <%= color('--test-key', BOLD) %> or both and <%= color('--app-link-subdomain', BOLD) %>,
|
68
68
|
<%= color('--domains', BOLD) %> or both. If these are not specified, this command will prompt you
|
69
69
|
for this information.
|
70
70
|
|
@@ -72,11 +72,11 @@ See https://github.com/BranchMetrics/branch_io_cli#setup-command for more inform
|
|
72
72
|
EOF
|
73
73
|
|
74
74
|
# Required Branch params
|
75
|
-
c.option "--
|
76
|
-
c.option "--
|
77
|
-
c.option "--
|
78
|
-
c.option "--domains example.com,www.example.com", Array, "Comma-separated list of custom domain(s) or non-Branch domain(s)"
|
79
|
-
c.option "--
|
75
|
+
c.option "-L", "--live-key key_live_xxxx", String, "Branch live key"
|
76
|
+
c.option "-T", "--test-key key_test_yyyy", String, "Branch test key"
|
77
|
+
c.option "--app-link-subdomain myapp", String, "Branch app.link subdomain, e.g. myapp for myapp.app.link"
|
78
|
+
c.option "-D", "--domains example.com,www.example.com", Array, "Comma-separated list of custom domain(s) or non-Branch domain(s)"
|
79
|
+
c.option "-U", "--uri-scheme myurischeme[://]", String, "Custom URI scheme used in the Branch Dashboard for this app"
|
80
80
|
|
81
81
|
c.option "--xcodeproj MyProject.xcodeproj", String, "Path to an Xcode project to update"
|
82
82
|
c.option "--target MyAppTarget", String, "Name of a target to modify in the Xcode project"
|
@@ -84,15 +84,29 @@ EOF
|
|
84
84
|
c.option "--cartfile /path/to/Cartfile", String, "Path to the Cartfile for the project"
|
85
85
|
c.option "--frameworks AdSupport,CoreSpotlight,SafariServices", Array, "Comma-separated list of system frameworks to add to the project"
|
86
86
|
|
87
|
-
c.option "--
|
88
|
-
c.option "--
|
89
|
-
c.option "--force",
|
90
|
-
c.option "--
|
91
|
-
c.option "--
|
92
|
-
c.option "--commit",
|
87
|
+
c.option "--[no-]pod-repo-update", "Update the local podspec repo before installing (default: yes)"
|
88
|
+
c.option "--[no-]validate", "Validate Universal Link configuration (default: yes)"
|
89
|
+
c.option "--[no-]force", "Update project even if Universal Link validation fails (default: no)"
|
90
|
+
c.option "--[no-]add-sdk", "Add the Branch framework to the project (default: yes)"
|
91
|
+
c.option "--[no-]patch-source", "Add Branch SDK calls to the AppDelegate (default: yes)"
|
92
|
+
c.option "--[no-]commit", "Commit the results to Git (default: no)"
|
93
|
+
|
94
|
+
c.example "Test without validation (can use dummy keys and domains)", "branch_io setup -L key_live_xxxx -D myapp.app.link --no-validate"
|
95
|
+
c.example "Use both live and test keys", "branch_io setup -L key_live_xxxx -T key_test_yyyy -D myapp.app.link"
|
96
|
+
c.example "Use custom or non-Branch domains", "branch_io setup -D myapp.app.link,example.com,www.example.com"
|
97
|
+
c.example "Avoid pod repo update", "branch_io setup --no-pod-repo-update"
|
93
98
|
|
94
99
|
c.action do |args, options|
|
95
|
-
|
100
|
+
options.default(
|
101
|
+
# Defaults for boolean options
|
102
|
+
pod_repo_update: true,
|
103
|
+
validate: true,
|
104
|
+
force: false,
|
105
|
+
add_sdk: true,
|
106
|
+
patch_source: true,
|
107
|
+
commit: false
|
108
|
+
)
|
109
|
+
Commands::SetupCommand.new(options).run!
|
96
110
|
end
|
97
111
|
end
|
98
112
|
|
@@ -120,12 +134,12 @@ validation.
|
|
120
134
|
See https://github.com/BranchMetrics/branch_io_cli#validate-command for more information.
|
121
135
|
EOF
|
122
136
|
|
137
|
+
c.option "-D", "--domains example.com,www.example.com", Array, "Comma-separated list of domains to validate (Branch domains or non-Branch domains)"
|
123
138
|
c.option "--xcodeproj MyProject.xcodeproj", String, "Path to an Xcode project to update"
|
124
139
|
c.option "--target MyAppTarget", String, "Name of a target to modify in the Xcode project"
|
125
|
-
c.option "--domains example.com,www.example.com", Array, "Comma-separated list of domains to validate (Branch domains or non-Branch domains)"
|
126
140
|
|
127
141
|
c.action do |args, options|
|
128
|
-
valid =
|
142
|
+
valid = Commands::ValidateCommand.new(options).run!
|
129
143
|
exit_code = valid ? 0 : 1
|
130
144
|
exit exit_code
|
131
145
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module BranchIOCLI
|
2
|
+
module Commands
|
3
|
+
class Command
|
4
|
+
attr_reader :options
|
5
|
+
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def run!
|
11
|
+
# implemented by subclasses
|
12
|
+
end
|
13
|
+
|
14
|
+
def helper
|
15
|
+
Helper::BranchHelper
|
16
|
+
end
|
17
|
+
|
18
|
+
def config_helper
|
19
|
+
Helper::ConfigurationHelper
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module BranchIOCLI
|
2
|
+
module Commands
|
3
|
+
class SetupCommand < Command
|
4
|
+
def initialize(options)
|
5
|
+
super
|
6
|
+
config_helper.validate_setup_options options
|
7
|
+
@keys = config_helper.keys
|
8
|
+
@domains = config_helper.all_domains
|
9
|
+
end
|
10
|
+
|
11
|
+
# rubocop: disable Metrics/PerceivedComplexity
|
12
|
+
def run!
|
13
|
+
xcodeproj = config_helper.xcodeproj
|
14
|
+
|
15
|
+
case config_helper.sdk_integration_mode
|
16
|
+
when :cocoapods
|
17
|
+
if File.exist? config_helper.podfile_path
|
18
|
+
helper.update_podfile options
|
19
|
+
else
|
20
|
+
helper.add_cocoapods options
|
21
|
+
end
|
22
|
+
when :carthage
|
23
|
+
if File.exist? config_helper.cartfile_path
|
24
|
+
helper.update_cartfile options, xcodeproj
|
25
|
+
else
|
26
|
+
helper.add_carthage options
|
27
|
+
end
|
28
|
+
when :direct
|
29
|
+
helper.add_direct options
|
30
|
+
end
|
31
|
+
|
32
|
+
target_name = options.target # may be nil
|
33
|
+
is_app_target = config_helper.target.extension_target_type?
|
34
|
+
|
35
|
+
if is_app_target && options.validate &&
|
36
|
+
!helper.validate_team_and_bundle_ids_from_aasa_files(xcodeproj, target_name, @domains)
|
37
|
+
say "Universal Link configuration failed validation."
|
38
|
+
helper.errors.each { |error| say " #{error}" }
|
39
|
+
return unless options.force
|
40
|
+
elsif is_app_target && options.validate
|
41
|
+
say "Universal Link configuration passed validation. ✅"
|
42
|
+
end
|
43
|
+
|
44
|
+
# the following calls can all raise IOError
|
45
|
+
helper.add_keys_to_info_plist xcodeproj, target_name, @keys
|
46
|
+
helper.add_branch_universal_link_domains_to_info_plist xcodeproj, target_name, @domains if is_app_target
|
47
|
+
helper.ensure_uri_scheme_in_info_plist if is_app_target # does nothing if already present
|
48
|
+
|
49
|
+
new_path = helper.add_universal_links_to_project xcodeproj, target_name, @domains, false if is_app_target
|
50
|
+
`git add #{new_path}` if options.commit && new_path
|
51
|
+
|
52
|
+
helper.add_system_frameworks xcodeproj, target_name, options.frameworks unless options.frameworks.nil? || options.frameworks.empty?
|
53
|
+
|
54
|
+
xcodeproj.save
|
55
|
+
|
56
|
+
helper.patch_source xcodeproj if options.patch_source
|
57
|
+
|
58
|
+
return unless options.commit
|
59
|
+
|
60
|
+
changes = helper.changes.to_a.map { |c| Pathname.new(File.expand_path(c)).relative_path_from(Pathname.pwd).to_s }
|
61
|
+
|
62
|
+
`git commit #{changes.join(" ")} -m '[branch_io_cli] Branch SDK integration'`
|
63
|
+
end
|
64
|
+
# rubocop: enable Metrics/PerceivedComplexity
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module BranchIOCLI
|
2
|
+
module Commands
|
3
|
+
module ValidateCommand
|
4
|
+
def initialize(options)
|
5
|
+
super
|
6
|
+
config_helper.validate_validation_options options
|
7
|
+
end
|
8
|
+
|
9
|
+
def run!
|
10
|
+
# raises
|
11
|
+
xcodeproj = config_helper.xcodeproj
|
12
|
+
|
13
|
+
valid = true
|
14
|
+
|
15
|
+
unless options.domains.nil? || options.domains.empty?
|
16
|
+
domains_valid = helper.validate_project_domains(
|
17
|
+
options.domains,
|
18
|
+
xcodeproj,
|
19
|
+
options.target
|
20
|
+
)
|
21
|
+
|
22
|
+
if domains_valid
|
23
|
+
say "Project domains match :domains parameter: ✅"
|
24
|
+
else
|
25
|
+
say "Project domains do not match specified :domains"
|
26
|
+
helper.errors.each { |error| say " #{error}" }
|
27
|
+
end
|
28
|
+
|
29
|
+
valid &&= domains_valid
|
30
|
+
end
|
31
|
+
|
32
|
+
configuration_valid = helper.validate_team_and_bundle_ids_from_aasa_files xcodeproj, options.target
|
33
|
+
unless configuration_valid
|
34
|
+
say "Universal Link configuration failed validation."
|
35
|
+
helper.errors.each { |error| say " #{error}" }
|
36
|
+
end
|
37
|
+
|
38
|
+
valid &&= configuration_valid
|
39
|
+
|
40
|
+
say "Universal Link configuration passed validation. ✅" if valid
|
41
|
+
|
42
|
+
valid
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "branch_io_cli/helper/android_helper"
|
2
2
|
require "branch_io_cli/helper/ios_helper"
|
3
|
+
require "net/http"
|
3
4
|
require "pattern_patch"
|
4
5
|
require "set"
|
5
6
|
|
@@ -33,6 +34,64 @@ module BranchIOCLI
|
|
33
34
|
file.write modified
|
34
35
|
end
|
35
36
|
end
|
37
|
+
|
38
|
+
def fetch(url)
|
39
|
+
response = Net::HTTP.get_response URI(url)
|
40
|
+
|
41
|
+
case response
|
42
|
+
when Net::HTTPSuccess
|
43
|
+
response.body
|
44
|
+
when Net::HTTPRedirection
|
45
|
+
fetch response['location']
|
46
|
+
else
|
47
|
+
raise "Error fetching #{url}: #{response.code} #{response.message}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def download(url, dest)
|
52
|
+
uri = URI(url)
|
53
|
+
|
54
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
|
55
|
+
request = Net::HTTP::Get.new uri
|
56
|
+
|
57
|
+
http.request request do |response|
|
58
|
+
case response
|
59
|
+
when Net::HTTPSuccess
|
60
|
+
bytes_downloaded = 0
|
61
|
+
dots_reported = 0
|
62
|
+
# report a dot every 100 kB
|
63
|
+
per_dot = 102_400
|
64
|
+
|
65
|
+
File.open dest, 'w' do |io|
|
66
|
+
response.read_body do |chunk|
|
67
|
+
io.write chunk
|
68
|
+
|
69
|
+
# print progress
|
70
|
+
bytes_downloaded += chunk.length
|
71
|
+
while (bytes_downloaded - per_dot * dots_reported) >= per_dot
|
72
|
+
print "."
|
73
|
+
dots_reported += 1
|
74
|
+
end
|
75
|
+
STDOUT.flush
|
76
|
+
end
|
77
|
+
end
|
78
|
+
say "\n"
|
79
|
+
when Net::HTTPRedirection
|
80
|
+
download response['location'], dest
|
81
|
+
else
|
82
|
+
raise "Error downloading #{url}: #{response.code} #{response.message}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def ensure_directory(path)
|
89
|
+
return if path == "/" || path == "."
|
90
|
+
parent = File.dirname path
|
91
|
+
ensure_directory parent
|
92
|
+
return if Dir.exist? path
|
93
|
+
Dir.mkdir path
|
94
|
+
end
|
36
95
|
end
|
37
96
|
end
|
38
97
|
end
|
@@ -1,42 +1,73 @@
|
|
1
|
-
require "json"
|
2
|
-
require "net/http"
|
3
1
|
require "pathname"
|
4
|
-
require "tmpdir"
|
5
2
|
require "xcodeproj"
|
6
|
-
require "zip"
|
7
3
|
|
8
4
|
module BranchIOCLI
|
9
5
|
module Helper
|
10
|
-
#
|
6
|
+
# Processes CLI options.
|
7
|
+
# Validates options.
|
8
|
+
# Prompts for input in a number of cases.
|
11
9
|
class ConfigurationHelper
|
12
|
-
|
13
|
-
|
10
|
+
APP_LINK_REGEXP = /\.app\.link$|\.test-app\.link$/
|
11
|
+
SDK_OPTIONS =
|
12
|
+
{
|
13
|
+
"Set this project up to use CocoaPods and add the Branch SDK." => :cocoapods,
|
14
|
+
"Set this project up to use Carthage and add the Branch SDK." => :carthage,
|
15
|
+
"Add Branch.framework directly to the project's dependencies." => :direct,
|
16
|
+
"Skip adding the framework to the project." => :skip
|
17
|
+
}
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
class << self
|
20
|
+
attr_reader :xcodeproj_path
|
21
|
+
attr_reader :xcodeproj
|
22
|
+
attr_reader :keys
|
23
|
+
attr_reader :all_domains
|
24
|
+
attr_reader :podfile_path
|
25
|
+
attr_reader :cartfile_path
|
26
|
+
attr_reader :target
|
27
|
+
attr_reader :uri_scheme
|
28
|
+
attr_reader :pod_repo_update
|
29
|
+
attr_reader :validate
|
30
|
+
attr_reader :add_sdk
|
31
|
+
attr_reader :force
|
32
|
+
attr_reader :patch_source
|
33
|
+
attr_reader :commit
|
34
|
+
attr_reader :sdk_integration_mode
|
23
35
|
|
24
36
|
def validate_setup_options(options)
|
25
37
|
print_identification "setup"
|
26
38
|
|
27
|
-
|
39
|
+
@pod_repo_update = options.pod_repo_update
|
40
|
+
@validate = options.validate
|
41
|
+
@patch_source = options.patch_source
|
42
|
+
@add_sdk = options.add_sdk
|
43
|
+
@force = options.force
|
44
|
+
@commit = options.commit
|
45
|
+
|
46
|
+
say "--force is ignored when --no-validate is used." if !options.validate && options.force
|
47
|
+
if options.cartfile && options.podfile
|
48
|
+
say "--cartfile and --podfile are mutually exclusive. Please specify the file to patch."
|
49
|
+
exit 1
|
50
|
+
end
|
28
51
|
|
29
52
|
validate_xcodeproj_path options
|
30
53
|
validate_target options
|
31
54
|
validate_keys_from_setup_options options
|
32
55
|
validate_all_domains options, !@target.extension_target_type?
|
33
56
|
validate_uri_scheme options
|
34
|
-
validate_buildfile_path options, "Podfile"
|
35
|
-
validate_buildfile_path options, "Cartfile"
|
36
57
|
|
37
|
-
|
58
|
+
# If neither --podfile nor --cartfile is present, arbitrarily look for a Podfile
|
59
|
+
# first.
|
60
|
+
|
61
|
+
# If --cartfile is present, don't look for a Podfile. Just validate that
|
62
|
+
# Cartfile.
|
63
|
+
validate_buildfile_path options, "Podfile" if options.cartfile.nil?
|
64
|
+
|
65
|
+
# If --podfile is present or a Podfile was found, don't look for a Cartfile.
|
66
|
+
validate_buildfile_path options, "Cartfile" if @podfile.nil?
|
38
67
|
|
39
68
|
validate_sdk_addition options
|
69
|
+
|
70
|
+
print_setup_configuration
|
40
71
|
end
|
41
72
|
|
42
73
|
def validate_validation_options(options)
|
@@ -68,6 +99,13 @@ EOF
|
|
68
99
|
<%= color('URI scheme:', BOLD) %> #{@uri_scheme || '(none)'}
|
69
100
|
<%= color('Podfile:', BOLD) %> #{@podfile_path || '(none)'}
|
70
101
|
<%= color('Cartfile:', BOLD) %> #{@cartfile_path || '(none)'}
|
102
|
+
<%= color('Pod repo update:', BOLD) %> #{@pod_repo_update.inspect}
|
103
|
+
<%= color('Validate:', BOLD) %> #{@validate.inspect}
|
104
|
+
<%= color('Force:', BOLD) %> #{@force.inspect}
|
105
|
+
<%= color('Add SDK:', BOLD) %> #{@add_sdk.inspect}
|
106
|
+
<%= color('Patch source:', BOLD) %> #{@patch_source.inspect}
|
107
|
+
<%= color('Commit:', BOLD) %> #{@commit.inspect}
|
108
|
+
<%= color('SDK integration mode:', BOLD) %> #{@sdk_integration_mode || '(none)'}
|
71
109
|
|
72
110
|
EOF
|
73
111
|
end
|
@@ -244,10 +282,10 @@ EOF
|
|
244
282
|
end
|
245
283
|
|
246
284
|
def validate_buildfile_path(options, filename)
|
247
|
-
# Disable Podfile/Cartfile update if --
|
248
|
-
return
|
285
|
+
# Disable Podfile/Cartfile update if --no-add-sdk is present
|
286
|
+
return unless options.add_sdk && @sdk_integration_mode.nil?
|
249
287
|
|
250
|
-
buildfile_path =
|
288
|
+
buildfile_path = options.send filename.downcase
|
251
289
|
|
252
290
|
# Was --podfile/--cartfile used?
|
253
291
|
if buildfile_path
|
@@ -284,10 +322,12 @@ EOF
|
|
284
322
|
else
|
285
323
|
@cartfile_path = buildfile_path
|
286
324
|
end
|
325
|
+
|
326
|
+
@sdk_integration_mode = filename == "Podfile" ? :cocoapods : :carthage
|
287
327
|
end
|
288
328
|
|
289
329
|
def validate_sdk_addition(options)
|
290
|
-
return if options.
|
330
|
+
return if !options.add_sdk || @sdk_integration_mode
|
291
331
|
|
292
332
|
# If no CocoaPods or Carthage, check to see if the framework is linked.
|
293
333
|
target = BranchHelper.target_from_project @xcodeproj, options.target
|
@@ -303,222 +343,16 @@ EOF
|
|
303
343
|
menu.prompt = "What would you like to do?"
|
304
344
|
end
|
305
345
|
|
306
|
-
|
307
|
-
|
308
|
-
case option
|
309
|
-
when :skip
|
310
|
-
return
|
311
|
-
else
|
312
|
-
send "add_#{option}", options
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
def add_cocoapods(options)
|
317
|
-
@podfile_path = File.expand_path "../Podfile", @xcodeproj_path
|
318
|
-
target = BranchHelper.target_from_project @xcodeproj, options.target
|
319
|
-
|
320
|
-
install_command = "pod install"
|
321
|
-
install_command += " --repo-update" unless options.no_pod_repo_update
|
322
|
-
Dir.chdir(File.dirname(@podfile_path)) do
|
323
|
-
system "pod init"
|
324
|
-
BranchHelper.apply_patch(
|
325
|
-
files: @podfile_path,
|
326
|
-
regexp: /^(\s*)# Pods for #{target.name}$/,
|
327
|
-
mode: :append,
|
328
|
-
text: "\n\\1pod \"Branch\"",
|
329
|
-
global: false
|
330
|
-
)
|
331
|
-
system install_command
|
332
|
-
end
|
333
|
-
|
334
|
-
BranchHelper.add_change @podfile_path
|
335
|
-
BranchHelper.add_change "#{@podfile_path}.lock"
|
336
|
-
|
337
|
-
# For now, add Pods folder to SCM.
|
338
|
-
pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from Pathname.pwd
|
339
|
-
workspace_path = Pathname.new(File.expand_path(@xcodeproj_path.sub(/.xcodeproj$/, ".xcworkspace"))).relative_path_from Pathname.pwd
|
340
|
-
podfile_pathname = Pathname.new(@podfile_path).relative_path_from Pathname.pwd
|
341
|
-
BranchHelper.add_change pods_folder_path
|
342
|
-
BranchHelper.add_change workspace_path
|
343
|
-
`git add #{podfile_pathname} #{podfile_pathname}.lock #{pods_folder_path} #{workspace_path}` if options.commit
|
344
|
-
end
|
345
|
-
|
346
|
-
def add_carthage(options)
|
347
|
-
# TODO: Collapse this and Command::update_cartfile
|
348
|
-
|
349
|
-
# 1. Generate Cartfile
|
350
|
-
@cartfile_path = File.expand_path "../Cartfile", @xcodeproj_path
|
351
|
-
File.open(@cartfile_path, "w") do |file|
|
352
|
-
file.write <<EOF
|
353
|
-
github "BranchMetrics/ios-branch-deep-linking"
|
354
|
-
EOF
|
355
|
-
end
|
356
|
-
|
357
|
-
# 2. carthage update
|
358
|
-
Dir.chdir(File.dirname(@cartfile_path)) do
|
359
|
-
system "carthage update --platform ios"
|
360
|
-
end
|
361
|
-
|
362
|
-
# 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
|
363
|
-
BranchHelper.add_change cartfile_path
|
364
|
-
BranchHelper.add_change "#{cartfile_path}.resolved"
|
365
|
-
|
366
|
-
# 4. Add to target dependencies
|
367
|
-
frameworks_group = @xcodeproj.frameworks_group
|
368
|
-
branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
|
369
|
-
target = BranchHelper.target_from_project @xcodeproj, options.target
|
370
|
-
target.frameworks_build_phase.add_file_reference branch_framework
|
371
|
-
|
372
|
-
# 5. Create a copy-frameworks build phase
|
373
|
-
carthage_build_phase = target.new_shell_script_build_phase "carthage copy-frameworks"
|
374
|
-
carthage_build_phase.shell_script = "/usr/local/bin/carthage copy-frameworks"
|
375
|
-
|
376
|
-
carthage_build_phase.input_paths << "$(SRCROOT)/Carthage/Build/iOS/Branch.framework"
|
377
|
-
carthage_build_phase.output_paths << "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Branch.framework"
|
378
|
-
|
379
|
-
@xcodeproj.save
|
380
|
-
|
381
|
-
# For now, add Carthage folder to SCM
|
382
|
-
|
383
|
-
# 6. Add the Carthage folder to the commit (in case :commit param specified)
|
384
|
-
carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from(Pathname.pwd)
|
385
|
-
cartfile_pathname = Pathname.new(@cartfile_path).relative_path_from Pathname.pwd
|
386
|
-
BranchHelper.add_change carthage_folder_path
|
387
|
-
`git add #{cartfile_pathname} #{cartfile_pathname}.resolved #{carthage_folder_path}` if options.commit
|
388
|
-
end
|
389
|
-
|
390
|
-
def add_direct(options)
|
391
|
-
# Put the framework in the path for any existing Frameworks group in the project.
|
392
|
-
frameworks_group = @xcodeproj.frameworks_group
|
393
|
-
framework_path = File.join frameworks_group.real_path, "Branch.framework"
|
394
|
-
raise "#{framework_path} exists." if File.exist? framework_path
|
395
|
-
|
396
|
-
say "Finding current framework release"
|
397
|
-
|
398
|
-
# Find the latest release from GitHub.
|
399
|
-
releases = JSON.parse fetch "https://api.github.com/repos/BranchMetrics/ios-branch-deep-linking/releases"
|
400
|
-
current_release = releases.first
|
401
|
-
# Get the download URL for the framework.
|
402
|
-
framework_asset = current_release["assets"][0]
|
403
|
-
framework_url = framework_asset["browser_download_url"]
|
404
|
-
|
405
|
-
say "Downloading Branch.framework v. #{current_release['tag_name']} (#{framework_asset['size']} bytes zipped)"
|
406
|
-
|
407
|
-
Dir.mktmpdir do |download_folder|
|
408
|
-
zip_path = File.join download_folder, "Branch.framework.zip"
|
409
|
-
|
410
|
-
File.unlink zip_path if File.exist? zip_path
|
411
|
-
|
412
|
-
# Download the framework zip
|
413
|
-
download framework_url, zip_path
|
414
|
-
|
415
|
-
say "Unzipping Branch.framework"
|
416
|
-
|
417
|
-
# Unzip
|
418
|
-
Zip::File.open zip_path do |zip_file|
|
419
|
-
# Start with just the framework and add dSYM, etc., later
|
420
|
-
zip_file.glob "Carthage/Build/iOS/Branch.framework/**/*" do |entry|
|
421
|
-
filename = entry.name.sub %r{^Carthage/Build/iOS}, frameworks_group.real_path.to_s
|
422
|
-
ensure_directory File.dirname filename
|
423
|
-
entry.extract filename
|
424
|
-
end
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
# Now the current framework is in framework_path
|
429
|
-
|
430
|
-
say "Adding to #{@xcodeproj_path}"
|
431
|
-
|
432
|
-
# Add as a dependency in the Frameworks group
|
433
|
-
framework = frameworks_group.new_file "Branch.framework" # relative to frameworks_group.real_path
|
434
|
-
@target.frameworks_build_phase.add_file_reference framework, true
|
435
|
-
|
436
|
-
# Make sure this is in the FRAMEWORK_SEARCH_PATHS if we just added it.
|
437
|
-
if frameworks_group.files.count == 1
|
438
|
-
@target.build_configurations.each do |config|
|
439
|
-
paths = config.build_settings["FRAMEWORK_SEARCH_PATHS"] || []
|
440
|
-
next if paths.any? { |p| p == '$(SRCROOT)' || p == '$(SRCROOT)/**' }
|
441
|
-
paths << '$(SRCROOT)'
|
442
|
-
config.build_settings["FRAMEWORK_SEARCH_PATHS"] = paths
|
443
|
-
end
|
444
|
-
end
|
445
|
-
# If it already existed, it's almost certainly already in FRAMEWORK_SEARCH_PATHS.
|
446
|
-
|
447
|
-
@xcodeproj.save
|
346
|
+
@sdk_integration_mode = SDK_OPTIONS[selected]
|
448
347
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
def fetch(url)
|
456
|
-
response = Net::HTTP.get_response URI(url)
|
457
|
-
|
458
|
-
case response
|
459
|
-
when Net::HTTPSuccess
|
460
|
-
response.body
|
461
|
-
when Net::HTTPRedirection
|
462
|
-
fetch response['location']
|
463
|
-
else
|
464
|
-
raise "Error fetching #{url}: #{response.code} #{response.message}"
|
348
|
+
case @sdk_integration_mode
|
349
|
+
when :cocoapods
|
350
|
+
@podfile_path = File.expand_path "../Podfile", @xcodeproj_path
|
351
|
+
when :carthage
|
352
|
+
@cartfile_path = File.expand_path "../Cartfile", @xcodeproj_path
|
465
353
|
end
|
466
354
|
end
|
467
|
-
|
468
|
-
def download(url, dest)
|
469
|
-
uri = URI(url)
|
470
|
-
|
471
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
|
472
|
-
request = Net::HTTP::Get.new uri
|
473
|
-
|
474
|
-
http.request request do |response|
|
475
|
-
case response
|
476
|
-
when Net::HTTPSuccess
|
477
|
-
bytes_downloaded = 0
|
478
|
-
dots_reported = 0
|
479
|
-
# report a dot every 100 kB
|
480
|
-
per_dot = 102_400
|
481
|
-
|
482
|
-
File.open dest, 'w' do |io|
|
483
|
-
response.read_body do |chunk|
|
484
|
-
io.write chunk
|
485
|
-
|
486
|
-
# print progress
|
487
|
-
bytes_downloaded += chunk.length
|
488
|
-
while (bytes_downloaded - per_dot * dots_reported) >= per_dot
|
489
|
-
print "."
|
490
|
-
dots_reported += 1
|
491
|
-
end
|
492
|
-
STDOUT.flush
|
493
|
-
end
|
494
|
-
end
|
495
|
-
say "\n"
|
496
|
-
when Net::HTTPRedirection
|
497
|
-
download response['location'], dest
|
498
|
-
else
|
499
|
-
raise "Error downloading #{url}: #{response.code} #{response.message}"
|
500
|
-
end
|
501
|
-
end
|
502
|
-
end
|
503
|
-
end
|
504
|
-
|
505
|
-
def ensure_directory(path)
|
506
|
-
return if path == "/" || path == "."
|
507
|
-
parent = File.dirname path
|
508
|
-
ensure_directory parent
|
509
|
-
return if Dir.exist? path
|
510
|
-
Dir.mkdir path
|
511
|
-
end
|
512
|
-
|
513
|
-
SDK_OPTIONS =
|
514
|
-
{
|
515
|
-
"Set this project up to use CocoaPods and add the Branch SDK." => :cocoapods,
|
516
|
-
"Set this project up to use Carthage and add the Branch SDK." => :carthage,
|
517
|
-
"Add Branch.framework directly to the project's dependencies." => :direct,
|
518
|
-
"Skip adding the framework to the project." => :skip
|
519
|
-
}
|
520
355
|
end
|
521
356
|
end
|
522
357
|
end
|
523
|
-
# rubocop enable: Metrics/ClassLength
|
524
358
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
require "json"
|
2
2
|
require "net/http"
|
3
3
|
require "openssl"
|
4
|
+
require "pathname"
|
4
5
|
require "plist"
|
6
|
+
require "tmpdir"
|
7
|
+
require "zip"
|
5
8
|
|
6
9
|
module BranchIOCLI
|
7
10
|
module Helper
|
@@ -679,6 +682,227 @@ EOF
|
|
679
682
|
|
680
683
|
true
|
681
684
|
end
|
685
|
+
|
686
|
+
def add_cocoapods(options)
|
687
|
+
podfile_path = ConfigurationHelper.podfile_path
|
688
|
+
|
689
|
+
install_command = "pod install"
|
690
|
+
install_command += " --repo-update" if options.pod_repo_update
|
691
|
+
Dir.chdir(File.dirname(podfile_path)) do
|
692
|
+
system "pod init"
|
693
|
+
apply_patch(
|
694
|
+
files: podfile_path,
|
695
|
+
regexp: /^(\s*)# Pods for #{ConfigurationHelper.target.name}$/,
|
696
|
+
mode: :append,
|
697
|
+
text: "\n\\1pod \"Branch\"",
|
698
|
+
global: false
|
699
|
+
)
|
700
|
+
system install_command
|
701
|
+
end
|
702
|
+
|
703
|
+
add_change podfile_path
|
704
|
+
add_change "#{podfile_path}.lock"
|
705
|
+
|
706
|
+
# For now, add Pods folder to SCM.
|
707
|
+
pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from Pathname.pwd
|
708
|
+
workspace_path = Pathname.new(File.expand_path(ConfigurationHelper.xcodeproj_path.sub(/.xcodeproj$/, ".xcworkspace"))).relative_path_from Pathname.pwd
|
709
|
+
podfile_pathname = Pathname.new(podfile_path).relative_path_from Pathname.pwd
|
710
|
+
add_change pods_folder_path
|
711
|
+
add_change workspace_path
|
712
|
+
`git add #{podfile_pathname} #{podfile_pathname}.lock #{pods_folder_path} #{workspace_path}` if options.commit
|
713
|
+
end
|
714
|
+
|
715
|
+
def add_carthage(options)
|
716
|
+
# TODO: Collapse this and Command::update_cartfile
|
717
|
+
|
718
|
+
# 1. Generate Cartfile
|
719
|
+
cartfile_path = ConfigurationHelper.cartfile_path
|
720
|
+
File.open(cartfile_path, "w") do |file|
|
721
|
+
file.write <<EOF
|
722
|
+
github "BranchMetrics/ios-branch-deep-linking"
|
723
|
+
EOF
|
724
|
+
end
|
725
|
+
|
726
|
+
# 2. carthage update
|
727
|
+
Dir.chdir(File.dirname(cartfile_path)) do
|
728
|
+
system "carthage update --platform ios"
|
729
|
+
end
|
730
|
+
|
731
|
+
# 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
|
732
|
+
add_change cartfile_path
|
733
|
+
add_change "#{cartfile_path}.resolved"
|
734
|
+
add_change ConfigurationHelper.xcodeproj_path
|
735
|
+
|
736
|
+
# 4. Add to target dependencies
|
737
|
+
frameworks_group = ConfigurationHelper.xcodeproj.frameworks_group
|
738
|
+
branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
|
739
|
+
target = ConfigurationHelper.target
|
740
|
+
target.frameworks_build_phase.add_file_reference branch_framework
|
741
|
+
|
742
|
+
# 5. Create a copy-frameworks build phase
|
743
|
+
carthage_build_phase = target.new_shell_script_build_phase "carthage copy-frameworks"
|
744
|
+
carthage_build_phase.shell_script = "/usr/local/bin/carthage copy-frameworks"
|
745
|
+
|
746
|
+
carthage_build_phase.input_paths << "$(SRCROOT)/Carthage/Build/iOS/Branch.framework"
|
747
|
+
carthage_build_phase.output_paths << "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Branch.framework"
|
748
|
+
|
749
|
+
ConfigurationHelper.xcodeproj.save
|
750
|
+
|
751
|
+
# For now, add Carthage folder to SCM
|
752
|
+
|
753
|
+
# 6. Add the Carthage folder to the commit (in case :commit param specified)
|
754
|
+
carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from(Pathname.pwd)
|
755
|
+
cartfile_pathname = Pathname.new(cartfile_path).relative_path_from Pathname.pwd
|
756
|
+
add_change carthage_folder_path
|
757
|
+
`git add #{cartfile_pathname} #{cartfile_pathname}.resolved #{carthage_folder_path}` if options.commit
|
758
|
+
end
|
759
|
+
|
760
|
+
def add_direct(options)
|
761
|
+
# Put the framework in the path for any existing Frameworks group in the project.
|
762
|
+
frameworks_group = ConfigurationHelper.xcodeproj.frameworks_group
|
763
|
+
framework_path = File.join frameworks_group.real_path, "Branch.framework"
|
764
|
+
raise "#{framework_path} exists." if File.exist? framework_path
|
765
|
+
|
766
|
+
say "Finding current framework release"
|
767
|
+
|
768
|
+
# Find the latest release from GitHub.
|
769
|
+
releases = JSON.parse fetch "https://api.github.com/repos/BranchMetrics/ios-branch-deep-linking/releases"
|
770
|
+
current_release = releases.first
|
771
|
+
# Get the download URL for the framework.
|
772
|
+
framework_asset = current_release["assets"][0]
|
773
|
+
framework_url = framework_asset["browser_download_url"]
|
774
|
+
|
775
|
+
say "Downloading Branch.framework v. #{current_release['tag_name']} (#{framework_asset['size']} bytes zipped)"
|
776
|
+
|
777
|
+
Dir.mktmpdir do |download_folder|
|
778
|
+
zip_path = File.join download_folder, "Branch.framework.zip"
|
779
|
+
|
780
|
+
File.unlink zip_path if File.exist? zip_path
|
781
|
+
|
782
|
+
# Download the framework zip
|
783
|
+
download framework_url, zip_path
|
784
|
+
|
785
|
+
say "Unzipping Branch.framework"
|
786
|
+
|
787
|
+
# Unzip
|
788
|
+
Zip::File.open zip_path do |zip_file|
|
789
|
+
# Start with just the framework and add dSYM, etc., later
|
790
|
+
zip_file.glob "Carthage/Build/iOS/Branch.framework/**/*" do |entry|
|
791
|
+
filename = entry.name.sub %r{^Carthage/Build/iOS}, frameworks_group.real_path.to_s
|
792
|
+
ensure_directory File.dirname filename
|
793
|
+
entry.extract filename
|
794
|
+
end
|
795
|
+
end
|
796
|
+
end
|
797
|
+
|
798
|
+
# Now the current framework is in framework_path
|
799
|
+
|
800
|
+
say "Adding to #{@xcodeproj_path}"
|
801
|
+
|
802
|
+
# Add as a dependency in the Frameworks group
|
803
|
+
framework = frameworks_group.new_file "Branch.framework" # relative to frameworks_group.real_path
|
804
|
+
ConfigurationHelper.target.frameworks_build_phase.add_file_reference framework, true
|
805
|
+
|
806
|
+
# Make sure this is in the FRAMEWORK_SEARCH_PATHS if we just added it.
|
807
|
+
if frameworks_group.files.count == 1
|
808
|
+
ConfigurationHelper.target.build_configurations.each do |config|
|
809
|
+
paths = config.build_settings["FRAMEWORK_SEARCH_PATHS"] || []
|
810
|
+
next if paths.any? { |p| p == '$(SRCROOT)' || p == '$(SRCROOT)/**' }
|
811
|
+
paths << '$(SRCROOT)'
|
812
|
+
config.build_settings["FRAMEWORK_SEARCH_PATHS"] = paths
|
813
|
+
end
|
814
|
+
end
|
815
|
+
# If it already existed, it's almost certainly already in FRAMEWORK_SEARCH_PATHS.
|
816
|
+
|
817
|
+
ConfigurationHelper.xcodeproj.save
|
818
|
+
|
819
|
+
add_change ConfigurationHelper.xcodeproj_path
|
820
|
+
add_change framework_path
|
821
|
+
`git add #{framework_path}` if options.commit
|
822
|
+
|
823
|
+
say "Done. ✅"
|
824
|
+
end
|
825
|
+
|
826
|
+
def update_podfile(options)
|
827
|
+
podfile_path = ConfigurationHelper.podfile_path
|
828
|
+
return false if podfile_path.nil?
|
829
|
+
|
830
|
+
# 1. Patch Podfile. Return if no change (Branch pod already present).
|
831
|
+
return false unless patch_podfile podfile_path
|
832
|
+
|
833
|
+
# 2. pod install
|
834
|
+
# command = "PATH='#{ENV['PATH']}' pod install"
|
835
|
+
command = 'pod install'
|
836
|
+
command += ' --repo-update' if options.pod_repo_update
|
837
|
+
|
838
|
+
Dir.chdir(File.dirname(podfile_path)) do
|
839
|
+
system command
|
840
|
+
end
|
841
|
+
|
842
|
+
# 3. Add Podfile and Podfile.lock to commit (in case :commit param specified)
|
843
|
+
add_change podfile_path
|
844
|
+
add_change "#{podfile_path}.lock"
|
845
|
+
|
846
|
+
# 4. Check if Pods folder is under SCM
|
847
|
+
pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from Pathname.pwd
|
848
|
+
`git ls-files #{pods_folder_path} --error-unmatch > /dev/null 2>&1`
|
849
|
+
return true unless $?.exitstatus == 0
|
850
|
+
|
851
|
+
# 5. If so, add the Pods folder to the commit (in case :commit param specified)
|
852
|
+
add_change pods_folder_path
|
853
|
+
`git add #{pods_folder_path}` if options.commit
|
854
|
+
|
855
|
+
true
|
856
|
+
end
|
857
|
+
|
858
|
+
def update_cartfile(options, project)
|
859
|
+
cartfile_path = ConfigurationHelper.cartfile_path
|
860
|
+
return false if cartfile_path.nil?
|
861
|
+
|
862
|
+
# 1. Patch Cartfile. Return if no change (Branch already present).
|
863
|
+
return false unless patch_cartfile cartfile_path
|
864
|
+
|
865
|
+
# 2. carthage update
|
866
|
+
Dir.chdir(File.dirname(cartfile_path)) do
|
867
|
+
system "carthage update --platform ios"
|
868
|
+
end
|
869
|
+
|
870
|
+
# 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
|
871
|
+
add_change cartfile_path
|
872
|
+
add_change "#{cartfile_path}.resolved"
|
873
|
+
add_change ConfigurationHelper.xcodeproj_path
|
874
|
+
|
875
|
+
# 4. Add to target dependencies
|
876
|
+
frameworks_group = project.frameworks_group
|
877
|
+
branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
|
878
|
+
target = ConfigurationHelper.target
|
879
|
+
target.frameworks_build_phase.add_file_reference branch_framework
|
880
|
+
|
881
|
+
# 5. Add to copy-frameworks build phase
|
882
|
+
carthage_build_phase = target.build_phases.find do |phase|
|
883
|
+
phase.respond_to?(:shell_script) && phase.shell_script =~ /carthage\s+copy-frameworks/
|
884
|
+
end
|
885
|
+
|
886
|
+
if carthage_build_phase
|
887
|
+
carthage_build_phase.input_paths << "$(SRCROOT)/Carthage/Build/iOS/Branch.framework"
|
888
|
+
carthage_build_phase.output_paths << "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Branch.framework"
|
889
|
+
end
|
890
|
+
|
891
|
+
# 6. Check if Carthage folder is under SCM
|
892
|
+
carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from Pathname.pwd
|
893
|
+
`git ls-files #{carthage_folder_path} --error-unmatch > /dev/null 2>&1`
|
894
|
+
return true unless $?.exitstatus == 0
|
895
|
+
|
896
|
+
# 7. If so, add the Carthage folder to the commit (in case :commit param specified)
|
897
|
+
add_change carthage_folder_path
|
898
|
+
`git add #{carthage_folder_path}` if options.commit
|
899
|
+
|
900
|
+
true
|
901
|
+
end
|
902
|
+
|
903
|
+
def patch_source(xcodeproj)
|
904
|
+
patch_app_delegate_swift(xcodeproj) || patch_app_delegate_objc(xcodeproj)
|
905
|
+
end
|
682
906
|
end
|
683
907
|
end
|
684
908
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: branch_io_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Branch
|
@@ -222,7 +222,10 @@ files:
|
|
222
222
|
- bin/branch_io
|
223
223
|
- lib/branch_io_cli.rb
|
224
224
|
- lib/branch_io_cli/cli.rb
|
225
|
-
- lib/branch_io_cli/
|
225
|
+
- lib/branch_io_cli/commands.rb
|
226
|
+
- lib/branch_io_cli/commands/command.rb
|
227
|
+
- lib/branch_io_cli/commands/setup_command.rb
|
228
|
+
- lib/branch_io_cli/commands/validate_command.rb
|
226
229
|
- lib/branch_io_cli/helper.rb
|
227
230
|
- lib/branch_io_cli/helper/android_helper.rb
|
228
231
|
- lib/branch_io_cli/helper/branch_helper.rb
|
@@ -1,177 +0,0 @@
|
|
1
|
-
require "pathname"
|
2
|
-
require "xcodeproj"
|
3
|
-
|
4
|
-
module BranchIOCLI
|
5
|
-
class Command
|
6
|
-
class << self
|
7
|
-
def setup(options)
|
8
|
-
config_helper.validate_setup_options options
|
9
|
-
|
10
|
-
@keys = config_helper.keys
|
11
|
-
@domains = config_helper.all_domains
|
12
|
-
@xcodeproj_path = config_helper.xcodeproj_path
|
13
|
-
xcodeproj = config_helper.xcodeproj
|
14
|
-
|
15
|
-
update_podfile(options) || update_cartfile(options, xcodeproj)
|
16
|
-
|
17
|
-
target_name = options.target # may be nil
|
18
|
-
is_app_target = !Helper::ConfigurationHelper.target.extension_target_type?
|
19
|
-
|
20
|
-
if is_app_target && !options.no_validate &&
|
21
|
-
!helper.validate_team_and_bundle_ids_from_aasa_files(xcodeproj, target_name, @domains)
|
22
|
-
say "Universal Link configuration failed validation."
|
23
|
-
helper.errors.each { |error| say " #{error}" }
|
24
|
-
return unless options.force
|
25
|
-
elsif is_app_target && !options.no_validate
|
26
|
-
say "Universal Link configuration passed validation. ✅"
|
27
|
-
end
|
28
|
-
|
29
|
-
# the following calls can all raise IOError
|
30
|
-
helper.add_keys_to_info_plist xcodeproj, target_name, @keys
|
31
|
-
helper.add_branch_universal_link_domains_to_info_plist xcodeproj, target_name, @domains if is_app_target
|
32
|
-
helper.ensure_uri_scheme_in_info_plist if is_app_target # does nothing if already present
|
33
|
-
|
34
|
-
new_path = helper.add_universal_links_to_project xcodeproj, target_name, @domains, false if is_app_target
|
35
|
-
`git add #{new_path}` if options.commit && new_path
|
36
|
-
|
37
|
-
helper.add_system_frameworks xcodeproj, target_name, options.frameworks unless options.frameworks.nil? || options.frameworks.empty?
|
38
|
-
|
39
|
-
xcodeproj.save
|
40
|
-
|
41
|
-
patch_source xcodeproj unless options.no_patch_source
|
42
|
-
|
43
|
-
return unless options.commit
|
44
|
-
|
45
|
-
changes = helper.changes.to_a.map { |c| Pathname.new(File.expand_path(c)).relative_path_from(Pathname.pwd).to_s }
|
46
|
-
|
47
|
-
`git commit #{changes.join(" ")} -m '[branch_io_cli] Branch SDK integration'`
|
48
|
-
end
|
49
|
-
|
50
|
-
def validate(options)
|
51
|
-
config_helper.validate_validation_options options
|
52
|
-
|
53
|
-
# raises
|
54
|
-
xcodeproj = config_helper.xcodeproj
|
55
|
-
|
56
|
-
valid = true
|
57
|
-
|
58
|
-
unless options.domains.nil? || options.domains.empty?
|
59
|
-
domains_valid = helper.validate_project_domains(
|
60
|
-
options.domains,
|
61
|
-
xcodeproj,
|
62
|
-
options.target
|
63
|
-
)
|
64
|
-
|
65
|
-
if domains_valid
|
66
|
-
say "Project domains match :domains parameter: ✅"
|
67
|
-
else
|
68
|
-
say "Project domains do not match specified :domains"
|
69
|
-
helper.errors.each { |error| say " #{error}" }
|
70
|
-
end
|
71
|
-
|
72
|
-
valid &&= domains_valid
|
73
|
-
end
|
74
|
-
|
75
|
-
configuration_valid = helper.validate_team_and_bundle_ids_from_aasa_files xcodeproj, options.target
|
76
|
-
unless configuration_valid
|
77
|
-
say "Universal Link configuration failed validation."
|
78
|
-
helper.errors.each { |error| say " #{error}" }
|
79
|
-
end
|
80
|
-
|
81
|
-
valid &&= configuration_valid
|
82
|
-
|
83
|
-
say "Universal Link configuration passed validation. ✅" if valid
|
84
|
-
|
85
|
-
valid
|
86
|
-
end
|
87
|
-
|
88
|
-
def helper
|
89
|
-
Helper::BranchHelper
|
90
|
-
end
|
91
|
-
|
92
|
-
def config_helper
|
93
|
-
Helper::ConfigurationHelper
|
94
|
-
end
|
95
|
-
|
96
|
-
def update_podfile(options)
|
97
|
-
podfile_path = config_helper.podfile_path
|
98
|
-
return false if podfile_path.nil?
|
99
|
-
|
100
|
-
# 1. Patch Podfile. Return if no change (Branch pod already present).
|
101
|
-
return false unless helper.patch_podfile podfile_path
|
102
|
-
|
103
|
-
# 2. pod install
|
104
|
-
# command = "PATH='#{ENV['PATH']}' pod install"
|
105
|
-
command = 'pod install'
|
106
|
-
command += ' --repo-update' unless options.no_pod_repo_update
|
107
|
-
|
108
|
-
Dir.chdir(File.dirname(podfile_path)) do
|
109
|
-
system command
|
110
|
-
end
|
111
|
-
|
112
|
-
# 3. Add Podfile and Podfile.lock to commit (in case :commit param specified)
|
113
|
-
helper.add_change podfile_path
|
114
|
-
helper.add_change "#{podfile_path}.lock"
|
115
|
-
|
116
|
-
# 4. Check if Pods folder is under SCM
|
117
|
-
pods_folder_path = Pathname.new(File.expand_path("../Pods", podfile_path)).relative_path_from Pathname.pwd
|
118
|
-
`git ls-files #{pods_folder_path} --error-unmatch > /dev/null 2>&1`
|
119
|
-
return true unless $?.exitstatus == 0
|
120
|
-
|
121
|
-
# 5. If so, add the Pods folder to the commit (in case :commit param specified)
|
122
|
-
helper.add_change pods_folder_path
|
123
|
-
`git add #{pods_folder_path}` if options.commit
|
124
|
-
|
125
|
-
true
|
126
|
-
end
|
127
|
-
|
128
|
-
def update_cartfile(options, project)
|
129
|
-
cartfile_path = config_helper.cartfile_path
|
130
|
-
return false if cartfile_path.nil?
|
131
|
-
|
132
|
-
# 1. Patch Cartfile. Return if no change (Branch already present).
|
133
|
-
return false unless helper.patch_cartfile cartfile_path
|
134
|
-
|
135
|
-
# 2. carthage update
|
136
|
-
Dir.chdir(File.dirname(cartfile_path)) do
|
137
|
-
system "carthage update --platform ios"
|
138
|
-
end
|
139
|
-
|
140
|
-
# 3. Add Cartfile and Cartfile.resolved to commit (in case :commit param specified)
|
141
|
-
helper.add_change cartfile_path
|
142
|
-
helper.add_change "#{cartfile_path}.resolved"
|
143
|
-
|
144
|
-
# 4. Add to target dependencies
|
145
|
-
frameworks_group = project.frameworks_group
|
146
|
-
branch_framework = frameworks_group.new_file "Carthage/Build/iOS/Branch.framework"
|
147
|
-
target = Helper::ConfigurationHelper.target
|
148
|
-
target.frameworks_build_phase.add_file_reference branch_framework
|
149
|
-
|
150
|
-
# 5. Add to copy-frameworks build phase
|
151
|
-
carthage_build_phase = target.build_phases.find do |phase|
|
152
|
-
phase.respond_to?(:shell_script) && phase.shell_script =~ /carthage\s+copy-frameworks/
|
153
|
-
end
|
154
|
-
|
155
|
-
if carthage_build_phase
|
156
|
-
carthage_build_phase.input_paths << "$(SRCROOT)/Carthage/Build/iOS/Branch.framework"
|
157
|
-
carthage_build_phase.output_paths << "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Branch.framework"
|
158
|
-
end
|
159
|
-
|
160
|
-
# 6. Check if Carthage folder is under SCM
|
161
|
-
carthage_folder_path = Pathname.new(File.expand_path("../Carthage", cartfile_path)).relative_path_from Pathname.pwd
|
162
|
-
`git ls-files #{carthage_folder_path} --error-unmatch > /dev/null 2>&1`
|
163
|
-
return true unless $?.exitstatus == 0
|
164
|
-
|
165
|
-
# 7. If so, add the Carthage folder to the commit (in case :commit param specified)
|
166
|
-
helper.add_change carthage_folder_path
|
167
|
-
`git add #{carthage_folder_path}` if options.commit
|
168
|
-
|
169
|
-
true
|
170
|
-
end
|
171
|
-
|
172
|
-
def patch_source(xcodeproj)
|
173
|
-
helper.patch_app_delegate_swift(xcodeproj) || helper.patch_app_delegate_objc(xcodeproj)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|