Skip to content

Commit 786c3d0

Browse files
authored
Stable order in pyenv.cfg, include-system-site-packages only for ref (#1535)
Previously the order was dictionary order depdendent, so not stable accross Python implementations, and we also set the include system site package for all creators, should be only for ref creators. Signed-off-by: Bernat Gabor <[email protected]>
1 parent bf48544 commit 786c3d0

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

docs/changelog/1535.bugfix.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Stable order within ``pyenv.cfg`` and add ``include-system-site-packages`` only for creators that reference a global
2+
Python - by ``gaborbernat``.

src/virtualenv/create/creator.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ def __init__(self, options, interpreter):
3232
self.interpreter = interpreter
3333
self._debug = None
3434
self.dest = Path(options.dest)
35-
self.enable_system_site_package = options.system_site
3635
self.clear = options.clear
3736
self.pyenv_cfg = PyEnvCfg.from_folder(self.dest)
3837

@@ -45,7 +44,6 @@ def __unicode__(self):
4544
def _args(self):
4645
return [
4746
("dest", six.ensure_text(str(self.dest))),
48-
("global", self.enable_system_site_package),
4947
("clear", self.clear),
5048
]
5149

@@ -58,16 +56,9 @@ def add_parser_arguments(cls, parser, interpreter, meta):
5856
"--clear",
5957
dest="clear",
6058
action="store_true",
61-
help="clear out the non-root install and start from scratch",
59+
help="remove the destination directory if exist before starting (will overwrite files otherwise)",
6260
default=False,
6361
)
64-
parser.add_argument(
65-
"--system-site-packages",
66-
default=False,
67-
action="store_true",
68-
dest="system_site",
69-
help="give the virtual environment access to the system site-packages dir",
70-
)
7162

7263
@classmethod
7364
def validate_dest(cls, raw_value):
@@ -151,13 +142,11 @@ def can_create(cls, interpreter):
151142
return True
152143

153144
def set_pyenv_cfg(self):
154-
self.pyenv_cfg.content = {
155-
"home": self.interpreter.system_exec_prefix,
156-
"include-system-site-packages": "true" if self.enable_system_site_package else "false",
157-
"implementation": self.interpreter.implementation,
158-
"version_info": ".".join(str(i) for i in self.interpreter.version_info),
159-
"virtualenv": __version__,
160-
}
145+
self.pyenv_cfg.content = OrderedDict()
146+
self.pyenv_cfg["home"] = self.interpreter.system_exec_prefix
147+
self.pyenv_cfg["implementation"] = self.interpreter.implementation
148+
self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info)
149+
self.pyenv_cfg["virtualenv"] = __version__
161150

162151
@property
163152
def debug(self):

src/virtualenv/create/via_global_ref/api.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,18 @@ class ViaGlobalRefApi(Creator):
1212
def __init__(self, options, interpreter):
1313
super(ViaGlobalRefApi, self).__init__(options, interpreter)
1414
self.symlinks = getattr(options, "copies", False) is False
15+
self.enable_system_site_package = options.system_site
1516

1617
@classmethod
1718
def add_parser_arguments(cls, parser, interpreter, meta):
1819
super(ViaGlobalRefApi, cls).add_parser_arguments(parser, interpreter, meta)
20+
parser.add_argument(
21+
"--system-site-packages",
22+
default=False,
23+
action="store_true",
24+
dest="system_site",
25+
help="give the virtual environment access to the system site-packages dir",
26+
)
1927
group = parser.add_mutually_exclusive_group()
2028
if meta.can_symlink:
2129
group.add_argument(
@@ -34,3 +42,10 @@ def add_parser_arguments(cls, parser, interpreter, meta):
3442
dest="copies",
3543
help="try to use copies rather than symlinks, even when symlinks are the default for the platform",
3644
)
45+
46+
def _args(self):
47+
return super(ViaGlobalRefApi, self)._args() + [("global", self.enable_system_site_package)]
48+
49+
def set_pyenv_cfg(self):
50+
super(ViaGlobalRefApi, self).set_pyenv_cfg()
51+
self.pyenv_cfg["include-system-site-packages"] = "true" if self.enable_system_site_package else "false"

src/virtualenv/pyenv_cfg.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import absolute_import, unicode_literals
22

33
import logging
4+
from collections import OrderedDict
45

56
import six
67

@@ -16,12 +17,12 @@ def from_folder(cls, folder):
1617

1718
@classmethod
1819
def from_file(cls, path):
19-
content = cls._read_values(path) if path.exists() else {}
20+
content = cls._read_values(path) if path.exists() else OrderedDict()
2021
return PyEnvCfg(content, path)
2122

2223
@staticmethod
2324
def _read_values(path):
24-
content = {}
25+
content = OrderedDict()
2526
for line in path.read_text(encoding="utf-8").splitlines():
2627
equals_at = line.index("=")
2728
key = line[:equals_at].strip()

0 commit comments

Comments
 (0)