linknew 0.0.2 → 1.0.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 +4 -4
- data/.rubocop.yml +2 -0
- data/.travis.yml +3 -1
- data/CHANGELOG.md +6 -0
- data/README.md +8 -0
- data/Rakefile +7 -4
- data/bin/linknew +5 -9
- data/lib/linknew.rb +34 -12
- data/lib/linknew/database.rb +34 -12
- data/lib/linknew/version.rb +2 -2
- data/linknew.gemspec +18 -15
- data/spec/linknew_spec.rb +51 -2
- metadata +39 -9
- data/lib/linknew/errors.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6c6b7c93b7e8cc4900ddbb1fde23831a900c80f
|
4
|
+
data.tar.gz: 48348457b5ce6d09b444093577cae419bd306c60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca8f77e90a2538af6cc184ec447b52904ef19b0588333198699d4dd5dac8768b7beb8b16e7670c6b776eb828079a2456b755e9660619cf4b19a0f85d9b39cd35
|
7
|
+
data.tar.gz: 41ce550e857c0422cd70dfce70832beed638f0df2365e508d146827a38c618a9e3346326600f638856fb85b6c89eceaa4f3c298321e314680afef59ace95b2fe
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
[](http://rubygems.org/gems/linknew)
|
2
|
+
[](https://travis-ci.org/voidus/linknew)
|
3
|
+
[](https://codeclimate.com/github/voidus/linknew)
|
4
|
+
[](https://coveralls.io/r/voidus/linknew)
|
5
|
+
[](https://gemnasium.com/voidus/linknew)
|
6
|
+
[](http://inch-ci.org/github/voidus/linknew)
|
7
|
+
[](https://www.pullreview.com/github/voidus/linknew/reviews/master)
|
8
|
+
|
1
9
|
# Linknew
|
2
10
|
|
3
11
|
Linknew creates links to all files in another directory once. You can use it to keep track of which files in a shared
|
data/Rakefile
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
4
|
+
require 'reek/rake/task'
|
3
5
|
|
4
6
|
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
RuboCop::RakeTask.new { |config| config.fail_on_error = false }
|
8
|
+
Reek::Rake::Task.new { |config| config.fail_on_error = false }
|
5
9
|
|
6
|
-
task :
|
7
|
-
|
10
|
+
task default: [:spec, :rubocop, :reek]
|
data/bin/linknew
CHANGED
@@ -1,21 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'linknew'
|
3
3
|
|
4
|
-
CONFIG_FILE =
|
4
|
+
CONFIG_FILE = '.linknew'
|
5
5
|
HELP_MESSAGE = <<HERE
|
6
6
|
|
7
7
|
HERE
|
8
8
|
|
9
|
-
unless File.
|
10
|
-
abort
|
9
|
+
unless File.exist? CONFIG_FILE
|
10
|
+
abort 'Usage: Put a target location in .linknew and run the script'
|
11
11
|
end
|
12
12
|
|
13
13
|
folder = IO.read(CONFIG_FILE).strip
|
14
|
-
unless File.
|
15
|
-
|
16
|
-
end
|
17
|
-
unless File.directory? folder
|
18
|
-
abort "The folder \"#{folder}\" is not a directory"
|
19
|
-
end
|
14
|
+
abort "The folder \"#{folder}\" does not exist" unless File.exist? folder
|
15
|
+
abort "The folder \"#{folder}\" is not a directory" unless File.directory? folder
|
20
16
|
|
21
17
|
Linknew::Linknew.new(folder).execute
|
data/lib/linknew.rb
CHANGED
@@ -1,27 +1,49 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'linknew/version'
|
2
|
+
require 'sqlite3'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'shellwords'
|
3
5
|
|
4
6
|
require 'linknew/database'
|
5
7
|
|
8
|
+
# Linknew is an application, and while it's code might be benificial in some situations, the api
|
9
|
+
# shouldn't be that important.
|
6
10
|
module Linknew
|
11
|
+
# The main linknew class
|
7
12
|
class Linknew
|
8
|
-
def initialize
|
13
|
+
def initialize(folder)
|
9
14
|
@folder = folder
|
10
|
-
abort(
|
15
|
+
abort('Target folder does not exist') unless File.exist? folder
|
11
16
|
end
|
12
17
|
|
18
|
+
# Runs the program
|
13
19
|
def execute
|
14
|
-
|
20
|
+
puts MTIME_WARNING_MESSAGE unless CAN_SET_MTIME
|
21
|
+
|
22
|
+
Database.new do |db|
|
23
|
+
scan_files(db)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
MTIME_WARNING_MESSAGE = 'WARNING: Not running on linux, will not set mtime of symbolic links.'
|
30
|
+
CAN_SET_MTIME = RUBY_PLATFORM =~ /linux/ && !$PROGRAM_NAME =~ /\brspec$/
|
31
|
+
|
32
|
+
def scan_files(db)
|
15
33
|
Dir.foreach(@folder) do |file|
|
16
|
-
next if file ==
|
17
|
-
file = File.join(@folder, file)
|
34
|
+
next if file == '.' || file == '..'
|
18
35
|
|
19
|
-
|
20
|
-
|
21
|
-
File.symlink(file, File.basename(file))
|
22
|
-
db.enter_file(file)
|
23
|
-
end
|
36
|
+
file = File.join(@folder, file)
|
37
|
+
process_file(file, db) unless db.known? file
|
24
38
|
end
|
25
39
|
end
|
40
|
+
|
41
|
+
def process_file(file, db)
|
42
|
+
linkname = File.basename(file)
|
43
|
+
puts "Linking #{linkname}"
|
44
|
+
File.symlink(file, linkname)
|
45
|
+
`touch -h #{linkname.shellescape} -r #{file.shellescape}` if CAN_SET_MTIME
|
46
|
+
db.enter(file)
|
47
|
+
end
|
26
48
|
end
|
27
49
|
end
|
data/lib/linknew/database.rb
CHANGED
@@ -1,28 +1,50 @@
|
|
1
|
-
require 'linknew/errors'
|
2
1
|
require 'digest'
|
3
2
|
|
4
3
|
module Linknew
|
4
|
+
# Encapsules the linknew database
|
5
5
|
class Database
|
6
|
-
def initialize
|
7
|
-
@db = SQLite3::Database.new
|
8
|
-
|
9
|
-
@db.execute "CREATE INDEX IF NOT EXISTS files_md5name ON files (md5name)"
|
6
|
+
def initialize(&block)
|
7
|
+
@db = SQLite3::Database.new '.linknew.db'
|
8
|
+
creates_tables_if_not_exist
|
10
9
|
|
11
|
-
|
12
|
-
|
10
|
+
return unless block_given?
|
11
|
+
|
12
|
+
begin
|
13
|
+
block.call(self)
|
14
|
+
ensure
|
15
|
+
close
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def close
|
20
|
+
@db.close
|
13
21
|
end
|
14
22
|
|
15
|
-
def
|
16
|
-
|
23
|
+
def known?(file)
|
24
|
+
hash = Database.filehash(file)
|
25
|
+
p "Querying file #{file} with hash #{hash}"
|
26
|
+
ret = @db.execute(HAS_FILE_STMT, hash)[0][0] == 1
|
27
|
+
p "Returning #{ret}"
|
28
|
+
ret
|
17
29
|
end
|
18
30
|
|
19
|
-
def
|
20
|
-
|
31
|
+
def enter(file)
|
32
|
+
hash = Database.filehash(file)
|
33
|
+
p "Entering file #{file} with hash #{hash}"
|
34
|
+
@db.execute(ENTER_FILE_STMT, hash)
|
21
35
|
end
|
22
36
|
|
23
37
|
private
|
24
38
|
|
25
|
-
|
39
|
+
HAS_FILE_STMT = 'SELECT EXISTS(SELECT 1 FROM files WHERE md5name = ? LIMIT 1)'
|
40
|
+
ENTER_FILE_STMT = 'INSERT INTO files VALUES (?)'
|
41
|
+
|
42
|
+
def creates_tables_if_not_exist
|
43
|
+
@db.execute 'CREATE TABLE IF NOT EXISTS files (md5name char(32))'
|
44
|
+
@db.execute 'CREATE INDEX IF NOT EXISTS files_md5name ON files (md5name)'
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.filehash(file)
|
26
48
|
::Digest::MD5.hexdigest(File.basename(file))
|
27
49
|
end
|
28
50
|
end
|
data/lib/linknew/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Linknew
|
2
|
-
VERSION =
|
1
|
+
module Linknew # rubocop:disable Documentation
|
2
|
+
VERSION = '1.0.0'
|
3
3
|
end
|
data/linknew.gemspec
CHANGED
@@ -4,25 +4,28 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'linknew/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'linknew'
|
8
8
|
spec.version = Linknew::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
9
|
+
spec.authors = ['Simon Kohlmeyer']
|
10
|
+
spec.email = ['simon.kohlmeyer@gmail.com']
|
11
|
+
spec.summary = 'Links to files in a directory once'
|
12
12
|
spec.description = <<HERE
|
13
|
-
Linknew creates links to all files in another directory once.
|
14
|
-
directory you already
|
13
|
+
Linknew creates links to all files in another directory once.
|
14
|
+
You can use it to keep track of which files in a shared directory you already
|
15
|
+
looked at.
|
15
16
|
HERE
|
16
|
-
spec.homepage =
|
17
|
-
spec.license =
|
17
|
+
spec.homepage = 'http://github.com/voidus/linknew'
|
18
|
+
spec.license = 'MIT'
|
18
19
|
|
19
20
|
spec.files = `git ls-files -z`.split("\x0")
|
20
|
-
spec.executables = spec.files.grep(
|
21
|
-
spec.test_files = spec.files.grep(
|
22
|
-
spec.require_paths = [
|
21
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
22
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
23
|
+
spec.require_paths = ['lib']
|
23
24
|
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
25
|
+
spec.add_dependency 'sqlite3', '~>1.3'
|
26
|
+
spec.add_development_dependency 'bundler'
|
27
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.27.1'
|
30
|
+
spec.add_development_dependency 'reek'
|
28
31
|
end
|
data/spec/linknew_spec.rb
CHANGED
@@ -1,11 +1,60 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
2
3
|
|
3
4
|
describe Linknew do
|
5
|
+
before(:all) { @original_wd = Dir.pwd }
|
6
|
+
after(:all) { Dir.chdir(@original_wd) }
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@source_dir = Dir.mktmpdir('src_')
|
10
|
+
@work_dir = Dir.mktmpdir('dst_')
|
11
|
+
|
12
|
+
@testfile = 'some_file'
|
13
|
+
|
14
|
+
@testfile_source = File.join(@source_dir, @testfile)
|
15
|
+
@testfile_work = File.join(@work_dir, @testfile)
|
16
|
+
|
17
|
+
FileUtils.touch(@testfile_source)
|
18
|
+
Dir.chdir(@work_dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
after(:each) do
|
22
|
+
FileUtils.remove_entry @source_dir
|
23
|
+
FileUtils.remove_entry @work_dir
|
24
|
+
end
|
25
|
+
|
26
|
+
def call_linknew
|
27
|
+
Linknew::Linknew.new(@source_dir).execute
|
28
|
+
end
|
29
|
+
|
4
30
|
it 'has a version number' do
|
5
31
|
expect(Linknew::VERSION).not_to be nil
|
6
32
|
end
|
7
33
|
|
8
|
-
it '
|
9
|
-
|
34
|
+
it 'creates a database file' do
|
35
|
+
call_linknew
|
36
|
+
expect(::File).to exist('.linknew.db')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'creates a database file' do
|
40
|
+
call_linknew
|
41
|
+
expect(File.exist?('.linknew.db'))
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'creates a link to a new file' do
|
45
|
+
call_linknew
|
46
|
+
expect(File).to exist(@testfile_work)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'also works without to' do
|
50
|
+
call_linknew
|
51
|
+
expect(File.exist?(@testfile_work))
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'ignores already linked files on the second run when the link has been deleted' do
|
55
|
+
call_linknew
|
56
|
+
File.delete(@testfile_work)
|
57
|
+
call_linknew
|
58
|
+
expect(File).not_to exist(@testfile_work)
|
10
59
|
end
|
11
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linknew
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Kohlmeyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,6 +54,34 @@ dependencies:
|
|
54
54
|
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.27.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.27.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: reek
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - ">="
|
@@ -67,8 +95,9 @@ dependencies:
|
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
69
97
|
description: |
|
70
|
-
Linknew creates links to all files in another directory once.
|
71
|
-
directory you already
|
98
|
+
Linknew creates links to all files in another directory once.
|
99
|
+
You can use it to keep track of which files in a shared directory you already
|
100
|
+
looked at.
|
72
101
|
email:
|
73
102
|
- simon.kohlmeyer@gmail.com
|
74
103
|
executables:
|
@@ -78,8 +107,10 @@ extra_rdoc_files: []
|
|
78
107
|
files:
|
79
108
|
- ".gitignore"
|
80
109
|
- ".rspec"
|
110
|
+
- ".rubocop.yml"
|
81
111
|
- ".ruby-version"
|
82
112
|
- ".travis.yml"
|
113
|
+
- CHANGELOG.md
|
83
114
|
- Gemfile
|
84
115
|
- LICENSE.txt
|
85
116
|
- README.md
|
@@ -87,7 +118,6 @@ files:
|
|
87
118
|
- bin/linknew
|
88
119
|
- lib/linknew.rb
|
89
120
|
- lib/linknew/database.rb
|
90
|
-
- lib/linknew/errors.rb
|
91
121
|
- lib/linknew/version.rb
|
92
122
|
- linknew.gemspec
|
93
123
|
- spec/linknew_spec.rb
|
data/lib/linknew/errors.rb
DELETED