s3repo 0.0.3 → 0.1.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/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
|