dle 0.1.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +71 -0
- data/Rakefile +1 -0
- data/VERSION +1 -0
- data/bin/dle +3 -0
- data/bin/dle.sh +14 -0
- data/dle.gemspec +24 -0
- data/lib/active_support/core_ext/object/blank.rb +112 -0
- data/lib/active_support/core_ext/object/try.rb +53 -0
- data/lib/banana/logger.rb +258 -0
- data/lib/dle.rb +24 -0
- data/lib/dle/application.rb +96 -0
- data/lib/dle/application/dispatch.rb +151 -0
- data/lib/dle/dl_file.rb +111 -0
- data/lib/dle/filesystem.rb +109 -0
- data/lib/dle/filesystem/destructive.rb +115 -0
- data/lib/dle/filesystem/node.rb +44 -0
- data/lib/dle/filesystem/softnode.rb +6 -0
- data/lib/dle/helpers.rb +43 -0
- data/lib/dle/version.rb +4 -0
- metadata +112 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
module Dle
|
2
|
+
class Filesystem
|
3
|
+
# This class performs all destructive methods and MUST ENSURE that simulation setting is respected.
|
4
|
+
class Destructive
|
5
|
+
def initialize app, action, fs, snode
|
6
|
+
@app, @action, @fs, @snode = app, action, fs, snode
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
send("perform_#{@action}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def source_node
|
14
|
+
@source_node ||= begin
|
15
|
+
@fs.reindex!
|
16
|
+
@fs.index[@snode.snode.inode]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def perform_chown
|
21
|
+
unam, gnam = @snode.should.split(":")
|
22
|
+
uid = Etc.getpwnam(unam).uid
|
23
|
+
gid = gnam ? Etc.getgrnam(gnam).gid : Etc.getpwnam(unam).gid
|
24
|
+
if @app.opts[:simulate]
|
25
|
+
@app.log "File.chown(#{uid}, #{gid}, #{source_node.path})"
|
26
|
+
else
|
27
|
+
begin
|
28
|
+
File.chown(uid, gid, source_node.path)
|
29
|
+
rescue Errno::EPERM
|
30
|
+
@app.warn "Operation not permitted - #{source_node.path}"
|
31
|
+
rescue
|
32
|
+
@app.warn "Unhandled error - #{$!.message}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def perform_chmod
|
38
|
+
if @app.opts[:simulate]
|
39
|
+
@app.log "File.chmod(0#{@snode.should}, #{source_node.path})"
|
40
|
+
else
|
41
|
+
begin
|
42
|
+
File.chmod(@snode.should.to_i(8), source_node.path)
|
43
|
+
rescue Errno::EPERM
|
44
|
+
@app.warn "Operation not permitted - #{source_node.path}"
|
45
|
+
rescue
|
46
|
+
@app.warn "Unhandled error - #{$!.message}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def perform_mv action = :mv
|
52
|
+
dest = File.expand_path(@snode.snode.path)
|
53
|
+
dest_dir = File.dirname(dest)
|
54
|
+
|
55
|
+
# ensure destination directory
|
56
|
+
if !FileTest.directory?(dest_dir)
|
57
|
+
if @app.opts[:simulate]
|
58
|
+
@app.log "FileUtils.mkdir_p(#{dest_dir})"
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
FileUtils.mkdir_p(dest_dir)
|
62
|
+
rescue Errno::EPERM
|
63
|
+
@app.warn "Operation not permitted - #{dest_dir}"
|
64
|
+
rescue
|
65
|
+
@app.warn "Unhandled error - #{$!.message}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# use recursive copy for directories
|
71
|
+
action = :cp_r if action == :cp && FileTest.directory?(source_node.path)
|
72
|
+
|
73
|
+
if @app.opts[:simulate]
|
74
|
+
@app.log "FileUtils.#{action}(#{source_node.path}, #{dest})"
|
75
|
+
else
|
76
|
+
begin
|
77
|
+
FileUtils.send(action, source_node.path, dest)
|
78
|
+
rescue Errno::EPERM
|
79
|
+
@app.warn "Operation not permitted - #{source_node.path} => #{dest}"
|
80
|
+
rescue
|
81
|
+
@app.warn "Unhandled error - #{$!.message}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def perform_cp
|
87
|
+
perform_mv :cp
|
88
|
+
end
|
89
|
+
|
90
|
+
def perform_rm
|
91
|
+
case @snode.snode.mode
|
92
|
+
when "del" then _perform_rm
|
93
|
+
when "delf" then _perform_rm(:rm_f)
|
94
|
+
when "delr" then _perform_rm(:rm_r)
|
95
|
+
when "delrf" then _perform_rm(:rm_rf)
|
96
|
+
else raise(RuntimeError, "unknown rm mode #{@snode.snode.mode}")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def _perform_rm action = :rm
|
101
|
+
if @app.opts[:simulate]
|
102
|
+
@app.log "FileUtils.#{action}(#{source_node.path})"
|
103
|
+
else
|
104
|
+
begin
|
105
|
+
FileUtils.send(action, source_node.path)
|
106
|
+
rescue Errno::EPERM
|
107
|
+
@app.warn "Operation not permitted - #{source_node.path}"
|
108
|
+
rescue
|
109
|
+
@app.warn "Unhandled error - #{$!.message}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Dle
|
2
|
+
class Filesystem
|
3
|
+
class Node
|
4
|
+
attr_reader :path, :fs
|
5
|
+
|
6
|
+
def initialize fs, path
|
7
|
+
@fs = fs
|
8
|
+
@path = path
|
9
|
+
end
|
10
|
+
|
11
|
+
def relative_path
|
12
|
+
@fs.relative_path(@path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def mode
|
16
|
+
sprintf("%o", stat.mode).to_s[-3..-1]
|
17
|
+
end
|
18
|
+
|
19
|
+
def owngrp
|
20
|
+
"#{owner}:#{group}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def owner
|
24
|
+
Etc.getpwuid(stat.uid).name
|
25
|
+
end
|
26
|
+
|
27
|
+
def group
|
28
|
+
Etc.getgrgid(stat.gid).name
|
29
|
+
end
|
30
|
+
|
31
|
+
def inode
|
32
|
+
"#{stat.dev.to_s(36)}-#{stat.ino.to_s(36)}"
|
33
|
+
end
|
34
|
+
|
35
|
+
[:basename, :dirname, :extname, :stat, :size].each do |meth|
|
36
|
+
define_method(meth) {|*a| File.send(meth, @path, *a) }
|
37
|
+
end
|
38
|
+
|
39
|
+
[:directory?, :file?, :symlink?].each do |meth|
|
40
|
+
define_method(meth) {|*a| FileTest.send(meth, @path, *a) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/dle/helpers.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Dle
|
2
|
+
module Helpers
|
3
|
+
BYTE_UNITS = %W(TiB GiB MiB KiB B).freeze
|
4
|
+
|
5
|
+
def human_filesize(s)
|
6
|
+
s = s.to_f
|
7
|
+
i = BYTE_UNITS.length - 1
|
8
|
+
while s > 512 && i > 0
|
9
|
+
i -= 1
|
10
|
+
s /= 1024
|
11
|
+
end
|
12
|
+
((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + BYTE_UNITS[i]
|
13
|
+
end
|
14
|
+
|
15
|
+
def render_table table, headers = []
|
16
|
+
[].tap do |r|
|
17
|
+
col_sizes = table.map{|col| col.map(&:to_s).map(&:length).max }
|
18
|
+
headers.map(&:length).each_with_index do |length, header|
|
19
|
+
col_sizes[header] = [col_sizes[header], length].max
|
20
|
+
end
|
21
|
+
|
22
|
+
# header
|
23
|
+
if headers.any?
|
24
|
+
r << [].tap do |line|
|
25
|
+
col_sizes.count.times do |col|
|
26
|
+
line << headers[col].ljust(col_sizes[col])
|
27
|
+
end
|
28
|
+
end.join(" | ")
|
29
|
+
r << "".ljust(col_sizes.inject(&:+) + ((col_sizes.count - 1) * 3), "-")
|
30
|
+
end
|
31
|
+
|
32
|
+
# records
|
33
|
+
table[0].count.times do |row|
|
34
|
+
r << [].tap do |line|
|
35
|
+
col_sizes.count.times do |col|
|
36
|
+
line << "#{table[col][row]}".ljust(col_sizes[col])
|
37
|
+
end
|
38
|
+
end.join(" | ")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/dle/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sven Pachnit
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pry
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: You can move, rename, chmod, chown or remove individual files or directories
|
56
|
+
with your favorite text editor.
|
57
|
+
email:
|
58
|
+
- sven@bmonkeys.net
|
59
|
+
executables:
|
60
|
+
- dle
|
61
|
+
- dle.sh
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- .gitignore
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE.txt
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- VERSION
|
71
|
+
- bin/dle
|
72
|
+
- bin/dle.sh
|
73
|
+
- dle.gemspec
|
74
|
+
- lib/active_support/core_ext/object/blank.rb
|
75
|
+
- lib/active_support/core_ext/object/try.rb
|
76
|
+
- lib/banana/logger.rb
|
77
|
+
- lib/dle.rb
|
78
|
+
- lib/dle/application.rb
|
79
|
+
- lib/dle/application/dispatch.rb
|
80
|
+
- lib/dle/dl_file.rb
|
81
|
+
- lib/dle/filesystem.rb
|
82
|
+
- lib/dle/filesystem/destructive.rb
|
83
|
+
- lib/dle/filesystem/node.rb
|
84
|
+
- lib/dle/filesystem/softnode.rb
|
85
|
+
- lib/dle/helpers.rb
|
86
|
+
- lib/dle/version.rb
|
87
|
+
homepage: https://github.com/2called-chaos/dle
|
88
|
+
licenses:
|
89
|
+
- MIT
|
90
|
+
metadata: {}
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
requirements: []
|
106
|
+
rubyforge_project:
|
107
|
+
rubygems_version: 2.0.3
|
108
|
+
signing_key:
|
109
|
+
specification_version: 4
|
110
|
+
summary: Directory List Edit – Edit file structures in your favorite editor!
|
111
|
+
test_files: []
|
112
|
+
has_rdoc:
|