v/cmd/tools/vdoc/files.v

73 lines
1.8 KiB
V

module main
import os
fn get_ignore_paths(path string) ![]string {
ignore_file_path := os.join_path(path, '.vdocignore')
ignore_content := os.read_file(ignore_file_path) or {
return error_with_code('ignore file not found.', 1)
}
mut res := []string{}
if ignore_content.trim_space().len > 0 {
rules := ignore_content.split_into_lines().map(it.trim_space())
mut final := []string{}
for rule in rules {
if rule.contains('*.') || rule.contains('**') {
println('vdoc: Wildcards in ignore rules are not allowed for now.')
continue
}
final << rule
}
res = final.map(os.join_path(path, it.trim_right('/')))
} else {
mut dirs := os.ls(path) or { return []string{} }
res = dirs.map(os.join_path(path, it)).filter(os.is_dir(it))
}
return res.map(it.replace('/', os.path_separator))
}
fn is_included(path string, ignore_paths []string) bool {
if path == '' {
return true
}
for ignore_path in ignore_paths {
if !path.contains(ignore_path) {
continue
}
return false
}
return true
}
fn get_modules_list(opath string, ignore_paths2 []string) []string {
path := opath.trim_right('/\\')
names := os.ls(path) or { return [] }
mut ignore_paths := get_ignore_paths(path) or { []string{} }
ignore_paths << ignore_paths2
mut dirs := map[string]int{}
for name in names {
if name == 'testdata' {
continue
}
if name == 'tests' {
continue
}
fpath := os.join_path(path, name)
fmeta := os.inode(fpath)
if fmeta.typ == .directory && is_included(fpath, ignore_paths) {
current_ignore_paths := ignore_paths.filter(it.starts_with(fpath))
for k in get_modules_list(fpath, current_ignore_paths) {
dirs[k]++
}
continue
}
if fpath.ends_with('.v') && !fpath.ends_with('_test.v') {
dirs[path]++
continue
}
}
mut res := dirs.keys()
res.sort()
return res
}