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
commit f6c8f97fe8
4 changed files with 81 additions and 2 deletions

View file

@ -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

View file

@ -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))

View file

@ -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.
## ##

View file

@ -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