Patchwork D11333: windows: degrade to py2 behavior when reading a non-symlink as a symlink

login
register
mail settings
Submitter phabricator
Date Aug. 22, 2021, 11:39 p.m.
Message ID <differential-rev-PHID-DREV-ee6t74esdg4rwhvi5y2h-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/49647/
State Superseded
Headers show

Comments

phabricator - Aug. 22, 2021, 11:39 p.m.
mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  While waiting for the push to hg-committed in WSL to complete, I ran a
  `phabimport` from Windows and got this traceback:
  
    $ hg phabimport 11313
    ** Unknown exception encountered with possibly-broken third-party extension "mercurial_keyring" (version N/A)
    ** which supports versions unknown of Mercurial.
    ** Please disable "mercurial_keyring" and try your action again.
    ** If that fixes the bug please report it to https://foss.heptapod.net/mercurial/mercurial_keyring/issues
    ** Python 3.9.5 (default, May  6 2021, 17:29:31) [MSC v.1928 64 bit (AMD64)]
    ** Mercurial Distributed SCM (version 5.9rc1+hg32.0e2f5733563d)
    ** Extensions loaded: absorb, blackbox, evolve 10.3.3, extdiff, fastannotate, fix, mercurial_keyring, mq, phabblocker 20210126, phabricator, rebase, show, strip, topic 0.22.3
    Traceback (most recent call last):
      File "mercurial.lock", line 279, in _trylock
      File "mercurial.vfs", line 202, in makelock
      File "mercurial.util", line 2147, in makelock
    FileExistsError: [WinError 183] Cannot create a file when that file already exists: b'hp-omen:78348' -> b'C:\\Users\\Matt\\hg/.hg/store/lock'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<string>", line 24, in <module>
      File "mercurial.dispatch", line 144, in run
      File "mercurial.dispatch", line 250, in dispatch
      File "mercurial.dispatch", line 294, in _rundispatch
      File "mercurial.dispatch", line 470, in _runcatch
      File "mercurial.dispatch", line 480, in _callcatch
      File "mercurial.scmutil", line 153, in callcatch
      File "mercurial.dispatch", line 460, in _runcatchfunc
      File "mercurial.dispatch", line 1273, in _dispatch
      File "mercurial.dispatch", line 918, in runcommand
      File "mercurial.dispatch", line 1285, in _runcommand
      File "mercurial.dispatch", line 1271, in <lambda>
      File "mercurial.util", line 1886, in check
      File "mercurial.util", line 1886, in check
      File "hgext.mq", line 4239, in mqcommand
      File "mercurial.util", line 1886, in check
      File "mercurial.util", line 1886, in check
      File "hgext.phabricator", line 314, in inner
      File "hgext.phabricator", line 2222, in phabimport
      File "hgext.phabricator", line 2123, in readpatch
      File "hgext.phabricator", line 2199, in _write
      File "mercurial.localrepo", line 2956, in lock
      File "mercurial.localrepo", line 2918, in _lock
      File "mercurial.lock", line 152, in trylock
      File "mercurial.lock", line 283, in _trylock
      File "mercurial.lock", line 314, in _readlock
      File "mercurial.vfs", line 221, in readlock
      File "mercurial.util", line 2163, in readlock
      File "mercurial.windows", line 619, in readlink
    ValueError: not a symbolic link
  
  Both exceptions look accurate (the file exists, and the Windows side can't read
  WSL side symlinks).  I didn't try to reproduce this entirely within the Windows
  side, but we can do better than a cryptic stacktrace.  With this change, the
  same scenario results in this abort:
  
    abort: C:\Users\Matt\hg/.hg/store/lock: The file cannot be accessed by the system
  
  When both the `push` and `phabimport` are done on the Windows side, it prints a
  message about waiting for the lock, and successfully applies the patch after the
  push completes.
  
  I'm not sure if there's enough info to be able to convert the abort into the
  wait scenario.  As it stands now, we don't support symlinks on Windows, which
  requires either a UAC Administrator level process or an opt-in in developer
  mode, and there are several places where the new symlink on Windows support in
  py3 was explicitly disabled in order to get tests to pass quicker.

REPOSITORY
  rHG Mercurial

BRANCH
  stable

REVISION DETAIL
  https://phab.mercurial-scm.org/D11333

AFFECTED FILES
  mercurial/windows.py

CHANGE DETAILS




To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/windows.py b/mercurial/windows.py
--- a/mercurial/windows.py
+++ b/mercurial/windows.py
@@ -616,7 +616,16 @@ 
 
 
 def readlink(pathname):
-    return pycompat.fsencode(os.readlink(pycompat.fsdecode(pathname)))
+    path = pycompat.fsdecode(pathname)
+    try:
+        link = os.readlink(path)
+    except ValueError as e:
+        # On py2, os.readlink() raises an AttributeError since it is
+        # unsupported.  On py3, reading a non-link raises a ValueError.  Simply
+        # treat this as the error the locking code has been expecting up to now
+        # until an effort can be made to enable symlink support on Windows.
+        raise AttributeError(e)
+    return pycompat.fsencode(link)
 
 
 def removedirs(name):