Blame examples/tree.lua

Packit 437b5e
-- tree view of the file system like the "tree" unix utility
Packit 437b5e
-- John Belmonte <jvb@prairienet.org>
Packit 437b5e
Packit 437b5e
local posix = require 'posix'
Packit 437b5e
Packit 437b5e
local leaf_indent = '|   '
Packit 437b5e
local tail_leaf_indent = '    '
Packit 437b5e
local leaf_prefix = '|-- '
Packit 437b5e
local tail_leaf_prefix = '`-- '
Packit 437b5e
local link_prefix = ' -> '
Packit 437b5e
Packit 437b5e
local function printf(...)
Packit 437b5e
  io.write(string.format(...))
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function do_directory(directory, level, prefix)
Packit 437b5e
    local num_dirs = 0
Packit 437b5e
    local num_files = 0
Packit 437b5e
    local files = posix.dir(directory)
Packit 437b5e
    local last_file_index = #files
Packit 437b5e
    table.sort(files)
Packit 437b5e
    for i, name in ipairs(files) do
Packit 437b5e
        if name ~= '.' and name ~= '..' then
Packit 437b5e
            local full_name = string.format('%s/%s', directory, name)
Packit 437b5e
            local info = assert(posix.stat(full_name))
Packit 437b5e
            local is_tail = (i==last_file_index)
Packit 437b5e
            local prefix2 = is_tail and tail_leaf_prefix or leaf_prefix
Packit 437b5e
            local link = ''
Packit 437b5e
            if info.type == 'link' then
Packit 437b5e
                linked_name = assert(posix.readlink(full_name))
Packit 437b5e
                link = string.format('%s%s', link_prefix, linked_name)
Packit 437b5e
            end
Packit 437b5e
            printf('%s%s%s%s\n', prefix, prefix2, name, link)
Packit 437b5e
            if info.type == 'directory' then
Packit 437b5e
                local indent = is_tail and tail_leaf_indent or leaf_indent
Packit 437b5e
                -- TODO: cache string concatination
Packit 437b5e
                sub_dirs, sub_files = do_directory(full_name, level+1,
Packit 437b5e
                    prefix .. indent)
Packit 437b5e
                num_dirs = num_dirs + sub_dirs + 1
Packit 437b5e
                num_files = num_files + sub_files
Packit 437b5e
            else
Packit 437b5e
                num_files = num_files + 1
Packit 437b5e
            end
Packit 437b5e
        end
Packit 437b5e
    end
Packit 437b5e
    return num_dirs, num_files
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
local function fore(directory)
Packit 437b5e
    print(directory)
Packit 437b5e
    num_dirs, num_files = do_directory(directory, 0, '')
Packit 437b5e
    printf('\n%d directories, %d files\n', num_dirs, num_files)
Packit 437b5e
end
Packit 437b5e
Packit 437b5e
directory = (arg and #arg > 0) and arg[1] or '.'
Packit 437b5e
fore(directory)