carthage_remote_cache 0.0.8 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +38 -0
- data/.ruby-version +2 -0
- data/.travis.yml +1 -1
- data/Dockerfile +7 -0
- data/Gemfile.lock +41 -41
- data/Guardfile +2 -2
- data/README.md +38 -5
- data/Rakefile +2 -2
- data/bin/carthagerc +18 -8
- data/carthage_remote_cache.gemspec +4 -4
- data/dev/start_server +1 -1
- data/lib/api.rb +10 -10
- data/lib/carthage_archive.rb +13 -51
- data/lib/carthage_remote_cache.rb +18 -14
- data/lib/commands/download_command.rb +10 -9
- data/lib/commands/server_command.rb +2 -2
- data/lib/commands/upload_command.rb +6 -6
- data/lib/commands/verify_command.rb +1 -1
- data/lib/commands.rb +5 -5
- data/lib/configuration.rb +1 -1
- data/lib/constants.rb +9 -7
- data/lib/crc32.rb +3 -3
- data/lib/errors.rb +12 -1
- data/lib/framework.rb +19 -0
- data/lib/framework_carthage_archive.rb +57 -0
- data/lib/log.rb +1 -1
- data/lib/networking.rb +81 -41
- data/lib/server/config.ru +3 -3
- data/lib/server/server_app.rb +69 -12
- data/lib/shell_wrapper.rb +1 -1
- data/lib/table.rb +4 -4
- data/lib/utils.rb +26 -12
- data/lib/version.rb +1 -1
- data/lib/version_file.rb +66 -20
- data/lib/xcframework.rb +29 -0
- data/lib/xcframework_carthage_archive.rb +17 -0
- metadata +36 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3437fb2e13b47b5d1a5479e5d028b0e96447cc232bfa3a9b08e38e014a24bf2a
|
4
|
+
data.tar.gz: a84e8493195b8d80622ac63ec76eac05754f5917d12e634c432dcee1a5ff5558
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dae27cbc7028ba7ea772cabf04ff1dd750b2950e3c7e30a11e06c86ed202cfcd8b800263a2214d0475d80572007af5553c79844661d4f537fe6413004e9eed2
|
7
|
+
data.tar.gz: f04784fcf41b486a53d1706c0371ea10d3b27fe575ca9687204f9c000713fd58d199eaede9d7ca770ef7681432479b57346bf832d1b482cbb90b3dfe63815faf
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ "master" ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ "master" ]
|
15
|
+
|
16
|
+
permissions:
|
17
|
+
contents: read
|
18
|
+
|
19
|
+
jobs:
|
20
|
+
test:
|
21
|
+
|
22
|
+
runs-on: ubuntu-latest
|
23
|
+
strategy:
|
24
|
+
matrix:
|
25
|
+
ruby-version: ['2.7.2']
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v3
|
29
|
+
- name: Set up Ruby
|
30
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
31
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
32
|
+
# uses: ruby/setup-ruby@v1
|
33
|
+
uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
|
34
|
+
with:
|
35
|
+
ruby-version: ${{ matrix.ruby-version }}
|
36
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
37
|
+
- name: Run tests
|
38
|
+
run: bundle exec rake test
|
data/.ruby-version
ADDED
data/.travis.yml
CHANGED
data/Dockerfile
ADDED
data/Gemfile.lock
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
carthage_remote_cache (0.0.
|
4
|
+
carthage_remote_cache (0.0.11)
|
5
5
|
concurrent-ruby (~> 1.0.5)
|
6
|
-
rack (
|
6
|
+
rack (>= 2.0.6, < 2.3.0)
|
7
7
|
rest-client (~> 2.0.2)
|
8
|
-
sinatra (
|
8
|
+
sinatra (>= 2.0.4, < 2.3.0)
|
9
9
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
coderay (1.1.
|
13
|
+
coderay (1.1.3)
|
14
14
|
concurrent-ruby (1.0.5)
|
15
|
-
domain_name (0.5.
|
15
|
+
domain_name (0.5.20190701)
|
16
16
|
unf (>= 0.0.5, < 1.0.0)
|
17
|
-
ffi (1.
|
18
|
-
formatador (
|
17
|
+
ffi (1.15.5)
|
18
|
+
formatador (1.1.0)
|
19
19
|
guard (2.14.2)
|
20
20
|
formatador (>= 0.2.4)
|
21
21
|
listen (>= 2.7, < 4.0)
|
@@ -29,72 +29,72 @@ GEM
|
|
29
29
|
guard-test (2.0.8)
|
30
30
|
guard-compat (~> 1.2)
|
31
31
|
test-unit (~> 3.0)
|
32
|
-
http-cookie (1.0.
|
32
|
+
http-cookie (1.0.5)
|
33
33
|
domain_name (~> 0.5)
|
34
|
-
listen (3.1
|
35
|
-
rb-fsevent (~> 0.
|
36
|
-
rb-inotify (~> 0.9, >= 0.9.
|
37
|
-
|
38
|
-
lumberjack (1.0.12)
|
34
|
+
listen (3.7.1)
|
35
|
+
rb-fsevent (~> 0.10, >= 0.10.3)
|
36
|
+
rb-inotify (~> 0.9, >= 0.9.10)
|
37
|
+
lumberjack (1.2.8)
|
39
38
|
metaclass (0.0.4)
|
40
|
-
method_source (0.
|
41
|
-
mime-types (3.1)
|
39
|
+
method_source (1.0.0)
|
40
|
+
mime-types (3.4.1)
|
42
41
|
mime-types-data (~> 3.2015)
|
43
|
-
mime-types-data (3.
|
42
|
+
mime-types-data (3.2022.0105)
|
44
43
|
mocha (1.3.0)
|
45
44
|
metaclass (~> 0.0.1)
|
46
|
-
mustermann (1.
|
45
|
+
mustermann (1.1.1)
|
46
|
+
ruby2_keywords (~> 0.0.1)
|
47
47
|
nenv (0.3.0)
|
48
48
|
netrc (0.11.0)
|
49
|
-
notiffany (0.1.
|
49
|
+
notiffany (0.1.3)
|
50
50
|
nenv (~> 0.1)
|
51
51
|
shellany (~> 0.0)
|
52
|
-
power_assert (
|
53
|
-
pry (0.
|
54
|
-
coderay (~> 1.1
|
55
|
-
method_source (~>
|
56
|
-
rack (2.
|
57
|
-
rack-protection (2.0
|
52
|
+
power_assert (2.0.1)
|
53
|
+
pry (0.14.1)
|
54
|
+
coderay (~> 1.1)
|
55
|
+
method_source (~> 1.0)
|
56
|
+
rack (2.2.4)
|
57
|
+
rack-protection (2.2.0)
|
58
58
|
rack
|
59
|
-
rake (
|
60
|
-
rb-fsevent (0.
|
61
|
-
rb-inotify (0.
|
62
|
-
ffi (
|
63
|
-
rerun (0.13.
|
59
|
+
rake (13.0.6)
|
60
|
+
rb-fsevent (0.11.1)
|
61
|
+
rb-inotify (0.10.1)
|
62
|
+
ffi (~> 1.0)
|
63
|
+
rerun (0.13.1)
|
64
64
|
listen (~> 3.0)
|
65
65
|
rest-client (2.0.2)
|
66
66
|
http-cookie (>= 1.0.2, < 2.0)
|
67
67
|
mime-types (>= 1.16, < 4.0)
|
68
68
|
netrc (~> 0.8)
|
69
|
-
|
70
|
-
rufo (0.
|
69
|
+
ruby2_keywords (0.0.5)
|
70
|
+
rufo (0.13.0)
|
71
71
|
shellany (0.0.1)
|
72
|
-
sinatra (2.0
|
72
|
+
sinatra (2.2.0)
|
73
73
|
mustermann (~> 1.0)
|
74
|
-
rack (~> 2.
|
75
|
-
rack-protection (= 2.0
|
74
|
+
rack (~> 2.2)
|
75
|
+
rack-protection (= 2.2.0)
|
76
76
|
tilt (~> 2.0)
|
77
|
-
test-unit (3.2.
|
77
|
+
test-unit (3.2.9)
|
78
78
|
power_assert
|
79
|
-
thor (
|
80
|
-
tilt (2.0.
|
79
|
+
thor (1.2.1)
|
80
|
+
tilt (2.0.10)
|
81
81
|
unf (0.1.4)
|
82
82
|
unf_ext
|
83
|
-
unf_ext (0.0.
|
83
|
+
unf_ext (0.0.8.2)
|
84
84
|
|
85
85
|
PLATFORMS
|
86
86
|
ruby
|
87
87
|
|
88
88
|
DEPENDENCIES
|
89
|
-
bundler
|
89
|
+
bundler
|
90
90
|
carthage_remote_cache!
|
91
91
|
guard (~> 2.14.2)
|
92
92
|
guard-test (~> 2.0.8)
|
93
93
|
mocha (~> 1.3.0)
|
94
|
-
rake (~>
|
94
|
+
rake (~> 13.0)
|
95
95
|
rerun
|
96
96
|
rufo
|
97
97
|
test-unit (~> 3.2.7)
|
98
98
|
|
99
99
|
BUNDLED WITH
|
100
|
-
|
100
|
+
2.2.11
|
data/Guardfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
guard :test do
|
2
2
|
watch(%r{^test/.+_tests\.rb$})
|
3
|
-
watch(
|
4
|
-
watch(
|
3
|
+
watch("test/test_helper.rb") { "test" }
|
4
|
+
watch("test/fixtures.rb") { "test" }
|
5
5
|
watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_tests.rb" }
|
6
6
|
end
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# CarthageRemoteCache
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![Test Status](https://github.com/kayak/carthage_remote_cache/actions/workflows/ruby.yml/badge.svg)](https://github.com/kayak/carthage_remote_cache/actions/workflows/ruby.yml)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/carthage_remote_cache.svg)](https://badge.fury.io/rb/carthage_remote_cache)
|
5
5
|
|
6
6
|
Centralized cache to serve Carthage frameworks. Useful for distributed CI setup with several build machines. It's aware of your `xcodebuild` and `swift` versions and builds on top of Carthage's `.xyz.version` file mechanism.
|
@@ -68,22 +68,29 @@ It is recommended to always perform the upload workflow after upgrading Xcode an
|
|
68
68
|
|
69
69
|
### Download Workflow
|
70
70
|
|
71
|
-
Once cache server has been populated with framework binaries, it's time to fetch frameworks from a different machine. Make sure to pull in `Cartrcfile` from
|
71
|
+
Once the cache server has been populated with framework binaries, it's time to fetch frameworks from a different machine. Make sure to pull in `Cartrcfile` from the repository before executing:
|
72
72
|
|
73
73
|
$ carthagerc download
|
74
74
|
|
75
|
-
You should expect to see following output on a machine with empty `Carthage` folder:
|
75
|
+
You should expect to see the following output on a machine with empty `Carthage` folder:
|
76
76
|
|
77
77
|
Downloaded and extracted 53 archives (97.2 MB), skipped 0 archives.
|
78
78
|
|
79
79
|
Your project should be ready for building.
|
80
80
|
|
81
|
-
####
|
81
|
+
#### Overwrite Local Carthage Folder
|
82
82
|
|
83
83
|
In case you happen to change a file in `Carthage/Build` by accident, it's possible to force download all frameworks again with:
|
84
84
|
|
85
85
|
$ carthagerc download --force
|
86
86
|
|
87
|
+
#### Download Only Some Platforms
|
88
|
+
|
89
|
+
The example above downloaded all frameworks for all platforms (iOS, macOS, tvOS, watchOS). If large dependencies or network speed are an issue, you can download only a subset of the platforms by using the `--platform` argument:
|
90
|
+
|
91
|
+
$ carthagerc download --platform iOS,macOS,tvOS,watchOS
|
92
|
+
|
93
|
+
Please note, that invoking the `download` command multiple times with different platform arguments is not supported. The `.version` file will "forget" that `carthagerc` already downloaded the platform specified before the last download. If you need multiple platforms, specify them in a single `download` command once, delimited with a comma.
|
87
94
|
|
88
95
|
### Config
|
89
96
|
|
@@ -205,6 +212,30 @@ If you want to stop the agent, run:
|
|
205
212
|
|
206
213
|
Check out official documentation on [Launch Agents](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html) for more info.
|
207
214
|
|
215
|
+
#### Docker
|
216
|
+
|
217
|
+
To build an image based on the latest released gem, run
|
218
|
+
|
219
|
+
$ docker build -t carthagerc .
|
220
|
+
|
221
|
+
Afterwards you can run the image in a container using
|
222
|
+
|
223
|
+
$ docker run -d --publish 9292:9292 --name carthagerc carthagerc:latest
|
224
|
+
|
225
|
+
The server will now be available on port 9292 on `localhost`. Note that the command above will cause any data added to `~/.carthagerc_server` to be written into the container layer. While this works, it's generally discouraged due to decreased performance and portability. To avoid this, you can use a volume.
|
226
|
+
|
227
|
+
$ docker run -d --publish 9292:9292 --mount "source=carthagerc,target=/root/.carthagerc_server" --name carthagerc carthagerc:latest
|
228
|
+
|
229
|
+
We also recommend adding the `--log-opt` option to limit the size of logs, e.g. `--log-opt max-size=50m`.
|
230
|
+
|
231
|
+
To inspect the logs after running, use
|
232
|
+
|
233
|
+
$ docker logs carthagerc
|
234
|
+
|
235
|
+
To stop the container, run
|
236
|
+
|
237
|
+
$ docker container stop carthagerc
|
238
|
+
|
208
239
|
### Version
|
209
240
|
|
210
241
|
$ carthagerc version
|
@@ -221,7 +252,7 @@ Documentation is also available when running `carthagerc` or `carthagerc --help`
|
|
221
252
|
config
|
222
253
|
print environment information and Cartrcfile configuration
|
223
254
|
|
224
|
-
download [-f|--force] [-v|--verbose]
|
255
|
+
download [-f|--force] [-v|--verbose] [-mPLATFORM|--platform=PLATFORM]
|
225
256
|
fetch missing frameworks into Carthage/Build
|
226
257
|
|
227
258
|
init
|
@@ -242,6 +273,8 @@ Documentation is also available when running `carthagerc` or `carthagerc --help`
|
|
242
273
|
OPTIONS
|
243
274
|
-f, --force Force upload/download of framework archives even if local and server .version files match
|
244
275
|
-h, --help Show help
|
276
|
+
-m, --platform=PLATFORM Comma delimited list of platforms which should be downloaded from the server; e.g. `--platform iOS,macOS`; Supported values: iOS, macOS, tvOS, watchOS
|
277
|
+
-n, --no-retry Don't retry download or upload on network failures
|
245
278
|
-p, --port=PORT Server application port used when starting server, default port is 9292
|
246
279
|
-v, --verbose Show extra runtime information
|
247
280
|
|
data/Rakefile
CHANGED
@@ -5,10 +5,10 @@ task :default => :spec
|
|
5
5
|
|
6
6
|
Rake::TestTask.new do |t|
|
7
7
|
t.libs << "test"
|
8
|
-
t.test_files = FileList[
|
8
|
+
t.test_files = FileList["test/*_tests.rb"]
|
9
9
|
t.verbose = true
|
10
10
|
end
|
11
11
|
|
12
12
|
task :format do
|
13
|
-
system(
|
13
|
+
system("bundle exec rufo bin/carthagerc lib test Gemfile Guardfile Rakefile carthage_remote_cache.gemspec")
|
14
14
|
end
|
data/bin/carthagerc
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.push File.expand_path("../../lib", __FILE__)
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
5
|
+
require "optparse"
|
6
|
+
require "carthage_remote_cache"
|
7
|
+
require "commands"
|
8
8
|
|
9
|
-
ARGV <<
|
9
|
+
ARGV << "-h" if ARGV.empty?
|
10
|
+
command = ARGV[0]
|
10
11
|
options = {
|
11
12
|
:force => false,
|
13
|
+
:is_retry_enabled => true,
|
12
14
|
:server_port => SERVER_DEFAULT_PORT,
|
13
15
|
:verbose => false,
|
14
16
|
}
|
@@ -30,7 +32,7 @@ opt_parser = OptionParser.new do |opt|
|
|
30
32
|
opt.separator " config"
|
31
33
|
opt.separator " print environment information and #{CARTRCFILE} configuration"
|
32
34
|
opt.separator ""
|
33
|
-
opt.separator " download [-f|--force] [-v|--verbose]"
|
35
|
+
opt.separator " download [-f|--force] [-v|--verbose] [-mPLATFORM|--platform=PLATFORM]"
|
34
36
|
opt.separator " fetch missing frameworks into Carthage/Build"
|
35
37
|
opt.separator ""
|
36
38
|
opt.separator " init"
|
@@ -59,6 +61,15 @@ opt_parser = OptionParser.new do |opt|
|
|
59
61
|
exit
|
60
62
|
end
|
61
63
|
|
64
|
+
opt.on("-m", "--platform=PLATFORM", "Comma delimited list of platforms which should be downloaded from the server; e.g. `--platform iOS,macOS`; Supported values: #{PLATFORMS.map(&:to_s).join(", ")}") do |platform|
|
65
|
+
raise AppError.new("[-p|--platform] is only supported for the 'download' command") if command != "download"
|
66
|
+
options[:platforms] = platform_to_symbols(platform)
|
67
|
+
end
|
68
|
+
|
69
|
+
opt.on("-n", "--no-retry", "Don't retry download or upload on network failures") do
|
70
|
+
options[:is_retry_enabled] = false
|
71
|
+
end
|
72
|
+
|
62
73
|
opt.on("-pPORT", "--port=PORT", "Server application port used when starting server, default port is #{SERVER_DEFAULT_PORT}") do |port|
|
63
74
|
options[:server_port] = port
|
64
75
|
end
|
@@ -68,10 +79,9 @@ opt_parser = OptionParser.new do |opt|
|
|
68
79
|
end
|
69
80
|
end
|
70
81
|
|
71
|
-
opt_parser.parse!
|
72
|
-
|
73
82
|
begin
|
74
|
-
|
83
|
+
opt_parser.parse!
|
84
|
+
|
75
85
|
case command
|
76
86
|
when "config"
|
77
87
|
puts Configuration.new_with_defaults
|
@@ -20,17 +20,17 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler"
|
23
|
+
spec.add_development_dependency "bundler"
|
24
24
|
spec.add_development_dependency "guard", "~> 2.14.2"
|
25
25
|
spec.add_development_dependency "guard-test", "~> 2.0.8"
|
26
26
|
spec.add_development_dependency "mocha", "~> 1.3.0"
|
27
|
-
spec.add_development_dependency "rake", "~>
|
27
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
28
28
|
spec.add_development_dependency "rerun"
|
29
29
|
spec.add_development_dependency "rufo"
|
30
30
|
spec.add_development_dependency "test-unit", "~> 3.2.7"
|
31
31
|
|
32
32
|
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0.5"
|
33
|
-
spec.add_runtime_dependency "rack", "
|
33
|
+
spec.add_runtime_dependency "rack", ">= 2.0.6", "< 2.3.0"
|
34
34
|
spec.add_runtime_dependency "rest-client", "~> 2.0.2"
|
35
|
-
spec.add_runtime_dependency "sinatra", "
|
35
|
+
spec.add_runtime_dependency "sinatra", ">= 2.0.4", "< 2.3.0"
|
36
36
|
end
|
data/dev/start_server
CHANGED
data/lib/api.rb
CHANGED
@@ -23,7 +23,7 @@ class API
|
|
23
23
|
rescue VersionFileDoesNotExistError => e
|
24
24
|
errors << OutdatedFrameworkBuildError.new(
|
25
25
|
carthage_dependency.guessed_framework_basename,
|
26
|
-
|
26
|
+
"-",
|
27
27
|
carthage_dependency.version
|
28
28
|
)
|
29
29
|
rescue OutdatedFrameworkBuildError => e
|
@@ -35,11 +35,11 @@ class API
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
def version_file_matches_server?(carthage_dependency, version_file)
|
38
|
+
def version_file_matches_server?(carthage_dependency, version_file, platforms)
|
39
39
|
if @options[:force]
|
40
40
|
false
|
41
41
|
else
|
42
|
-
server_version_file = @networking.download_version_file(carthage_dependency)
|
42
|
+
server_version_file = @networking.download_version_file(carthage_dependency, platforms)
|
43
43
|
result = version_file.same_content?(server_version_file)
|
44
44
|
server_version_file.remove unless server_version_file.nil?
|
45
45
|
result
|
@@ -47,13 +47,13 @@ class API
|
|
47
47
|
end
|
48
48
|
|
49
49
|
# @return zip archive size in Bytes
|
50
|
-
def create_and_upload_archive(carthage_dependency,
|
51
|
-
archive =
|
52
|
-
archive.
|
50
|
+
def create_and_upload_archive(carthage_dependency, framework, platform)
|
51
|
+
archive = framework.make_archive(platform)
|
52
|
+
archive.compress_archive(@shell)
|
53
53
|
archive_size = archive.archive_size
|
54
54
|
begin
|
55
55
|
checksum = crc32(archive.archive_path)
|
56
|
-
@networking.upload_framework_archive(archive.archive_path, carthage_dependency,
|
56
|
+
@networking.upload_framework_archive(archive.archive_path, carthage_dependency, framework.name, platform, checksum)
|
57
57
|
ensure
|
58
58
|
archive.delete_archive
|
59
59
|
end
|
@@ -62,10 +62,10 @@ class API
|
|
62
62
|
|
63
63
|
# @return zip archive size in Bytes
|
64
64
|
# @raise AppError if download or checksum validation fails
|
65
|
-
def download_and_unpack_archive(carthage_dependency,
|
66
|
-
result = @networking.download_framework_archive(carthage_dependency,
|
65
|
+
def download_and_unpack_archive(carthage_dependency, framework, platform)
|
66
|
+
result = @networking.download_framework_archive(carthage_dependency, framework, platform)
|
67
67
|
if result.nil?
|
68
|
-
raise AppError.new, "Failed to download framework #{carthage_dependency} – #{
|
68
|
+
raise AppError.new, "Failed to download framework #{carthage_dependency} – #{framework.name} (#{platform}). Please `upload` the framework first."
|
69
69
|
end
|
70
70
|
|
71
71
|
archive = result[:archive]
|
data/lib/carthage_archive.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
1
3
|
class CarthageArchive
|
2
4
|
attr_reader :archive_filename, :archive_path
|
3
5
|
|
@@ -10,44 +12,11 @@ class CarthageArchive
|
|
10
12
|
@archive_path = @archive_filename
|
11
13
|
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
# - Carthage/Build/iOS/Alamofire.framework/Alamofire
|
16
|
-
# - Carthage/Build/iOS/618BEB79-4C7F-3692-B140-131FB983AC5E.bcsymbolmap
|
17
|
-
# into Alamofire-iOS.zip
|
18
|
-
def create_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
19
|
-
$LOG.debug("Archiving #{@framework_name} for #{@platform}")
|
20
|
-
|
21
|
-
platform_path = File.join(carthage_build_dir, platform_to_carthage_dir_string(@platform))
|
22
|
-
framework_path = File.join(platform_path, "#{@framework_name}.framework")
|
23
|
-
raise MissingFrameworkDirectoryError.new, "Archive can't be created, no framework directory at #{framework_path}" unless Dir.exist?(framework_path)
|
24
|
-
|
25
|
-
# It's very likely, that binary releases don't contain DSYMs.
|
26
|
-
dsym_path = File.join(platform_path, "#{@framework_name}.framework.dSYM")
|
27
|
-
unless File.exist?(dsym_path)
|
28
|
-
$LOG.error("DSYM File #{dsym_path} not found, continuing")
|
29
|
-
dsym_path = nil
|
30
|
-
end
|
31
|
-
|
32
|
-
binary_path = File.join(framework_path, @framework_name)
|
33
|
-
raise AppError.new, "Binary #{binary_path} is missing, failed to read .bcsymbolmap files" unless File.exist?(binary_path)
|
34
|
-
|
35
|
-
bcsymbolmap_paths = find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
36
|
-
|
37
|
-
input_paths = []
|
38
|
-
input_paths << framework_path
|
39
|
-
input_paths << dsym_path unless dsym_path.nil?
|
40
|
-
input_paths += bcsymbolmap_paths
|
41
|
-
|
42
|
-
$LOG.debug("Adding > #{input_paths.inspect}")
|
15
|
+
def unpack_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
16
|
+
raise AppError.new, "Archive #{@archive_path} is missing" unless File.exist?(@archive_path)
|
43
17
|
|
44
|
-
|
45
|
-
shell.archive(input_paths, @archive_path)
|
46
|
-
$LOG.debug("Created #{@archive_path} archive, file size: #{formatted_archive_size}")
|
47
|
-
end
|
18
|
+
delete_existing_build_framework_if_exists(carthage_build_dir)
|
48
19
|
|
49
|
-
def unpack_archive(shell)
|
50
|
-
raise AppError.new, "Archive #{@archive_path} is missing" unless File.exist?(@archive_path)
|
51
20
|
$LOG.debug("Unpacking #{@archive_path}, file size: #{formatted_archive_size}")
|
52
21
|
shell.unpack(@archive_path)
|
53
22
|
end
|
@@ -63,22 +32,15 @@ class CarthageArchive
|
|
63
32
|
|
64
33
|
private
|
65
34
|
|
66
|
-
def find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
67
|
-
raw_dwarfdump = shell.dwarfdump(binary_path)
|
68
|
-
uuids = parse_uuids(raw_dwarfdump)
|
69
|
-
bcsymbolmap_paths = uuids.map { |uuid| File.join(platform_path, "#{uuid}.bcsymbolmap") }.select { |path| File.exist?(path) }
|
70
|
-
bcsymbolmap_paths
|
71
|
-
end
|
72
|
-
|
73
|
-
# Example dwarfdump link:
|
74
|
-
# UUID: 618BEB79-4C7F-3692-B140-131FB983AC5E (i386) Carthage/Build/iOS/CocoaLumberjackSwift.framework/CocoaLumberjackSwift
|
75
|
-
def parse_uuids(raw_dwarfdump)
|
76
|
-
lines = raw_dwarfdump.split("\n")
|
77
|
-
uuids = lines.map { |line| line[/^UUID: ([A-Z0-9\-]+)\s+\(.*$/, 1] }
|
78
|
-
uuids.compact
|
79
|
-
end
|
80
|
-
|
81
35
|
def formatted_archive_size
|
82
36
|
format_file_size(archive_size)
|
83
37
|
end
|
38
|
+
|
39
|
+
def delete_existing_build_framework_if_exists(carthage_build_dir)
|
40
|
+
framework_path = File.join(carthage_build_dir, "#{@framework_name}.xcframework")
|
41
|
+
if File.exist?(framework_path)
|
42
|
+
$LOG.debug("Deleting #{framework_path}")
|
43
|
+
FileUtils.rm_rf(framework_path)
|
44
|
+
end
|
45
|
+
end
|
84
46
|
end
|
@@ -1,17 +1,21 @@
|
|
1
1
|
lib = File.expand_path("..", __FILE__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
4
|
+
require "api"
|
5
|
+
require "carthage_archive"
|
6
|
+
require "framework_carthage_archive"
|
7
|
+
require "xcframework_carthage_archive"
|
8
|
+
require "framework"
|
9
|
+
require "xcframework"
|
10
|
+
require "carthage_dependency"
|
11
|
+
require "constants"
|
12
|
+
require "configuration"
|
13
|
+
require "crc32"
|
14
|
+
require "errors"
|
15
|
+
require "log"
|
16
|
+
require "networking"
|
17
|
+
require "shell_wrapper"
|
18
|
+
require "table"
|
19
|
+
require "utils"
|
20
|
+
require "version"
|
21
|
+
require "version_file"
|
@@ -1,16 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require "concurrent"
|
2
2
|
|
3
3
|
class DownloadCommand
|
4
4
|
def self.new_with_defaults(options)
|
5
5
|
shell = ShellWrapper.new
|
6
6
|
config = Configuration.new(shell)
|
7
|
-
networking = Networking.new(config)
|
7
|
+
networking = Networking.new(config, options[:is_retry_enabled])
|
8
8
|
api = API.new(shell, config, networking, options)
|
9
9
|
|
10
10
|
DownloadCommand.new(
|
11
11
|
config: config,
|
12
12
|
networking: networking,
|
13
13
|
api: api,
|
14
|
+
platforms: options[:platforms],
|
14
15
|
)
|
15
16
|
end
|
16
17
|
|
@@ -18,6 +19,7 @@ class DownloadCommand
|
|
18
19
|
@config = args[:config]
|
19
20
|
@networking = args[:networking]
|
20
21
|
@api = args[:api]
|
22
|
+
@platforms = args[:platforms]
|
21
23
|
end
|
22
24
|
|
23
25
|
def run
|
@@ -57,14 +59,13 @@ class DownloadCommand
|
|
57
59
|
private
|
58
60
|
|
59
61
|
def download(carthage_dependency)
|
60
|
-
local_version_file =
|
61
|
-
if File.exist?(carthage_dependency.version_filepath)
|
62
|
+
local_version_file = if File.exist?(carthage_dependency.version_filepath)
|
62
63
|
carthage_dependency.new_version_file
|
63
64
|
else
|
64
65
|
nil
|
65
66
|
end
|
66
67
|
|
67
|
-
if !local_version_file.nil? && @api.version_file_matches_server?(carthage_dependency, local_version_file)
|
68
|
+
if !local_version_file.nil? && @api.version_file_matches_server?(carthage_dependency, local_version_file, @platforms)
|
68
69
|
$LOG.debug("Version file #{local_version_file.path} matches server version, skipping download")
|
69
70
|
@mutex.synchronize do
|
70
71
|
@number_of_skipped_archives += local_version_file.number_of_frameworks
|
@@ -72,12 +73,12 @@ class DownloadCommand
|
|
72
73
|
return
|
73
74
|
end
|
74
75
|
|
75
|
-
version_file = @networking.download_version_file(carthage_dependency)
|
76
|
+
version_file = @networking.download_version_file(carthage_dependency, @platforms)
|
76
77
|
raise AppError.new, "Version file #{carthage_dependency.version_filename} is not present on the server, please run `carthagerc upload` first" if version_file.nil?
|
77
78
|
|
78
|
-
version_file.frameworks_by_platform.each do |platform,
|
79
|
-
for
|
80
|
-
archive_size = @api.download_and_unpack_archive(carthage_dependency,
|
79
|
+
version_file.frameworks_by_platform.each do |platform, frameworks|
|
80
|
+
for framework in frameworks
|
81
|
+
archive_size = @api.download_and_unpack_archive(carthage_dependency, framework, platform)
|
81
82
|
@mutex.synchronize do
|
82
83
|
@number_of_downloaded_archives += 1
|
83
84
|
@total_archive_size += archive_size
|