Skip to content

Commit 45230fe

Browse files
committed
gh-109940: Respect VIRTUAL_ENV_DISABLE_PROMPT in activate.bat
1 parent ce916dc commit 45230fe

4 files changed

Lines changed: 63 additions & 22 deletions

File tree

Lib/test/test_venv.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,51 @@ def test_unicode_in_batch_file(self):
593593
)
594594
self.assertEqual(out.strip(), '0')
595595

596+
@unittest.skipUnless(os.name == 'nt', 'only relevant on Windows')
597+
def test_activate_bat_respects_disable_prompt(self):
598+
rmtree(self.env_dir)
599+
env_dir = os.path.join(os.path.realpath(self.env_dir), 'venv')
600+
builder = venv.EnvBuilder(clear=True)
601+
builder.create(env_dir)
602+
activate = os.path.join(env_dir, self.bindir, 'activate.bat')
603+
test_batch = os.path.join(self.env_dir, 'test_disable_prompt.bat')
604+
with open(test_batch, "w") as f:
605+
f.write('@echo off\n'
606+
'set "PROMPT=base$G"\n'
607+
'set "VIRTUAL_ENV_DISABLE_PROMPT=1"\n'
608+
f'call "{activate}"\n'
609+
'echo ACTIVE_PROMPT:%PROMPT%\n'
610+
'echo VIRTUAL_ENV:%VIRTUAL_ENV%\n'
611+
'set "PROMPT=changed$G"\n'
612+
'deactivate\n'
613+
'echo FINAL_PROMPT:%PROMPT%\n')
614+
out, err = check_output([test_batch])
615+
lines = out.splitlines()
616+
self.assertEqual(lines[0], b'ACTIVE_PROMPT:base$G')
617+
self.assertEndsWith(lines[1], os.fsencode(env_dir))
618+
self.assertEqual(lines[2], b'FINAL_PROMPT:changed$G')
619+
620+
@unittest.skipUnless(os.name == 'nt', 'only relevant on Windows')
621+
def test_activate_bat_prefixes_prompt_by_default(self):
622+
rmtree(self.env_dir)
623+
env_dir = os.path.join(os.path.realpath(self.env_dir), 'venv')
624+
builder = venv.EnvBuilder(clear=True)
625+
builder.create(env_dir)
626+
activate = os.path.join(env_dir, self.bindir, 'activate.bat')
627+
test_batch = os.path.join(self.env_dir, 'test_enable_prompt.bat')
628+
with open(test_batch, "w") as f:
629+
f.write('@echo off\n'
630+
'set "PROMPT=base) $G"\n'
631+
'set "VIRTUAL_ENV_DISABLE_PROMPT="\n'
632+
f'call "{activate}"\n'
633+
'echo ACTIVE_PROMPT:%PROMPT%\n'
634+
'deactivate\n'
635+
'echo FINAL_PROMPT:%PROMPT%\n')
636+
out, err = check_output([test_batch])
637+
lines = out.splitlines()
638+
self.assertEqual(lines[0], b'ACTIVE_PROMPT:(venv) base) $G')
639+
self.assertEqual(lines[1], b'FINAL_PROMPT:base) $G')
640+
596641
@unittest.skipUnless(os.name == 'nt' and can_symlink(),
597642
'symlinks on Windows')
598643
def test_failed_symlink(self):

Lib/venv/scripts/nt/activate.bat

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010

1111
@if not defined PROMPT @set PROMPT=$P$G
1212

13-
@if defined _OLD_VIRTUAL_PROMPT @set PROMPT=%_OLD_VIRTUAL_PROMPT%
14-
@if defined _OLD_VIRTUAL_PYTHONHOME @set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
13+
@if defined _OLD_VIRTUAL_PROMPT @set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
14+
@if defined _OLD_VIRTUAL_PYTHONHOME @set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
1515

16-
@set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
17-
@set "PROMPT=(__VENV_PROMPT__) %PROMPT%"
16+
@if not defined VIRTUAL_ENV_DISABLE_PROMPT @set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
17+
@if not defined VIRTUAL_ENV_DISABLE_PROMPT @set "PROMPT=(__VENV_PROMPT__) %PROMPT%"
1818

19-
@if defined PYTHONHOME @set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
20-
@set PYTHONHOME=
19+
@if defined PYTHONHOME @set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%"
20+
@set "PYTHONHOME="
2121

22-
@if defined _OLD_VIRTUAL_PATH @set PATH=%_OLD_VIRTUAL_PATH%
23-
@if not defined _OLD_VIRTUAL_PATH @set _OLD_VIRTUAL_PATH=%PATH%
22+
@if defined _OLD_VIRTUAL_PATH @set "PATH=%_OLD_VIRTUAL_PATH%"
23+
@if not defined _OLD_VIRTUAL_PATH @set "_OLD_VIRTUAL_PATH=%PATH%"
2424

2525
@set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%"
2626
@set "VIRTUAL_ENV_PROMPT=__VENV_PROMPT__"

Lib/venv/scripts/nt/deactivate.bat

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
1-
@if defined _OLD_VIRTUAL_PROMPT (
2-
@set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
3-
)
4-
@set _OLD_VIRTUAL_PROMPT=
1+
@if defined _OLD_VIRTUAL_PROMPT @set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
2+
@set "_OLD_VIRTUAL_PROMPT="
53

6-
@if defined _OLD_VIRTUAL_PYTHONHOME (
7-
@set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
8-
@set _OLD_VIRTUAL_PYTHONHOME=
9-
)
4+
@if defined _OLD_VIRTUAL_PYTHONHOME @set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
5+
@if defined _OLD_VIRTUAL_PYTHONHOME @set "_OLD_VIRTUAL_PYTHONHOME="
106

11-
@if defined _OLD_VIRTUAL_PATH (
12-
@set "PATH=%_OLD_VIRTUAL_PATH%"
13-
)
7+
@if defined _OLD_VIRTUAL_PATH @set "PATH=%_OLD_VIRTUAL_PATH%"
148

15-
@set _OLD_VIRTUAL_PATH=
9+
@set "_OLD_VIRTUAL_PATH="
1610

17-
@set VIRTUAL_ENV=
18-
@set VIRTUAL_ENV_PROMPT=
11+
@set "VIRTUAL_ENV="
12+
@set "VIRTUAL_ENV_PROMPT="
1913

2014
:END
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix Windows :mod:`venv` activation in ``cmd.exe`` to respect
2+
``VIRTUAL_ENV_DISABLE_PROMPT``.

0 commit comments

Comments
 (0)