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.
@@ -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
@@ -0,0 +1,6 @@
1
+ module Dle
2
+ class Filesystem
3
+ class Softnode < OpenStruct
4
+ end
5
+ end
6
+ end
@@ -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
@@ -0,0 +1,4 @@
1
+ module Dle
2
+ VERSION = "0.1.0"
3
+ UPDATE_URL = "https://raw.githubusercontent.com/2called-chaos/dle/master/VERSION"
4
+ end
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: