rbsync 0.0.9 → 0.0.10

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.
Files changed (4) hide show
  1. data/VERSION +1 -1
  2. data/lib/rbsync.rb +59 -12
  3. data/rbsync.gemspec +2 -2
  4. metadata +4 -4
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.9
1
+ 0.0.10
data/lib/rbsync.rb CHANGED
@@ -79,8 +79,24 @@ require 'fileutils'
79
79
  # rsync.updated_file_only = true
80
80
  # rsync.sync( "src", "dest" )
81
81
  # rsync.sync( "dest", "src" )# swap src to dest , dest to src
82
+ #### TODO:
83
+ ## FileUtils/Dir.chdir をSSH対応に切替える
84
+ ## progress 表示のために fileutils.copy を 自作する
82
85
  class RbSync
83
86
  attr_accessor :conf
87
+ # for ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]
88
+ # File.dirname of cygwin doesn't work corrently for JAPANESE hiragana pathname
89
+ # Cygwinの日本語UTF8/SJIS環境だと「ひらがな」パス名が正しく扱えないのでmonkey patch
90
+ if ((RUBY_PLATFORM =~ /cygwin/) and RUBY_VERSION == "1.8.7")then
91
+ def File.dirname(e)
92
+ paths = e.split("/")
93
+ paths.pop
94
+ paths.join("/")
95
+ end
96
+ def FileUtils.mkdir_p(e)
97
+ `mkdir -p "#{e}"`
98
+ end
99
+ end
84
100
  def initialize()
85
101
  @conf ={}
86
102
  @conf[:update] = false
@@ -91,11 +107,14 @@ class RbSync
91
107
  def find_as_relative(dir_name,excludes=[])
92
108
  files =[]
93
109
  excludes = [] unless excludes
110
+ #todo write this two line . exculude initialize test
111
+ excludes = excludes.split(",") if excludes.class == String
112
+ excludes = [excludes] unless excludes.class == Array
113
+
94
114
  Dir.chdir(dir_name){
95
115
  files = Dir.glob "./**/*", File::FNM_DOTMATCH
96
116
  exclude_files =[]
97
117
  exclude_files = excludes.map{|g| Dir.glob "./**/#{g}",File::FNM_DOTMATCH }
98
- #files.each{|e|pp [e, File.directory?(e)] }
99
118
  files = files.reject{|e| File.directory?(e) }
100
119
  files = files - exclude_files.flatten
101
120
  }
@@ -169,33 +188,40 @@ class RbSync
169
188
  def collet_hash(file_names,basedir,options={})
170
189
  #prepare
171
190
  require 'thread'
191
+ self.patch_digest_base
172
192
  threads =[]
173
193
  output = Hash.new{|s,key| s[key]=[] }
174
194
  q = Queue.new
175
195
  limitsize = options[:hash_limit_size]
176
196
  # compute digests
177
197
  file_names.each{|e| q.push e }
178
- 5.times{
198
+ 3.times{
179
199
  threads.push(
180
200
  Thread.start{
181
201
  while(!q.empty?)
182
202
  name = q.pop
203
+ #$stdout.puts "reading #{name}" if options[:verbose]
204
+ #$stdout.flush if options[:verbose]
183
205
  hash = compute_digest_file(File.expand_path(name,basedir),limitsize)
184
206
  output[hash].push name
185
207
  end
186
208
  }
187
209
  )
188
210
  }
211
+ if options[:verbose] then
212
+ t = Thread.start{
213
+ until(q.empty?)
214
+ puts( "#{q.size}/#{file_names.size}");
215
+ $stdout.flush;
216
+ sleep 1;
217
+ end
218
+ }
219
+ threads.push(t )
220
+ end
189
221
  threads.each{|t|t.join}
190
222
  return output
191
223
  end
192
- # compute digest md5
193
- # ==limitsize
194
- # If file size is very large,
195
- # and a few bytes at head of file is enough to compare.
196
- # for speed-up, Set limit size to enable to avoid reading a whole of file.
197
- # もしファイルがとても巨大で、かつ、先頭の数キロバイトが比較に十分であれば、limitsize 以降をスキップする
198
- def compute_digest_file(filename, limitsize=nil)
224
+ def patch_digest_base()
199
225
  require 'digest/md5'
200
226
  s = %{
201
227
  class Digest::Base
@@ -213,6 +239,14 @@ class RbSync
213
239
  end
214
240
  }
215
241
  eval s
242
+ end
243
+ # compute digest md5
244
+ # ==limitsize
245
+ # If file size is very large,
246
+ # and a few bytes at head of file is enough to compare.
247
+ # for speed-up, Set limit size to enable to avoid reading a whole of file.
248
+ # もしファイルがとても巨大で、かつ、先頭の数キロバイトが比較に十分であれば、limitsize 以降をスキップする
249
+ def compute_digest_file(filename, limitsize=nil)
216
250
  Digest::MD5.open(filename,limitsize).hexdigest
217
251
  end
218
252
 
@@ -314,8 +348,10 @@ class RbSync
314
348
  #main
315
349
  copy_thread = Thread.start{
316
350
  FileUtils.mkdir_p File.dirname(e[1]) unless File.exists?(File.dirname(e[1]))
351
+ ## todo copy file as stream for progress
317
352
  FileUtils.copy( e[0] , e[1] ,{:preserve=>self.preserve?,:verbose=>self.verbose? } )
318
353
  }
354
+
319
355
  #progress of each file
320
356
  progress_thread = nil
321
357
  if(@conf[:progress])
@@ -324,11 +360,22 @@ class RbSync
324
360
  bar.size = 30
325
361
  src_size = File.size(e[0])
326
362
  dst_size = -1
327
- bar.start("copying #{e[0]} to #{e[1]}")
363
+ bar.start("copying #{e[0]} \r\n to #{e[1]}")
364
+ cnt = 0
328
365
  while(src_size!=dst_size)
366
+ unless File.exists?(e[1]) then
367
+ cnt = cnt + 1
368
+ if cnt > 10 then
369
+ puts "copying #{e[1]} timeout error"
370
+ throw Error
371
+ break
372
+ end
373
+ sleep 0.05
374
+ next
375
+ end
329
376
  src_size = File.size(e[0]).to_f
330
377
  dst_size = File.size(e[1]).to_f
331
- break if dst_size == 0
378
+ next if dst_size == 0 # preven zero divide
332
379
  percent = dst_size/src_size*100
333
380
  bar.progress(percent.to_int)
334
381
  sleep 0.2
@@ -343,7 +390,7 @@ class RbSync
343
390
  def sync(src,dest,options={})
344
391
  options[:excludes] = self.excludes.push(options[:excludes]).flatten.uniq if options[:excludes]
345
392
  options[:update] = @conf[:update] if options[:update] == nil
346
- options[:check_hash] = options[:check_hash] and @conf[:check_hash]
393
+ options[:check_hash] = options[:check_hash] or @conf[:check_hash]
347
394
  options[:hash_limit_size] = @conf[:hash_limit_size] if options[:hash_limit_size] == nil
348
395
  options[:overwrite] = @conf[:overwrite] if options[:overwrite] == nil
349
396
  options[:overwrite] = false if options[:no_overwrite]
data/rbsync.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rbsync}
8
- s.version = "0.0.9"
8
+ s.version = "0.0.10"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["takuya"]
12
- s.date = %q{2011-06-15}
12
+ s.date = %q{2011-07-10}
13
13
  s.description = %q{rbsync is sync file utility.this can sync directory even if filename differed.checking content insted.}
14
14
  s.email = %q{takuya.1st@gmail}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbsync
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 9
10
- version: 0.0.9
9
+ - 10
10
+ version: 0.0.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - takuya
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-15 00:00:00 +09:00
18
+ date: 2011-07-10 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency