dle 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: