From bbc231f8e06c18fe640fa56a927df476c2426ccb Mon Sep 17 00:00:00 2001 From: genotrance Date: Thu, 12 Mar 2020 02:53:11 -0500 Subject: [PATCH] Fix #12676 (#13634) --- compiler/scriptconfig.nim | 4 ++-- lib/system/nimscript.nim | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/compiler/scriptconfig.nim b/compiler/scriptconfig.nim index 6aad1b25ff975..220486aed1724 100644 --- a/compiler/scriptconfig.nim +++ b/compiler/scriptconfig.nim @@ -57,9 +57,9 @@ proc setupVM*(module: PSym; cache: IdentCache; scriptName: string; # Idea: Treat link to file as a file, but ignore link to directory to prevent # endless recursions out of the box. - cbos listFiles: + cbos listFilesImpl: listDirs(a, {pcFile, pcLinkToFile}) - cbos listDirs: + cbos listDirsImpl: listDirs(a, {pcDir}) cbos removeDir: if defined(nimsuggest) or graph.config.cmd == cmdCheck: diff --git a/lib/system/nimscript.nim b/lib/system/nimscript.nim index 719e92c4a505f..b8abdaa384bc7 100644 --- a/lib/system/nimscript.nim +++ b/lib/system/nimscript.nim @@ -26,13 +26,10 @@ template builtin = discard # We know the effects better than the compiler: {.push hint[XDeclaredButNotUsed]: off.} -proc listDirs*(dir: string): seq[string] = - ## Lists all the subdirectories (non-recursively) in the directory `dir`. - builtin -proc listFiles*(dir: string): seq[string] = - ## Lists all the files (non-recursively) in the directory `dir`. - builtin - +proc listDirsImpl(dir: string): seq[string] {. + tags: [ReadIOEffect], raises: [OSError].} = builtin +proc listFilesImpl(dir: string): seq[string] {. + tags: [ReadIOEffect], raises: [OSError].} = builtin proc removeDir(dir: string) {. tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin proc removeFile(dir: string) {. @@ -47,6 +44,7 @@ proc copyDir(src, dest: string) {. tags: [ReadIOEffect, WriteIOEffect], raises: [OSError].} = builtin proc createDir(dir: string) {.tags: [WriteIOEffect], raises: [OSError].} = builtin + proc getError: string = builtin proc setCurrentDir(dir: string) = builtin proc getCurrentDir*(): string = @@ -196,6 +194,16 @@ template log(msg: string, body: untyped) = if mode != ScriptMode.WhatIf: body +proc listDirs*(dir: string): seq[string] = + ## Lists all the subdirectories (non-recursively) in the directory `dir`. + result = listDirsImpl(dir) + checkOsError() + +proc listFiles*(dir: string): seq[string] = + ## Lists all the files (non-recursively) in the directory `dir`. + result = listFilesImpl(dir) + checkOsError() + proc rmDir*(dir: string) {.raises: [OSError].} = ## Removes the directory `dir`. log "rmDir: " & dir: