mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #21482 -- Uplifted restriction of collectstatic using symlink option in Windows NT 6.
Original patch by Vajrasky Kok. Reviewed by Florian Apolloner, Aymeric Augustin.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os
|
||||
import sys
|
||||
from collections import OrderedDict
|
||||
from optparse import make_option
|
||||
|
||||
@@ -82,12 +81,8 @@ class Command(NoArgsCommand):
|
||||
|
||||
Split off from handle_noargs() to facilitate testing.
|
||||
"""
|
||||
if self.symlink:
|
||||
if sys.platform == 'win32':
|
||||
raise CommandError("Symlinking is not supported by this "
|
||||
"platform (%s)." % sys.platform)
|
||||
if not self.local:
|
||||
raise CommandError("Can't symlink to a remote destination.")
|
||||
if self.symlink and not self.local:
|
||||
raise CommandError("Can't symlink to a remote destination.")
|
||||
|
||||
if self.clear:
|
||||
self.clear_dir('')
|
||||
@@ -279,7 +274,18 @@ class Command(NoArgsCommand):
|
||||
os.makedirs(os.path.dirname(full_path))
|
||||
except OSError:
|
||||
pass
|
||||
os.symlink(source_path, full_path)
|
||||
try:
|
||||
os.symlink(source_path, full_path)
|
||||
except AttributeError:
|
||||
import platform
|
||||
raise CommandError("Symlinking is not supported by Python %s." %
|
||||
platform.python_version())
|
||||
except NotImplementedError:
|
||||
import platform
|
||||
raise CommandError("Symlinking is not supported in this "
|
||||
"platform (%s)." % platform.platform())
|
||||
except OSError as e:
|
||||
raise CommandError(e)
|
||||
if prefixed_path not in self.symlinked_files:
|
||||
self.symlinked_files.append(prefixed_path)
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import os
|
||||
import stat
|
||||
import sys
|
||||
import tempfile
|
||||
from os.path import join, normcase, normpath, abspath, isabs, sep, dirname
|
||||
|
||||
from django.utils.encoding import force_text
|
||||
@@ -99,3 +100,24 @@ def rmtree_errorhandler(func, path, exc_info):
|
||||
os.chmod(path, stat.S_IWRITE)
|
||||
# use the original function to repeat the operation
|
||||
func(path)
|
||||
|
||||
|
||||
def symlinks_supported():
|
||||
"""
|
||||
A function to check if creating symlinks are supported in the
|
||||
host platform and/or if they are allowed to be created (e.g.
|
||||
on Windows it requires admin permissions).
|
||||
"""
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
original_path = os.path.join(tmpdir, 'original')
|
||||
symlink_path = os.path.join(tmpdir, 'symlink')
|
||||
os.makedirs(original_path)
|
||||
try:
|
||||
os.symlink(original_path, symlink_path)
|
||||
supported = True
|
||||
except (OSError, NotImplementedError, AttributeError):
|
||||
supported = False
|
||||
else:
|
||||
os.remove(symlink_path)
|
||||
finally:
|
||||
return supported
|
||||
|
||||
Reference in New Issue
Block a user