Add a few useful os calls to nimscript (#7442)
This commit is contained in:
parent
16c1a90857
commit
f6c8f97fe8
4 changed files with 81 additions and 2 deletions
|
|
@ -19,6 +19,8 @@
|
||||||
with ``strutils.split``.
|
with ``strutils.split``.
|
||||||
- Added ``system.toOpenArray`` in order to support zero-copy slicing
|
- Added ``system.toOpenArray`` in order to support zero-copy slicing
|
||||||
operations. This is currently not yet available for the JavaScript target.
|
operations. This is currently not yet available for the JavaScript target.
|
||||||
|
- Added ``getCurrentDir``, ``findExe``, ``cpDir`` and ``mvDir`` procs to
|
||||||
|
``nimscript``.
|
||||||
|
|
||||||
### Library changes
|
### Library changes
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,11 +70,17 @@ proc setupVM*(module: PSym; cache: IdentCache; scriptName: string;
|
||||||
setResult(a, os.getCurrentDir())
|
setResult(a, os.getCurrentDir())
|
||||||
cbos moveFile:
|
cbos moveFile:
|
||||||
os.moveFile(getString(a, 0), getString(a, 1))
|
os.moveFile(getString(a, 0), getString(a, 1))
|
||||||
|
cbos moveDir:
|
||||||
|
os.moveDir(getString(a, 0), getString(a, 1))
|
||||||
cbos copyFile:
|
cbos copyFile:
|
||||||
os.copyFile(getString(a, 0), getString(a, 1))
|
os.copyFile(getString(a, 0), getString(a, 1))
|
||||||
|
cbos copyDir:
|
||||||
|
os.copyDir(getString(a, 0), getString(a, 1))
|
||||||
cbos getLastModificationTime:
|
cbos getLastModificationTime:
|
||||||
# depends on Time's implementation!
|
# depends on Time's implementation!
|
||||||
setResult(a, int64(getLastModificationTime(getString(a, 0))))
|
setResult(a, int64(getLastModificationTime(getString(a, 0))))
|
||||||
|
cbos findExe:
|
||||||
|
setResult(a, os.findExe(getString(a, 0)))
|
||||||
|
|
||||||
cbos rawExec:
|
cbos rawExec:
|
||||||
setResult(a, osproc.execCmd getString(a, 0))
|
setResult(a, osproc.execCmd getString(a, 0))
|
||||||
|
|
|
||||||
|
|
@ -38,13 +38,19 @@ proc removeFile(dir: string) {.
|
||||||
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
||||||
proc moveFile(src, dest: string) {.
|
proc moveFile(src, dest: string) {.
|
||||||
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
||||||
|
proc moveDir(src, dest: string) {.
|
||||||
|
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
||||||
proc copyFile(src, dest: string) {.
|
proc copyFile(src, dest: string) {.
|
||||||
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
||||||
|
proc copyDir(src, dest: string) {.
|
||||||
|
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
|
||||||
proc createDir(dir: string) {.tags: [WriteIOEffect], raises: [OSError].} =
|
proc createDir(dir: string) {.tags: [WriteIOEffect], raises: [OSError].} =
|
||||||
builtin
|
builtin
|
||||||
proc getOsError: string = builtin
|
proc getOsError: string = builtin
|
||||||
proc setCurrentDir(dir: string) = builtin
|
proc setCurrentDir(dir: string) = builtin
|
||||||
proc getCurrentDir(): string = builtin
|
proc getCurrentDir*(): string =
|
||||||
|
## Retrieves the current working directory.
|
||||||
|
builtin
|
||||||
proc rawExec(cmd: string): int {.tags: [ExecIOEffect], raises: [OSError].} =
|
proc rawExec(cmd: string): int {.tags: [ExecIOEffect], raises: [OSError].} =
|
||||||
builtin
|
builtin
|
||||||
|
|
||||||
|
|
@ -117,7 +123,7 @@ proc existsEnv*(key: string): bool {.tags: [ReadIOEffect].} =
|
||||||
proc putEnv*(key, val: string) {.tags: [WriteIOEffect].} =
|
proc putEnv*(key, val: string) {.tags: [WriteIOEffect].} =
|
||||||
## Sets the value of the environment variable named key to val.
|
## Sets the value of the environment variable named key to val.
|
||||||
builtin
|
builtin
|
||||||
|
|
||||||
proc fileExists*(filename: string): bool {.tags: [ReadIOEffect].} =
|
proc fileExists*(filename: string): bool {.tags: [ReadIOEffect].} =
|
||||||
## Checks if the file exists.
|
## Checks if the file exists.
|
||||||
builtin
|
builtin
|
||||||
|
|
@ -206,12 +212,24 @@ proc mvFile*(`from`, to: string) {.raises: [OSError].} =
|
||||||
moveFile `from`, to
|
moveFile `from`, to
|
||||||
checkOsError()
|
checkOsError()
|
||||||
|
|
||||||
|
proc mvDir*(`from`, to: string) {.raises: [OSError].} =
|
||||||
|
## Moves the dir `from` to `to`.
|
||||||
|
log "mvDir: " & `from` & ", " & to:
|
||||||
|
moveDir `from`, to
|
||||||
|
checkOsError()
|
||||||
|
|
||||||
proc cpFile*(`from`, to: string) {.raises: [OSError].} =
|
proc cpFile*(`from`, to: string) {.raises: [OSError].} =
|
||||||
## Copies the file `from` to `to`.
|
## Copies the file `from` to `to`.
|
||||||
log "cpFile: " & `from` & ", " & to:
|
log "cpFile: " & `from` & ", " & to:
|
||||||
copyFile `from`, to
|
copyFile `from`, to
|
||||||
checkOsError()
|
checkOsError()
|
||||||
|
|
||||||
|
proc cpDir*(`from`, to: string) {.raises: [OSError].} =
|
||||||
|
## Copies the dir `from` to `to`.
|
||||||
|
log "cpDir: " & `from` & ", " & to:
|
||||||
|
copyDir `from`, to
|
||||||
|
checkOsError()
|
||||||
|
|
||||||
proc exec*(command: string) =
|
proc exec*(command: string) =
|
||||||
## Executes an external process.
|
## Executes an external process.
|
||||||
log "exec: " & command:
|
log "exec: " & command:
|
||||||
|
|
@ -265,6 +283,12 @@ proc cd*(dir: string) {.raises: [OSError].} =
|
||||||
setCurrentDir(dir)
|
setCurrentDir(dir)
|
||||||
checkOsError()
|
checkOsError()
|
||||||
|
|
||||||
|
proc findExe*(bin: string): string =
|
||||||
|
## Searches for bin in the current working directory and then in directories
|
||||||
|
## listed in the PATH environment variable. Returns "" if the exe cannot be
|
||||||
|
## found.
|
||||||
|
builtin
|
||||||
|
|
||||||
template withDir*(dir: string; body: untyped): untyped =
|
template withDir*(dir: string; body: untyped): untyped =
|
||||||
## Changes the current directory temporarily.
|
## Changes the current directory temporarily.
|
||||||
##
|
##
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,51 @@ putEnv("dummy", "myval")
|
||||||
doAssert(existsEnv("dummy") == true)
|
doAssert(existsEnv("dummy") == true)
|
||||||
doAssert(getEnv("dummy") == "myval")
|
doAssert(getEnv("dummy") == "myval")
|
||||||
|
|
||||||
|
# issue #7393
|
||||||
|
let wd = getCurrentDir()
|
||||||
|
cd("..")
|
||||||
|
assert wd != getCurrentDir()
|
||||||
|
cd(wd)
|
||||||
|
assert wd == getCurrentDir()
|
||||||
|
|
||||||
|
assert findExe("nim") != ""
|
||||||
|
|
||||||
|
# general tests
|
||||||
|
mode = ScriptMode.Verbose
|
||||||
|
|
||||||
|
assert getCommand() == "c"
|
||||||
|
setCommand("cpp")
|
||||||
|
assert getCommand() == "cpp"
|
||||||
|
setCommand("c")
|
||||||
|
|
||||||
|
assert cmpic("HeLLO", "hello") == 0
|
||||||
|
|
||||||
|
assert fileExists("tests/newconfig/tfoo.nims") == true
|
||||||
|
assert dirExists("tests") == true
|
||||||
|
|
||||||
|
assert existsFile("tests/newconfig/tfoo.nims") == true
|
||||||
|
assert existsDir("tests") == true
|
||||||
|
|
||||||
|
discard selfExe()
|
||||||
|
|
||||||
|
when defined(windows):
|
||||||
|
assert toExe("nim") == "nim.exe"
|
||||||
|
assert toDll("nim") == "nim.dll"
|
||||||
|
else:
|
||||||
|
assert toExe("nim") == "nim"
|
||||||
|
assert toDll("nim") == "libnim.so"
|
||||||
|
|
||||||
|
rmDir("tempXYZ")
|
||||||
|
assert dirExists("tempXYZ") == false
|
||||||
|
mkDir("tempXYZ")
|
||||||
|
assert dirExists("tempXYZ") == true
|
||||||
|
assert fileExists("tempXYZ/koch.nim") == false
|
||||||
|
cpFile("koch.nim", "tempXYZ/koch.nim")
|
||||||
|
assert fileExists("tempXYZ/koch.nim") == true
|
||||||
|
cpDir("nimsuggest", "tempXYZ/.")
|
||||||
|
assert dirExists("tempXYZ/tests") == true
|
||||||
|
assert fileExists("tempXYZ/nimsuggest.nim") == true
|
||||||
|
rmFile("tempXYZ/koch.nim")
|
||||||
|
assert fileExists("tempXYZ/koch.nim") == false
|
||||||
|
rmDir("tempXYZ")
|
||||||
|
assert dirExists("tempXYZ") == false
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue