central 0.2.8 → 0.2.9
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/central +29 -20
- data/lib/central.rb +85 -4
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecf6eb46fbc67795241445bc38629214a0d9eb2b63237f3ade4ccc5009b2eb4f
|
4
|
+
data.tar.gz: d105df04c79771d9ae767c471185ec80147fbf7db6d552affa7d01185e4fe965
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3ec6fa7e823098fc75b55c66399b25da990bc3bdb58d9f54b1c9cb7f26b00eb123699c6772800cfc54aa68826b6152b61284c76555dd248183fbb2d9b497010
|
7
|
+
data.tar.gz: 5501d4249660a4d1d288aa6421439045f1ba66da1c316c62517a09d0ed1e7fb14f99f40fbef82966ae7d12ce411c61d0411f64872e4ace77bfdd2c52087ddd11
|
data/bin/central
CHANGED
@@ -7,29 +7,38 @@
|
|
7
7
|
# -------------------------------------------------------------------------
|
8
8
|
|
9
9
|
require 'central'
|
10
|
+
require 'optparse'
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
VERSION = 'v0.2.9'
|
13
|
+
|
14
|
+
options = {:color => true}
|
15
|
+
OptionParser.new do |opts|
|
16
|
+
opts.banner = %{central #{VERSION} - created by Dmitry Geurkov (d.geurkov@gmail.com) and licensed under LGPLv3
|
17
|
+
|
18
|
+
Usage: central [options] [directory|configuration.rb, ...]
|
19
|
+
|
20
|
+
Description: if directory is specified it will use configuration.rb file inside that directory
|
21
|
+
if no [directory|configuration.rb] is specified
|
22
|
+
it will use configuration.rb in current working directory
|
23
|
+
|
24
|
+
Options:}
|
25
|
+
opts.on("-m", "--monitor", "Monitor erb files for changes and reprocess them automatically") do |_|
|
26
|
+
options[:monitor] = true
|
15
27
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
puts ''
|
20
|
-
puts 'Usage: central [monitor] [path/to/configuration.rb]'
|
21
|
-
puts ''
|
22
|
-
puts 'Description: [monitor] - will monitor erb files for changes'
|
23
|
-
puts ' reprocess them automatically, disabled by default'
|
24
|
-
puts ' if no [path/to/configuration.rb] is specified'
|
25
|
-
puts ' it will use configuration.rb in current working directory'
|
26
|
-
exit 0
|
28
|
+
|
29
|
+
opts.on("-n", "--no-color", "Do not colorize output") do |_|
|
30
|
+
options[:color] = false
|
27
31
|
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
|
33
|
+
opts.on("-v", "--version", "Print version") do |_|
|
34
|
+
puts "central #{VERSION}"
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
end.parse!
|
38
|
+
|
39
|
+
if options[:monitor]
|
40
|
+
run_central(ARGV,options[:color])
|
32
41
|
run_monitors
|
33
42
|
else
|
34
|
-
run_central(ARGV)
|
43
|
+
run_central(ARGV,options[:color])
|
35
44
|
end
|
data/lib/central.rb
CHANGED
@@ -9,8 +9,10 @@ require 'erb'
|
|
9
9
|
require 'socket'
|
10
10
|
require 'open3'
|
11
11
|
require 'fileutils'
|
12
|
+
require 'digest'
|
12
13
|
|
13
14
|
# cli colors
|
15
|
+
$colored = true
|
14
16
|
COLOR_RED = 31
|
15
17
|
COLOR_GREEN = 32
|
16
18
|
|
@@ -19,7 +21,11 @@ $monitors = {}
|
|
19
21
|
|
20
22
|
# putsc, puts with color
|
21
23
|
def color(message, color)
|
22
|
-
|
24
|
+
if $colored
|
25
|
+
"\e[#{color}m#{message}\e[0m"
|
26
|
+
else
|
27
|
+
message
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
# info
|
@@ -170,6 +176,26 @@ def file_exists?(path)
|
|
170
176
|
File.file?(path) && File.readable?(path)
|
171
177
|
end
|
172
178
|
|
179
|
+
# get file size
|
180
|
+
def file_size(path)
|
181
|
+
File.new(abs(path)).size
|
182
|
+
end
|
183
|
+
|
184
|
+
# get file creation time
|
185
|
+
def file_ctime(path)
|
186
|
+
File.new(abs(path)).ctime
|
187
|
+
end
|
188
|
+
|
189
|
+
# get file modification time
|
190
|
+
def file_mtime(path)
|
191
|
+
File.new(abs(path)).mtime
|
192
|
+
end
|
193
|
+
|
194
|
+
# get directory entries
|
195
|
+
def dir_entries(path)
|
196
|
+
Dir.entries(abs(path)).select { |f| f != '.' && f != '..' }
|
197
|
+
end
|
198
|
+
|
173
199
|
# check if directory exists
|
174
200
|
def dir_exists?(path)
|
175
201
|
path = abs(path)
|
@@ -192,6 +218,11 @@ def symlink_path(symlink)
|
|
192
218
|
out.strip
|
193
219
|
end
|
194
220
|
|
221
|
+
# calculate SHA2 digest for a file
|
222
|
+
def sha2(file)
|
223
|
+
Digest::SHA256.hexdigest read(file)
|
224
|
+
end
|
225
|
+
|
195
226
|
# make directory including intermediate directories
|
196
227
|
def mkdir(path)
|
197
228
|
path = abs(path)
|
@@ -307,8 +338,12 @@ def git(url, path, branch: nil, silent: true, depth: nil)
|
|
307
338
|
end
|
308
339
|
|
309
340
|
# download url into a path using curl
|
310
|
-
def curl(url, path, verbose: false)
|
341
|
+
def curl(url, path, content_length_check: false, verbose: false)
|
311
342
|
path = abs(path)
|
343
|
+
if content_length_check and file_exists?(path)
|
344
|
+
content_length = curl_headers(url, verbose: verbose)['content-length'].to_i
|
345
|
+
return if file_size(path) == content_length
|
346
|
+
end
|
312
347
|
info 'Downloading', "#{url} → #{path}"
|
313
348
|
exit_code, output, = shell("curl -s -S \"#{url}\"",
|
314
349
|
verbose: verbose, silent: true)
|
@@ -320,6 +355,21 @@ def curl(url, path, verbose: false)
|
|
320
355
|
info 'Downloaded', "#{url} → #{path}"
|
321
356
|
end
|
322
357
|
|
358
|
+
# get url response headers as Hash using curl
|
359
|
+
def curl_headers(url, method: 'HEAD', verbose: false)
|
360
|
+
exit_code, output, = shell("curl -I -X #{method} -s -S \"#{url}\"",
|
361
|
+
verbose: verbose, silent: true)
|
362
|
+
unless exit_code.success?
|
363
|
+
error output
|
364
|
+
fail "Couldn't get headers from", url
|
365
|
+
end
|
366
|
+
headers = {}
|
367
|
+
output.scan(/^(?!HTTP)([^:]+):(.*)$/).each do |m|
|
368
|
+
headers[m[0].strip.downcase] = m[1].sub("\r","").strip
|
369
|
+
end
|
370
|
+
headers
|
371
|
+
end
|
372
|
+
|
323
373
|
# read content of a file
|
324
374
|
def read(file)
|
325
375
|
file = abs(file)
|
@@ -364,8 +414,17 @@ def ls(path, dotfiles: false, grep: '', dir: true, file: true)
|
|
364
414
|
ls
|
365
415
|
end
|
366
416
|
|
417
|
+
# compare_file
|
418
|
+
def compare_file(from, to)
|
419
|
+
from = abs(from)
|
420
|
+
to = abs(to)
|
421
|
+
FileUtils.compare_file(from, to)
|
422
|
+
end
|
423
|
+
|
367
424
|
# copy_file
|
368
425
|
def copy_file(from, to)
|
426
|
+
from = abs(from)
|
427
|
+
to = abs(to)
|
369
428
|
fail "Couldn't access file", from unless file_exists?(from)
|
370
429
|
|
371
430
|
return if file_exists?(to) && FileUtils.compare_file(from, to)
|
@@ -379,7 +438,27 @@ def copy(from, to)
|
|
379
438
|
from = abs(from)
|
380
439
|
to = abs(to)
|
381
440
|
if dir_exists?(from)
|
382
|
-
(
|
441
|
+
dir_entries(from).each do |f|
|
442
|
+
FileUtils.mkdir_p(to)
|
443
|
+
copy("#{from}/#{f}", "#{to}/#{f}")
|
444
|
+
end
|
445
|
+
else
|
446
|
+
copy_file(from, to)
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
# mirror
|
451
|
+
def mirror(from, to)
|
452
|
+
from = abs(from)
|
453
|
+
to = abs(to)
|
454
|
+
if dir_exists?(from)
|
455
|
+
from_entries = dir_entries(from)
|
456
|
+
if dir_exists?(to)
|
457
|
+
dir_entries(to).each do |f|
|
458
|
+
rm("#{to}/#{f}", recursive: true) unless from_entries.include?(f)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
from_entries.each do |f|
|
383
462
|
FileUtils.mkdir_p(to)
|
384
463
|
copy("#{from}/#{f}", "#{to}/#{f}")
|
385
464
|
end
|
@@ -418,6 +497,7 @@ end
|
|
418
497
|
def run(file)
|
419
498
|
cwd = pwd
|
420
499
|
file = abs(file)
|
500
|
+
file = File.join(file,'configuration.rb') if not file_exists?(file) and dir_exists?(file)
|
421
501
|
fail 'No configuration file found', file unless file_exists?(file)
|
422
502
|
|
423
503
|
info 'Running configuration', file
|
@@ -433,7 +513,8 @@ def run_if_exists(file)
|
|
433
513
|
end
|
434
514
|
|
435
515
|
# run central configuration
|
436
|
-
def run_central(configurations)
|
516
|
+
def run_central(configurations, colored = true)
|
517
|
+
$colored = colored
|
437
518
|
if configurations.instance_of?(Array) && !configurations.empty?
|
438
519
|
configurations.each { |configuration| run configuration }
|
439
520
|
elsif configurations.instance_of?(String)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: central
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Geurkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: central dotfile management system
|
14
14
|
email: d.geurkov@gmail.com
|
@@ -38,8 +38,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '0'
|
40
40
|
requirements: []
|
41
|
-
|
42
|
-
rubygems_version: 2.7.6
|
41
|
+
rubygems_version: 3.1.4
|
43
42
|
signing_key:
|
44
43
|
specification_version: 4
|
45
44
|
summary: central dotfile management
|