hash-that-tree 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -19
- data/Gemfile +4 -4
- data/Gemfile.lock +21 -21
- data/LICENSE.txt +21 -21
- data/README.md +83 -77
- data/Rakefile +1 -1
- data/bin/hashthattree +1 -1
- data/hash-that-tree.gemspec +27 -27
- data/lib/cli.rb +35 -35
- data/lib/compare.rb +120 -120
- data/lib/display.rb +73 -73
- data/lib/hashit.rb +53 -53
- data/spec/testfiles/1/file3.txt +1 -1
- data/spec/testfiles/1/file4.txt +1 -1
- data/spec/testfiles/2/file3.txt +2 -2
- data/spec/testfiles/2/file4.txt +2 -2
- data/templates/displaytemplates.rb +38 -38
- data/test.htm +94 -94
- metadata +10 -26
data/.gitignore
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
coverage
|
6
|
-
InstalledFiles
|
7
|
-
lib/bundler/man
|
8
|
-
pkg
|
9
|
-
rdoc
|
10
|
-
spec/reports
|
11
|
-
test/tmp
|
12
|
-
test/version_tmp
|
13
|
-
tmp
|
14
|
-
doc
|
15
|
-
# YARD artifacts
|
16
|
-
.yardoc
|
17
|
-
_yardoc
|
18
|
-
.project
|
19
|
-
*~
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
coverage
|
6
|
+
InstalledFiles
|
7
|
+
lib/bundler/man
|
8
|
+
pkg
|
9
|
+
rdoc
|
10
|
+
spec/reports
|
11
|
+
test/tmp
|
12
|
+
test/version_tmp
|
13
|
+
tmp
|
14
|
+
doc
|
15
|
+
# YARD artifacts
|
16
|
+
.yardoc
|
17
|
+
_yardoc
|
18
|
+
.project
|
19
|
+
*~
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in hash-that-tree.gemspec
|
4
|
-
gemspec
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in hash-that-tree.gemspec
|
4
|
+
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
hash-that-tree (0.1.4)
|
5
|
-
mustache
|
6
|
-
thor
|
7
|
-
yard
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: https://rubygems.org/
|
11
|
-
specs:
|
12
|
-
mustache (0.99.4)
|
13
|
-
thor (0.16.0)
|
14
|
-
yard (0.8.3)
|
15
|
-
|
16
|
-
PLATFORMS
|
17
|
-
ruby
|
18
|
-
x86-mingw32
|
19
|
-
|
20
|
-
DEPENDENCIES
|
21
|
-
hash-that-tree!
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
hash-that-tree (0.1.4)
|
5
|
+
mustache
|
6
|
+
thor
|
7
|
+
yard
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
mustache (0.99.4)
|
13
|
+
thor (0.16.0)
|
14
|
+
yard (0.8.3)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
x86-mingw32
|
19
|
+
|
20
|
+
DEPENDENCIES
|
21
|
+
hash-that-tree!
|
data/LICENSE.txt
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
Copyright (c) 2012 John Ryan
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
1
|
+
Copyright (c) 2012 John Ryan
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
22
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,77 +1,83 @@
|
|
1
|
-
#hash-that-tree
|
2
|
-
A ruby command line app prints the MD5 hashes all of the files in an array of folders.
|
3
|
-
The output can be in standard text, csv, html or json.
|
4
|
-
|
5
|
-
Also has a compare functionthat takes 2 folder, then iterates through the files and comparing the MD5 hashes of the files with the same name
|
6
|
-
|
7
|
-
## Usage
|
8
|
-
# to view help
|
9
|
-
hashthattree help
|
10
|
-
|
11
|
-
# Get the hash of all files in a folder (with optional formatting)
|
12
|
-
hashthattree hashit ./spec/testfiles/1
|
13
|
-
hashthattree hashit ./spec/testfiles/1 -o=csv
|
14
|
-
hashthattree hashit ./spec/testfiles/1 -o=html
|
15
|
-
hashthattree hashit ./spec/testfiles/1 -o=json
|
16
|
-
|
17
|
-
# Get the hash of all files in multiple folders
|
18
|
-
hashthattree hashit ./spec/testfiles/1
|
19
|
-
|
20
|
-
# run the app on the test files in two folders (this will soon be depreciated)
|
21
|
-
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2
|
22
|
-
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 csv
|
23
|
-
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 html
|
24
|
-
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 json
|
25
|
-
|
26
|
-
## Installation
|
27
|
-
|
28
|
-
Add this line to your application's Gemfile:
|
29
|
-
|
30
|
-
gem 'hash-that-tree'
|
31
|
-
|
32
|
-
And then execute:
|
33
|
-
|
34
|
-
$ bundle
|
35
|
-
|
36
|
-
Or install it yourself as:
|
37
|
-
|
38
|
-
$ gem install hash-that-tree
|
39
|
-
|
40
|
-
## Creating Documentation
|
41
|
-
Run the following command to generate the documantation
|
42
|
-
|
43
|
-
rdoc --exclude spec/testfiles
|
44
|
-
|
45
|
-
## Create a gem
|
46
|
-
|
47
|
-
Build and Test Locally
|
48
|
-
-gem build hash-that-tree.gemspec
|
49
|
-
-gem install hash-that-tree-X.X.X # where X.X.X is the version of the compiled gemspec
|
50
|
-
-hashthattree
|
51
|
-
|
52
|
-
Build and deploy to rubygems.org
|
53
|
-
-gem update --system
|
54
|
-
-gem build hash-that-tree.gemspec
|
55
|
-
-gem push hash-that-tree-0.0.1.gem # where X.X.X is the version of the compiled gemspec
|
56
|
-
|
57
|
-
## Contributing
|
58
|
-
|
59
|
-
1. Fork it
|
60
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
61
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
63
|
-
5. Create new Pull Request
|
64
|
-
|
65
|
-
##References
|
66
|
-
|
67
|
-
Looking into bundling with https://github.com/radar/guides/blob/master/gem-development.md
|
68
|
-
http://whatisthor.com/
|
69
|
-
|
70
|
-
## TODO
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
1
|
+
#hash-that-tree
|
2
|
+
A ruby command line app prints the MD5 hashes all of the files in an array of folders.
|
3
|
+
The output can be in standard text, csv, html or json.
|
4
|
+
|
5
|
+
Also has a compare functionthat takes 2 folder, then iterates through the files and comparing the MD5 hashes of the files with the same name
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
# to view help
|
9
|
+
hashthattree help
|
10
|
+
|
11
|
+
# Get the hash of all files in a folder (with optional formatting)
|
12
|
+
hashthattree hashit ./spec/testfiles/1
|
13
|
+
hashthattree hashit ./spec/testfiles/1 -o=csv
|
14
|
+
hashthattree hashit ./spec/testfiles/1 -o=html
|
15
|
+
hashthattree hashit ./spec/testfiles/1 -o=json
|
16
|
+
|
17
|
+
# Get the hash of all files in multiple folders
|
18
|
+
hashthattree hashit ./spec/testfiles/1
|
19
|
+
|
20
|
+
# run the app on the test files in two folders (this will soon be depreciated)
|
21
|
+
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2
|
22
|
+
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 csv
|
23
|
+
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 html
|
24
|
+
hashthattree compare ./spec/testfiles/1 ./spec/testfiles/2 json
|
25
|
+
|
26
|
+
## Installation
|
27
|
+
|
28
|
+
Add this line to your application's Gemfile:
|
29
|
+
|
30
|
+
gem 'hash-that-tree'
|
31
|
+
|
32
|
+
And then execute:
|
33
|
+
|
34
|
+
$ bundle
|
35
|
+
|
36
|
+
Or install it yourself as:
|
37
|
+
|
38
|
+
$ gem install hash-that-tree
|
39
|
+
|
40
|
+
## Creating Documentation
|
41
|
+
Run the following command to generate the documantation
|
42
|
+
|
43
|
+
rdoc --exclude spec/testfiles
|
44
|
+
|
45
|
+
## Create a gem
|
46
|
+
|
47
|
+
Build and Test Locally
|
48
|
+
-gem build hash-that-tree.gemspec
|
49
|
+
-gem install hash-that-tree-X.X.X # where X.X.X is the version of the compiled gemspec
|
50
|
+
-hashthattree
|
51
|
+
|
52
|
+
Build and deploy to rubygems.org
|
53
|
+
-gem update --system
|
54
|
+
-gem build hash-that-tree.gemspec
|
55
|
+
-gem push hash-that-tree-0.0.1.gem # where X.X.X is the version of the compiled gemspec
|
56
|
+
|
57
|
+
## Contributing
|
58
|
+
|
59
|
+
1. Fork it
|
60
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
61
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
62
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
63
|
+
5. Create new Pull Request
|
64
|
+
|
65
|
+
##References
|
66
|
+
|
67
|
+
Looking into bundling with https://github.com/radar/guides/blob/master/gem-development.md
|
68
|
+
http://whatisthor.com/
|
69
|
+
|
70
|
+
## TODO
|
71
|
+
|
72
|
+
I have a few items to do in upcoming releases
|
73
|
+
|
74
|
+
- [x] Add MD5
|
75
|
+
- [x] Allow for single or multiple folders
|
76
|
+
- [x] Format output in json
|
77
|
+
- [x] Format output in html
|
78
|
+
- [x] Format output in csv
|
79
|
+
-[ ] Add Unit Tests
|
80
|
+
-[ ] Allow to be used as an API as well as a Command Line Tool
|
81
|
+
-[ ] Add folder recursion option
|
82
|
+
-[ ] Add SHA1
|
83
|
+
|
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/hashthattree
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require_relative '../lib/cli'
|
1
|
+
require_relative '../lib/cli'
|
data/hash-that-tree.gemspec
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
|
5
|
-
Gem::Specification.new do |gem|
|
6
|
-
gem.name = %q{hash-that-tree}
|
7
|
-
gem.version = "0.1.
|
8
|
-
gem.authors = ["John Ryan"]
|
9
|
-
gem.email = ["555john@gmail.com"]
|
10
|
-
gem.description = %q{Command line app that produces the MD5 hash of all files in a set of folders}
|
11
|
-
gem.summary = %q{A ruby command line app prints the MD5 hashes all of the files in an array of folders, the output can be in standard text, csv, html or json}
|
12
|
-
gem.homepage = %q{http://github.com/
|
13
|
-
|
14
|
-
gem.extra_rdoc_files = ["LICENSE.txt","README.md" ]
|
15
|
-
gem.files = `git ls-files`.split($/)
|
16
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
-
gem.executable = 'hashthattree'
|
18
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
-
gem.require_paths = ["lib"]
|
20
|
-
|
21
|
-
gem.rdoc_options << '--exclude spec/testfiles'
|
22
|
-
|
23
|
-
gem.add_dependency "mustache"
|
24
|
-
gem.add_dependency "thor"
|
25
|
-
gem.add_dependency "yard"
|
26
|
-
|
27
|
-
end
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = %q{hash-that-tree}
|
7
|
+
gem.version = "0.1.5"
|
8
|
+
gem.authors = ["John Ryan"]
|
9
|
+
gem.email = ["555john@gmail.com"]
|
10
|
+
gem.description = %q{Command line app that produces the MD5 hash of all files in a set of folders}
|
11
|
+
gem.summary = %q{A ruby command line app prints the MD5 hashes all of the files in an array of folders, the output can be in standard text, csv, html or json}
|
12
|
+
gem.homepage = %q{http://github.com/patchapps/hash-that-tree}
|
13
|
+
|
14
|
+
gem.extra_rdoc_files = ["LICENSE.txt","README.md" ]
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.executable = 'hashthattree'
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
gem.rdoc_options << '--exclude spec/testfiles'
|
22
|
+
|
23
|
+
gem.add_dependency "mustache"
|
24
|
+
gem.add_dependency "thor"
|
25
|
+
gem.add_dependency "yard"
|
26
|
+
|
27
|
+
end
|
data/lib/cli.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
|
-
require 'thor'
|
2
|
-
require_relative 'compare'
|
3
|
-
require_relative 'hashit'
|
4
|
-
require_relative 'display'
|
5
|
-
|
6
|
-
# Command Line Program that takes multiple directories and creates a MD5 hash for every file contained within.<br/>
|
7
|
-
# It then builds a result set that compares files with the same name and allows for them to be outputted
|
8
|
-
# as a csv string
|
9
|
-
module HashThatTree
|
10
|
-
#This class controls the Command Line Interface
|
11
|
-
class CLI < Thor
|
12
|
-
#Create a hash of all files in the folders, compare them and output the results in CSV format
|
13
|
-
desc "compare FOLDER1 FOLDER2", "Create a hash of all files in the folders, compare them and output the results in the specified format"
|
14
|
-
method_option :output, :aliases => "-o", :default => :csv, :desc => "Choose the format to display the results in - csv, json or html"
|
15
|
-
def compare(folder1, folder2)
|
16
|
-
htt = CompareMD5.new(folder1, folder2, options)
|
17
|
-
htt.compare
|
18
|
-
htt.display_results
|
19
|
-
end
|
20
|
-
|
21
|
-
desc "hashit FOLDERS", "Create a hash of all files in all folders supplied and display as standard, json, csv or html"
|
22
|
-
method_option :errors, :aliases => "-e", :type => :boolean, :default => false, :desc => "true = display files that could not be processed, false = do not display skipped files"
|
23
|
-
#method_option :hashtype, :aliases => "-h", :default => "cmd5", :desc => "Choose the hash algorithm to use - md5 or sha"
|
24
|
-
method_option :output, :aliases => "-o", :default => "standard", :desc => "Choose the format to display the results in - standard(default), csv, json or html"
|
25
|
-
#method_option :recursive, :aliases => "-r", :type => :boolean, :default => "false", :desc => "true = recurse through sub directories, false = only do top directory"
|
26
|
-
def hashit(*folders)
|
27
|
-
htt = HashIt.new(options, folders)
|
28
|
-
htt.create_hash_results
|
29
|
-
dis = Display.new(options, htt.error_data, htt.file_data)
|
30
|
-
dis.display_results()
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
#CLI.start(ARGV)
|
35
|
-
CLI.start()
|
1
|
+
require 'thor'
|
2
|
+
require_relative 'compare'
|
3
|
+
require_relative 'hashit'
|
4
|
+
require_relative 'display'
|
5
|
+
|
6
|
+
# Command Line Program that takes multiple directories and creates a MD5 hash for every file contained within.<br/>
|
7
|
+
# It then builds a result set that compares files with the same name and allows for them to be outputted
|
8
|
+
# as a csv string
|
9
|
+
module HashThatTree
|
10
|
+
#This class controls the Command Line Interface
|
11
|
+
class CLI < Thor
|
12
|
+
#Create a hash of all files in the folders, compare them and output the results in CSV format
|
13
|
+
desc "compare FOLDER1 FOLDER2", "Create a hash of all files in the folders, compare them and output the results in the specified format"
|
14
|
+
method_option :output, :aliases => "-o", :default => :csv, :desc => "Choose the format to display the results in - csv, json or html"
|
15
|
+
def compare(folder1, folder2)
|
16
|
+
htt = CompareMD5.new(folder1, folder2, options)
|
17
|
+
htt.compare
|
18
|
+
htt.display_results
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "hashit FOLDERS", "Create a hash of all files in all folders supplied and display as standard, json, csv or html"
|
22
|
+
method_option :errors, :aliases => "-e", :type => :boolean, :default => false, :desc => "true = display files that could not be processed, false = do not display skipped files"
|
23
|
+
#method_option :hashtype, :aliases => "-h", :default => "cmd5", :desc => "Choose the hash algorithm to use - md5 or sha"
|
24
|
+
method_option :output, :aliases => "-o", :default => "standard", :desc => "Choose the format to display the results in - standard(default), csv, json or html"
|
25
|
+
#method_option :recursive, :aliases => "-r", :type => :boolean, :default => "false", :desc => "true = recurse through sub directories, false = only do top directory"
|
26
|
+
def hashit(*folders)
|
27
|
+
htt = HashIt.new(options, folders)
|
28
|
+
htt.create_hash_results
|
29
|
+
dis = Display.new(options, htt.error_data, htt.file_data)
|
30
|
+
dis.display_results()
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
#CLI.start(ARGV)
|
35
|
+
CLI.start()
|
36
36
|
end
|
data/lib/compare.rb
CHANGED
@@ -1,120 +1,120 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
|
3
|
-
# Author:: John Ryan (mailto:555john@gmail.com)
|
4
|
-
# Copyright:: Copyright (c) 2012 John Ryan
|
5
|
-
# License:: Distributes under the same terms as Ruby
|
6
|
-
|
7
|
-
module HashThatTree
|
8
|
-
|
9
|
-
# This class accepts two folders and provides methods to iterate
|
10
|
-
# through them creating a hash of each file within and can display
|
11
|
-
# the results for analysis
|
12
|
-
class CompareMD5
|
13
|
-
attr_accessor :folder1 #path to folder containing files to hash
|
14
|
-
attr_accessor :folder2 #path to folder containing files to hash to be compared to folder1
|
15
|
-
attr_accessor :format #the format to output the results to. csv, html or json
|
16
|
-
|
17
|
-
#initialize the class with the folders to be compared
|
18
|
-
def initialize(folder1, folder2, options)
|
19
|
-
@folder1 = folder1
|
20
|
-
@folder2 = folder2
|
21
|
-
@format = options['output']
|
22
|
-
@filehash = Hash.new
|
23
|
-
validate
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
# Validates the input ensuring the arguments are both valid folders
|
28
|
-
def validate
|
29
|
-
if(folder1==nil) || (folder1=="") || !Dir.exists?(folder1)
|
30
|
-
puts "a valid folder path is required as argument 1"
|
31
|
-
exit
|
32
|
-
end
|
33
|
-
|
34
|
-
if(folder2==nil) || (folder2=="") || !Dir.exists?(folder2)
|
35
|
-
puts "a valid folder path is required as argument 2"
|
36
|
-
exit
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
# Iterates through the folders and creates a FileHashResults object containing the
|
42
|
-
# results of the comparisson
|
43
|
-
def compare
|
44
|
-
|
45
|
-
Dir.foreach(@folder1) do |item|
|
46
|
-
begin
|
47
|
-
next if item == '.' or item == '..'
|
48
|
-
fullfilename = File.expand_path(@folder1, item)
|
49
|
-
the_hash = Digest::MD5.hexdigest(File.read(File.join(File.expand_path(@folder1), item)))
|
50
|
-
item = item.downcase
|
51
|
-
filedata = FileHashResults.new(item, the_hash, nil)
|
52
|
-
@filehash[item] = filedata
|
53
|
-
rescue
|
54
|
-
#puts "Skipped:#{item.inspect}"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
Dir.foreach(@folder2) do |item|
|
59
|
-
begin
|
60
|
-
next if item == '.' or item == '..'
|
61
|
-
the_hash = Digest::MD5.hexdigest(File.read(File.join(@folder2, item)))
|
62
|
-
item = item.downcase
|
63
|
-
if(@filehash[item]==nil)
|
64
|
-
filedata = FileHashResults.new(item, nil, the_hash)
|
65
|
-
@filehash[item] = filedata
|
66
|
-
next
|
67
|
-
end
|
68
|
-
@filehash[item.downcase].file_hash2 = the_hash
|
69
|
-
rescue
|
70
|
-
#puts "Skipped:#{item.inspect}"
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
#print the contents of the FileHashResults object standard out in the format specified. Default is csv
|
76
|
-
def display_results()
|
77
|
-
case @format
|
78
|
-
when "csv"
|
79
|
-
display_results_csv
|
80
|
-
when "html"
|
81
|
-
display_results_html
|
82
|
-
when "json"
|
83
|
-
display_results_json
|
84
|
-
else
|
85
|
-
display_results_csv
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
#Prints the results to standard out in the csv format specified.
|
90
|
-
def display_results_csv
|
91
|
-
puts "FileName,#{@folder1},#{@folder2},Are Equal"
|
92
|
-
@filehash.each{ |key, value| puts "#{value.file_name},#{value.file_hash1},#{value.file_hash2}, #{value.file_hash1==value.file_hash2}" }
|
93
|
-
end
|
94
|
-
|
95
|
-
#Prints the results to standard out in the csv format specified.
|
96
|
-
def display_results_html
|
97
|
-
output ="<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title></head><body>"
|
98
|
-
output.concat("<table><thead><tr><td>FileName</td></tr><tr><td>#{@folder1}</td></tr><tr><td>#{@folder2}</td></tr><tr><td>Equal</td></tr></thead>")
|
99
|
-
@filehash.each{ |key, value| output.concat("<tbody><tr><td>#{value.file_name}</td></tr><tr><td>#{value.file_hash1}</td></tr><tr><td>#{value.file_hash2}</td></tr><tr><td>#{value.file_hash1==value.file_hash2}</td></tr>")}
|
100
|
-
output.concat("</tbody></table></body></html>")
|
101
|
-
puts output
|
102
|
-
end
|
103
|
-
|
104
|
-
#Prints the results to standard out in the csv format specified.
|
105
|
-
def display_results_json
|
106
|
-
puts @filehash
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
110
|
-
|
111
|
-
#Container for the results of the file comparisson
|
112
|
-
class FileHashResults
|
113
|
-
attr_accessor :file_name, :file_hash1, :file_hash2
|
114
|
-
def initialize(file_name, file_hash1, file_hash2)
|
115
|
-
@file_name = file_name
|
116
|
-
@file_hash1 = file_hash1
|
117
|
-
@file_hash2 = file_hash2
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
# Author:: John Ryan (mailto:555john@gmail.com)
|
4
|
+
# Copyright:: Copyright (c) 2012 John Ryan
|
5
|
+
# License:: Distributes under the same terms as Ruby
|
6
|
+
|
7
|
+
module HashThatTree
|
8
|
+
|
9
|
+
# This class accepts two folders and provides methods to iterate
|
10
|
+
# through them creating a hash of each file within and can display
|
11
|
+
# the results for analysis
|
12
|
+
class CompareMD5
|
13
|
+
attr_accessor :folder1 #path to folder containing files to hash
|
14
|
+
attr_accessor :folder2 #path to folder containing files to hash to be compared to folder1
|
15
|
+
attr_accessor :format #the format to output the results to. csv, html or json
|
16
|
+
|
17
|
+
#initialize the class with the folders to be compared
|
18
|
+
def initialize(folder1, folder2, options)
|
19
|
+
@folder1 = folder1
|
20
|
+
@folder2 = folder2
|
21
|
+
@format = options['output']
|
22
|
+
@filehash = Hash.new
|
23
|
+
validate
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
# Validates the input ensuring the arguments are both valid folders
|
28
|
+
def validate
|
29
|
+
if(folder1==nil) || (folder1=="") || !Dir.exists?(folder1)
|
30
|
+
puts "a valid folder path is required as argument 1"
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
if(folder2==nil) || (folder2=="") || !Dir.exists?(folder2)
|
35
|
+
puts "a valid folder path is required as argument 2"
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
# Iterates through the folders and creates a FileHashResults object containing the
|
42
|
+
# results of the comparisson
|
43
|
+
def compare
|
44
|
+
|
45
|
+
Dir.foreach(@folder1) do |item|
|
46
|
+
begin
|
47
|
+
next if item == '.' or item == '..'
|
48
|
+
fullfilename = File.expand_path(@folder1, item)
|
49
|
+
the_hash = Digest::MD5.hexdigest(File.read(File.join(File.expand_path(@folder1), item)))
|
50
|
+
item = item.downcase
|
51
|
+
filedata = FileHashResults.new(item, the_hash, nil)
|
52
|
+
@filehash[item] = filedata
|
53
|
+
rescue
|
54
|
+
#puts "Skipped:#{item.inspect}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Dir.foreach(@folder2) do |item|
|
59
|
+
begin
|
60
|
+
next if item == '.' or item == '..'
|
61
|
+
the_hash = Digest::MD5.hexdigest(File.read(File.join(@folder2, item)))
|
62
|
+
item = item.downcase
|
63
|
+
if(@filehash[item]==nil)
|
64
|
+
filedata = FileHashResults.new(item, nil, the_hash)
|
65
|
+
@filehash[item] = filedata
|
66
|
+
next
|
67
|
+
end
|
68
|
+
@filehash[item.downcase].file_hash2 = the_hash
|
69
|
+
rescue
|
70
|
+
#puts "Skipped:#{item.inspect}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#print the contents of the FileHashResults object standard out in the format specified. Default is csv
|
76
|
+
def display_results()
|
77
|
+
case @format
|
78
|
+
when "csv"
|
79
|
+
display_results_csv
|
80
|
+
when "html"
|
81
|
+
display_results_html
|
82
|
+
when "json"
|
83
|
+
display_results_json
|
84
|
+
else
|
85
|
+
display_results_csv
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
#Prints the results to standard out in the csv format specified.
|
90
|
+
def display_results_csv
|
91
|
+
puts "FileName,#{@folder1},#{@folder2},Are Equal"
|
92
|
+
@filehash.each{ |key, value| puts "#{value.file_name},#{value.file_hash1},#{value.file_hash2}, #{value.file_hash1==value.file_hash2}" }
|
93
|
+
end
|
94
|
+
|
95
|
+
#Prints the results to standard out in the csv format specified.
|
96
|
+
def display_results_html
|
97
|
+
output ="<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title></title></head><body>"
|
98
|
+
output.concat("<table><thead><tr><td>FileName</td></tr><tr><td>#{@folder1}</td></tr><tr><td>#{@folder2}</td></tr><tr><td>Equal</td></tr></thead>")
|
99
|
+
@filehash.each{ |key, value| output.concat("<tbody><tr><td>#{value.file_name}</td></tr><tr><td>#{value.file_hash1}</td></tr><tr><td>#{value.file_hash2}</td></tr><tr><td>#{value.file_hash1==value.file_hash2}</td></tr>")}
|
100
|
+
output.concat("</tbody></table></body></html>")
|
101
|
+
puts output
|
102
|
+
end
|
103
|
+
|
104
|
+
#Prints the results to standard out in the csv format specified.
|
105
|
+
def display_results_json
|
106
|
+
puts @filehash
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
#Container for the results of the file comparisson
|
112
|
+
class FileHashResults
|
113
|
+
attr_accessor :file_name, :file_hash1, :file_hash2
|
114
|
+
def initialize(file_name, file_hash1, file_hash2)
|
115
|
+
@file_name = file_name
|
116
|
+
@file_hash1 = file_hash1
|
117
|
+
@file_hash2 = file_hash2
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|