diff --git a/lib/colorls/core.rb b/lib/colorls/core.rb index 7b968d5..db8f461 100644 --- a/lib/colorls/core.rb +++ b/lib/colorls/core.rb @@ -11,7 +11,7 @@ module ColorLS class Core def initialize(input, all: false, report: false, sort: false, show: false, mode: nil, git_status: false, almost_all: false, colors: [], group: nil, - reverse: false, hyperlink: false, tree_depth: nil) + reverse: false, hyperlink: false, tree_depth: nil, show_group: true, show_user: true) @input = (+input).force_encoding(ColorLS.file_encoding) @count = {folders: 0, recognized_files: 0, unrecognized_files: 0} @all = all @@ -23,7 +23,7 @@ module ColorLS @group = group @show = show @one_per_line = mode == :one_per_line - @long = mode == :long + init_long_format(mode,show_group,show_user) @tree = {mode: mode == :tree, depth: tree_depth} @horizontal = mode == :horizontal process_git_status_details(git_status) @@ -75,6 +75,12 @@ module ColorLS end end + def init_long_format(mode,show_group,show_user) + @long = mode == :long + @show_group = show_group + @show_user = show_user + end + # how much characters an item occupies besides its name CHARS_PER_ITEM = 12 @@ -274,8 +280,11 @@ module ColorLS links = content.nlink.to_s.rjust(@linklength) - [mode_info(content.stats), links, user_info(content), group_info(content.group), - size_info(content.size), mtime_info(content.mtime)].join(' ') + line_array = [mode_info(content.stats), links] + line_array.push user_info(content) if @show_user + line_array.push group_info(content.group) if @show_group + line_array.concat [size_info(content.size), mtime_info(content.mtime)] + line_array.join(' ') end def symlink_info(content) diff --git a/lib/colorls/flags.rb b/lib/colorls/flags.rb index 168d480..60bd0ab 100644 --- a/lib/colorls/flags.rb +++ b/lib/colorls/flags.rb @@ -10,19 +10,7 @@ module ColorLS @args = args @light_colors = false - @opts = { - show: false, - sort: true, - reverse: false, - group: nil, - mode: STDOUT.tty? ? :vertical : :one_per_line, # rubocop:disable Style/GlobalStdStream - all: false, - almost_all: false, - report: false, - git_status: false, - colors: [], - tree_depth: 3 - } + @opts = default_opts parse_options @@ -81,6 +69,24 @@ module ColorLS warn "WARN: #{e}, check your locale settings" end + def default_opts + { + show: false, + sort: true, + reverse: false, + group: nil, + mode: STDOUT.tty? ? :vertical : :one_per_line, # rubocop:disable Style/GlobalStdStream + all: false, + almost_all: false, + report: false, + git_status: false, + colors: [], + tree_depth: 3, + show_group: true, + show_user: true + } + end + def add_sort_options(options) options.separator '' options.separator 'sorting options:' @@ -126,8 +132,7 @@ module ColorLS when 'single-column' then @opts[:mode] = :one_per_line end end - options.on('-1', 'list one file per line') { @opts[:mode] = :one_per_line } - options.on('-l', '--long', 'use a long listing format') { @opts[:mode] = :long } + options.on('-1', 'list one file per line') { @opts[:mode] = :one_per_line } options.on('--tree=[DEPTH]', Integer, 'shows tree view of the directory') do |depth| @opts[:tree_depth] = depth @opts[:mode] = :tree @@ -136,6 +141,19 @@ module ColorLS options.on('-C', 'list entries by columns instead of by lines') { @opts[:mode] = :vertical } end + def add_long_style_options(options) + options.on('-l', '--long', 'use a long listing format') { @opts[:mode] = :long } + options.on('-o', 'use a long listing format without group information') do + @opts[:mode] = :long + @opts[:show_group] = false + end + options.on('-g', 'use a long listing format without owner information') do + @opts[:mode] = :long + @opts[:show_user] = false + end + options.on('-G', '--no-group', 'show no group information in a long listing') { @opts[:show_group] = false } + end + def add_general_options(options) options.separator '' options.separator 'general options:' @@ -196,17 +214,22 @@ module ColorLS EXAMPLES end + def assign_each_options(opts) + add_common_options(opts) + add_format_options(opts) + add_long_style_options(opts) + add_sort_options(opts) + add_compatiblity_options(opts) + add_general_options(opts) + add_help_option(opts) + end + def parse_options @parser = OptionParser.new do |opts| opts.banner = 'Usage: colorls [OPTION]... [FILE]...' opts.separator '' - add_common_options(opts) - add_format_options(opts) - add_sort_options(opts) - add_compatiblity_options(opts) - add_general_options(opts) - add_help_option(opts) + assign_each_options(opts) opts.on_tail('--version', 'show version') do puts ColorLS::VERSION diff --git a/man/colorls.1 b/man/colorls.1 index 93234eb..d050b46 100644 --- a/man/colorls.1 +++ b/man/colorls.1 @@ -1,7 +1,7 @@ .\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . -.TH "COLORLS" "1" "October 2020" "colorls 1.4.2" "colorls Manual" +.TH "COLORLS" "1" "November 2020" "colorls 1.4.2" "colorls Manual" . .SH "NAME" \fBcolorls\fR \- list directory contents with colors and icons @@ -55,10 +55,6 @@ use format: across (\-x), horizontal (\-x), long (\-l), single\-column (\-1), ve list one file per line . .TP -\fB\-l\fR, \fB\-\-long\fR -use a long listing format -. -.TP \fB\-\-tree\fR shows tree view of the directory . @@ -71,6 +67,22 @@ list entries by lines instead of by columns list entries by columns instead of by lines . .TP +\fB\-l\fR, \fB\-\-long\fR +use a long listing format +. +.TP +\fB\-o\fR +use a long listing format without group information +. +.TP +\fB\-g\fR +use a long listing format without owner information +. +.TP +\fB\-G\fR, \fB\-\-no\-group\fR +show no group information in a long listing +. +.TP \fB\-\-sd\fR, \fB\-\-sort\-dirs\fR, \fB\-\-group\-directories\-first\fR sort directories first . diff --git a/spec/color_ls/flags_spec.rb b/spec/color_ls/flags_spec.rb index a6e6957..2932543 100644 --- a/spec/color_ls/flags_spec.rb +++ b/spec/color_ls/flags_spec.rb @@ -325,4 +325,156 @@ RSpec.describe ColorLS::Flags do expect(subject).to eq 2 end end + + context 'with -o flag' do + let(:args) { ['-o', "#{FIXTURES}/a.txt"] } + + before do + fileInfo = instance_double( + 'FileInfo', + :group => "sys", + :mtime => Time.now, + :directory? => false, + :owner => "user", + :name => "a.txt", + :show => "a.txt", + :nlink => 1, + :size => 128, + :blockdev? => false, + :chardev? => false, + :socket? => false, + :symlink? => false, + :stats => OpenStruct.new( + mode: 0o444, # read for user, owner, other + setuid?: true, + setgid?: true, + sticky?: true + ), + :executable? => false + ) + + allow(ColorLS::FileInfo).to receive(:new).with("#{FIXTURES}/a.txt", link_info: true) { fileInfo } + end + + it 'lists without group info' do + expect { subject }.not_to output(/sys/).to_stdout + end + it 'lists with user info' do + expect { subject }.to output(/user/).to_stdout + end + end + + context 'with -g flag' do + let(:args) { ['-g', "#{FIXTURES}/a.txt"] } + + before do + fileInfo = instance_double( + 'FileInfo', + :group => "sys", + :mtime => Time.now, + :directory? => false, + :owner => "user", + :name => "a.txt", + :show => "a.txt", + :nlink => 1, + :size => 128, + :blockdev? => false, + :chardev? => false, + :socket? => false, + :symlink? => false, + :stats => OpenStruct.new( + mode: 0o444, # read for user, owner, other + setuid?: true, + setgid?: true, + sticky?: true + ), + :executable? => false + ) + + allow(ColorLS::FileInfo).to receive(:new).with("#{FIXTURES}/a.txt", link_info: true) { fileInfo } + end + + it 'lists with group info' do + expect { subject }.to output(/sys/).to_stdout + end + it 'lists without user info' do + expect { subject }.not_to output(/user/).to_stdout + end + end + + context 'with -o and -g flag' do + let(:args) { ['-og', "#{FIXTURES}/a.txt"] } + + before do + fileInfo = instance_double( + 'FileInfo', + :group => "sys", + :mtime => Time.now, + :directory? => false, + :owner => "user", + :name => "a.txt", + :show => "a.txt", + :nlink => 1, + :size => 128, + :blockdev? => false, + :chardev? => false, + :socket? => false, + :symlink? => false, + :stats => OpenStruct.new( + mode: 0o444, # read for user, owner, other + setuid?: true, + setgid?: true, + sticky?: true + ), + :executable? => false + ) + + allow(ColorLS::FileInfo).to receive(:new).with("#{FIXTURES}/a.txt", link_info: true) { fileInfo } + end + + it 'lists without group info' do + expect { subject }.not_to output(/sys/).to_stdout + end + it 'lists without user info' do + expect { subject }.not_to output(/user/).to_stdout + end + end + + context 'with -G flag in a listing format' do + let(:args) { ['-l', '-G', "#{FIXTURES}/a.txt"] } + + before do + fileInfo = instance_double( + 'FileInfo', + :group => "sys", + :mtime => Time.now, + :directory? => false, + :owner => "user", + :name => "a.txt", + :show => "a.txt", + :nlink => 1, + :size => 128, + :blockdev? => false, + :chardev? => false, + :socket? => false, + :symlink? => false, + :stats => OpenStruct.new( + mode: 0o444, # read for user, owner, other + setuid?: true, + setgid?: true, + sticky?: true + ), + :executable? => false + ) + + allow(ColorLS::FileInfo).to receive(:new).with("#{FIXTURES}/a.txt", link_info: true) { fileInfo } + end + + it 'lists without group info' do + expect { subject }.not_to output(/sys/).to_stdout + end + it 'lists with user info' do + expect { subject }.to output(/user/).to_stdout + end + end end diff --git a/zsh/_colorls b/zsh/_colorls index 631dc10..0d90fcd 100644 --- a/zsh/_colorls +++ b/zsh/_colorls @@ -17,11 +17,15 @@ _arguments -s -S \ "--report[show brief report]" \ "--format[use format: across (-x), horizontal (-x), long (-l), single-column (-1), vertical (-C)]" \ "-1[list one file per line]" \ - "-l[use a long listing format]" \ - "--long[use a long listing format]" \ "--tree[shows tree view of the directory]" \ "-x[list entries by lines instead of by columns]" \ "-C[list entries by columns instead of by lines]" \ + "-l[use a long listing format]" \ + "--long[use a long listing format]" \ + "-o[use a long listing format without group information]" \ + "-g[use a long listing format without owner information]" \ + "-G[show no group information in a long listing]" \ + "--no-group[show no group information in a long listing]" \ "--sd[sort directories first]" \ "--sort-dirs[sort directories first]" \ "--group-directories-first[sort directories first]" \