diff --git a/IPython/html/nbextensions.py b/IPython/html/nbextensions.py
index e96db4f75..0312d65c4 100644
--- a/IPython/html/nbextensions.py
+++ b/IPython/html/nbextensions.py
@@ -211,7 +211,7 @@ def install_nbextension(path, overwrite=False, symlink=False, user=False, prefix
destination = basename(path)
destination = cast_unicode_py2(destination)
full_dest = pjoin(nbext, destination)
- if overwrite and os.path.exists(full_dest):
+ if overwrite and os.path.lexists(full_dest):
if verbose >= 1:
print("removing %s" % full_dest)
if os.path.isdir(full_dest) and not os.path.islink(full_dest):
diff --git a/IPython/html/tests/test_nbextensions.py b/IPython/html/tests/test_nbextensions.py
index 116ba7a7f..65484a052 100644
--- a/IPython/html/tests/test_nbextensions.py
+++ b/IPython/html/tests/test_nbextensions.py
@@ -279,6 +279,22 @@ class TestInstallNBExtension(TestCase):
link = os.readlink(dest)
self.assertEqual(link, src)
+ @dec.skip_win32
+ def test_overwrite_broken_symlink(self):
+ with TemporaryDirectory() as d:
+ f = u'ƒ.js'
+ f2 = u'ƒ2.js'
+ src = pjoin(d, f)
+ src2 = pjoin(d, f2)
+ touch(src)
+ install_nbextension(src, symlink=True)
+ os.rename(src, src2)
+ install_nbextension(src2, symlink=True, overwrite=True, destination=f)
+ dest = pjoin(self.system_nbext, f)
+ assert os.path.islink(dest)
+ link = os.readlink(dest)
+ self.assertEqual(link, src2)
+
@dec.skip_win32
def test_install_symlink_destination(self):
with TemporaryDirectory() as d: