1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

os: cleanup APIs returning !bool to either return ! or bool (#16111)

This commit is contained in:
Delyan Angelov 2022-10-20 13:56:06 +03:00 committed by GitHub
parent ac63fa1b11
commit 2083e6b04c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 69 additions and 109 deletions

View File

@ -257,8 +257,8 @@ fn (mut a App) report_info() {
} }
fn is_writable_dir(path string) bool { fn is_writable_dir(path string) bool {
res := os.is_writable_folder(path) or { false } os.ensure_folder_is_writable(path) or { return false }
return res return true
} }
fn main() { fn main() {

View File

@ -19,7 +19,7 @@ pub fn temp_file(tfo TempFileOptions) !(os.File, string) {
if d == '' { if d == '' {
d = os.temp_dir() d = os.temp_dir()
} }
os.is_writable_folder(d) or { os.ensure_folder_is_writable(d) or {
return error(@FN + return error(@FN +
' could not create temporary file in "$d". Please ensure write permissions.') ' could not create temporary file in "$d". Please ensure write permissions.')
} }
@ -46,31 +46,28 @@ pub struct TempDirOptions {
pattern string pattern string
} }
fn error_for_temporary_folder(fn_name string, d string) !string {
return error('$fn_name could not create temporary directory "$d". Please ensure you have write permissions for it.')
}
// temp_dir returns an uniquely named, writable, directory path // temp_dir returns an uniquely named, writable, directory path
pub fn temp_dir(tdo TempFileOptions) !string { pub fn temp_dir(tdo TempFileOptions) !string {
mut d := tdo.path mut d := tdo.path
if d == '' { if d == '' {
d = os.temp_dir() d = os.temp_dir()
} }
os.is_writable_folder(d) or { os.ensure_folder_is_writable(d) or { return error_for_temporary_folder(@FN, d) }
return error(@FN +
' could not create temporary directory "$d". Please ensure write permissions.')
}
d = d.trim_right(os.path_separator) d = d.trim_right(os.path_separator)
prefix, suffix := prefix_and_suffix(tdo.pattern) or { return error(@FN + ' $err.msg()') } prefix, suffix := prefix_and_suffix(tdo.pattern) or { return error(@FN + ' $err.msg()') }
for retry := 0; retry < util.retries; retry++ { for retry := 0; retry < util.retries; retry++ {
path := os.join_path(d, prefix + random_number() + suffix) path := os.join_path(d, prefix + random_number() + suffix)
os.mkdir_all(path) or { continue } os.mkdir_all(path) or { continue }
if os.is_dir(path) && os.exists(path) { if os.is_dir(path) && os.exists(path) {
os.is_writable_folder(path) or { os.ensure_folder_is_writable(path) or { return error_for_temporary_folder(@FN, d) }
return error(@FN +
' could not create temporary directory "$d". Please ensure write permissions.')
}
return path return path
} }
} }
return error(@FN + return error('${@FN} could not create temporary directory "$d". Retry limit ($util.retries) exhausted.')
' could not create temporary directory "$d". Retry limit ($util.retries) exhausted. Please ensure write permissions.')
} }
// * Utility functions // * Utility functions

View File

@ -81,11 +81,10 @@ fn test_temp_dir() {
return return
} }
assert os.is_dir(path) assert os.is_dir(path)
mut writable := os.is_writable_folder(path) or { os.ensure_folder_is_writable(path) or {
assert false assert false
return return
} }
assert writable
mut prev_path := path mut prev_path := path
// Test pattern // Test pattern
path = util.temp_dir( path = util.temp_dir(
@ -114,11 +113,10 @@ fn test_temp_dir() {
} }
assert path != prev_path assert path != prev_path
assert os.is_dir(path) assert os.is_dir(path)
writable = os.is_writable_folder(path) or { os.ensure_folder_is_writable(path) or {
assert false assert false
return return
} }
assert writable
assert path.contains(tfolder) assert path.contains(tfolder)
filename = os.file_name(path) filename = os.file_name(path)
for c in filename { for c in filename {

View File

@ -13,13 +13,12 @@ fn test_tmpdir() {
os.rm(tfile) or { panic(err) } os.rm(tfile) or { panic(err) }
} }
fn test_is_writable_folder() { fn test_ensure_folder_is_writable() {
tmp := os.temp_dir() tmp := os.temp_dir()
f := os.is_writable_folder(tmp) or { os.ensure_folder_is_writable(tmp) or {
eprintln('err: $err') eprintln('err: $err')
false assert false
} }
assert f
} }
fn test_expand_tilde_to_home() { fn test_expand_tilde_to_home() {

View File

@ -17,21 +17,19 @@ pub fn (mut l FileLock) unlink() {
C.unlink(&char(l.name.str)) C.unlink(&char(l.name.str))
} }
pub fn (mut l FileLock) acquire() !bool { pub fn (mut l FileLock) acquire() ! {
if l.fd != -1 { if l.fd != -1 {
// lock already acquired by this instance return error_with_code('lock already acquired by this instance', 1)
return false
} }
fd := open_lockfile(l.name) fd := open_lockfile(l.name)
if fd == -1 { if fd == -1 {
return error('cannot create lock file $l.name') return error_with_code('cannot create lock file $l.name', -1)
} }
if C.flock(fd, C.LOCK_EX) == -1 { if C.flock(fd, C.LOCK_EX) == -1 {
C.close(fd) C.close(fd)
return error('cannot lock') return error_with_code('cannot lock', -2)
} }
l.fd = fd l.fd = fd
return true
} }
pub fn (mut l FileLock) release() bool { pub fn (mut l FileLock) release() bool {
@ -44,7 +42,7 @@ pub fn (mut l FileLock) release() bool {
return false return false
} }
pub fn (mut l FileLock) wait_acquire(s int) !bool { pub fn (mut l FileLock) wait_acquire(s int) bool {
fin := time.now().add(s) fin := time.now().add(s)
for time.now() < fin { for time.now() < fin {
if l.try_acquire() { if l.try_acquire() {

View File

@ -15,17 +15,15 @@ pub fn (mut l FileLock) unlink() {
C.DeleteFileW(t_wide) C.DeleteFileW(t_wide)
} }
pub fn (mut l FileLock) acquire() !bool { pub fn (mut l FileLock) acquire() ! {
if l.fd != -1 { if l.fd != -1 {
// lock already acquired by this instance return error_with_code('lock already acquired by this instance', 1)
return false
} }
fd := open(l.name) fd := open(l.name)
if fd == -1 { if fd == -1 {
return error('cannot create lock file $l.name') return error_with_code('cannot create lock file $l.name', -1)
} }
l.fd = fd l.fd = fd
return true
} }
pub fn (mut l FileLock) release() bool { pub fn (mut l FileLock) release() bool {
@ -39,7 +37,7 @@ pub fn (mut l FileLock) release() bool {
return false return false
} }
pub fn (mut l FileLock) wait_acquire(s int) !bool { pub fn (mut l FileLock) wait_acquire(s int) bool {
fin := time.now().add(s) fin := time.now().add(s)
for time.now() < fin { for time.now() < fin {
if l.try_acquire() { if l.try_acquire() {

View File

@ -177,3 +177,10 @@ pub fn file_last_mod_unix(path string) int {
return mtime return mtime
} }
pub fn ensure_folder_is_writable(path string) ! {
fpath := join_path(path, 'some_newfile')
#try { $fs.writeFileSync(fpath); $fs.unlinkSync(fpath) } catch(e) { return error(new string('could not write to ' + path)) }
_ := fpath
}

View File

@ -856,3 +856,9 @@ pub fn config_dir() !string {
} }
return error('Cannot find config directory') return error('Cannot find config directory')
} }
[deprecated: 'use os.ensure_folder_is_writable instead']
pub fn is_writable_folder(folder string) !bool {
ensure_folder_is_writable(folder)!
return true
}

View File

@ -1,15 +1,15 @@
module os module os
pub fn mkdir(path string, params MkdirParams) !bool { pub fn mkdir(path string, params MkdirParams) ! {
$if js_node { $if js_node {
if path == '.' { if path == '.' {
return true return
} }
#$fs.mkdirSync(path.valueOf()) #$fs.mkdirSync(path.valueOf())
return true return
} $else { } $else {
return false return error('could not create folder')
} }
} }

View File

@ -281,51 +281,16 @@ pub fn ls(path string) ![]string {
return res return res
} }
/*
pub fn is_dir(path string) bool {
//$if linux {
//C.syscall(4, path.str) // sys_newstat
//}
dir := C.opendir(path.str)
res := !isnil(dir)
if res {
C.closedir(dir)
}
return res
}
*/
// mkdir creates a new directory with the specified path. // mkdir creates a new directory with the specified path.
pub fn mkdir(path string, params MkdirParams) !bool { pub fn mkdir(path string, params MkdirParams) ! {
if path == '.' { if path == '.' {
return true return
} }
/*
mut k := 0
defer {
k = 1
}
*/
apath := real_path(path) apath := real_path(path)
// defer {
// apath.free()
//}
/*
$if linux {
$if !android {
ret := C.syscall(sys_mkdir, apath.str, params.mode)
if ret == -1 {
return error(posix_get_error_msg(C.errno))
}
return true
}
}
*/
r := unsafe { C.mkdir(&char(apath.str), params.mode) } r := unsafe { C.mkdir(&char(apath.str), params.mode) }
if r == -1 { if r == -1 {
return error(posix_get_error_msg(C.errno)) return error(posix_get_error_msg(C.errno))
} }
return true
} }
// execute starts the specified command, waits for it to complete, and returns its output. // execute starts the specified command, waits for it to complete, and returns its output.
@ -423,18 +388,18 @@ pub fn (mut c Command) close() ! {
} }
} }
pub fn symlink(origin string, target string) !bool { pub fn symlink(origin string, target string) ! {
res := C.symlink(&char(origin.str), &char(target.str)) res := C.symlink(&char(origin.str), &char(target.str))
if res == 0 { if res == 0 {
return true return
} }
return error(posix_get_error_msg(C.errno)) return error(posix_get_error_msg(C.errno))
} }
pub fn link(origin string, target string) !bool { pub fn link(origin string, target string) ! {
res := C.link(&char(origin.str), &char(target.str)) res := C.link(&char(origin.str), &char(target.str))
if res == 0 { if res == 0 {
return true return
} }
return error(posix_get_error_msg(C.errno)) return error(posix_get_error_msg(C.errno))
} }
@ -449,14 +414,6 @@ pub fn (mut f File) close() {
return return
} }
f.is_opened = false f.is_opened = false
/*
$if linux {
$if !android {
C.syscall(sys_close, f.fd)
return
}
}
*/
C.fflush(f.cfile) C.fflush(f.cfile)
C.fclose(f.cfile) C.fclose(f.cfile)
} }
@ -475,14 +432,15 @@ pub fn debugger_present() bool {
fn C.mkstemp(stemplate &u8) int fn C.mkstemp(stemplate &u8) int
// `is_writable_folder` - `folder` exists and is writable to the process // ensure_folder_is_writable checks that `folder` exists, and is writable to the process
// by creating an empty file in it, then deleting it.
[manualfree] [manualfree]
pub fn is_writable_folder(folder string) !bool { pub fn ensure_folder_is_writable(folder string) ! {
if !exists(folder) { if !exists(folder) {
return error('`$folder` does not exist') return error_with_code('`$folder` does not exist', 1)
} }
if !is_dir(folder) { if !is_dir(folder) {
return error('`$folder` is not a folder') return error_with_code('`$folder` is not a folder', 2)
} }
tmp_perm_check := join_path_single(folder, 'XXXXXX') tmp_perm_check := join_path_single(folder, 'XXXXXX')
defer { defer {
@ -491,12 +449,11 @@ pub fn is_writable_folder(folder string) !bool {
unsafe { unsafe {
x := C.mkstemp(&char(tmp_perm_check.str)) x := C.mkstemp(&char(tmp_perm_check.str))
if -1 == x { if -1 == x {
return error('folder `$folder` is not writable') return error_with_code('folder `$folder` is not writable', 3)
} }
C.close(x) C.close(x)
} }
rm(tmp_perm_check)! rm(tmp_perm_check)!
return true
} }
[inline] [inline]

View File

@ -469,7 +469,7 @@ fn test_realpath_absolutepath_symlink() {
file_name := 'tolink_file.txt' file_name := 'tolink_file.txt'
symlink_name := 'symlink.txt' symlink_name := 'symlink.txt'
create_file(file_name)! create_file(file_name)!
assert os.symlink(file_name, symlink_name)! os.symlink(file_name, symlink_name)!
rpath := os.real_path(symlink_name) rpath := os.real_path(symlink_name)
println(rpath) println(rpath)
assert os.is_abs_path(rpath) assert os.is_abs_path(rpath)

View File

@ -190,16 +190,15 @@ pub fn ls(path string) ![]string {
} }
// mkdir creates a new directory with the specified path. // mkdir creates a new directory with the specified path.
pub fn mkdir(path string, params MkdirParams) !bool { pub fn mkdir(path string, params MkdirParams) ! {
if path == '.' { if path == '.' {
return true return
} }
apath := real_path(path) apath := real_path(path)
if !C.CreateDirectory(apath.to_wide(), 0) { if !C.CreateDirectory(apath.to_wide(), 0) {
return error('mkdir failed for "$apath", because CreateDirectory returned: ' + return error('mkdir failed for "$apath", because CreateDirectory returned: ' +
get_error_msg(int(C.GetLastError()))) get_error_msg(int(C.GetLastError())))
} }
return true
} }
// Ref - https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=vs-2019 // Ref - https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=vs-2019
@ -378,7 +377,7 @@ pub fn raw_execute(cmd string) Result {
} }
} }
pub fn symlink(origin string, target string) !bool { pub fn symlink(origin string, target string) ! {
// this is a temporary fix for TCC32 due to runtime error // this is a temporary fix for TCC32 due to runtime error
// TODO: find the cause why TCC32 for Windows does not work without the compiletime option // TODO: find the cause why TCC32 for Windows does not work without the compiletime option
$if x64 || x32 { $if x64 || x32 {
@ -397,12 +396,12 @@ pub fn symlink(origin string, target string) !bool {
if !exists(target) { if !exists(target) {
return error('C.CreateSymbolicLinkW reported success, but symlink still does not exist') return error('C.CreateSymbolicLinkW reported success, but symlink still does not exist')
} }
return true return
} }
return false return error('could not symlink')
} }
pub fn link(origin string, target string) !bool { pub fn link(origin string, target string) ! {
res := C.CreateHardLinkW(target.to_wide(), origin.to_wide(), C.NULL) res := C.CreateHardLinkW(target.to_wide(), origin.to_wide(), C.NULL)
// 1 = success, != 1 failure => https://stackoverflow.com/questions/33010440/createsymboliclink-on-windows-10 // 1 = success, != 1 failure => https://stackoverflow.com/questions/33010440/createsymboliclink-on-windows-10
if res != 1 { if res != 1 {
@ -411,7 +410,6 @@ pub fn link(origin string, target string) !bool {
if !exists(target) { if !exists(target) {
return error('C.CreateHardLinkW reported success, but link still does not exist') return error('C.CreateHardLinkW reported success, but link still does not exist')
} }
return true
} }
pub fn (mut f File) close() { pub fn (mut f File) close() {
@ -494,19 +492,21 @@ pub fn loginname() string {
return unsafe { string_from_wide(&loginname[0]) } return unsafe { string_from_wide(&loginname[0]) }
} }
// `is_writable_folder` - `folder` exists and is writable to the process // ensure_folder_is_writable checks that `folder` exists, and is writable to the process
pub fn is_writable_folder(folder string) !bool { // by creating an empty file in it, then deleting it.
pub fn ensure_folder_is_writable(folder string) ! {
if !exists(folder) { if !exists(folder) {
return error('`$folder` does not exist') return error_with_code('`$folder` does not exist', 1)
} }
if !is_dir(folder) { if !is_dir(folder) {
return error('`folder` is not a folder') return error_with_code('`folder` is not a folder', 2)
} }
tmp_folder_name := 'tmp_perm_check_pid_' + getpid().str() tmp_folder_name := 'tmp_perm_check_pid_' + getpid().str()
tmp_perm_check := join_path_single(folder, tmp_folder_name) tmp_perm_check := join_path_single(folder, tmp_folder_name)
write_file(tmp_perm_check, 'test') or { return error('cannot write to folder "$folder": $err') } write_file(tmp_perm_check, 'test') or {
return error_with_code('cannot write to folder "$folder": $err', 3)
}
rm(tmp_perm_check)! rm(tmp_perm_check)!
return true
} }
[inline] [inline]

View File

@ -31,7 +31,7 @@ fn check_if_output_folder_is_writable(pref &pref.Preferences) {
if odir.len == pref.out_name.len { if odir.len == pref.out_name.len {
output_folder = os.getwd() output_folder = os.getwd()
} }
os.is_writable_folder(output_folder) or { os.ensure_folder_is_writable(output_folder) or {
// An early error here, is better than an unclear C error later: // An early error here, is better than an unclear C error later:
verror(err.msg()) verror(err.msg())
} }