lsst-git-lfs-s3 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +44 -0
- data/.travis.yml +5 -0
- data/Gemfile +2 -0
- data/README.md +3 -0
- data/Rakefile +3 -1
- data/bin/git-lfs-s3 +6 -4
- data/git-lfs-s3.gemspec +15 -12
- data/lib/git-lfs-s3.rb +5 -3
- data/lib/git-lfs-s3/application.rb +49 -47
- data/lib/git-lfs-s3/aws.rb +6 -4
- data/lib/git-lfs-s3/services/ceph_presigner.rb +15 -6
- data/lib/git-lfs-s3/services/upload.rb +9 -6
- data/lib/git-lfs-s3/services/upload/base.rb +5 -3
- data/lib/git-lfs-s3/services/upload/object_exists.rb +3 -1
- data/lib/git-lfs-s3/services/upload/upload_required.rb +8 -8
- data/lib/git-lfs-s3/version.rb +3 -1
- metadata +25 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71878bf6966f50b7f5f3000dd16f4c309f885ff6
|
4
|
+
data.tar.gz: 4b73e19c8cbccc032efa5f8b845fd0eb733345c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83b172cb17cc167133baa0dd04169c8266a294026b45faa49aeb46fa3c9839f0d9518f6635e20a727f7d09478571adef8175a174b4c4a6c59e7cb29c3816c1b8
|
7
|
+
data.tar.gz: a2293c788540582f2a2015b4b93e3eed7656659174b91fe45085ecf6e7dbb8f5f991db824fe08b800a678ed3fae65007b93f84d5d2e676c1c79e38dbac82a56a
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: '2.4'
|
3
|
+
|
4
|
+
Metrics/BlockLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Style/TrailingCommaInArguments:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Style/BracesAroundHashParameters:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
# trailing commas after last item in array/hash
|
14
|
+
Style/TrailingCommaInArrayLiteral:
|
15
|
+
Enabled: false
|
16
|
+
Style/TrailingCommaInHashLiteral:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
# no, I really don't want to put //'s around %r{}s
|
20
|
+
Style/RegexpLiteral:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Metrics/MethodLength:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Style/Documentation:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Metrics/AbcSize:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Style/DateTime:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
Metrics/ClassLength:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Naming/FileName:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Lint/HandleExceptions:
|
42
|
+
Enabled: false
|
43
|
+
Lint/RescueException:
|
44
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# LSST's Git LFS S3
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.org/lsst-sqre/git-lfs-s3.svg?branch=master)](https://travis-ci.org/lsst-sqre/git-lfs-s3)
|
4
|
+
|
5
|
+
|
3
6
|
A [Git LFS](https://git-lfs.github.com/) server that stores your large Git files on S3.
|
4
7
|
|
5
8
|
It works by generating a presigned URL that the Git LFS client can use to upload directly to S3. It also provides download URLs that allow Git clients to download directly from S3. No data is proxied through the Git LFS server.
|
data/Rakefile
CHANGED
data/bin/git-lfs-s3
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require 'rubygems'
|
5
|
+
require 'logger'
|
6
|
+
require 'git-lfs-s3'
|
6
7
|
|
7
8
|
GitLfsS3::Application.set :aws_region, ENV['AWS_REGION']
|
8
9
|
GitLfsS3::Application.set :aws_access_key_id, ENV['AWS_ACCESS_KEY_ID']
|
@@ -21,7 +22,8 @@ if GitLfsS3::Application.settings.ceph_s3
|
|
21
22
|
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
|
22
23
|
force_path_style: true,
|
23
24
|
region: 'us-east-1',
|
24
|
-
# ssl_ca_bundle: '/usr/local/etc/openssl/cert.pem' # Required for brew
|
25
|
+
# ssl_ca_bundle: '/usr/local/etc/openssl/cert.pem' # Required for brew
|
26
|
+
# install on a mac.
|
25
27
|
)
|
26
28
|
end
|
27
29
|
|
data/git-lfs-s3.gemspec
CHANGED
@@ -1,26 +1,29 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
lib = File.expand_path('lib', __dir__)
|
3
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
6
|
require 'git-lfs-s3/version'
|
5
7
|
|
6
8
|
Gem::Specification.new do |gem|
|
7
|
-
gem.name =
|
9
|
+
gem.name = 'lsst-git-lfs-s3'
|
8
10
|
gem.version = GitLfsS3::VERSION
|
9
|
-
gem.authors = [
|
10
|
-
gem.email = [
|
11
|
-
gem.description =
|
12
|
-
gem.summary =
|
13
|
-
gem.homepage =
|
11
|
+
gem.authors = ['Ryan LeFevre', 'J. Matt Peterson']
|
12
|
+
gem.email = ['meltingice8917@gmail.com', 'jmatt@lsst.org']
|
13
|
+
gem.description = "LSST's Git LFS server"
|
14
|
+
gem.summary = "LSST's Git LFS server"
|
15
|
+
gem.homepage = 'https://github.com/lsst-sqre/git-lfs-s3'
|
14
16
|
gem.license = 'MIT'
|
15
17
|
|
16
|
-
gem.files = `git ls-files`.split(
|
17
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
19
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
18
20
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
-
gem.require_paths = [
|
21
|
+
gem.require_paths = ['lib']
|
20
22
|
|
21
23
|
gem.add_dependency 'aws-sdk', '~> 2'
|
22
|
-
gem.add_dependency 'sinatra', '~> 2'
|
23
24
|
gem.add_dependency 'multi_json', '~> 1'
|
25
|
+
gem.add_dependency 'sinatra', '~> 2'
|
24
26
|
|
25
27
|
gem.add_development_dependency 'rake', '~> 10'
|
28
|
+
gem.add_development_dependency 'rubocop', '~> 0.53.0'
|
26
29
|
end
|
data/lib/git-lfs-s3.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'sinatra/base'
|
2
4
|
require 'aws-sdk'
|
3
5
|
require 'multi_json'
|
4
6
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
7
|
+
require 'git-lfs-s3/aws'
|
8
|
+
require 'git-lfs-s3/services/upload'
|
9
|
+
require 'git-lfs-s3/application'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'date'
|
2
4
|
|
3
5
|
module GitLfsS3
|
@@ -32,34 +34,35 @@ module GitLfsS3
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def authorized?
|
35
|
-
@auth ||=
|
36
|
-
@auth.provided? &&
|
37
|
-
@auth.
|
38
|
-
|
37
|
+
@auth ||= Rack::Auth::Basic::Request.new(request.env)
|
38
|
+
@auth.provided? &&
|
39
|
+
@auth.basic? &&
|
40
|
+
@auth.credentials &&
|
41
|
+
self.class.auth_callback.call(
|
42
|
+
@auth.credentials[0], @auth.credentials[1], request.safe?
|
43
|
+
)
|
39
44
|
end
|
40
45
|
|
41
46
|
def protected!
|
42
|
-
unless authorized?
|
43
|
-
|
44
|
-
|
45
|
-
end
|
47
|
+
return unless authorized?
|
48
|
+
response['WWW-Authenticate'] = %(Basic realm="Restricted Area")
|
49
|
+
throw(:halt, [401, 'Invalid username or password'])
|
46
50
|
end
|
47
51
|
|
48
52
|
get '/' do
|
49
|
-
|
53
|
+
'Git LFS S3 is online.'
|
50
54
|
end
|
51
55
|
|
52
56
|
def valid_obj?(obj)
|
53
57
|
# Validate that size >= 0 and oid is a SHA256 hash.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
58
|
+
oid = obj[:oid]
|
59
|
+
return unless obj[:size] >= 0
|
60
|
+
(oid.hex.size <= 32) && (oid.size == 64) && (oid =~ /^[0-9a-f]+$/)
|
61
|
+
# XXX what exception needs to be ignored here?
|
62
|
+
rescue Exception
|
60
63
|
end
|
61
64
|
|
62
|
-
def expire_at
|
65
|
+
def expire_at
|
63
66
|
DateTime.now.next_day.to_time.utc.iso8601
|
64
67
|
end
|
65
68
|
|
@@ -72,9 +75,9 @@ module GitLfsS3
|
|
72
75
|
'size' => size,
|
73
76
|
'authenticated' => authenticated,
|
74
77
|
'actions' => {
|
75
|
-
'download'
|
78
|
+
'download' => {
|
76
79
|
'href' => obj.presigned_url(:get,
|
77
|
-
:
|
80
|
+
expires_in: 86_400),
|
78
81
|
'expires_at' => expire_at,
|
79
82
|
},
|
80
83
|
},
|
@@ -90,10 +93,10 @@ module GitLfsS3
|
|
90
93
|
'size' => size,
|
91
94
|
'authenticated' => authenticated,
|
92
95
|
'actions' => {
|
93
|
-
'upload'
|
96
|
+
'upload' => {
|
94
97
|
'href' => obj.presigned_url(:put,
|
95
98
|
acl: 'public-read',
|
96
|
-
:
|
99
|
+
expires_in: 86_400),
|
97
100
|
'expires_at' => expire_at,
|
98
101
|
},
|
99
102
|
},
|
@@ -116,7 +119,7 @@ module GitLfsS3
|
|
116
119
|
# Handle git-lfs batch downloads.
|
117
120
|
objects = []
|
118
121
|
params[:objects].each do |obj_json|
|
119
|
-
obj_json =
|
122
|
+
obj_json = IndifferentHash(obj_json)
|
120
123
|
obj = object_data(obj_json[:oid])
|
121
124
|
if valid_obj?(obj_json)
|
122
125
|
if obj.exists?
|
@@ -135,7 +138,7 @@ module GitLfsS3
|
|
135
138
|
# Handle git-lfs batch uploads.
|
136
139
|
objects = []
|
137
140
|
params[:objects].each do |obj_json|
|
138
|
-
obj_json =
|
141
|
+
obj_json = IndifferentHash(obj_json)
|
139
142
|
obj = object_data(obj_json[:oid])
|
140
143
|
if valid_obj?(obj_json)
|
141
144
|
if obj.exists?
|
@@ -148,7 +151,7 @@ module GitLfsS3
|
|
148
151
|
end
|
149
152
|
end
|
150
153
|
objects
|
151
|
-
|
154
|
+
end
|
152
155
|
|
153
156
|
def lfs_resp(objects)
|
154
157
|
# Successful git-lfs batch response.
|
@@ -159,21 +162,21 @@ module GitLfsS3
|
|
159
162
|
}
|
160
163
|
body MultiJson.dump(resp)
|
161
164
|
end
|
162
|
-
|
165
|
+
|
163
166
|
def error_resp(status_code, message)
|
164
167
|
# Error git-lfs batch response.
|
165
168
|
status(status_code)
|
166
169
|
resp = {
|
167
170
|
'message' => message,
|
168
|
-
'request_id' => SecureRandom
|
171
|
+
'request_id' => SecureRandom.uuid
|
169
172
|
}
|
170
173
|
body MultiJson.dump(resp)
|
171
174
|
end
|
172
|
-
|
175
|
+
|
173
176
|
post '/objects/batch', provides: 'application/vnd.git-lfs+json' do
|
174
177
|
# git-lfs batch API
|
175
178
|
authenticated = authorized?
|
176
|
-
params =
|
179
|
+
params = IndifferentHash(JSON.parse(request.body.read))
|
177
180
|
logger.debug params
|
178
181
|
if params[:operation] == 'download'
|
179
182
|
if settings.public_server
|
@@ -196,7 +199,7 @@ module GitLfsS3
|
|
196
199
|
end
|
197
200
|
end
|
198
201
|
|
199
|
-
get
|
202
|
+
get '/objects/:oid', provides: 'application/vnd.git-lfs+json' do
|
200
203
|
if settings.public_server
|
201
204
|
object = object_data(params[:oid])
|
202
205
|
if object.exists?
|
@@ -206,7 +209,9 @@ module GitLfsS3
|
|
206
209
|
'size' => object.size,
|
207
210
|
'_links' => {
|
208
211
|
'self' => {
|
209
|
-
'href' => File.join(
|
212
|
+
'href' => File.join(
|
213
|
+
settings.server_url, 'objects', params[:oid]
|
214
|
+
)
|
210
215
|
},
|
211
216
|
'download' => {
|
212
217
|
'href' => object_data(params[:oid]).presigned_url(:get)
|
@@ -216,53 +221,50 @@ module GitLfsS3
|
|
216
221
|
body MultiJson.dump(resp)
|
217
222
|
else
|
218
223
|
status 404
|
219
|
-
body MultiJson.dump({message: 'Object not found'})
|
224
|
+
body MultiJson.dump({ message: 'Object not found' })
|
220
225
|
end
|
221
226
|
else
|
222
227
|
status 401
|
223
|
-
body MultiJson.dump({message: 'Invalid username or password'})
|
228
|
+
body MultiJson.dump({ message: 'Invalid username or password' })
|
224
229
|
end
|
225
230
|
end
|
226
231
|
|
227
232
|
def public_read_grant
|
228
233
|
grantee = Aws::S3::Types::Grantee.new(
|
229
234
|
display_name: nil, email_address: nil, id: nil, type: nil,
|
230
|
-
uri:
|
231
|
-
|
235
|
+
uri: 'http://acs.amazonaws.com/groups/global/AllUsers'
|
236
|
+
)
|
237
|
+
Aws::S3::Types::Grant.new(grantee: grantee, permission: 'READ')
|
232
238
|
end
|
233
239
|
|
234
|
-
post
|
240
|
+
post '/objects', provides: 'application/vnd.git-lfs+json' do
|
235
241
|
if authorized?
|
236
242
|
logger.debug headers.inspect
|
237
243
|
service = UploadService.service_for(request.body)
|
238
244
|
logger.debug service.response
|
239
|
-
|
245
|
+
|
240
246
|
status service.status
|
241
247
|
body MultiJson.dump(service.response)
|
242
248
|
else
|
243
249
|
status 401
|
244
|
-
body MultiJson.dump({message: 'Invalid username or password'})
|
250
|
+
body MultiJson.dump({ message: 'Invalid username or password' })
|
245
251
|
end
|
246
252
|
end
|
247
253
|
|
248
254
|
post '/verify', provides: 'application/vnd.git-lfs+json' do
|
249
255
|
if authorized?
|
250
|
-
data = MultiJson.load(request.body.tap
|
256
|
+
data = MultiJson.load(request.body.tap(&:rewind).read)
|
251
257
|
object = object_data(data['oid'])
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
if not object.acl.grants.include?(public_read_grant)
|
257
|
-
object.acl.put(acl: "public-read")
|
258
|
+
status 404 unless object.exists?
|
259
|
+
if settings.public_server && settings.ceph_s3
|
260
|
+
unless object.acl.grants.include?(public_read_grant)
|
261
|
+
object.acl.put(acl: 'public-read')
|
258
262
|
end
|
259
263
|
end
|
260
|
-
if object.size == data['size']
|
261
|
-
status 200
|
262
|
-
end
|
264
|
+
status 200 if object.size == data['size']
|
263
265
|
else
|
264
266
|
status 401
|
265
|
-
body MultiJson.dump({message: 'Invalid username or password'})
|
267
|
+
body MultiJson.dump({ message: 'Invalid username or password' })
|
266
268
|
end
|
267
269
|
end
|
268
270
|
end
|
data/lib/git-lfs-s3/aws.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GitLfsS3
|
2
4
|
module AwsHelpers
|
3
5
|
def s3
|
4
6
|
@s3 ||= Aws::S3::Client.new({
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
region: aws_region,
|
8
|
+
access_key_id: aws_access_key_id,
|
9
|
+
secret_access_key: aws_secret_access_key
|
10
|
+
})
|
9
11
|
end
|
10
12
|
|
11
13
|
def bucket_name
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'base64'
|
2
4
|
require 'date'
|
3
5
|
require 'digest/sha1'
|
@@ -6,19 +8,26 @@ require 'uri'
|
|
6
8
|
|
7
9
|
module GitLfsS3
|
8
10
|
module CephPresignerService
|
9
|
-
|
11
|
+
module_function
|
12
|
+
|
10
13
|
extend AwsHelpers
|
11
|
-
|
14
|
+
|
12
15
|
def signed_url(obj)
|
13
|
-
expire_at = (DateTime.now + 1).strftime(
|
16
|
+
expire_at = (DateTime.now + 1).strftime('%s')
|
14
17
|
secret_access_key = GitLfsS3::Application.settings.aws_secret_access_key
|
15
18
|
access_key_id = GitLfsS3::Application.settings.aws_access_key_id
|
16
19
|
endpoint = GitLfsS3::Application.settings.endpoint
|
17
20
|
digest = OpenSSL::Digest.new('sha1')
|
18
|
-
can_string = "PUT\n\napplication/octet-stream\n
|
21
|
+
can_string = "PUT\n\napplication/octet-stream\n" \
|
22
|
+
"#{expire_at}\n/#{obj.bucket_name}/#{obj.key}"
|
19
23
|
hmac = OpenSSL::HMAC.digest(digest, secret_access_key, can_string)
|
20
|
-
signature = URI.
|
21
|
-
|
24
|
+
signature = URI.encode_www_form(
|
25
|
+
Base64.encode64(hmac).strip, /[\+=?@$&,\/:;\?]/
|
26
|
+
)
|
27
|
+
"#{endpoint}/#{obj.bucket_name}/#{obj.key}?" \
|
28
|
+
"Signature=#{signature}" \
|
29
|
+
"&AWSAccessKeyId=#{access_key_id}" \
|
30
|
+
"&Expires=#{expire_at}"
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
@@ -1,19 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'git-lfs-s3/services/upload/base'
|
4
|
+
require 'git-lfs-s3/services/upload/object_exists'
|
5
|
+
require 'git-lfs-s3/services/upload/upload_required'
|
4
6
|
|
5
7
|
module GitLfsS3
|
6
8
|
module UploadService
|
7
|
-
|
9
|
+
module_function
|
10
|
+
|
8
11
|
extend AwsHelpers
|
9
12
|
|
10
13
|
MODULES = [
|
11
14
|
ObjectExists,
|
12
15
|
UploadRequired
|
13
|
-
]
|
16
|
+
].freeze
|
14
17
|
|
15
18
|
def service_for(data)
|
16
|
-
req = MultiJson.load data.tap
|
19
|
+
req = MultiJson.load data.tap(&:rewind).read
|
17
20
|
object = object_data(req['oid'])
|
18
21
|
|
19
22
|
MODULES.each do |mod|
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GitLfsS3
|
2
4
|
module UploadService
|
3
5
|
class Base
|
4
6
|
include AwsHelpers
|
5
|
-
|
7
|
+
|
6
8
|
attr_reader :req, :object
|
7
9
|
|
8
10
|
def initialize(req, object)
|
@@ -11,11 +13,11 @@ module GitLfsS3
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def response
|
14
|
-
raise
|
16
|
+
raise 'Override'
|
15
17
|
end
|
16
18
|
|
17
19
|
def status
|
18
|
-
raise
|
20
|
+
raise 'Override'
|
19
21
|
end
|
20
22
|
|
21
23
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GitLfsS3
|
2
4
|
module UploadService
|
3
5
|
class ObjectExists < Base
|
@@ -9,7 +11,7 @@ module GitLfsS3
|
|
9
11
|
{
|
10
12
|
'_links' => {
|
11
13
|
'download' => {
|
12
|
-
'href' => object.presigned_url(:get, :
|
14
|
+
'href' => object.presigned_url(:get, expires_in: 86_400)
|
13
15
|
}
|
14
16
|
}
|
15
17
|
}
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'git-lfs-s3/services/ceph_presigner'
|
2
4
|
|
3
5
|
module GitLfsS3
|
4
6
|
module UploadService
|
@@ -29,18 +31,16 @@ module GitLfsS3
|
|
29
31
|
|
30
32
|
def upload_destination
|
31
33
|
if ceph_s3
|
32
|
-
GitLfsS3::CephPresignerService
|
34
|
+
GitLfsS3::CephPresignerService.signed_url(object)
|
35
|
+
elsif GitLfsS3::Application.settings.public_server
|
36
|
+
object.presigned_url(:put, acl: 'public-read', expires_in: 86_400)
|
33
37
|
else
|
34
|
-
|
35
|
-
object.presigned_url(:put, acl: 'public-read', :expires_in => 86400)
|
36
|
-
else
|
37
|
-
object.presigned_url(:put, :expires_in => 86400)
|
38
|
-
end
|
38
|
+
object.presigned_url(:put, expires_in: 86_400)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def upload_headers
|
43
|
-
{'content-type' => ''}
|
43
|
+
{ 'content-type' => '' }
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/lib/git-lfs-s3/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lsst-git-lfs-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan LeFevre
|
@@ -26,33 +26,33 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '2'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: multi_json
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '1'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '1'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
43
|
+
name: sinatra
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '2'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '2'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rake
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,7 +67,21 @@ dependencies:
|
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '10'
|
70
|
-
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rubocop
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.53.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.53.0
|
84
|
+
description: LSST's Git LFS server
|
71
85
|
email:
|
72
86
|
- meltingice8917@gmail.com
|
73
87
|
- jmatt@lsst.org
|
@@ -77,6 +91,8 @@ extensions: []
|
|
77
91
|
extra_rdoc_files: []
|
78
92
|
files:
|
79
93
|
- ".gitignore"
|
94
|
+
- ".rubocop.yml"
|
95
|
+
- ".travis.yml"
|
80
96
|
- Gemfile
|
81
97
|
- README.md
|
82
98
|
- Rakefile
|
@@ -114,6 +130,5 @@ rubyforge_project:
|
|
114
130
|
rubygems_version: 2.6.14
|
115
131
|
signing_key:
|
116
132
|
specification_version: 4
|
117
|
-
summary: LSST's Git LFS server
|
118
|
-
S3 URLs.
|
133
|
+
summary: LSST's Git LFS server
|
119
134
|
test_files: []
|