crawling 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 +4 -4
- data/bin/crawling +16 -10
- data/crawling.gemspec +1 -1
- data/lib/crawling/version.rb +1 -1
- data/lib/crawling.rb +64 -41
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58b06f8d2ecfcaf9426d38d525f90e0385db30f0
|
4
|
+
data.tar.gz: e03d6cac9a48affb12ef7f3dc0b327c914960686
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60a167da46d0fb9bad4f679062328f1c8a49da7908bfda35b9312aa9df2f1887a31c39f374a8cb050c540d706b94d07d790a5aa3ee0d429775b5a68dcbd153b5
|
7
|
+
data.tar.gz: d0d95bb35f2be14eca28ccdd2611b85c3cceb605860f885a11ca08fc3e6e1aeedcc6f15b058138951cb289bfce1104beefe0cae8b754da813022e5164515badb
|
data/bin/crawling
CHANGED
@@ -6,6 +6,10 @@ require 'moister'
|
|
6
6
|
require 'ostruct'
|
7
7
|
|
8
8
|
module Crawling::Command
|
9
|
+
def self.nil_if_empty arr
|
10
|
+
arr.empty? ? nil : arr
|
11
|
+
end
|
12
|
+
|
9
13
|
def self.run args
|
10
14
|
config = nil
|
11
15
|
command = nil
|
@@ -25,16 +29,15 @@ module Crawling::Command
|
|
25
29
|
op.on '-H', '--home dir', 'path to home directory', 'home_dir'
|
26
30
|
|
27
31
|
op.subcommand 'cd', 'run shell in store directory'
|
28
|
-
op.subcommand 'add', 'add
|
29
|
-
op.subcommand 'get', 'get
|
30
|
-
op.subcommand 'diff', 'show differences between store directory and filesystem'
|
31
|
-
op.subcommand 'merge', 'merge differences between store directory and filesystem' do |subop|
|
32
|
+
op.subcommand 'add,a *paths', 'add paths to store directory'
|
33
|
+
op.subcommand 'get,g *paths', 'get paths from store directory'
|
34
|
+
op.subcommand 'diff,d [*paths]', 'show differences between store directory and filesystem'
|
35
|
+
op.subcommand 'merge,m [*paths]', 'merge differences between store directory and filesystem' do |subop|
|
32
36
|
op.on '-m', '--merge-app app', 'command used to merge files', 'merge_app'
|
33
37
|
end
|
34
38
|
op.subcommand 'clone', 'clone or pull latest store using configured commands'
|
35
39
|
|
36
40
|
parsed_cfg = op.parse(args)
|
37
|
-
positionals = parsed_cfg.positionals
|
38
41
|
command = parsed_cfg.command
|
39
42
|
config = OpenStruct.new parsed_cfg[:config]
|
40
43
|
end
|
@@ -44,18 +47,21 @@ module Crawling::Command
|
|
44
47
|
exit
|
45
48
|
end
|
46
49
|
|
50
|
+
command_cfg = OpenStruct.new config[command]
|
51
|
+
config.delete_field command
|
52
|
+
|
47
53
|
crawling = Crawling::Instance.new(**config.to_h)
|
48
54
|
case command
|
49
55
|
when 'cd'
|
50
|
-
crawling.cd
|
56
|
+
crawling.cd
|
51
57
|
when 'add'
|
52
|
-
crawling.add
|
58
|
+
crawling.add command_cfg.paths
|
53
59
|
when 'get'
|
54
|
-
crawling.get
|
60
|
+
crawling.get command_cfg.paths
|
55
61
|
when 'diff'
|
56
|
-
crawling.diff
|
62
|
+
crawling.diff nil_if_empty(command_cfg.paths)
|
57
63
|
when 'merge'
|
58
|
-
crawling.merge
|
64
|
+
crawling.merge nil_if_empty(command_cfg.paths)
|
59
65
|
when 'clone'
|
60
66
|
crawling.clone
|
61
67
|
end
|
data/crawling.gemspec
CHANGED
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
32
|
spec.add_development_dependency "rspec"
|
33
33
|
|
34
|
-
spec.add_dependency "moister", "~> 0.
|
34
|
+
spec.add_dependency "moister", "~> 0.3"
|
35
35
|
spec.add_dependency "diffy", "~> 3.1.0"
|
36
36
|
end
|
data/lib/crawling/version.rb
CHANGED
data/lib/crawling.rb
CHANGED
@@ -15,6 +15,11 @@ module Crawling
|
|
15
15
|
Dir.glob("#{path}/**/*", File::FNM_DOTMATCH).reject(&File.method(:directory?))
|
16
16
|
end
|
17
17
|
|
18
|
+
# relative_to must be an absolute Pathname
|
19
|
+
def self.relative_path_to target, relative_to
|
20
|
+
Pathname.new(target).expand_path.relative_path_from relative_to
|
21
|
+
end
|
22
|
+
|
18
23
|
# Like File.cp but also creates the parent directory at destination if it doesn't exist
|
19
24
|
def self.copy_file src_file, dest_file
|
20
25
|
dest_parent_dir = File.dirname dest_file
|
@@ -26,22 +31,49 @@ module Crawling
|
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
34
|
+
class Store
|
35
|
+
attr_reader :store_dir
|
36
|
+
|
37
|
+
def initialize store_dir, sys_dir
|
38
|
+
@store_dir = File.absolute_path store_dir
|
39
|
+
@store_pathname = Pathname.new(store_dir).expand_path
|
40
|
+
@sys_dir = File.absolute_path sys_dir
|
41
|
+
@sys_pathname = Pathname.new(sys_dir).expand_path
|
42
|
+
end
|
43
|
+
|
44
|
+
# if path is within store then return system path otherwise return nil
|
45
|
+
def get_sys_path path
|
46
|
+
if path.start_with? @store_dir
|
47
|
+
File.join @sys_dir, Crawling.relative_path_to(path, @store_pathname)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# if path is within system then return store path otherwise return nil
|
52
|
+
def get_store_path path
|
53
|
+
if path.start_with? @sys_dir
|
54
|
+
File.join @store_dir, Crawling.relative_path_to(path, @sys_pathname)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
29
59
|
class Instance
|
30
60
|
def initialize(config_dir: nil, home_dir: nil, merge_app: nil)
|
31
61
|
@home_dir = home_dir || ENV['HOME']
|
32
|
-
@home_pathname = Pathname.new(@home_dir).expand_path
|
33
62
|
@config_dir = config_dir || "#{@home_dir}/.config/crawling"
|
34
63
|
@config_pathname = Pathname.new(@config_dir).expand_path
|
35
64
|
@merge_app = merge_app || 'vimdiff %s %h'
|
36
|
-
end
|
37
65
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
66
|
+
stores = { 'home' => @home_dir }
|
67
|
+
@stores = stores.map do |store_dir, sys_dir|
|
68
|
+
store_dir = File.join(@config_dir, store_dir)
|
69
|
+
Store.new store_dir, sys_dir
|
70
|
+
end
|
71
|
+
end
|
42
72
|
|
43
|
-
|
44
|
-
|
73
|
+
def cd
|
74
|
+
FileUtils::mkdir_p @config_dir unless Dir.exists? @config_dir
|
75
|
+
Dir.chdir @config_dir
|
76
|
+
puts "creating shell in #{@config_dir}, type exit or ctrl-D to exit"
|
45
77
|
system ENV['SHELL']
|
46
78
|
puts "crawling shell exited"
|
47
79
|
end
|
@@ -65,13 +97,18 @@ module Crawling
|
|
65
97
|
raise "path #{path} does not exist in storage" unless File.exists? storage_path
|
66
98
|
|
67
99
|
files_from(storage_path).each do |storage_file|
|
68
|
-
|
69
|
-
|
100
|
+
if storage_file == storage_path
|
101
|
+
Crawling.copy_file storage_file, path
|
102
|
+
else
|
103
|
+
# path was a directory so recalculate new system path
|
104
|
+
path_offset = storage_file[storage_path.length..-1]
|
105
|
+
Crawling.copy_file storage_file, path + path_offset
|
106
|
+
end
|
70
107
|
end
|
71
108
|
end
|
72
109
|
end
|
73
110
|
|
74
|
-
def diff paths
|
111
|
+
def diff paths = nil
|
75
112
|
each_with_storage_path(files_from_paths_or_all paths) do |file, storage_file|
|
76
113
|
missing_from = file_or_storage_file_doesnt_exist file, storage_file
|
77
114
|
if missing_from
|
@@ -88,7 +125,7 @@ module Crawling
|
|
88
125
|
end
|
89
126
|
end
|
90
127
|
|
91
|
-
def merge paths
|
128
|
+
def merge paths = nil
|
92
129
|
each_with_storage_path(files_from_paths_or_all paths) do |file, storage_file|
|
93
130
|
missing_from = file_or_storage_file_doesnt_exist file, storage_file
|
94
131
|
if missing_from
|
@@ -138,47 +175,33 @@ module Crawling
|
|
138
175
|
|
139
176
|
private
|
140
177
|
def get_config_dir
|
141
|
-
FileUtils::mkdir_p @config_dir unless Dir.exists? @config_dir
|
142
178
|
@config_dir
|
143
179
|
end
|
144
180
|
|
145
|
-
def relative_path_to target, relative_to
|
146
|
-
Pathname.new(target).expand_path.relative_path_from relative_to
|
147
|
-
end
|
148
|
-
|
149
181
|
def each_with_storage_path paths
|
150
182
|
paths.each do |path|
|
151
|
-
|
183
|
+
pair = get_path_pair(path)
|
184
|
+
raise "could not resolve #{path} to store" if pair.nil?
|
185
|
+
yield pair
|
152
186
|
end
|
153
187
|
end
|
154
188
|
|
155
|
-
def
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
def from_storage_path path
|
165
|
-
cfg_rel_path = Pathname.new(relative_path_to path, @config_pathname)
|
166
|
-
head, *tail = Pathname(cfg_rel_path).each_filename.to_a
|
167
|
-
if head === 'home'
|
168
|
-
File.join @home_dir, *tail
|
169
|
-
else
|
170
|
-
raise "storage type #{head} not supported yet"
|
189
|
+
def get_path_pair path
|
190
|
+
path = File.absolute_path path
|
191
|
+
@stores.each do |store|
|
192
|
+
sys_path = store.get_sys_path path
|
193
|
+
return [ sys_path, path ] if sys_path
|
194
|
+
store_path = store.get_store_path path
|
195
|
+
return [ path, store_path ] if store_path
|
171
196
|
end
|
197
|
+
nil
|
172
198
|
end
|
173
199
|
|
174
|
-
# if paths is empty then get
|
175
|
-
#
|
200
|
+
# if paths is empty then get all paths from stores otherwise get files
|
201
|
+
# recursively reachable from the provided paths
|
176
202
|
def files_from_paths_or_all paths
|
177
|
-
if paths.
|
178
|
-
|
179
|
-
Crawling.child_files_recursive(
|
180
|
-
File.join(@config_dir, HOME_PARENT_DIR)
|
181
|
-
).map &method(:from_storage_path)
|
203
|
+
if paths.nil?
|
204
|
+
@stores.map { |store| Crawling.child_files_recursive(store.store_dir) }.flatten
|
182
205
|
else
|
183
206
|
paths.map(&method(:files_from)).flatten
|
184
207
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crawling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Pike
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.3'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
68
|
+
version: '0.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: diffy
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|