os: remove base_dir(); dir() and base() fixes

pull/6517/head
Alexander Medvednikov 2020-10-01 01:25:52 +02:00
parent 324d547cdb
commit 4879661f5a
4 changed files with 44 additions and 21 deletions

View File

@ -642,21 +642,46 @@ pub fn file_ext(path string) string {
return path[pos..] return path[pos..]
} }
// dir will return the part of `path` before the last occurence of a `path_separator`. // dir returns all but the last element of path, typically the path's directory.
// After dropping the final element, trailing slashes are removed.
// If the path is empty, dir returns ".". If the path consists entirely of separators,
// dir returns a single separator.
// The returned path does not end in a separator unless it is the root directory.
pub fn dir(path string) string { pub fn dir(path string) string {
pos := path.last_index(path_separator) or { if path == '' {
return '.' return '.'
} }
mut pos := path.last_index(path_separator) or {
return '.'
}
if path.ends_with(path_separator) {
pos--
}
return path[..pos] return path[..pos]
} }
// base_dir will return the base directory of `path`. // base returns the last element of path.
pub fn base_dir(path string) string { // Trailing path separators are removed before extracting the last element.
posx := path.last_index(path_separator) or { // If the path is empty, base returns ".". If the path consists entirely of separators, base returns a
// single separator.
pub fn base(path string) string {
if path == '' {
return '.'
}
if path == path_separator {
return path_separator
}
if path.ends_with(path_separator) {
path2 := path[..path.len-1]
pos := path2.last_index(path_separator) or {
return path2.clone()
}
return path2[pos+1..]
}
pos := path.last_index(path_separator) or {
return path.clone() return path.clone()
} }
// NB: *without* terminating / return path[pos+1..]
return path[..posx]
} }
// file_name will return all characters found after the last occurence of `path_separator`. // file_name will return all characters found after the last occurence of `path_separator`.

View File

@ -446,13 +446,15 @@ fn test_dir() {
assert os.dir('os') == '.' assert os.dir('os') == '.'
} }
fn test_basedir() { fn test_base() {
$if windows { $if windows {
assert os.base_dir('v\\vlib\\os') == 'v\\vlib' assert os.base('v\\vlib\\os') == 'os'
assert os.base('v\\vlib\\os\\') == 'os'
} $else { } $else {
assert os.base_dir('v/vlib/os') == 'v/vlib' assert os.base('v/vlib/os') == 'os'
assert os.base('v/vlib/os/') == 'os'
} }
assert os.base_dir('filename') == 'filename' assert os.base('filename') == 'filename'
} }
fn test_uname() { fn test_uname() {

View File

@ -27,7 +27,7 @@ fn get_vtmp_filename(base_file_name, postfix string) string {
} }
pub fn compile(command string, pref &pref.Preferences) { pub fn compile(command string, pref &pref.Preferences) {
odir := os.base_dir(pref.out_name) odir := os.dir(pref.out_name)
// When pref.out_name is just the name of an executable, i.e. `./v -o executable main.v` // When pref.out_name is just the name of an executable, i.e. `./v -o executable main.v`
// without a folder component, just use the current folder instead: // without a folder component, just use the current folder instead:
mut output_folder := odir mut output_folder := odir
@ -55,9 +55,7 @@ pub fn compile(command string, pref &pref.Preferences) {
println('compilation took: ${util.bold(sw.elapsed().milliseconds().str())} ms') println('compilation took: ${util.bold(sw.elapsed().milliseconds().str())} ms')
} }
// running does not require the parsers anymore // running does not require the parsers anymore
unsafe { unsafe {b.myfree()}
b.myfree()
}
if pref.is_test || pref.is_run { if pref.is_test || pref.is_run {
b.run_compiled_executable_and_exit() b.run_compiled_executable_and_exit()
} }
@ -68,9 +66,7 @@ pub fn compile(command string, pref &pref.Preferences) {
fn (mut b Builder) myfree() { fn (mut b Builder) myfree() {
// for file in b.parsed_files { // for file in b.parsed_files {
// } // }
unsafe { unsafe {b.parsed_files.free()}
b.parsed_files.free()
}
} }
fn (mut b Builder) run_compiled_executable_and_exit() { fn (mut b Builder) run_compiled_executable_and_exit() {
@ -142,7 +138,7 @@ fn (mut v Builder) set_module_lookup_paths() {
// 3.2) search in ~/.vmodules/ (i.e. modules installed with vpm) // 3.2) search in ~/.vmodules/ (i.e. modules installed with vpm)
v.module_search_paths = [] v.module_search_paths = []
if v.pref.is_test { if v.pref.is_test {
v.module_search_paths << os.base_dir(v.compiled_dir) // pdir of _test.v v.module_search_paths << os.dir(v.compiled_dir) // pdir of _test.v
} }
v.module_search_paths << v.compiled_dir v.module_search_paths << v.compiled_dir
x := os.join_path(v.compiled_dir, 'modules') x := os.join_path(v.compiled_dir, 'modules')
@ -263,7 +259,7 @@ pub fn (v &Builder) 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.base_dir(single_test_v_file) dir = os.dir(single_test_v_file)
} }
does_exist := os.exists(dir) does_exist := os.exists(dir)
if !does_exist { if !does_exist {

View File

@ -109,7 +109,7 @@ fn (mut mcache ModFileCacher) traverse(mfolder string) ([]string, ModFileAndFold
if mcache.check_for_stop(cfolder, files) { if mcache.check_for_stop(cfolder, files) {
break break
} }
cfolder = os.base_dir(cfolder) cfolder = os.dir(cfolder)
folders_so_far << cfolder folders_so_far << cfolder
levels++ levels++
} }