carthage_remote_cache 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +38 -0
- data/.ruby-version +2 -0
- data/.travis.yml +1 -1
- data/Gemfile.lock +19 -19
- data/README.md +1 -1
- data/carthage_remote_cache.gemspec +1 -1
- data/lib/api.rb +7 -7
- data/lib/carthage_archive.rb +1 -53
- data/lib/carthage_remote_cache.rb +4 -0
- data/lib/commands/download_command.rb +3 -3
- data/lib/commands/upload_command.rb +3 -3
- data/lib/framework.rb +19 -0
- data/lib/framework_carthage_archive.rb +57 -0
- data/lib/networking.rb +3 -3
- data/lib/server/server_app.rb +45 -1
- data/lib/utils.rb +6 -2
- data/lib/version.rb +1 -1
- data/lib/version_file.rb +37 -5
- data/lib/xcframework.rb +29 -0
- data/lib/xcframework_carthage_archive.rb +17 -0
- metadata +20 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
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/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
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
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/
|
@@ -14,8 +14,8 @@ GEM
|
|
14
14
|
concurrent-ruby (1.0.5)
|
15
15
|
domain_name (0.5.20190701)
|
16
16
|
unf (>= 0.0.5, < 1.0.0)
|
17
|
-
ffi (1.15.
|
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,17 +29,17 @@ 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.
|
34
|
+
listen (3.7.1)
|
35
35
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
36
36
|
rb-inotify (~> 0.9, >= 0.9.10)
|
37
37
|
lumberjack (1.2.8)
|
38
38
|
metaclass (0.0.4)
|
39
39
|
method_source (1.0.0)
|
40
|
-
mime-types (3.
|
40
|
+
mime-types (3.4.1)
|
41
41
|
mime-types-data (~> 3.2015)
|
42
|
-
mime-types-data (3.
|
42
|
+
mime-types-data (3.2022.0105)
|
43
43
|
mocha (1.3.0)
|
44
44
|
metaclass (~> 0.0.1)
|
45
45
|
mustermann (1.1.1)
|
@@ -49,15 +49,15 @@ GEM
|
|
49
49
|
notiffany (0.1.3)
|
50
50
|
nenv (~> 0.1)
|
51
51
|
shellany (~> 0.0)
|
52
|
-
power_assert (2.0.
|
52
|
+
power_assert (2.0.1)
|
53
53
|
pry (0.14.1)
|
54
54
|
coderay (~> 1.1)
|
55
55
|
method_source (~> 1.0)
|
56
|
-
rack (2.2.
|
57
|
-
rack-protection (2.0
|
56
|
+
rack (2.2.4)
|
57
|
+
rack-protection (2.2.0)
|
58
58
|
rack
|
59
|
-
rake (13.0.
|
60
|
-
rb-fsevent (0.11.
|
59
|
+
rake (13.0.6)
|
60
|
+
rb-fsevent (0.11.1)
|
61
61
|
rb-inotify (0.10.1)
|
62
62
|
ffi (~> 1.0)
|
63
63
|
rerun (0.13.1)
|
@@ -66,21 +66,21 @@ GEM
|
|
66
66
|
http-cookie (>= 1.0.2, < 2.0)
|
67
67
|
mime-types (>= 1.16, < 4.0)
|
68
68
|
netrc (~> 0.8)
|
69
|
-
ruby2_keywords (0.0.
|
69
|
+
ruby2_keywords (0.0.5)
|
70
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
77
|
test-unit (3.2.9)
|
78
78
|
power_assert
|
79
|
-
thor (1.1
|
79
|
+
thor (1.2.1)
|
80
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
|
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.
|
@@ -32,5 +32,5 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0.5"
|
33
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/lib/api.rb
CHANGED
@@ -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
@@ -12,42 +12,6 @@ class CarthageArchive
|
|
12
12
|
@archive_path = @archive_filename
|
13
13
|
end
|
14
14
|
|
15
|
-
# Aggregate following files:
|
16
|
-
# - Carthage/Build/iOS/Alamofire.framework
|
17
|
-
# - Carthage/Build/iOS/Alamofire.framework/Alamofire
|
18
|
-
# - Carthage/Build/iOS/618BEB79-4C7F-3692-B140-131FB983AC5E.bcsymbolmap
|
19
|
-
# into Alamofire-iOS.zip
|
20
|
-
def create_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
21
|
-
$LOG.debug("Archiving #{@framework_name} for #{@platform}")
|
22
|
-
|
23
|
-
platform_path = File.join(carthage_build_dir, platform_to_carthage_dir_string(@platform))
|
24
|
-
framework_path = File.join(platform_path, "#{@framework_name}.framework")
|
25
|
-
raise MissingFrameworkDirectoryError.new, "Archive can't be created, no framework directory at #{framework_path}" unless Dir.exist?(framework_path)
|
26
|
-
|
27
|
-
# It's very likely, that binary releases don't contain DSYMs.
|
28
|
-
dsym_path = File.join(platform_path, "#{@framework_name}.framework.dSYM")
|
29
|
-
unless File.exist?(dsym_path)
|
30
|
-
$LOG.error("DSYM File #{dsym_path} not found, continuing")
|
31
|
-
dsym_path = nil
|
32
|
-
end
|
33
|
-
|
34
|
-
binary_path = File.join(framework_path, @framework_name)
|
35
|
-
raise AppError.new, "Binary #{binary_path} is missing, failed to read .bcsymbolmap files" unless File.exist?(binary_path)
|
36
|
-
|
37
|
-
bcsymbolmap_paths = find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
38
|
-
|
39
|
-
input_paths = []
|
40
|
-
input_paths << framework_path
|
41
|
-
input_paths << dsym_path unless dsym_path.nil?
|
42
|
-
input_paths += bcsymbolmap_paths
|
43
|
-
|
44
|
-
$LOG.debug("Adding > #{input_paths.inspect}")
|
45
|
-
|
46
|
-
delete_archive
|
47
|
-
shell.archive(input_paths, @archive_path)
|
48
|
-
$LOG.debug("Created #{@archive_path} archive, file size: #{formatted_archive_size}")
|
49
|
-
end
|
50
|
-
|
51
15
|
def unpack_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
52
16
|
raise AppError.new, "Archive #{@archive_path} is missing" unless File.exist?(@archive_path)
|
53
17
|
|
@@ -68,28 +32,12 @@ class CarthageArchive
|
|
68
32
|
|
69
33
|
private
|
70
34
|
|
71
|
-
def find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
72
|
-
raw_dwarfdump = shell.dwarfdump(binary_path)
|
73
|
-
uuids = parse_uuids(raw_dwarfdump)
|
74
|
-
bcsymbolmap_paths = uuids.map { |uuid| File.join(platform_path, "#{uuid}.bcsymbolmap") }.select { |path| File.exist?(path) }
|
75
|
-
bcsymbolmap_paths
|
76
|
-
end
|
77
|
-
|
78
|
-
# Example dwarfdump link:
|
79
|
-
# UUID: 618BEB79-4C7F-3692-B140-131FB983AC5E (i386) Carthage/Build/iOS/CocoaLumberjackSwift.framework/CocoaLumberjackSwift
|
80
|
-
def parse_uuids(raw_dwarfdump)
|
81
|
-
lines = raw_dwarfdump.split("\n")
|
82
|
-
uuids = lines.map { |line| line[/^UUID: ([A-Z0-9\-]+)\s+\(.*$/, 1] }
|
83
|
-
uuids.compact
|
84
|
-
end
|
85
|
-
|
86
35
|
def formatted_archive_size
|
87
36
|
format_file_size(archive_size)
|
88
37
|
end
|
89
38
|
|
90
39
|
def delete_existing_build_framework_if_exists(carthage_build_dir)
|
91
|
-
|
92
|
-
framework_path = File.join(platform_path, "#{@framework_name}.framework")
|
40
|
+
framework_path = File.join(carthage_build_dir, "#{@framework_name}.xcframework")
|
93
41
|
if File.exist?(framework_path)
|
94
42
|
$LOG.debug("Deleting #{framework_path}")
|
95
43
|
FileUtils.rm_rf(framework_path)
|
@@ -3,6 +3,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
require "api"
|
5
5
|
require "carthage_archive"
|
6
|
+
require "framework_carthage_archive"
|
7
|
+
require "xcframework_carthage_archive"
|
8
|
+
require "framework"
|
9
|
+
require "xcframework"
|
6
10
|
require "carthage_dependency"
|
7
11
|
require "constants"
|
8
12
|
require "configuration"
|
@@ -76,9 +76,9 @@ class DownloadCommand
|
|
76
76
|
version_file = @networking.download_version_file(carthage_dependency, @platforms)
|
77
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?
|
78
78
|
|
79
|
-
version_file.frameworks_by_platform.each do |platform,
|
80
|
-
for
|
81
|
-
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)
|
82
82
|
@mutex.synchronize do
|
83
83
|
@number_of_downloaded_archives += 1
|
84
84
|
@total_archive_size += archive_size
|
@@ -72,9 +72,9 @@ class UploadCommand
|
|
72
72
|
|
73
73
|
@networking.upload_version_file(carthage_dependency)
|
74
74
|
|
75
|
-
version_file.frameworks_by_platform.each do |platform,
|
76
|
-
for
|
77
|
-
archive_size = @api.create_and_upload_archive(carthage_dependency,
|
75
|
+
version_file.frameworks_by_platform.each do |platform, frameworks|
|
76
|
+
for framework in frameworks
|
77
|
+
archive_size = @api.create_and_upload_archive(carthage_dependency, framework, platform)
|
78
78
|
@mutex.synchronize do
|
79
79
|
@number_of_uploaded_archives += 1
|
80
80
|
@total_archive_size += archive_size
|
data/lib/framework.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Example data:
|
2
|
+
# - "name" : "Sentry",
|
3
|
+
# - "linking" : "dynamic"
|
4
|
+
class Framework
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
def self.parse(json)
|
8
|
+
Framework.new(json["name"], json["linking"])
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(name, linking)
|
12
|
+
@name = name
|
13
|
+
@linking = linking
|
14
|
+
end
|
15
|
+
|
16
|
+
def make_archive(platform)
|
17
|
+
FrameworkCarthageArchive.new(name, platform)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
class FrameworkCarthageArchive < CarthageArchive
|
4
|
+
|
5
|
+
# Aggregate following files:
|
6
|
+
# - Carthage/Build/iOS/Alamofire.framework
|
7
|
+
# - Carthage/Build/iOS/Alamofire.framework/Alamofire
|
8
|
+
# - Carthage/Build/iOS/618BEB79-4C7F-3692-B140-131FB983AC5E.bcsymbolmap
|
9
|
+
# into Alamofire-iOS.zip
|
10
|
+
def compress_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
11
|
+
$LOG.debug("Archiving #{@framework_name} for #{@platform}")
|
12
|
+
|
13
|
+
platform_path = File.join(carthage_build_dir, platform_to_carthage_dir_string(@platform))
|
14
|
+
framework_path = File.join(platform_path, "#{@framework_name}.framework")
|
15
|
+
raise MissingFrameworkDirectoryError.new, "Archive can't be created, no framework directory at #{framework_path}" unless Dir.exist?(framework_path)
|
16
|
+
|
17
|
+
# It's very likely, that binary releases don't contain DSYMs.
|
18
|
+
dsym_path = File.join(platform_path, "#{@framework_name}.framework.dSYM")
|
19
|
+
unless File.exist?(dsym_path)
|
20
|
+
$LOG.error("DSYM File #{dsym_path} not found, continuing")
|
21
|
+
dsym_path = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
binary_path = File.join(framework_path, @framework_name)
|
25
|
+
raise AppError.new, "Binary #{binary_path} is missing, failed to read .bcsymbolmap files" unless File.exist?(binary_path)
|
26
|
+
|
27
|
+
bcsymbolmap_paths = find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
28
|
+
|
29
|
+
input_paths = []
|
30
|
+
input_paths << framework_path
|
31
|
+
input_paths << dsym_path unless dsym_path.nil?
|
32
|
+
input_paths += bcsymbolmap_paths
|
33
|
+
|
34
|
+
$LOG.debug("Adding > #{input_paths.inspect}")
|
35
|
+
|
36
|
+
delete_archive
|
37
|
+
shell.archive(input_paths, @archive_path)
|
38
|
+
$LOG.debug("Created #{@archive_path} archive, file size: #{formatted_archive_size}")
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def find_bcsymbolmap_paths(shell, platform_path, binary_path)
|
44
|
+
raw_dwarfdump = shell.dwarfdump(binary_path)
|
45
|
+
uuids = parse_uuids(raw_dwarfdump)
|
46
|
+
bcsymbolmap_paths = uuids.map { |uuid| File.join(platform_path, "#{uuid}.bcsymbolmap") }.select { |path| File.exist?(path) }
|
47
|
+
bcsymbolmap_paths
|
48
|
+
end
|
49
|
+
|
50
|
+
# Example dwarfdump link:
|
51
|
+
# UUID: 618BEB79-4C7F-3692-B140-131FB983AC5E (i386) Carthage/Build/iOS/CocoaLumberjackSwift.framework/CocoaLumberjackSwift
|
52
|
+
def parse_uuids(raw_dwarfdump)
|
53
|
+
lines = raw_dwarfdump.split("\n")
|
54
|
+
uuids = lines.map { |line| line[/^UUID: ([A-Z0-9\-]+)\s+\(.*$/, 1] }
|
55
|
+
uuids.compact
|
56
|
+
end
|
57
|
+
end
|
data/lib/networking.rb
CHANGED
@@ -64,13 +64,13 @@ class Networking
|
|
64
64
|
# Archives
|
65
65
|
|
66
66
|
# @return Hash with CarthageArchive and checksum or nil
|
67
|
-
def download_framework_archive(carthage_dependency,
|
68
|
-
url = new_framework_url(carthage_dependency,
|
67
|
+
def download_framework_archive(carthage_dependency, framework, platform)
|
68
|
+
url = new_framework_url(carthage_dependency, framework.name, platform)
|
69
69
|
archive = perform_network_request do
|
70
70
|
$LOG.debug("Downloading framework from #{url}")
|
71
71
|
RestClient.get(url) do |response, request, result|
|
72
72
|
if response.code == 200
|
73
|
-
archive =
|
73
|
+
archive = framework.make_archive(platform)
|
74
74
|
File.write(archive.archive_path, response.to_s)
|
75
75
|
{ :archive => archive, :checksum => response.headers[ARCHIVE_CHECKSUM_HEADER_REST_CLIENT] }
|
76
76
|
else
|
data/lib/server/server_app.rb
CHANGED
@@ -4,12 +4,18 @@ require "fileutils"
|
|
4
4
|
require "carthage_remote_cache"
|
5
5
|
|
6
6
|
get "/" do
|
7
|
-
|
7
|
+
<<-eos
|
8
|
+
<html>
|
9
|
+
<p>Welcome to <strong>carthage_remote_cache</strong> (#{VERSION})</p>
|
10
|
+
<p>To browse cache contents visit <a href="/browser/">/browser/</a></p>
|
11
|
+
</html>
|
12
|
+
eos
|
8
13
|
end
|
9
14
|
|
10
15
|
version_path = "/version"
|
11
16
|
versions_path = "/versions/:xcodebuild_version/:swift_version/:dependency_name/:version/:version_filename"
|
12
17
|
frameworks_path = "/frameworks/:xcodebuild_version/:swift_version/:dependency_name/:version/:framework_name/:platform"
|
18
|
+
browser_path = "/browser/*"
|
13
19
|
|
14
20
|
get version_path do
|
15
21
|
status(200)
|
@@ -104,6 +110,44 @@ post frameworks_path do
|
|
104
110
|
end
|
105
111
|
end
|
106
112
|
|
113
|
+
# Full blown file browser.
|
114
|
+
get browser_path do
|
115
|
+
url_path = "/" + params["splat"][0]
|
116
|
+
path = File.join(SERVER_CACHE_DIR, url_path)
|
117
|
+
|
118
|
+
if File.file?(path)
|
119
|
+
status(200)
|
120
|
+
send_file(path)
|
121
|
+
else
|
122
|
+
html = "<html>"
|
123
|
+
|
124
|
+
# Current directory
|
125
|
+
html += "<h2>#{url_path}</h2>"
|
126
|
+
|
127
|
+
# ".." link
|
128
|
+
if url_path != "/"
|
129
|
+
parent = File.dirname(url_path)
|
130
|
+
parent += "/" if parent != "/"
|
131
|
+
html += "<p><a href=\"/browser#{parent}\">..</a></p>"
|
132
|
+
end
|
133
|
+
|
134
|
+
# Child links
|
135
|
+
for name in Dir.children(path).select { |name| name != ".DS_Store" }.sort
|
136
|
+
child_path = File.join(path, name)
|
137
|
+
html += "<p>"
|
138
|
+
if File.file?(child_path)
|
139
|
+
html += "<a href=\"#{name}\">#{name}</a> #{format_file_size(File.size(child_path))}"
|
140
|
+
else
|
141
|
+
html += "<a href=\"#{name}/\">#{name}/</a>"
|
142
|
+
end
|
143
|
+
html += " <span style=\"color:#777\">#{File.ctime(child_path).to_s}</span>"
|
144
|
+
html += "</p>"
|
145
|
+
end
|
146
|
+
|
147
|
+
html
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
107
151
|
private
|
108
152
|
|
109
153
|
def params_to_framework_dir(params)
|
data/lib/utils.rb
CHANGED
@@ -71,6 +71,10 @@ end
|
|
71
71
|
|
72
72
|
# @return string in "x.y MB" format
|
73
73
|
def format_file_size(bytes)
|
74
|
-
|
75
|
-
|
74
|
+
if bytes == 0
|
75
|
+
"0.0 MB"
|
76
|
+
else
|
77
|
+
megabytes = [0.1, bytes / 1000.0 / 1000.0].max
|
78
|
+
"#{megabytes.round(1)} MB"
|
79
|
+
end
|
76
80
|
end
|
data/lib/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = "0.0.
|
1
|
+
VERSION = "0.0.11"
|
data/lib/version_file.rb
CHANGED
@@ -22,7 +22,7 @@ class VersionFile
|
|
22
22
|
def platforms_by_framework
|
23
23
|
result = Hash.new { |h, k| h[k] = [] }
|
24
24
|
for framework_name in framework_names
|
25
|
-
|
25
|
+
framework_names_by_platform.each do |platform, framework_names_in_platform|
|
26
26
|
if framework_names_in_platform.include?(framework_name)
|
27
27
|
result[framework_name] << platform
|
28
28
|
end
|
@@ -31,14 +31,18 @@ class VersionFile
|
|
31
31
|
result
|
32
32
|
end
|
33
33
|
|
34
|
+
def framework_names_by_platform
|
35
|
+
@frameworks_by_platform.map { |platform, framework| [platform, framework.map { |f| f.name }] }.to_h
|
36
|
+
end
|
37
|
+
|
34
38
|
# Unique array of framework names.
|
35
39
|
def framework_names
|
36
|
-
|
40
|
+
framework_names_by_platform.values.flatten.uniq.sort
|
37
41
|
end
|
38
42
|
|
39
43
|
# Total number of frameworks accross all platforms.
|
40
44
|
def number_of_frameworks
|
41
|
-
|
45
|
+
framework_names_by_platform.values.flatten.count
|
42
46
|
end
|
43
47
|
|
44
48
|
def move_to_build_dir
|
@@ -93,10 +97,38 @@ class VersionFile
|
|
93
97
|
def parse_platform(platform)
|
94
98
|
carthage_platform_name = platform_to_carthage_dir_string(platform)
|
95
99
|
array = @json[carthage_platform_name]
|
96
|
-
if array.kind_of?(Array)
|
97
|
-
array.
|
100
|
+
if array.kind_of?(Array) and array.count > 0
|
101
|
+
if array.first["linking"]
|
102
|
+
parse_frameworks(array)
|
103
|
+
elsif array.first["container"]
|
104
|
+
parse_xcframeworks(array)
|
105
|
+
else
|
106
|
+
raise AppError.new "Failed to parse framework #{json}"
|
107
|
+
end
|
98
108
|
else
|
99
109
|
[]
|
100
110
|
end
|
101
111
|
end
|
112
|
+
|
113
|
+
def parse_frameworks(array)
|
114
|
+
array.map { |json| Framework.parse(json) }
|
115
|
+
end
|
116
|
+
|
117
|
+
def parse_xcframeworks(array)
|
118
|
+
# Parse the array of XCFrameworks
|
119
|
+
xcframeworks = array.map { |json| XCFramework.parse(json) }
|
120
|
+
|
121
|
+
# Merge entries with same name, but different identifiers into one.
|
122
|
+
by_name = xcframeworks.reduce({}) do |hash, xcframework|
|
123
|
+
if found = hash[xcframework.name]
|
124
|
+
hash[found.name] = found.new_xcframework_by_adding_identifiers(xcframework.identifiers)
|
125
|
+
else
|
126
|
+
hash[xcframework.name] = xcframework
|
127
|
+
end
|
128
|
+
hash
|
129
|
+
end
|
130
|
+
|
131
|
+
# Turn back into a simple array
|
132
|
+
by_name.values
|
133
|
+
end
|
102
134
|
end
|
data/lib/xcframework.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Example data:
|
2
|
+
# - "name" : "GoogleSignIn",
|
3
|
+
# - "container" : "GoogleSignIn.xcframework",
|
4
|
+
# - "identifiers" : ["ios-arm64_i386_x86_64-simulator", "ios-arm64_armv7"]
|
5
|
+
class XCFramework
|
6
|
+
attr_reader :name, :container, :identifiers
|
7
|
+
|
8
|
+
def self.parse(json)
|
9
|
+
XCFramework.new(json["name"], json["container"], [json["identifier"]])
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(name, container, identifiers)
|
13
|
+
@name = name
|
14
|
+
@container = container
|
15
|
+
@identifiers = identifiers
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
@name == other.name && @container == other.container && @identifiers == other.identifiers
|
20
|
+
end
|
21
|
+
|
22
|
+
def make_archive(platform)
|
23
|
+
XCFrameworkCarthageArchive.new(name, platform)
|
24
|
+
end
|
25
|
+
|
26
|
+
def new_xcframework_by_adding_identifiers(identifiers_to_add)
|
27
|
+
XCFramework.new(name, container, identifiers + identifiers_to_add)
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
class XCFrameworkCarthageArchive < CarthageArchive
|
4
|
+
|
5
|
+
# Compresses `Carthage/Build/GoogleSignIn.xcframework``
|
6
|
+
# into `GoogleSignIn-iOS.zip`.`
|
7
|
+
def compress_archive(shell, carthage_build_dir = CARTHAGE_BUILD_DIR)
|
8
|
+
$LOG.debug("Archiving #{@framework_name} for #{@platform}")
|
9
|
+
|
10
|
+
framework_path = File.join(carthage_build_dir, "#{@framework_name}.xcframework")
|
11
|
+
raise MissingFrameworkDirectoryError.new, "Archive can't be created, no xcframework directory at #{framework_path}" unless Dir.exist?(framework_path)
|
12
|
+
|
13
|
+
delete_archive
|
14
|
+
shell.archive([framework_path], @archive_path)
|
15
|
+
$LOG.debug("Created #{@archive_path} archive, file size: #{formatted_archive_size}")
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carthage_remote_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juraj Blahunka
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -174,16 +174,22 @@ dependencies:
|
|
174
174
|
name: sinatra
|
175
175
|
requirement: !ruby/object:Gem::Requirement
|
176
176
|
requirements:
|
177
|
-
- - "
|
177
|
+
- - ">="
|
178
178
|
- !ruby/object:Gem::Version
|
179
179
|
version: 2.0.4
|
180
|
+
- - "<"
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: 2.3.0
|
180
183
|
type: :runtime
|
181
184
|
prerelease: false
|
182
185
|
version_requirements: !ruby/object:Gem::Requirement
|
183
186
|
requirements:
|
184
|
-
- - "
|
187
|
+
- - ">="
|
185
188
|
- !ruby/object:Gem::Version
|
186
189
|
version: 2.0.4
|
190
|
+
- - "<"
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 2.3.0
|
187
193
|
description: Centralized cache to serve carthage frameworks. Useful for distributed
|
188
194
|
CI setup with several build machines.
|
189
195
|
email:
|
@@ -193,7 +199,9 @@ executables:
|
|
193
199
|
extensions: []
|
194
200
|
extra_rdoc_files: []
|
195
201
|
files:
|
202
|
+
- ".github/workflows/ruby.yml"
|
196
203
|
- ".gitignore"
|
204
|
+
- ".ruby-version"
|
197
205
|
- ".travis.yml"
|
198
206
|
- Dockerfile
|
199
207
|
- Gemfile
|
@@ -221,6 +229,8 @@ files:
|
|
221
229
|
- lib/constants.rb
|
222
230
|
- lib/crc32.rb
|
223
231
|
- lib/errors.rb
|
232
|
+
- lib/framework.rb
|
233
|
+
- lib/framework_carthage_archive.rb
|
224
234
|
- lib/log.rb
|
225
235
|
- lib/networking.rb
|
226
236
|
- lib/server/config.ru
|
@@ -230,11 +240,13 @@ files:
|
|
230
240
|
- lib/utils.rb
|
231
241
|
- lib/version.rb
|
232
242
|
- lib/version_file.rb
|
243
|
+
- lib/xcframework.rb
|
244
|
+
- lib/xcframework_carthage_archive.rb
|
233
245
|
homepage: https://github.com/kayak/carthage_remote_cache
|
234
246
|
licenses:
|
235
247
|
- Apache-2.0
|
236
248
|
metadata: {}
|
237
|
-
post_install_message:
|
249
|
+
post_install_message:
|
238
250
|
rdoc_options: []
|
239
251
|
require_paths:
|
240
252
|
- lib
|
@@ -249,8 +261,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
261
|
- !ruby/object:Gem::Version
|
250
262
|
version: '0'
|
251
263
|
requirements: []
|
252
|
-
rubygems_version: 3.
|
253
|
-
signing_key:
|
264
|
+
rubygems_version: 3.3.5
|
265
|
+
signing_key:
|
254
266
|
specification_version: 4
|
255
267
|
summary: Centralized cache to serve carthage frameworks. Useful for distributed CI
|
256
268
|
setup with several build machines.
|