rdupes 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0f75ec8d82ddbdc1319fdfdcfcfad7696d7fccd
4
- data.tar.gz: b74a50547365ff3370009416d6927262b29341e9
3
+ metadata.gz: 52c253e303c1b31d334dbaae5354cafc18397db2
4
+ data.tar.gz: 27bff2346e926eb9f483390048dcaff908a1f907
5
5
  SHA512:
6
- metadata.gz: ad19c096fc4d671d14c3e8a5752b02e960f203abd702e0a851bb2c0abc71591b3abb85aac082ec4fc7fa65bd66f8e4d552337642205d2192fc560b7511eb31a5
7
- data.tar.gz: 4a8a9eb52b3e0c006a532452c78dc937da9c64b728a953fbd872d798355d6dfb165af55e8b3926d236087d7fe83a515b427daa837704b7c40277e5cd12ac4054
6
+ metadata.gz: ce5fdaf876597b5e329db389b87c6b3144d886437f961ff3b22e7755c83a7e8c95159cac3887091ed89bc9579b9cb5e1c949afe90320be9efe9baf62125a8c1a
7
+ data.tar.gz: 3c235c3dd62631e8eb33088d4f5ef15f86246eb88317d4978fe319cbcafa7e9d5cd0181516791c9888dfe18621ca734fe071b33b68fe88d0dc44a74561b4e37a
data/exe/rdupes CHANGED
@@ -12,6 +12,10 @@ opt_parser = OptionParser.new do |opts|
12
12
  rdupe.add_reference_directory directory
13
13
  end
14
14
 
15
+ opts.on("-d", "--dryrun", "Runs the analysis but without any file deletion") do |q|
16
+ rdupe.dry_run!
17
+ end
18
+
15
19
  opts.on("-q", "--quiet", "Runs quietly") do |q|
16
20
  rdupe.quiet!
17
21
  end
@@ -2,6 +2,7 @@ require "rdupes/version"
2
2
  require 'logger'
3
3
  require 'shellwords'
4
4
  require 'tmpdir'
5
+ require 'colorize'
5
6
 
6
7
  module Rdupes
7
8
  class Finder
@@ -15,16 +16,24 @@ module Rdupes
15
16
  @counters = Hash.new(0)
16
17
  @quiet = false
17
18
  @keep = false
19
+ @dry_run = false
18
20
  end
19
21
 
20
22
  def quiet!
23
+ @logger.debug "Enabling quiet mode"
21
24
  @quiet = true
22
25
  end
23
26
 
24
27
  def keep!
28
+ @logger.debug "Enabling keep mode. Will keep the fdupes output"
25
29
  @keep = true
26
30
  end
27
31
 
32
+ def dry_run!
33
+ @logger.debug "Enabling dry run mode"
34
+ @dry_run = true
35
+ end
36
+
28
37
  def add_reference_directory(directory)
29
38
  directory_path = File.expand_path(directory)
30
39
  @logger.debug "Adding #{directory_path} to the reference directories"
@@ -47,26 +56,37 @@ module Rdupes
47
56
  raise 'No directories provided for duplicate search' if @search_directories.empty?
48
57
  raise 'fdupes needs to be installed' unless command? 'fdupes'
49
58
 
50
- unless @quiet
51
- puts "Processing #{@search_directories}"
52
- puts "Reference directory: #{@reference_directories}"
53
- end
59
+ say "Processing #{@search_directories}"
60
+ say "Reference directory: #{@reference_directories}"
54
61
 
55
62
  Dir.mktmpdir do |dir|
56
- fdupe_output = File.join(dir, 'duplicates.log')
63
+ fdupes_output = File.join(dir, 'duplicates.log')
57
64
  # Redirect to file
58
- cmd = "fdupes -rq #{directories_for_search.shelljoin} > #{fdupe_output}"
65
+ cmd = "fdupes -rq #{directories_for_search.shelljoin} > #{fdupes_output}"
59
66
  @logger.debug "Executing: #{cmd}"
60
67
  r = system cmd
61
68
  raise "fdupe crashed " unless r
62
- process_fdupes_result(fdupe_output)
63
- FileUtils.cp fdupe_output, "#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}_duplicates.log" if @keep
64
- puts "Deleted #{@counters[:deleted]} files" unless @quiet
69
+ process_fdupes_result(fdupes_output)
70
+
71
+ if @keep
72
+ fdupes_output_copy = "#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}_duplicates.log"
73
+ say "Copying fdupes result to #{fdupes_output_copy}"
74
+ FileUtils.cp fdupes_output, fdupes_output_copy
75
+ end
76
+
77
+ say "Found #{@counters[:duplicate_groups]} duplicate groups"
78
+ say "Found #{@counters[:duplicate_entries]} duplicate entries"
79
+ say "Flagged #{@counters[:flag_for_delete]} files for deletion"
80
+ say "Deleted #{@counters[:deleted]} files"
65
81
  end
66
82
  end
67
83
 
68
84
  private
69
85
 
86
+ def say(text)
87
+ puts text unless @quiet
88
+ end
89
+
70
90
  def command?(command)
71
91
  system("which #{ command} > /dev/null 2>&1")
72
92
  end
@@ -91,18 +111,26 @@ module Rdupes
91
111
 
92
112
  def handle_duplicate_group(duplicate_group)
93
113
  @logger.debug "Handling group of #{duplicate_group.size} duplicates"
114
+ say "#{'==>'.blue} Group of #{duplicate_group.size} duplicates"
115
+ @counters[:duplicate_groups] += 1
116
+ @counters[:duplicate_entries] += duplicate_group.size
94
117
  reference_files, duplicate_files = duplicate_group.partition do |f|
95
118
  @reference_directories.any? { |rf| File.expand_path(f).start_with?(rf) }
96
119
  end
97
120
  # Keep the first duplicate if there is no reference file.
98
- duplicate_files.shift if reference_files.empty?
121
+ say "- #{duplicate_files.shift}".green if reference_files.empty?
122
+ reference_files.each { |rf| say "- #{rf}".green }
99
123
  duplicate_files.each { |dp| handle_duplicate_file(dp) }
100
124
  end
101
125
 
102
126
  def handle_duplicate_file(duplicate_file)
103
- @counters[:deleted] += 1
104
127
  @logger.debug "Handling duplicate #{duplicate_file}"
105
- File.delete(duplicate_file)
128
+ @counters[:flag_for_delete] += 1
129
+ say "- #{duplicate_file}".red
130
+ unless @dry_run
131
+ File.delete(duplicate_file)
132
+ @counters[:deleted] += 1
133
+ end
106
134
  end
107
135
  end
108
136
  end
@@ -1,3 +1,3 @@
1
1
  module Rdupes
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.add_dependency "colorize"
22
23
  spec.add_development_dependency "bundler", "~> 1.13"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
25
  spec.add_development_dependency "rspec", "~> 3.0"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdupes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harold Waterkeyn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-21 00:00:00.000000000 Z
11
+ date: 2016-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement