vfs: simplify the `abstractvfs.rename()` implementation
authorMatt Harbison <matt_harbison@yahoo.com>
Fri, 20 Sep 2024 01:16:16 -0400
changeset 51922 adbb183c2f27
parent 51921 f79f98733a5b
child 51923 e59e1d8d29d2
vfs: simplify the `abstractvfs.rename()` implementation PyCharm was yapping about `util.rename()` not returning anything, because it is typed to return `None`, but the value was captured and returned after calling `_avoidambig()`. Instead, drop all of that, unconditionally rename, and then call `_avoidambig()` if appropriate. While we're here, convert the ersatz ternary operator into a modern one to help pytype. When a variable is initialized the old way, pytype tends to assign the type of the LHS of the `and`. In this case, that's a bool, and it will get confused that bool doesn't have a `stat` attribute once this method gets more type annotations. (Currently it thinks the `checkambig` arg is `Any`, so it doesn't care.)
mercurial/vfs.py
--- a/mercurial/vfs.py	Fri Sep 20 00:07:39 2024 -0400
+++ b/mercurial/vfs.py	Fri Sep 20 01:16:16 2024 -0400
@@ -273,12 +273,12 @@
         self._auditpath(dst, b'w')
         srcpath = self.join(src)
         dstpath = self.join(dst)
-        oldstat = checkambig and util.filestat.frompath(dstpath)
+        oldstat = util.filestat.frompath(dstpath) if checkambig else None
+
+        util.rename(srcpath, dstpath)
+
         if oldstat and oldstat.stat:
-            ret = util.rename(srcpath, dstpath)
             _avoidambig(dstpath, oldstat)
-            return ret
-        return util.rename(srcpath, dstpath)
 
     def readlink(self, path: bytes) -> bytes:
         return util.readlink(self.join(path))