summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorAndrey Makarov <ph.makarov@gmail.com>2022-10-28 11:01:28 +0300
committerGitHub <noreply@github.com>2022-10-28 10:01:28 +0200
commit779b1cc5beefa6064cb640401f1969c95a96c205 (patch)
treef2f90b81d95cd8d1aa64236dd053cb34dab95ccc /lib
parente68a6ea759c65ec2ec92cfe5ef922c5c3ef0623e (diff)
downloadNim-779b1cc5beefa6064cb640401f1969c95a96c205.tar.gz
Fix #20628 for Windows (#20667)
* Fix #20628 for Windows

* Move isRegular - !isSpecial and onlyRegular - skipSpecial

* Forgot to change it in 1 more place
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/os.nim15
-rw-r--r--lib/std/dirs.nim12
-rw-r--r--lib/std/private/oscommon.nim8
-rw-r--r--lib/std/private/osdirs.nim20
4 files changed, 29 insertions, 26 deletions
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