qdumpfs 1.5.3 → 1.6.1

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
  SHA256:
3
- metadata.gz: e087de6a6bbd303a4aa627978ac3cb6c17cfb082b3bf4c74aab91294f1cdc12b
4
- data.tar.gz: '082d2c1e1db12c650c5b8212f4a2cdf33fe723c2f2bd3684acbcd3e80ca593b3'
3
+ metadata.gz: d2912844a928c79223f682ec29561480c360c45bdc18ee9590b6623bbe04d95d
4
+ data.tar.gz: 9dac9f189d8948cbebf0a929a01763557300ac676679667bea3d6f2e0a652969
5
5
  SHA512:
6
- metadata.gz: ad74b997b6dad5e6a1bc3b3406a95831dbf2ced159ea64bb1acb47e9cec4efcc16916cd1ae3bd78283a1a600117d92a8f41628bc2fb28eb23d2275e429ba8fdb
7
- data.tar.gz: d025337b18fb68fbdb73f5bc2c9e1ec347659f3b35063fa92c2c9f0329d8bd1aa9bacc3f75d7347072e3af59dcf138ebbdcae4df7efe9a60f8610d0935bc9ba3
6
+ metadata.gz: 6769d780454a153e62e455ded96760971d62b82533773b72b872165e6cd7ec8bb96f661f7e87652f543c6f5e3af5631597231f937a8a2b4f44d1011a58b2b6d9
7
+ data.tar.gz: 882a8b0d152355f900c8d48e02458a53c9c898dbd6ee1516b33383a54ba6e023b807e197b0a2b87578279e71a70255b31f4498bc5170e4edca5c7ec2eb5289cf
data/.gitignore CHANGED
@@ -11,10 +11,13 @@ list*
11
11
  log.txt
12
12
  *test.cmd
13
13
  test*.cmd
14
+ test*.sh
14
15
  *.log
15
16
  /data/to
16
17
  /data/to2
17
-
18
-
18
+ .idea/workspace.xml
19
+ .idea/tasks.xml
20
+ .idea/dataSources.xml
21
+ .idea/dataSources.local.xml
19
22
  /sync_d.cmd
20
- /test.
23
+ /test
data/.idea/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
9
+ # GitHub Copilot persisted chat sessions
10
+ /copilot/chatSessions
@@ -0,0 +1,16 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="RubyArgCount" enabled="false" level="ERROR" enabled_by_default="false" />
5
+ <inspection_tool class="RubyCaseWithoutElseBlockInspection" enabled="false" level="WARNING" enabled_by_default="false" />
6
+ <inspection_tool class="RubyTooManyInstanceVariablesInspection" enabled="false" level="WARNING" enabled_by_default="false" />
7
+ <inspection_tool class="RubyTooManyMethodsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
8
+ <inspection_tool class="RubyUnnecessaryReturnStatement" enabled="false" level="WARNING" enabled_by_default="false" />
9
+ <inspection_tool class="RubyUnusedLocalVariable" enabled="false" level="WARNING" enabled_by_default="false" />
10
+ <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
11
+ <option name="processCode" value="true" />
12
+ <option name="processLiterals" value="true" />
13
+ <option name="processComments" value="true" />
14
+ </inspection_tool>
15
+ </profile>
16
+ </component>
data/.idea/misc.xml ADDED
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" project-jdk-name="rbenv: 3.1.3" project-jdk-type="RUBY_SDK" />
4
+ </project>
data/.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/qdumpfs.iml" filepath="$PROJECT_DIR$/.idea/qdumpfs.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
data/.idea/qdumpfs.iml ADDED
@@ -0,0 +1,91 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="ModuleRunConfigurationManager">
4
+ <shared />
5
+ </component>
6
+ <component name="NewModuleRootManager">
7
+ <content url="file://$MODULE_DIR$">
8
+ <sourceFolder url="file://$MODULE_DIR$/features" isTestSource="true" />
9
+ <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
10
+ <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
11
+ <excludeFolder url="file://$MODULE_DIR$/.idea/copilot/chatSessions" />
12
+ </content>
13
+ <orderEntry type="inheritedJdk" />
14
+ <orderEntry type="sourceFolder" forTests="false" />
15
+ <orderEntry type="module-library">
16
+ <library name="minitest (v5.22.3) [path][gem]" type="rubylib">
17
+ <properties>
18
+ <option name="version" value="4" />
19
+ </properties>
20
+ <CLASSES>
21
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/minitest-5.22.3/lib" />
22
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/minitest-5.22.3/test" />
23
+ </CLASSES>
24
+ <JAVADOC />
25
+ <SOURCES>
26
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/minitest-5.22.3/lib" />
27
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/minitest-5.22.3/test" />
28
+ </SOURCES>
29
+ <excluded>
30
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/minitest-5.22.3/test" />
31
+ </excluded>
32
+ </library>
33
+ </orderEntry>
34
+ <orderEntry type="module-library">
35
+ <library name="rake (v13.1.0) [path][gem]" type="rubylib">
36
+ <properties>
37
+ <option name="version" value="4" />
38
+ </properties>
39
+ <CLASSES>
40
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/doc" />
41
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/exe" />
42
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/lib" />
43
+ </CLASSES>
44
+ <JAVADOC />
45
+ <SOURCES>
46
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/doc" />
47
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/exe" />
48
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/lib" />
49
+ </SOURCES>
50
+ <excluded>
51
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/doc" />
52
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.1.0/gems/rake-13.1.0/exe" />
53
+ </excluded>
54
+ </library>
55
+ </orderEntry>
56
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v2.4.20, rbenv: 3.1.3) [gem]" level="application" />
57
+ </component>
58
+ <component name="RakeTasksCache-v2">
59
+ <option name="myRootTask">
60
+ <RakeTaskImpl id="rake">
61
+ <subtasks>
62
+ <RakeTaskImpl description="Build qdumpfs-1.6.1.gem into the pkg directory" fullCommand="build" id="build" />
63
+ <RakeTaskImpl id="build">
64
+ <subtasks>
65
+ <RakeTaskImpl description="Generate SHA512 checksum if qdumpfs-1.6.1.gem into the checksums directory" fullCommand="build:checksum" id="checksum" />
66
+ </subtasks>
67
+ </RakeTaskImpl>
68
+ <RakeTaskImpl description="Remove any temporary products" fullCommand="clean" id="clean" />
69
+ <RakeTaskImpl description="Remove any generated files" fullCommand="clobber" id="clobber" />
70
+ <RakeTaskImpl description="Build and install qdumpfs-1.6.1.gem into system gems" fullCommand="install" id="install" />
71
+ <RakeTaskImpl id="install">
72
+ <subtasks>
73
+ <RakeTaskImpl description="Build and install qdumpfs-1.6.1.gem into system gems without network access" fullCommand="install:local" id="local" />
74
+ </subtasks>
75
+ </RakeTaskImpl>
76
+ <RakeTaskImpl description="Create tag v1.6.1 and build and push qdumpfs-1.6.1.gem to rubygems.org" fullCommand="release[remote]" id="release[remote]" />
77
+ <RakeTaskImpl description="Run tests" fullCommand="test" id="test" />
78
+ <RakeTaskImpl description="" fullCommand="default" id="default" />
79
+ <RakeTaskImpl description="" fullCommand="release" id="release" />
80
+ <RakeTaskImpl id="release">
81
+ <subtasks>
82
+ <RakeTaskImpl description="" fullCommand="release:guard_clean" id="guard_clean" />
83
+ <RakeTaskImpl description="" fullCommand="release:rubygem_push" id="rubygem_push" />
84
+ <RakeTaskImpl description="" fullCommand="release:source_control_push" id="source_control_push" />
85
+ </subtasks>
86
+ </RakeTaskImpl>
87
+ </subtasks>
88
+ </RakeTaskImpl>
89
+ </option>
90
+ </component>
91
+ </module>
data/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qdumpfs (1.5.3)
4
+ qdumpfs (1.6.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- minitest (5.19.0)
10
- rake (13.0.6)
9
+ minitest (5.22.3)
10
+ rake (13.1.0)
11
11
 
12
12
  PLATFORMS
13
13
  x64-mingw32
@@ -20,4 +20,4 @@ DEPENDENCIES
20
20
  rake (>= 12.3.3)
21
21
 
22
22
  BUNDLED WITH
23
- 2.2.33
23
+ 2.4.20
@@ -68,6 +68,7 @@ module Qdumpfs
68
68
  class NullMatcher
69
69
  def initialize(options = {})
70
70
  end
71
+ # @param [Object] path
71
72
  def exclude?(path)
72
73
  false
73
74
  end
data/lib/qdumpfs/util.rb CHANGED
@@ -35,7 +35,8 @@ class File
35
35
  begin
36
36
  File.unlink(dest) if File.anything_exist?(dest)
37
37
  File.symlink(src, dest)
38
- rescue
38
+ rescue
39
+ puts "force_symlink fails #{src} #{dest}"
39
40
  end
40
41
  end
41
42
 
@@ -65,10 +66,10 @@ module QdumpfsFind
65
66
  def find(logger, *paths)
66
67
  block_given? or return enum_for(__method__, *paths)
67
68
  paths.collect!{|d|
68
- raise Errno::ENOENT unless File.exist?(d);
69
+ raise Errno::ENOENT unless File.exist?(d)
69
70
  d.dup
70
71
  }
71
- while file = paths.shift
72
+ while (file = paths.shift)
72
73
  catch(:prune) do
73
74
  yield file.dup.taint
74
75
  begin
@@ -77,7 +78,7 @@ module QdumpfsFind
77
78
  logger.print("File.lstat path=#{file} error=#{e.message}")
78
79
  next
79
80
  end
80
- if s.directory? then
81
+ if s.directory?
81
82
  begin
82
83
  fs = Dir.entries(file, :encoding=>'UTF-8')
83
84
  rescue => e
@@ -116,12 +117,14 @@ module QdumpfsUtils
116
117
  block = r.sysread(block_size)
117
118
  w.syswrite(block)
118
119
  i += 1
119
- @written_bytes += block.size
120
+ @write_bytes += block.size
120
121
  end
121
122
  }
122
123
  }
123
- rescue EOFError => e
124
- # puts e.message, e.backtrace
124
+ rescue EOFError
125
+ # この実装だとファイルサイズがblock_sizeより小さい場合にEOFErrorが発生する
126
+ # それはしかたがないので無視する
127
+ # puts e.message
125
128
  end
126
129
  unless FileTest.file?(dest)
127
130
  raise "copy_file fails #{dest}"
@@ -136,7 +139,12 @@ module QdumpfsUtils
136
139
  File.utime(stat.atime, stat.mtime, dest)
137
140
  File.chmod(stat.mode, dest) # not necessary. just to make sure
138
141
  end
139
-
142
+
143
+ def link(src, dest)
144
+ @link_bytes += File.size(src)
145
+ File.force_link(src, dest)
146
+ end
147
+
140
148
  def convert_bytes(bytes)
141
149
  if bytes < 1024
142
150
  sprintf("%dB", bytes)
@@ -189,7 +197,7 @@ module QdumpfsUtils
189
197
  type = "new_file"
190
198
  when "link"
191
199
  type = "symlink"
192
- end
200
+ end
193
201
  end
194
202
  end
195
203
  return type
@@ -1,4 +1,4 @@
1
1
  module Qdumpfs
2
- VERSION = "1.5.3"
2
+ VERSION = "1.6.1"
3
3
  end
4
4
 
data/lib/qdumpfs.rb CHANGED
@@ -68,8 +68,8 @@ module Qdumpfs
68
68
  command = Command.new(option)
69
69
  command.run
70
70
  rescue => e
71
+ puts e.message + "\n"
71
72
  if option.debug
72
- p e.message
73
73
  p e.backtrace
74
74
  end
75
75
  puts opt.help
@@ -104,8 +104,9 @@ module Qdumpfs
104
104
  private
105
105
  def log_result(src, today, elapsed)
106
106
  time = Time.now.strftime("%Y-%m-%dT%H:%M:%S")
107
- bytes = convert_bytes(@written_bytes)
108
- msg = sprintf("%s: %s -> %s (in %.2f sec, %s written)\n", time, src, today, elapsed, bytes)
107
+ write_bytes = convert_bytes(@write_bytes)
108
+ link_bytes = convert_bytes(@link_bytes)
109
+ msg = sprintf("%s: %s -> %s (in %.2f sec, %s write, %s link)\n", time, src, today, elapsed, write_bytes, link_bytes)
109
110
  log(msg)
110
111
  log("error files:\n")
111
112
  i = 1
@@ -136,7 +137,7 @@ module Qdumpfs
136
137
  when "directory"
137
138
  FileUtils.mkpath(today)
138
139
  when "unchanged"
139
- File.force_link(latest, today)
140
+ link(latest, today)
140
141
  when "updated"
141
142
  copy(src, today)
142
143
  when "new_file"
@@ -181,16 +182,17 @@ module Qdumpfs
181
182
  # today: 差分バックアップ先ディレクトリ ex)j:/to/backup1/2019/05/10/home
182
183
  dirs = {};
183
184
  QdumpfsFind.find(@opt.logger, src) do |s| # path of the source file
184
- if @opt.matcher.exclude?(s)
185
- if File.lstat(s).directory? then Find.prune() else next end
186
- end
187
- # バックアップ元ファイルのパスからディレクトリ部分を削除
188
- r = make_relative_path(s, src)
189
- # 既存バックアップファイルのパス
190
- l = File.join(latest, r) # path of the latest snapshot
191
- # 新規バックアップファイルのパス
192
- t = File.join(today, r) # path of the today's snapshot
193
185
  begin
186
+ if @opt.matcher.exclude?(s)
187
+ if File.lstat(s).directory? then Find.prune else next end
188
+ end
189
+ # バックアップ元ファイルのパスからディレクトリ部分を削除
190
+ r = make_relative_path(s, src)
191
+ # 既存バックアップファイルのパス
192
+ l = File.join(latest, r) # path of the latest snapshot
193
+ # 新規バックアップファイルのパス
194
+ t = File.join(today, r) # path of the today's snapshot
195
+
194
196
  # ファイルのアップデート
195
197
  update_file(s, l, t)
196
198
  dirs[t] = File.stat(s) if File.ftype(s) == "directory"
@@ -207,12 +209,13 @@ module Qdumpfs
207
209
  def recursive_copy(src, dst)
208
210
  dirs = {}
209
211
  QdumpfsFind.find(@opt.logger, src) do |s|
210
- if @opt.matcher.exclude?(s)
211
- if File.lstat(s).directory? then Find.prune() else next end
212
- end
213
- r = make_relative_path(s, src)
214
- t = File.join(dst, r)
215
212
  begin
213
+ if @opt.matcher.exclude?(s)
214
+ if File.lstat(s).directory? then Find.prune else next end
215
+ end
216
+ r = make_relative_path(s, src)
217
+ t = File.join(dst, r)
218
+
216
219
  type = detect_type(s)
217
220
  report(type, s)
218
221
  next if @opt.dry_run
@@ -227,7 +230,7 @@ module Qdumpfs
227
230
  # just ignore it
228
231
  else
229
232
  raise "#{type}: shouldn't be reached here"
230
- end
233
+ end
231
234
  chown_if_root(type, s, t)
232
235
  dirs[t] = File.stat(s) if File.ftype(s) == "directory"
233
236
  rescue => e
@@ -311,7 +314,8 @@ module Qdumpfs
311
314
 
312
315
  log("##### backup start #####")
313
316
 
314
- @written_bytes = 0
317
+ @write_bytes = 0
318
+ @link_bytes = 0
315
319
  @error_files = []
316
320
  start_time = Time.now
317
321
  if @opt.backup_at
@@ -362,7 +366,8 @@ module Qdumpfs
362
366
  @opt.validate_directories(2)
363
367
 
364
368
  start_time = Time.now
365
- @written_bytes = 0
369
+ @write_bytes = 0
370
+ @link_bytes = 0
366
371
  @error_files = []
367
372
  src = @opt.src
368
373
  dst = @opt.dst
@@ -421,7 +426,7 @@ module Qdumpfs
421
426
  file = @opt.open_verifyfile
422
427
 
423
428
  start_time = Time.now
424
- add_log("##### verify start #{fmt(start_time)} #####")
429
+ log("##### verify start #{fmt(start_time)} #####")
425
430
 
426
431
  src_count, dst_count = do_verify(src, dst)
427
432
 
@@ -432,7 +437,7 @@ module Qdumpfs
432
437
 
433
438
  end_time = Time.now
434
439
  diff = time_diff(start_time, end_time)
435
- add_log("##### list end #{fmt(end_time)} diff=#{diff} #####")
440
+ log("##### list end #{fmt(end_time)} diff=#{diff} #####")
436
441
 
437
442
  file.close
438
443
  end
data/test_qdumpfs.sh CHANGED
@@ -1,6 +1,5 @@
1
1
  #!/bin/sh
2
2
 
3
3
  curdir=$(dirname $0)
4
- bundle exec ruby $curdir/exe/qdumpfs $* ~/_qdumpfs/src ~/_qdumpfs/dst
5
-
6
-
4
+ #bundle exec ruby $curdir/exe/qdumpfs $* ~/_qdumpfs/src ~/_qdumpfs/dst
5
+ bundle exec ruby $curdir/exe/qdumpfs $* --exclude="/Users/sora/Documents/Virtual Machines.localized" /Users/sora /Volumes/qdumpfs/home
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qdumpfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.3
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - src
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-07 00:00:00.000000000 Z
11
+ date: 2024-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,12 @@ extensions: []
62
62
  extra_rdoc_files: []
63
63
  files:
64
64
  - ".gitignore"
65
+ - ".idea/.gitignore"
66
+ - ".idea/inspectionProfiles/Project_Default.xml"
67
+ - ".idea/misc.xml"
68
+ - ".idea/modules.xml"
69
+ - ".idea/qdumpfs.iml"
70
+ - ".idea/vcs.xml"
65
71
  - ".travis.yml"
66
72
  - ".vscode/settings.json"
67
73
  - CODE_OF_CONDUCT.md
@@ -121,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
127
  - !ruby/object:Gem::Version
122
128
  version: '0'
123
129
  requirements: []
124
- rubygems_version: 3.2.33
130
+ rubygems_version: 3.3.26
125
131
  signing_key:
126
132
  specification_version: 4
127
133
  summary: qdumpfs