Add a few useful os calls to nimscript (#7442)

This commit is contained in:
genotrance
2018-04-10 11:50:23 -05:00
committed by Andreas Rumpf
parent 16c1a90857
commit f6c8f97fe8
4 changed files with 81 additions and 2 deletions

View File

@@ -19,6 +19,8 @@
with ``strutils.split``.
- Added ``system.toOpenArray`` in order to support zero-copy slicing
operations. This is currently not yet available for the JavaScript target.
- Added ``getCurrentDir``, ``findExe``, ``cpDir`` and ``mvDir`` procs to
``nimscript``.
### Library changes

View File

@@ -70,11 +70,17 @@ proc setupVM*(module: PSym; cache: IdentCache; scriptName: string;
setResult(a, os.getCurrentDir())
cbos moveFile:
os.moveFile(getString(a, 0), getString(a, 1))
cbos moveDir:
os.moveDir(getString(a, 0), getString(a, 1))
cbos copyFile:
os.copyFile(getString(a, 0), getString(a, 1))
cbos copyDir:
os.copyDir(getString(a, 0), getString(a, 1))
cbos getLastModificationTime:
# depends on Time's implementation!
setResult(a, int64(getLastModificationTime(getString(a, 0))))
cbos findExe:
setResult(a, os.findExe(getString(a, 0)))
cbos rawExec:
setResult(a, osproc.execCmd getString(a, 0))

View File

@@ -38,13 +38,19 @@ proc removeFile(dir: string) {.
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
proc moveFile(src, dest: string) {.
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
proc moveDir(src, dest: string) {.
tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin
proc copyFile(src, dest: string) {.
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].} =
builtin
proc getOsError: 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].} =
builtin
@@ -117,7 +123,7 @@ proc existsEnv*(key: string): bool {.tags: [ReadIOEffect].} =
proc putEnv*(key, val: string) {.tags: [WriteIOEffect].} =
## Sets the value of the environment variable named key to val.
builtin
proc fileExists*(filename: string): bool {.tags: [ReadIOEffect].} =
## Checks if the file exists.
builtin
@@ -206,12 +212,24 @@ proc mvFile*(`from`, to: string) {.raises: [OSError].} =
moveFile `from`, to
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].} =
## Copies the file `from` to `to`.
log "cpFile: " & `from` & ", " & to:
copyFile `from`, to
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) =
## Executes an external process.
log "exec: " & command:
@@ -265,6 +283,12 @@ proc cd*(dir: string) {.raises: [OSError].} =
setCurrentDir(dir)
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 =
## Changes the current directory temporarily.
##

View File

@@ -30,4 +30,51 @@ putEnv("dummy", "myval")
doAssert(existsEnv("dummy") == true)
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