From 779b1cc5beefa6064cb640401f1969c95a96c205 Mon Sep 17 00:00:00 2001 From: Andrey Makarov Date: Fri, 28 Oct 2022 11:01:28 +0300 Subject: Fix #20628 for Windows (#20667) * Fix #20628 for Windows * Move isRegular - !isSpecial and onlyRegular - skipSpecial * Forgot to change it in 1 more place --- lib/pure/os.nim | 15 +++++++++------ lib/std/dirs.nim | 12 ++++++------ lib/std/private/oscommon.nim | 8 ++++---- lib/std/private/osdirs.nim | 20 ++++++++++---------- 4 files changed, 29 insertions(+), 26 deletions(-) (limited to 'lib') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 887cf6042..0fa594b9d 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -1030,8 +1030,11 @@ type creationTime*: times.Time ## Time file was created. Not supported on all systems! blockSize*: int ## Preferred I/O block size for this object. ## In some filesystems, this may vary from file to file. - isRegular*: bool ## Is file regular? (on Unix some "files" - ## can be non-regular like FIFOs, devices) + isSpecial*: bool ## Is file special? (on Unix some "files" + ## can be special=non-regular like FIFOs, + ## devices); for directories `isSpecial` + ## is always `false`, for symlinks it is + ## the same as for the link's target. template rawToFormalFileInfo(rawInfo, path, formalInfo): untyped = ## Transforms the native file info structure into the one nim uses. @@ -1092,14 +1095,14 @@ template rawToFormalFileInfo(rawInfo, path, formalInfo): untyped = checkAndIncludeMode(S_IWOTH, fpOthersWrite) checkAndIncludeMode(S_IXOTH, fpOthersExec) - (formalInfo.kind, formalInfo.isRegular) = + (formalInfo.kind, formalInfo.isSpecial) = if S_ISDIR(rawInfo.st_mode): - (pcDir, true) + (pcDir, false) elif S_ISLNK(rawInfo.st_mode): assert(path != "") # symlinks can't occur for file handles getSymlinkFileKind(path) else: - (pcFile, S_ISREG(rawInfo.st_mode)) + (pcFile, not S_ISREG(rawInfo.st_mode)) when defined(js): when not declared(FileHandle): @@ -1153,7 +1156,7 @@ proc getFileInfo*(path: string, followSymlink = true): FileInfo {.noWeirdTarget. ## When `followSymlink` is true (default), symlinks are followed and the ## information retrieved is information related to the symlink's target. ## Otherwise, information on the symlink itself is retrieved (however, - ## field `isRegular` is still determined from the target on Unix). + ## field `isSpecial` is still determined from the target on Unix). ## ## If the information cannot be retrieved, such as when the path doesn't ## exist, or when permission restrictions prevent the program from retrieving diff --git a/lib/std/dirs.nim b/lib/std/dirs.nim index 7d72af1eb..adab9e9dd 100644 --- a/lib/std/dirs.nim +++ b/lib/std/dirs.nim @@ -69,7 +69,7 @@ proc moveDir*(source, dest: Path) {.inline, tags: [ReadIOEffect, WriteIOEffect]. moveDir(source.string, dest.string) iterator walkDir*(dir: Path; relative = false, checkDir = false, - onlyRegular = false): + skipSpecial = false): tuple[kind: PathComponent, path: Path] {.tags: [ReadDirEffect].} = ## Walks over the directory `dir` and yields for each directory or file in ## `dir`. The component type and full path for each item are returned. @@ -80,20 +80,20 @@ iterator walkDir*(dir: Path; relative = false, checkDir = false, ## otherwise the full path is returned. ## * If `checkDir` is true, `OSError` is raised when `dir` ## doesn't exist. - ## * If `onlyRegular` is true, then (besides all directories) only *regular* + ## * If `skipSpecial` is true, then (besides all directories) only *regular* ## files (**without** special "file" objects like FIFOs, device files, ## etc) will be yielded on Unix. - for (k, p) in walkDir(dir.string, relative, checkDir, onlyRegular): + for (k, p) in walkDir(dir.string, relative, checkDir, skipSpecial): yield (k, Path(p)) iterator walkDirRec*(dir: Path, yieldFilter = {pcFile}, followFilter = {pcDir}, - relative = false, checkDir = false, onlyRegular = false): + relative = false, checkDir = false, skipSpecial = false): Path {.tags: [ReadDirEffect].} = ## Recursively walks over the directory `dir` and yields for each file ## or directory in `dir`. ## - ## Options `relative`, `checkdir`, `onlyRegular` are explained in + ## Options `relative`, `checkdir`, `skipSpecial` are explained in ## [walkDir iterator] description. ## ## .. warning:: Modifying the directory structure while the iterator @@ -121,7 +121,7 @@ iterator walkDirRec*(dir: Path, ## See also: ## * `walkDir iterator`_ for p in walkDirRec(dir.string, yieldFilter, followFilter, relative, - checkDir, onlyRegular): + checkDir, skipSpecial): yield Path(p) proc setCurrentDir*(newDir: Path) {.inline, tags: [].} = diff --git a/lib/std/private/oscommon.nim b/lib/std/private/oscommon.nim index 8d0df3086..66725395f 100644 --- a/lib/std/private/oscommon.nim +++ b/lib/std/private/oscommon.nim @@ -86,16 +86,16 @@ type when defined(posix) and not weirdTarget: proc getSymlinkFileKind*(path: string): - tuple[pc: PathComponent, isRegular: bool] = + tuple[pc: PathComponent, isSpecial: bool] = # Helper function. var s: Stat assert(path != "") - result = (pcLinkToFile, true) + result = (pcLinkToFile, false) if stat(path, s) == 0'i32: if S_ISDIR(s.st_mode): - result = (pcLinkToDir, true) + result = (pcLinkToDir, false) elif not S_ISREG(s.st_mode): - result = (pcLinkToFile, false) + result = (pcLinkToFile, true) proc tryMoveFSObject*(source, dest: string, isDir: bool): bool {.noWeirdTarget.} = ## Moves a file (or directory if `isDir` is true) from `source` to `dest`. diff --git a/lib/std/private/osdirs.nim b/lib/std/private/osdirs.nim index 5c8d61159..4b349817c 100644 --- a/lib/std/private/osdirs.nim +++ b/lib/std/private/osdirs.nim @@ -155,7 +155,7 @@ proc staticWalkDir(dir: string; relative: bool): seq[ discard iterator walkDir*(dir: string; relative = false, checkDir = false, - onlyRegular = false): + skipSpecial = false): tuple[kind: PathComponent, path: string] {.tags: [ReadDirEffect].} = ## Walks over the directory `dir` and yields for each directory or file in ## `dir`. The component type and full path for each item are returned. @@ -166,7 +166,7 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, ## otherwise the full path is returned. ## * If `checkDir` is true, `OSError` is raised when `dir` ## doesn't exist. - ## * If `onlyRegular` is true, then (besides all directories) only *regular* + ## * If `skipSpecial` is true, then (besides all directories) only *regular* ## files (**without** special "file" objects like FIFOs, device files, ## etc) will be yielded on Unix. ## @@ -240,9 +240,9 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, var k = pcFile template resolveSymlink() = - var isRegular: bool - (k, isRegular) = getSymlinkFileKind(path) - if onlyRegular and not isRegular: continue + var isSpecial: bool + (k, isSpecial) = getSymlinkFileKind(path) + if skipSpecial and isSpecial: continue template kSetGeneric() = # pure Posix component `k` resolution if lstat(path.cstring, s) < 0'i32: continue # don't yield @@ -250,7 +250,7 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, k = pcDir elif S_ISLNK(s.st_mode): resolveSymlink() - elif onlyRegular and not S_ISREG(s.st_mode): continue + elif skipSpecial and not S_ISREG(s.st_mode): continue when defined(linux) or defined(macosx) or defined(bsd) or defined(genode) or defined(nintendoswitch): @@ -261,7 +261,7 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, of DT_UNKNOWN: kSetGeneric() else: # DT_REG or special "files" like FIFOs - if onlyRegular and x.d_type != DT_REG: continue + if skipSpecial and x.d_type != DT_REG: continue else: discard # leave it as pcFile else: # assuming that field `d_type` is not present kSetGeneric() @@ -270,12 +270,12 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, iterator walkDirRec*(dir: string, yieldFilter = {pcFile}, followFilter = {pcDir}, - relative = false, checkDir = false, onlyRegular = false): + relative = false, checkDir = false, skipSpecial = false): string {.tags: [ReadDirEffect].} = ## Recursively walks over the directory `dir` and yields for each file ## or directory in `dir`. ## - ## Options `relative`, `checkdir`, `onlyRegular` are explained in + ## Options `relative`, `checkdir`, `skipSpecial` are explained in ## [walkDir iterator] description. ## ## .. warning:: Modifying the directory structure while the iterator @@ -311,7 +311,7 @@ iterator walkDirRec*(dir: string, while stack.len > 0: let d = stack.pop() for k, p in walkDir(dir / d, relative = true, checkDir = checkDir, - onlyRegular = onlyRegular): + skipSpecial = skipSpecial): let rel = d / p if k in {pcDir, pcLinkToDir} and k in followFilter: stack.add rel -- cgit 1.4.1-2-gfad0