smart_s3_sync 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b681c8704ec7dedf9b0f913627c599c3f432cdb
4
- data.tar.gz: d4d746948fb98f23fb27663be869a7c16d26fc18
3
+ metadata.gz: 14666867e372ebd1ca9f50414a68f497d84fe1d4
4
+ data.tar.gz: a650d738ab17f11d126b11ea54b4f6e1ced3398c
5
5
  SHA512:
6
- metadata.gz: 0b5a509bbaf42a85515108f0619608c9f2facebfd2a41455ecbb19f3f5cba3ae544e2e91589a4893018e0f3e749572d176b8aadba8076eb093ea2e7174d231d8
7
- data.tar.gz: cc2fc30d19637dffea7f738b894d16ead18f4b55de0dd45bffe5d151057bd74797feaae39b9fb3ef0f56bfee7162982217c0a66ffb3d0bd07430c6dd08973b52
6
+ metadata.gz: e1341e63a50e8d14192964a78514fdba32262fc304ca0951cf99b23b6b7a5820d129966f01835166f76065c3fda76179aaacad56f5e138b624a698de7996b79a
7
+ data.tar.gz: 62a25fa9228c46df83961d11aa3265138ab9798e52f3276a9fe5fac460ff8866ca38173068db441ef9050c2d1754e95756150a29839d95adcf02027d4731b5f6
data/bin/s5 CHANGED
@@ -8,11 +8,11 @@ def quit(message)
8
8
  exit 1
9
9
  end
10
10
 
11
- if ARGV.length != 2
12
- quit "Usage: #{File.basename($0)} REMOTE_URI LOCAL_DIR"
11
+ if ARGV.length < 2
12
+ quit "Usage: #{File.basename($0)} REMOTE_URI LOCAL_DIR [options]"
13
13
  end
14
14
 
15
- remote_uri, local_dir = ARGV
15
+ remote_uri, local_dir = ARGV[0], ARGV[1]
16
16
 
17
17
  remote_uri = URI.parse(remote_uri)
18
18
 
@@ -33,8 +33,17 @@ if !(access_key_id && access_key_secret)
33
33
  quit "S3_ACCESS_KEY_ID and S3_SECRET_ACCESS_KEY environment variables are required"
34
34
  end
35
35
 
36
+ options = {}
37
+
38
+ if ARGV.length > 2
39
+ ARGV[2, ARGV.length-2].each do |opt|
40
+ name, val = opt.split('=', 2)
41
+ options[name.sub(/^--/, '')] = val
42
+ end
43
+ end
44
+
36
45
  SmartS3Sync.sync(local_dir, bucket, {
37
46
  provider: 'AWS',
38
47
  aws_access_key_id: access_key_id,
39
48
  aws_secret_access_key: access_key_secret
40
- }, prefix)
49
+ }, prefix, options)
@@ -6,7 +6,7 @@ Fog.credentials = { :path_style => true }
6
6
 
7
7
  module SmartS3Sync
8
8
 
9
- def self.sync(dir, remote_dir, connection_options, remote_prefix=nil)
9
+ def self.sync(dir, remote_dir, connection_options, remote_prefix=nil, sync_options={})
10
10
  table = FileTable.new(dir, remote_prefix)
11
11
 
12
12
  bucket = Fog::Storage.new(connection_options).directories.
@@ -32,7 +32,7 @@ module SmartS3Sync
32
32
  $stderr.puts "Status: with an effective total of #{table.to_copy.inject(0){|coll, obj| coll + obj.destinations.length }} files (#{table.to_copy.map{|x| x.size * x.destinations.length }.inject(&:+)} bytes)"
33
33
 
34
34
  # And copy them to the right places
35
- table.copy!(bucket)
35
+ table.copy!(bucket, sync_options)
36
36
 
37
37
  # sweep through and remove all files not in the cloud
38
38
  Dir.glob(File.join(dir, '**/*')) do |file|
@@ -17,13 +17,13 @@ module SmartS3Sync
17
17
  @map[digest].add_destination(destination_filename) # and add local path to the target
18
18
  end
19
19
 
20
- def copy!(fog_dir)
20
+ def copy!(fog_dir, sync_options={})
21
21
  @map.sort_by do |(k, target)|
22
22
  1_000_000_000 * (target.local_source.nil? ? 0 : -1) -
23
23
  1_000_000 * target.destinations.length +
24
24
  1/1_048_576 * target.size
25
25
  end.each do |(k, target)|
26
- target.copy!(fog_dir)
26
+ target.copy!(fog_dir, sync_options)
27
27
  end
28
28
  end
29
29
 
@@ -26,33 +26,33 @@ module SmartS3Sync
26
26
  end
27
27
  end
28
28
 
29
- def copy!(fog_dir)
29
+ def copy!(fog_dir, sync_options={})
30
30
  # If every copy in the cloud is already present, the
31
31
  # number of destinations will be 0 - there is no work
32
32
  # left to do.
33
33
  if destinations.length > 0
34
34
  if local_source.nil? # we prefer to not have to download
35
- copy_from_fog(fog_dir)
35
+ copy_from_fog(fog_dir, sync_options)
36
36
  else
37
- copy_from_local(local_source)
37
+ copy_from_local(local_source, sync_options)
38
38
  end
39
39
  end
40
40
  end
41
41
 
42
42
  private
43
43
 
44
- def copy_from_fog(fog_dir)
44
+ def copy_from_fog(fog_dir, sync_options={})
45
45
  $stderr.puts "Downloading #{remote_filename}"
46
46
  tries = 0
47
47
  file = nil
48
48
  begin
49
- file = download(fog_dir) # basically, just try.
49
+ file = download(fog_dir, sync_options) # basically, just try.
50
50
 
51
51
  if file_hash(file.path) != digest.to_s
52
52
  raise "Hash mismatch downloading #{remote_filename}"
53
53
  end
54
54
 
55
- copy_from_local(file.path) # with a copy locally, the job is the same
55
+ copy_from_local(file.path, sync_options) # with a copy locally, the job is the same
56
56
  @local_source = destinations.shift # we now have a local copy!
57
57
  rescue StandardError => e
58
58
  if tries < 5
@@ -68,7 +68,7 @@ module SmartS3Sync
68
68
  end
69
69
  end
70
70
 
71
- def copy_from_local(source)
71
+ def copy_from_local(source, sync_options={})
72
72
  $stderr.puts "Linking #{destinations.join(', ')}"
73
73
  destinations.each do |dest|
74
74
  FileUtils.mkdir_p(File.dirname(dest), :mode => 0755)
@@ -89,11 +89,11 @@ module SmartS3Sync
89
89
  DigestCache.digest(path)
90
90
  end
91
91
 
92
- def download(fog_dir)
92
+ def download(fog_dir, sync_options={})
93
93
  dir = File.dirname(destinations[0])
94
94
  FileUtils.mkdir_p(dir)
95
95
  Tempfile.new(".#{digest}", dir).tap do |file|
96
- fog_dir.files.get(remote_filename) do |chunk, left, total|
96
+ rfile = fog_dir.files.get(remote_filename) do |chunk, left, total|
97
97
  if (chunk.size + left == total) # fog might restart in the middle
98
98
  file.rewind
99
99
  end
@@ -102,6 +102,11 @@ module SmartS3Sync
102
102
  end
103
103
  file.close
104
104
  File.chmod(0644, file.path)
105
+ if sync_options.has_key?('set-timestamp-from-metadata')
106
+ time = rfile.metadata[sync_options['set-timestamp-from-metadata']]
107
+ time &&= Time.at(time.to_i)
108
+ time && File.utime(time, time, file)
109
+ end
105
110
  end
106
111
  end
107
112
  end
@@ -1,3 +1,3 @@
1
1
  module SmartS3Sync
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.16"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_s3_sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Rhoden
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-30 00:00:00.000000000 Z
11
+ date: 2014-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3