s3repo 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/s3repo +24 -0
- data/lib/s3repo.rb +2 -0
- data/lib/s3repo/base.rb +14 -0
- data/lib/s3repo/cache.rb +18 -8
- data/lib/s3repo/client.rb +5 -0
- data/lib/s3repo/metadata.rb +41 -0
- data/lib/s3repo/repo.rb +20 -15
- data/lib/s3repo/version.rb +5 -0
- data/s3repo.gemspec +4 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e1bc9926cf762452f2d9a97ce3285aff708d2fd
|
4
|
+
data.tar.gz: 4b8c64c255cf57d2d42f542a3af02d0b42cfb320
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9f8031ab8c1ccdd6cfe815028595b7cceb82084f1cfe7c8ef70bf4bfdf6d7cd97ebb986d87b923bc6b383929df9738529407399b03a9b59905280ed1047f855
|
7
|
+
data.tar.gz: 7f75e8489ecbc9dd87ea43717ae0dec64c034602731a472e45a80a6ac890ab0161f29e6134223c8bcfaa0ef875f7a9a4650c8cdf22294b6b697df4d54acae90f
|
data/bin/s3repo
CHANGED
@@ -2,3 +2,27 @@
|
|
2
2
|
|
3
3
|
require 's3repo'
|
4
4
|
require 'mercenary'
|
5
|
+
|
6
|
+
Mercenary.program(:s3repo) do |p|
|
7
|
+
p.version S3Repo::VERSION
|
8
|
+
p.description 'Package management tool for Archlinux repos'
|
9
|
+
p.syntax 's3repo <subcommand> [args]'
|
10
|
+
|
11
|
+
p.command(:build) do |c|
|
12
|
+
c.syntax 'build'
|
13
|
+
c.description 'Build package files from PKGBUILDs'
|
14
|
+
|
15
|
+
c.action do
|
16
|
+
S3Repo.new.build_packages Dir.glob('*/PKGBUILD')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
p.command(:upload) do |c|
|
21
|
+
c.syntax 'upload'
|
22
|
+
c.description 'Upload packages to repo'
|
23
|
+
|
24
|
+
c.action do
|
25
|
+
S3Repo.new.add_packages Dir.glob('*/*.pkg.tar.xz')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/s3repo.rb
CHANGED
data/lib/s3repo/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'English'
|
2
|
+
|
1
3
|
module S3Repo
|
2
4
|
##
|
3
5
|
# Base object, used to provide common attributes
|
@@ -8,6 +10,12 @@ module S3Repo
|
|
8
10
|
|
9
11
|
private
|
10
12
|
|
13
|
+
def run(cmd)
|
14
|
+
results = `#{cmd} 2>&1`
|
15
|
+
return results if $CHILD_STATUS.success?
|
16
|
+
fail "Failed running #{cmd}:\n#{results}"
|
17
|
+
end
|
18
|
+
|
11
19
|
def bucket
|
12
20
|
@bucket ||= @options[:bucket] || ENV['S3_BUCKET']
|
13
21
|
return @bucket if @bucket
|
@@ -17,5 +25,11 @@ module S3Repo
|
|
17
25
|
def client
|
18
26
|
@client ||= @options[:client] || Client.new(bucket: bucket)
|
19
27
|
end
|
28
|
+
|
29
|
+
def file_cache
|
30
|
+
@file_cache ||= @options[:file_cache] || Cache.new(
|
31
|
+
client: client, tmpdir: @options[:tmpdir]
|
32
|
+
)
|
33
|
+
end
|
20
34
|
end
|
21
35
|
end
|
data/lib/s3repo/cache.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
2
3
|
require 'tempfile'
|
3
4
|
|
4
5
|
module S3Repo
|
5
6
|
##
|
6
7
|
# Cache object, stores S3 objects on disk
|
7
8
|
class Cache < Base
|
8
|
-
TMPDIRS = [ENV['S3REPO_TMPDIR'], ENV['TMPDIR'], '/tmp/s3repo']
|
9
|
+
TMPDIRS = [ENV['S3REPO_TMPDIR'], ENV['TMPDIR'], Dir.tmpdir, '/tmp/s3repo']
|
9
10
|
|
10
11
|
def initialize(params = {})
|
11
12
|
super
|
@@ -13,15 +14,19 @@ module S3Repo
|
|
13
14
|
end
|
14
15
|
|
15
16
|
def serve(key, refresh = true)
|
16
|
-
|
17
|
-
download(key, path) if refresh || !cached?(path)
|
18
|
-
File.open(path) { |fh| fh.read }
|
17
|
+
File.open(download(key, refresh)) { |fh| fh.read }
|
19
18
|
rescue Aws::S3::Errors::NoSuchKey
|
20
19
|
nil
|
21
20
|
end
|
22
21
|
|
23
22
|
private
|
24
23
|
|
24
|
+
def download(key, refresh = true)
|
25
|
+
path = expand_path key
|
26
|
+
get_object(key, path) if refresh || !cached?(path)
|
27
|
+
path
|
28
|
+
end
|
29
|
+
|
25
30
|
def expand_path(key)
|
26
31
|
File.absolute_path(key, cachedir)
|
27
32
|
end
|
@@ -30,17 +35,22 @@ module S3Repo
|
|
30
35
|
File.exist? path
|
31
36
|
end
|
32
37
|
|
33
|
-
def
|
38
|
+
def get_object(key, path)
|
34
39
|
FileUtils.mkdir_p File.dirname(path)
|
40
|
+
object = atomic_get_object(key, path)
|
41
|
+
etags[key] = object.etag
|
42
|
+
rescue Aws::S3::Errors::NotModified
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
def atomic_get_object(key, path)
|
35
47
|
tmpfile = Tempfile.create(key, partialdir)
|
36
48
|
object = client.get_object(
|
37
49
|
key: key, if_none_match: etags[key], response_target: tmpfile
|
38
50
|
)
|
39
51
|
tmpfile.close
|
40
52
|
File.rename tmpfile.path, path
|
41
|
-
|
42
|
-
rescue Aws::S3::Errors::NotModified
|
43
|
-
return
|
53
|
+
object
|
44
54
|
end
|
45
55
|
|
46
56
|
def etags
|
data/lib/s3repo/client.rb
CHANGED
@@ -13,6 +13,11 @@ module S3Repo
|
|
13
13
|
@api.respond_to?(method, include_all) || super
|
14
14
|
end
|
15
15
|
|
16
|
+
def upload!(key, path)
|
17
|
+
puts "Uploading #{key}"
|
18
|
+
put_object key: key, body: File.open(path) { |fh| fh.read }
|
19
|
+
end
|
20
|
+
|
16
21
|
private
|
17
22
|
|
18
23
|
def method_missing(method, *args, &block)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module S3Repo
|
5
|
+
##
|
6
|
+
# Metadata object, represents repo's DB file
|
7
|
+
class Metadata < Base
|
8
|
+
def initialize(params = {})
|
9
|
+
super
|
10
|
+
FileUtils.mkdir_p db_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_packages(paths)
|
14
|
+
@db_path = nil
|
15
|
+
paths.each do |path|
|
16
|
+
puts "Adding #{File.basename(path)} to repo.db"
|
17
|
+
run("repo-add #{db_path} #{path}")
|
18
|
+
end
|
19
|
+
client.upload!('repo.db', db_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def db_path
|
25
|
+
@db_path ||= download_db
|
26
|
+
end
|
27
|
+
|
28
|
+
def download_db
|
29
|
+
tmpfile = Tempfile.create(['repo', '.db.tar.xz'], db_dir)
|
30
|
+
tmpfile << file_cache.serve('repo.db')
|
31
|
+
tmpfile.close
|
32
|
+
tmpfile.path
|
33
|
+
end
|
34
|
+
|
35
|
+
def db_dir
|
36
|
+
@db_dir ||= File.absolute_path(
|
37
|
+
@options[:tmpdir] || Cache::TMPDIRS.compact.first
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/s3repo/repo.rb
CHANGED
@@ -8,12 +8,25 @@ module S3Repo
|
|
8
8
|
super
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
11
|
+
def build_packages(paths)
|
12
|
+
paths.each do |path|
|
13
|
+
dir = File.dirname(path)
|
14
|
+
puts "Building #{File.basename(dir)}"
|
15
|
+
Dir.chdir(dir) { run 'makepkg -f' }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_packages(paths)
|
20
|
+
paths.each do |path|
|
21
|
+
key = File.basename(path)
|
22
|
+
next if include? key
|
23
|
+
client.upload!(key, path)
|
24
|
+
end
|
25
|
+
metadata.add_packages(paths)
|
13
26
|
end
|
14
27
|
|
15
28
|
def packages
|
16
|
-
|
29
|
+
package_cache.cache { parse_packages }
|
17
30
|
end
|
18
31
|
|
19
32
|
def include?(key)
|
@@ -27,20 +40,12 @@ module S3Repo
|
|
27
40
|
|
28
41
|
private
|
29
42
|
|
30
|
-
def
|
31
|
-
@
|
32
|
-
end
|
33
|
-
|
34
|
-
def meta_cache
|
35
|
-
@meta_cache ||= BasicCache::TimeCache.new lifetime: 600
|
43
|
+
def metadata
|
44
|
+
@metadata ||= Metadata.new(client: client, file_cache: file_cache)
|
36
45
|
end
|
37
46
|
|
38
|
-
def
|
39
|
-
|
40
|
-
bucket: bucket,
|
41
|
-
key: file,
|
42
|
-
body: File.open(file) { |fh| fh.read }
|
43
|
-
)
|
47
|
+
def package_cache
|
48
|
+
@package_cache ||= BasicCache::TimeCache.new lifetime: 600
|
44
49
|
end
|
45
50
|
|
46
51
|
def parse_packages
|
data/s3repo.gemspec
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib/', __FILE__)
|
2
|
+
require 's3repo/version'
|
3
|
+
|
1
4
|
Gem::Specification.new do |s|
|
2
5
|
s.name = 's3repo'
|
3
|
-
s.version =
|
6
|
+
s.version = S3Repo::VERSION
|
4
7
|
s.date = Time.now.strftime('%Y-%m-%d')
|
5
8
|
|
6
9
|
s.summary = 'S3 Archlinux repo library'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3repo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Les Aker
|
@@ -142,7 +142,9 @@ files:
|
|
142
142
|
- lib/s3repo/base.rb
|
143
143
|
- lib/s3repo/cache.rb
|
144
144
|
- lib/s3repo/client.rb
|
145
|
+
- lib/s3repo/metadata.rb
|
145
146
|
- lib/s3repo/repo.rb
|
147
|
+
- lib/s3repo/version.rb
|
146
148
|
- s3repo.gemspec
|
147
149
|
- spec/s3repo_spec.rb
|
148
150
|
- spec/spec_helper.rb
|