Add support for special files

Like sockets, character and block devices.
This commit is contained in:
Claudio Bley 2018-10-21 18:37:06 +02:00
parent 71e8ca2320
commit 4a0ece2908
5 changed files with 40 additions and 36 deletions

View file

@ -144,9 +144,6 @@ module ColorLS
@file_aliase_keys = @file_aliases.keys
@folder_keys = @folders.keys
@folder_aliase_keys = @folder_aliases.keys
@all_files = @file_keys + @file_aliase_keys
@all_folders = @folder_keys + @folder_aliase_keys
end
def chunkify
@ -318,23 +315,33 @@ module ColorLS
print "\n"
end
def file_color(file, key)
color_key = case
when file.chardev? then :chardev
when file.blockdev? then :blockdev
when file.socket? then :socket
else
@file_keys.include?(key) ? :recognized_file : :unrecognized_file
end
@colors[color_key]
end
def options(content)
if content.directory?
key = content.name.to_sym
color = @colors[:dir]
return [:folder, color, :folders] unless @all_folders.include?(key)
key = @folder_aliases[key] unless @folder_keys.include?(key)
return [key, color, :folders]
key = :folder if key.nil?
color = @colors[:dir]
group = :folders
else
key = content.name.split('.').last.downcase.to_sym
key = @file_aliases[key] unless @file_keys.include?(key)
key = :file if key.nil?
color = file_color(content, key)
group = @file_keys.include?(key) ? :recognized_files : :unrecognized_files
end
color = @colors[:recognized_file]
return [content.downcase.to_sym, color, :recognized_files] if @file_keys.include?(key)
key = content.name.split('.').last.downcase.to_sym
return [:file, @colors[:unrecognized_file], :unrecognized_files] unless @all_files.include?(key)
key = @file_aliases[key] unless @file_keys.include?(key)
[key, color, :recognized_files]
[key, color, group]
end
def tree_traverse(path, prespace, indent)

View file

@ -1,5 +1,7 @@
module ColorLS
class FileInfo
extend Forwardable
@@users = {} # rubocop:disable Style/ClassVars
@@groups = {} # rubocop:disable Style/ClassVars
@ -31,10 +33,6 @@ module ColorLS
@stats.uid.to_s
end
def owned?
@stats.owned?
end
def group
return @@groups[@stats.gid] if @@groups.key? @stats.gid
group = Etc.getgrgid(@stats.gid)
@ -43,22 +41,6 @@ module ColorLS
@stats.gid.to_s
end
def mtime
@stats.mtime
end
def size
@stats.size
end
def directory?
@stats.directory?
end
def symlink?
@stats.symlink?
end
# target of a symlink (only available for symlinks)
def link_target
@target
@ -67,5 +49,7 @@ module ColorLS
def to_s
name
end
def_delegators :@stats, :directory?, :socket?, :chardev?, :symlink?, :blockdev?, :mtime, :size, :owned?
end
end

View file

@ -7,6 +7,11 @@ dir: dodgerblue
dead_link: red
link: cyan
# special files
socket: green
blockdev: green
chardev: green
# Access Modes
write: darkkhaki
read: limegreen
@ -36,4 +41,4 @@ addition: chartreuse
modification: darkkhaki
deletion: darkred
untracked: darkorange
unchanged: forestgreen
unchanged: forestgreen

View file

@ -7,6 +7,11 @@ dir: navyblue
dead_link: red
link: cyan
# special files
socket: darkgray
blockdev: darkgray
chardev: darkgray
# Access Modes
write: red
read: sienna
@ -36,4 +41,4 @@ addition: chartreuse
modification: darkkhaki
deletion: darkred
untracked: darkorange
unchanged: darkgreen
unchanged: darkgreen

View file

@ -56,6 +56,9 @@ RSpec.describe ColorLS::Flags do
:owner => "user",
:name => "a.txt",
:size => 128,
:blockdev? => false,
:chardev? => false,
:socket? => false,
:symlink? => false,
:stats => OpenStruct.new(
mode: 0o444, # read for user, owner, other