os, filepath: reorganize functions

pull/3195/head^2
Alexey 2019-12-23 13:09:22 +03:00 committed by Alexander Medvednikov
parent 6e130cd446
commit dced76d1a4
28 changed files with 174 additions and 98 deletions

View File

@ -2,13 +2,16 @@
// Use of this source code is governed by an MIT license // Use of this source code is governed by an MIT license
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
import os import (
import time os
time
filepath
)
fn main() { fn main() {
exe := os.executable() exe := os.executable()
dir := os.dir(exe) dir := filepath.dir(exe)
vdir := os.dir(os.dir(dir)) vdir := filepath.dir(filepath.dir(dir))
if !os.exists('$vdir/v') && !os.is_dir('$vdir/vlib') { if !os.exists('$vdir/v') && !os.is_dir('$vdir/vlib') {
println('fast.html generator needs to be located in `v/tools/fast/`') println('fast.html generator needs to be located in `v/tools/fast/`')
} }

View File

@ -108,7 +108,7 @@ pub fn v_build_failing(zargs string, folder string) bool {
main_label := 'Building $folder ...' main_label := 'Building $folder ...'
finish_label := 'building $folder' finish_label := 'building $folder'
vexe := vexe_path() vexe := vexe_path()
parent_dir := os.dir(vexe) parent_dir := filepath.dir(vexe)
vlib_should_be_present( parent_dir ) vlib_should_be_present( parent_dir )
vargs := zargs.replace(vexe, '') vargs := zargs.replace(vexe, '')
@ -148,7 +148,7 @@ pub fn building_any_v_binaries_failed() bool {
eprintln('Building V binaries...') eprintln('Building V binaries...')
eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"') eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"')
vexe := testing.vexe_path() vexe := testing.vexe_path()
parent_dir := os.dir(vexe) parent_dir := filepath.dir(vexe)
testing.vlib_should_be_present( parent_dir ) testing.vlib_should_be_present( parent_dir )
os.chdir( parent_dir ) os.chdir( parent_dir )

View File

@ -1,6 +1,8 @@
import os import (
os
import flag flag
filepath
)
const ( const (
tool_version = '0.0.4' tool_version = '0.0.4'
@ -212,7 +214,7 @@ fn main(){
used_tools_must_exist(['cp','rm','strip','make','git','upx','cc','wc','tail','hyperfine']) used_tools_must_exist(['cp','rm','strip','make','git','upx','cc','wc','tail','hyperfine'])
mut context := new_context() mut context := new_context()
mut fp := flag.new_flag_parser(os.args) mut fp := flag.new_flag_parser(os.args)
fp.application(os.filename(os.executable())) fp.application(filepath.filename(os.executable()))
fp.version( tool_version ) fp.version( tool_version )
fp.description( tool_description ) fp.description( tool_description )
fp.arguments_description('COMMIT_BEFORE [COMMIT_AFTER]') fp.arguments_description('COMMIT_BEFORE [COMMIT_AFTER]')

View File

@ -1,9 +1,12 @@
module main module main
import os import (
import flag os
import compiler flag
import strings strings
filepath
compiler
)
const ( const (
tool_version = '0.0.1' tool_version = '0.0.1'
@ -48,10 +51,10 @@ fn analyze_v_file(file string) {
fn main(){ fn main(){
toolexe := os.executable() toolexe := os.executable()
compiler.set_vroot_folder( os.dir(os.dir(toolexe)) ) compiler.set_vroot_folder( filepath.dir(filepath.dir(toolexe)) )
mut fp := flag.new_flag_parser(os.args) mut fp := flag.new_flag_parser(os.args)
fp.application(os.filename(toolexe)) fp.application(filepath.filename(toolexe))
fp.version( tool_version ) fp.version( tool_version )
fp.description( tool_description ) fp.description( tool_description )
fp.arguments_description('FILE.v/FOLDER [FILE.v/FOLDER]...') fp.arguments_description('FILE.v/FOLDER [FILE.v/FOLDER]...')

View File

@ -25,7 +25,7 @@ fn v_test_compiler(vargs string){
fn v_test_compiler2(vargs string){ fn v_test_compiler2(vargs string){
vexe := testing.vexe_path() vexe := testing.vexe_path()
parent_dir := os.dir(vexe) parent_dir := filepath.dir(vexe)
testing.vlib_should_be_present( parent_dir ) testing.vlib_should_be_present( parent_dir )
// Changing the current directory is needed for some of the compiler tests, // Changing the current directory is needed for some of the compiler tests,

View File

@ -1,4 +1,7 @@
import os import (
os
filepath
)
fn main() { fn main() {
println('Updating V...') println('Updating V...')

2
v.v
View File

@ -109,7 +109,7 @@ fn v_command(command string, args []string) {
} }
'doc' { 'doc' {
vexe := os.executable() vexe := os.executable()
vdir := os.dir(os.executable()) vdir := filepath.dir(os.executable())
os.chdir(vdir) os.chdir(vdir)
mod := args.last() mod := args.last()
os.system('$vexe build module vlib$os.path_separator' + args.last()) os.system('$vexe build module vlib$os.path_separator' + args.last())

View File

@ -1,11 +1,14 @@
import os import (
os
filepath
)
fn test_syscallwrappers() { fn test_syscallwrappers() {
if true { return } if true { return }
$if linux { $if linux {
$if x64 { $if x64 {
exe := os.executable() exe := os.executable()
vdir := os.dir(exe) vdir := filepath.dir(exe)
if vdir.len > 1 { if vdir.len > 1 {
dot_checks := vdir + "/.checks" dot_checks := vdir + "/.checks"
assert os.is_dir(dot_checks) assert os.is_dir(dot_checks)

View File

@ -30,7 +30,7 @@ fn (v mut V) cc() {
} }
v.build_thirdparty_obj_files() v.build_thirdparty_obj_files()
vexe := vexe_path() vexe := vexe_path()
vdir := os.dir(vexe) vdir := filepath.dir(vexe)
// Just create a C/JavaScript file and exit // Just create a C/JavaScript file and exit
// for example: `v -o v.c compiler` // for example: `v -o v.c compiler`
if v.out_name.ends_with('.c') || v.out_name.ends_with('.js') { if v.out_name.ends_with('.c') || v.out_name.ends_with('.js') {

View File

@ -3,8 +3,11 @@
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
module compiler module compiler
import os import (
import strings os
strings
filepath
)
struct CGen { struct CGen {
out os.File out os.File
@ -275,7 +278,7 @@ fn build_thirdparty_obj_file(path string, moduleflags []CFlag) {
return return
} }
println('$obj_path not found, building it...') println('$obj_path not found, building it...')
parent := os.dir(obj_path) parent := filepath.dir(obj_path)
files := os.ls(parent)or{ files := os.ls(parent)or{
panic(err) panic(err)
} }

View File

@ -7,6 +7,7 @@ import (
vweb.tmpl // for `$vweb_html()` vweb.tmpl // for `$vweb_html()`
os os
strings strings
filepath
) )
fn (p mut Parser) comp_time() { fn (p mut Parser) comp_time() {
@ -164,7 +165,7 @@ fn (p mut Parser) comp_time() {
// Can't find the template file in current directory, // Can't find the template file in current directory,
// try looking next to the vweb program, in case it's run with // try looking next to the vweb program, in case it's run with
// v path/to/vweb_app.v // v path/to/vweb_app.v
path = os.dir(p.scanner.file_path) + '/' + path path = filepath.dir(p.scanner.file_path) + '/' + path
if !os.exists(path) { if !os.exists(path) {
p.error('vweb HTML template "$path" not found') p.error('vweb HTML template "$path" not found')
} }

View File

@ -1,7 +1,10 @@
module compiler module compiler
import os import (
import time os
time
filepath
)
fn (v &V) generate_hotcode_reloading_compiler_flags() []string { fn (v &V) generate_hotcode_reloading_compiler_flags() []string {
mut a := []string mut a := []string
@ -52,7 +55,7 @@ fn (v &V) generate_hotcode_reloading_main_caller() {
// We are in live code reload mode, so start the .so loader in the background // We are in live code reload mode, so start the .so loader in the background
mut cgen := v.cgen mut cgen := v.cgen
cgen.genln('') cgen.genln('')
file_base := os.filename(v.dir).replace('.v', '') file_base := filepath.filename(v.dir).replace('.v', '')
if v.os != .windows { if v.os != .windows {
// unix: // unix:
so_name := file_base + '.so' so_name := file_base + '.so'
@ -77,7 +80,7 @@ fn (v &V) generate_hot_reload_code() {
// Hot code reloading // Hot code reloading
if v.pref.is_live { if v.pref.is_live {
mut file := os.realpath(v.dir) mut file := os.realpath(v.dir)
file_base := os.filename(file).replace('.v', '') file_base := filepath.filename(file).replace('.v', '')
so_name := file_base + '.so' so_name := file_base + '.so'
// Need to build .so file before building the live application // Need to build .so file before building the live application
// The live app needs to load this .so file on initialization. // The live app needs to load this .so file on initialization.

View File

@ -806,7 +806,7 @@ pub fn (v &V) get_user_files() []string {
v.log('> That brings in all other ordinary .v files in the same module too .') v.log('> That brings in all other ordinary .v files in the same module too .')
} }
user_files << single_test_v_file user_files << single_test_v_file
dir = os.basedir(single_test_v_file) dir = filepath.basedir(single_test_v_file)
} }
if dir.ends_with('.v') || dir.ends_with('.vsh') { if dir.ends_with('.v') || dir.ends_with('.vsh') {
single_v_file := dir single_v_file := dir
@ -927,7 +927,7 @@ pub fn new_v(args []string) &V {
// optional, custom modules search path // optional, custom modules search path
user_mod_path := get_cmdline_option(args, '-user_mod_path', '') user_mod_path := get_cmdline_option(args, '-user_mod_path', '')
// Location of all vlib files // Location of all vlib files
vroot := os.dir(vexe_path()) vroot := filepath.dir(vexe_path())
vlib_path := get_cmdline_option(args, '-vlib-path', filepath.join(vroot,'vlib')) vlib_path := get_cmdline_option(args, '-vlib-path', filepath.join(vroot,'vlib'))
vpath := get_cmdline_option(args, '-vpath', v_modules_path) vpath := get_cmdline_option(args, '-vpath', v_modules_path)
mut vgen_buf := strings.new_builder(1000) mut vgen_buf := strings.new_builder(1000)
@ -1064,7 +1064,7 @@ pub fn new_v(args []string) &V {
compile_defines, compile_defines_all := parse_defines( defines ) compile_defines, compile_defines_all := parse_defines( defines )
rdir := os.realpath(dir) rdir := os.realpath(dir)
rdir_name := os.filename(rdir) rdir_name := filepath.filename(rdir)
if '-bare' in args { if '-bare' in args {
verror('use -freestanding instead of -bare') verror('use -freestanding instead of -bare')
} }
@ -1125,7 +1125,7 @@ pub fn new_v(args []string) &V {
os: _os os: _os
out_name: out_name out_name: out_name
dir: dir dir: dir
compiled_dir: if os.is_dir(rdir) { rdir } else { os.dir(rdir) } compiled_dir: if os.is_dir(rdir) { rdir } else { filepath.dir(rdir) }
lang_dir: vroot lang_dir: vroot
table: new_table(obfuscate) table: new_table(obfuscate)
out_name_c: out_name_c out_name_c: out_name_c
@ -1164,7 +1164,6 @@ pub fn env_vflags_and_os_args() []string {
return non_empty(args) return non_empty(args)
} }
pub fn create_symlink() { pub fn create_symlink() {
$if windows { $if windows {
return return

View File

@ -28,7 +28,7 @@ mut:
fn generate_vh(mod string) { fn generate_vh(mod string) {
println('\n\n\n\nGenerating a V header file for module `$mod`') println('\n\n\n\nGenerating a V header file for module `$mod`')
vexe := vexe_path() vexe := vexe_path()
full_mod_path := filepath.join(os.dir(vexe),mod) full_mod_path := filepath.join(filepath.dir(vexe),mod)
dir := if mod.starts_with('vlib') { '$compiler.v_modules_path${os.path_separator}$mod' } else { mod } dir := if mod.starts_with('vlib') { '$compiler.v_modules_path${os.path_separator}$mod' } else { mod }
path := dir + '.vh' path := dir + '.vh'
pdir := dir.all_before_last(os.path_separator) pdir := dir.all_before_last(os.path_separator)

View File

@ -165,7 +165,7 @@ fn (v mut V) set_module_lookup_paths() {
// 4.2) search in ~/.vmodules/ (i.e. modules installed with vpm) (no -vpath) // 4.2) search in ~/.vmodules/ (i.e. modules installed with vpm) (no -vpath)
v.module_lookup_paths = [] v.module_lookup_paths = []
if v.pref.is_test { if v.pref.is_test {
v.module_lookup_paths << os.basedir(v.compiled_dir) // pdir of _test.v v.module_lookup_paths << filepath.basedir(v.compiled_dir) // pdir of _test.v
} }
v.module_lookup_paths << v.compiled_dir v.module_lookup_paths << v.compiled_dir
v.module_lookup_paths << filepath.join(v.compiled_dir,'modules') v.module_lookup_paths << filepath.join(v.compiled_dir,'modules')

View File

@ -1,6 +1,9 @@
module compiler module compiler
import os import (
os
filepath
)
#flag windows -l shell32 #flag windows -l shell32
#flag windows -l dbghelp #flag windows -l dbghelp
@ -311,7 +314,7 @@ fn build_thirdparty_obj_file_with_msvc(path string, moduleflags []CFlag) {
return return
} }
println('$obj_path not found, building it (with msvc)...') println('$obj_path not found, building it (with msvc)...')
parent := os.dir(obj_path) parent := filepath.dir(obj_path)
files := os.ls(parent)or{ files := os.ls(parent)or{
panic(err) panic(err)
} }

View File

@ -6,6 +6,7 @@ module compiler
import ( import (
os os
strings strings
filepath
compiler.x64 compiler.x64
// time // time
) )
@ -2329,7 +2330,7 @@ struct IndexConfig {
// for debugging only // for debugging only
fn (p &Parser) fileis(s string) bool { fn (p &Parser) fileis(s string) bool {
return os.filename(p.scanner.file_path).contains(s) return filepath.filename(p.scanner.file_path).contains(s)
} }
// in and dot have higher priority than `!` // in and dot have higher priority than `!`

View File

@ -9,9 +9,12 @@ module main
/// code, instead of in embedded C ... /// code, instead of in embedded C ...
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
import os import (
import benchmark os
import term term
filepath
benchmark
)
struct BenchedTests { struct BenchedTests {
mut: mut:
@ -75,7 +78,7 @@ fn (b &BenchedTests) fn_name() string {
// Called at the end of the test program produced by `v -stats file_test.v` // Called at the end of the test program produced by `v -stats file_test.v`
fn (b mut BenchedTests) end_testing() { fn (b mut BenchedTests) end_testing() {
b.bench.stop() b.bench.stop()
println( ' ' + b.bench.total_message('running V tests in "' + os.filename(b.test_suit_file) + '"' ) ) println( ' ' + b.bench.total_message('running V tests in "' + filepath.filename(b.test_suit_file) + '"' ) )
} }
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////

View File

@ -1,6 +1,9 @@
module runner module runner
import os import (
os
filepath
)
struct RunnerOptions { struct RunnerOptions {
pub: pub:
@ -17,7 +20,7 @@ pub fn full_path_to_v(dirs_in int) string {
vname := if os.user_os() == 'windows' { 'v.exe' } else { 'v' } vname := if os.user_os() == 'windows' { 'v.exe' } else { 'v' }
mut path := os.executable() mut path := os.executable()
for i := 0; i < dirs_in; i++ { for i := 0; i < dirs_in; i++ {
path = os.dir(path) path = filepath.dir(path)
} }
vexec := path + os.path_separator + vname vexec := path + os.path_separator + vname
/* /*

View File

@ -18,6 +18,5 @@ pub fn get_vtmp_folder() string {
pub fn get_vtmp_filename(base_file_name string, postfix string) string { pub fn get_vtmp_filename(base_file_name string, postfix string) string {
vtmp := get_vtmp_folder() vtmp := get_vtmp_folder()
return os.realpath(filepath.join(vtmp,os.filename(os.realpath(base_file_name)) + postfix)) return os.realpath(filepath.join(vtmp,filepath.filename(os.realpath(base_file_name)) + postfix))
} }

View File

@ -1,11 +1,14 @@
module compiler module compiler
import os import (
os
filepath
)
pub fn launch_tool(tname string) { pub fn launch_tool(tname string) {
is_verbose := '-verbose' in os.args || '--verbose' in os.args is_verbose := '-verbose' in os.args || '--verbose' in os.args
vexe := vexe_path() vexe := vexe_path()
vroot := os.dir(vexe) vroot := filepath.dir(vexe)
set_vroot_folder( vroot ) // needed by tools to find back v set_vroot_folder( vroot ) // needed by tools to find back v
tool_args := os.args[1..].join(' ') tool_args := os.args[1..].join(' ')
tool_exe := os.realpath('$vroot/tools/$tname') tool_exe := os.realpath('$vroot/tools/$tname')

View File

@ -3,18 +3,16 @@ module filepath
import ( import (
os os
) )
// return the extension in the file `path`
// ext returns the extension in the file `path`.
pub fn ext(path string) string { pub fn ext(path string) string {
pos := path.last_index_byte(`.`) pos := path.last_index('.') or {
if pos != -1 {
return path[pos..]
}
return '' return ''
}
return path[pos..]
} }
// returns true if `path` is absolute // is_abs returns true if `path` is absolute.
pub fn is_abs(path string) bool { pub fn is_abs(path string) bool {
$if windows { $if windows {
return path[0] == `/` || // incase we're in MingGW bash return path[0] == `/` || // incase we're in MingGW bash
@ -23,8 +21,7 @@ pub fn is_abs(path string) bool {
return path[0] == `/` return path[0] == `/`
} }
// pass directories as parameters, returns path as string // join returns path as string from string parameter(s).
// TODO use []string.join once ...string becomes "[]string"
pub fn join(base string, dirs ...string) string { pub fn join(base string, dirs ...string) string {
mut result := []string mut result := []string
result << base.trim_right('\\/') result << base.trim_right('\\/')
@ -34,3 +31,27 @@ pub fn join(base string, dirs ...string) string {
return result.join(os.path_separator) return result.join(os.path_separator)
} }
// dir returns all but the last element of path, typically the path's directory.
pub fn dir(path string) string {
if path == '.' {
return os.getwd()
}
pos := path.last_index(os.path_separator) or {
return '.'
}
return path[..pos]
}
// basedir returns a directory name from path
pub fn basedir(path string) string {
pos := path.last_index(os.path_separator) or {
return path
}
// NB: *without* terminating /
return path[..pos]
}
// filename returns a file name from path
pub fn filename(path string) string {
return path.all_after(os.path_separator)
}

View File

@ -0,0 +1,43 @@
import filepath
fn test_ext() {
assert filepath.ext('file.v') == '.v'
assert filepath.ext('file') == ''
}
fn test_is_abs() {
assert filepath.is_abs('/home/user') == true
assert filepath.is_abs('v/vlib') == false
$if windows {
assert filepath.is_abs('C:\\Windows\\') == true
}
}
fn test_join() {
$if windows {
assert filepath.join('v', 'vlib', 'filepath') == 'v\\vlib\\filepath'
} $else {
assert filepath.join('v', 'vlib', 'filepath') == 'v/vlib/filepath'
}
}
fn test_dir() {
$if windows {
assert filepath.dir('C:\\a\\b\\c') == 'C:\\a\\b'
} $else {
assert filepath.dir('/var/tmp/foo') == '/var/tmp'
}
assert filepath.dir('filepath') == '.'
}
fn test_basedir() {
$if windows {
assert filepath.basedir('v\\vlib\\filepath') == 'v\\vlib'
} $else {
assert filepath.basedir('v/vlib/filepath') == 'v/vlib'
}
assert filepath.basedir('filename') == 'filename'
}

View File

@ -10,6 +10,7 @@ import (
gg gg
glm glm
gl gl
filepath
) )
#flag windows -I @VROOT/thirdparty/freetype/include #flag windows -I @VROOT/thirdparty/freetype/include
@ -175,7 +176,7 @@ pub fn new_context(cfg gg.Cfg) &FreeType {
} }
if !os.exists(font_path) { if !os.exists(font_path) {
exe_path := os.executable() exe_path := os.executable()
exe_dir := os.basedir(exe_path) exe_dir := filepath.basedir(exe_path)
font_path = '$exe_dir/$font_path' font_path = '$exe_dir/$font_path'
} }
if !os.exists(font_path) { if !os.exists(font_path) {

View File

@ -67,8 +67,8 @@ pub fn (l mut Log) set_output_level(level LogLevel){
pub fn (l mut Log) set_full_logpath(full_log_path string) { pub fn (l mut Log) set_full_logpath(full_log_path string) {
rlog_file := os.realpath( full_log_path ) rlog_file := os.realpath( full_log_path )
l.set_output_label( os.filename( rlog_file ) ) l.set_output_label( filepath.filename( rlog_file ) )
l.set_output_path( os.basedir( rlog_file ) ) l.set_output_path( filepath.basedir( rlog_file ) )
} }
pub fn (l mut Log) set_output_label(label string){ pub fn (l mut Log) set_output_label(label string){

View File

@ -169,7 +169,7 @@ pub fn cp_r(osource_path, odest_path string, overwrite bool) ?bool {
} }
// single file copy // single file copy
if !os.is_dir(source_path) { if !os.is_dir(source_path) {
adjasted_path := if os.is_dir(dest_path) { filepath.join(dest_path,os.filename(source_path)) } else { dest_path } adjasted_path := if os.is_dir(dest_path) { filepath.join(dest_path,filepath.filename(source_path)) } else { dest_path }
if os.exists(adjasted_path) { if os.exists(adjasted_path) {
if overwrite { if overwrite {
os.rm(adjasted_path) os.rm(adjasted_path)
@ -611,40 +611,28 @@ fn print_c_errno() {
// C.printf('errno=%d err="%s"\n', C.errno, C.strerror(C.errno)) // C.printf('errno=%d err="%s"\n', C.errno, C.strerror(C.errno))
} }
[deprecated]
pub fn ext(path string) string { pub fn ext(path string) string {
pos := path.last_index('.') or { println('Use filepath.ext')
return '' return filepath.ext(path)
}
return path[pos..]
} }
// dir returns all but the last element of path, typically the path's directory. [deprecated]
pub fn dir(path string) string { pub fn dir(path string) string {
if path == '.' { println('Use filepath.dir')
return getwd() return filepath.ext(path)
}
pos := path.last_index(path_separator) or {
return '.'
}
return path[..pos]
}
fn path_sans_ext(path string) string {
pos := path.last_index('.') or {
return path
}
return path[..pos]
} }
[deprecated]
pub fn basedir(path string) string { pub fn basedir(path string) string {
pos := path.last_index(path_separator) or { println('Use filepath.basedir')
return path return filepath.basedir(path)
}
return path[..pos] // NB: *without* terminating /
} }
[deprecated]
pub fn filename(path string) string { pub fn filename(path string) string {
return path.all_after(path_separator) println('Use filepath.filename')
return filepath.filename(path)
} }
// get_line returns a one-line string from stdin // get_line returns a one-line string from stdin

View File

@ -88,15 +88,6 @@ fn test_create_and_delete_folder() {
assert folder_exists == false assert folder_exists == false
} }
fn test_dir() {
$if windows {
assert os.dir('C:\\a\\b\\c') == 'C:\\a\\b'
} $else {
assert os.dir('/var/tmp/foo') == '/var/tmp'
}
}
fn walk_callback(file string) { fn walk_callback(file string) {
if file == '.' || file == '..' { if file == '.' || file == '..' {
return return

View File

@ -19,7 +19,7 @@ import sdl.ttf as ttf
const ( const (
Title = 'tVintris' Title = 'tVintris'
BASE = os.dir( os.realpath( os.executable() ) ) BASE = filepath.dir( os.realpath( os.executable() ) )
FontName = BASE + '/fonts/RobotoMono-Regular.ttf' FontName = BASE + '/fonts/RobotoMono-Regular.ttf'
MusicName = BASE + '/sounds/TwintrisThosenine.mod' MusicName = BASE + '/sounds/TwintrisThosenine.mod'
SndBlockName = BASE + '/sounds/block.wav' SndBlockName = BASE + '/sounds/block.wav'