Initial commit. ofind provides partial file info, cbor.

master
Karchnu 2020-11-29 01:14:51 +01:00
commit 3dec5a086c
3 changed files with 124 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
old/
bin/
lib/
shard.lock

24
shard.yml Normal file
View File

@ -0,0 +1,24 @@
name: osh
version: 0.1.0
# authors:
# - name <email@example.com>
description: |
Oriented-object shell (and associated tools).
dependencies:
baguette-crystal-base:
git: https://git.baguette.netlib.re/Baguette/baguette-crystal-base
branch: master
cbor:
git: https://git.baguette.netlib.re/Baguette/crystal-cbor
branch: master
targets:
osh:
main: src/osh/main.cr
ofind:
main: src/ofind/main.cr
license: ISC

96
src/ofind/main.cr Normal file
View File

@ -0,0 +1,96 @@
require "option_parser"
require "cbor"
class Representation
include CBOR::Serializable
class Permissions
include CBOR::Serializable
property owner : String? = nil
property group : String? = nil
property other : String? = nil
def initialize
end
end
property name : String
property exists : Bool
property base_name : String? = nil
property size : UInt64? = nil
property owner : UInt32? = nil
property group : UInt32? = nil
property last_modification : Time? = nil
property type : String? = nil # directory, file, symlink, socket, …
property permissions : Permissions? = nil
def initialize(@name)
@exists = File.exists?(@name)
return unless @exists
infos = File.info(@name)
@owner = infos.owner_id.to_u32
@group = infos.group_id.to_u32
@last_modification = infos.modification_time
@size = infos.size
@type = infos.type.to_s
@permissions = Permissions.new.tap do |perms|
perms.owner = String.build do |str|
str << (infos.permissions.owner_read? ? 'r' : '-')
str << (infos.permissions.owner_write? ? 'w' : '-')
str << (infos.permissions.owner_execute? ? 'x' : '-')
end
perms.group = String.build do |str|
str << (infos.permissions.group_read? ? 'r' : '-')
str << (infos.permissions.group_write? ? 'w' : '-')
str << (infos.permissions.group_execute? ? 'x' : '-')
end
perms.other = String.build do |str|
str << (infos.permissions.other_read? ? 'r' : '-')
str << (infos.permissions.other_write? ? 'w' : '-')
str << (infos.permissions.other_execute? ? 'x' : '-')
end
end
end
end
class FindApplication
property to_search = Array(String).new
def initialize
end
def run
OptionParser.parse do |parser|
parser.banner = "usage: find [options] <files or directories>"
parser.on "-h", "--help", "Displays this help and exits." do
puts parser
exit 0
end
end
@to_search = ARGV
loop do
cur = @to_search.shift?
break unless cur
representation = Representation.new (cur)
if representation.type == "Directory"
Dir.each_child(cur) do |c|
@to_search << "#{cur}/#{c}"
end
end
STDOUT.write representation.to_cbor
STDOUT.flush
end
end
end
FindApplication.new.run