Skip to content

Commit

Permalink
Use unix line-endings in bash activate script
Browse files Browse the repository at this point in the history
Signed-off-by: Siddhant Kumar <skumar619@bloomberg.net>
  • Loading branch information
Siddhant Kumar committed Aug 16, 2020
1 parent 10f232b commit 4246291
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 3 deletions.
1 change: 1 addition & 0 deletions docs/changelog/1818.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Use unix style line endings in bash activation script - by :user:`saytosid`.
22 changes: 22 additions & 0 deletions src/virtualenv/activation/bash/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@
from __future__ import absolute_import, unicode_literals

from virtualenv.info import IS_WIN
from virtualenv.util.path import Path
from virtualenv.util.six import ensure_text

from ..via_template import ViaTemplateActivator


class BashActivator(ViaTemplateActivator):
def generate(self, creator):
generated = super(BashActivator, self).generate(creator)
if IS_WIN:
_convert_to_unix_line_endings(generated)
return generated

def templates(self):
yield Path("activate.sh")

def as_name(self, template):
return template.stem


def _convert_to_unix_line_endings(generated):
WINDOWS_LINE_ENDING = b"\r\n"
UNIX_LINE_ENDING = b"\n"

for file_path in generated:
with open(ensure_text(str(file_path)), "rb") as open_file:
content = open_file.read()

content = content.replace(WINDOWS_LINE_ENDING, UNIX_LINE_ENDING)

with open(ensure_text(str(file_path)), "wb") as open_file:
open_file.write(content)
25 changes: 22 additions & 3 deletions tests/unit/activation/test_bash.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from __future__ import absolute_import, unicode_literals

import sys

import pytest

from virtualenv.activation import BashActivator
from virtualenv.activation.via_template import ViaTemplateActivator
from virtualenv.info import IS_WIN
from virtualenv.util.path import Path
from virtualenv.util.six import ensure_text


@pytest.mark.skipif(sys.platform == "win32", reason="Github Actions ships with WSL bash")
@pytest.mark.skipif(IS_WIN, reason="Github Actions ships with WSL bash")
def test_bash(raise_on_non_source_class, activation_tester):
class Bash(raise_on_non_source_class):
def __init__(self, session):
Expand All @@ -16,3 +18,20 @@ def __init__(self, session):
)

activation_tester(Bash)


@pytest.mark.skipif(not IS_WIN, reason="Only makes sense on Windows")
def test_bash_activate_script_has_unix_line_endings(tmpdir, mocker):
class Mock_ViaTemplateActivator(ViaTemplateActivator):
def generate(self, creator):
file_path = Path(tmpdir / "activate")
with open(ensure_text(str(file_path)), "wb") as windows_line_endings_file:
windows_line_endings_file.writelines([b"Test_file\r\n"] * 10)

return [file_path]

class TestBashActivator(BashActivator, Mock_ViaTemplateActivator):
pass

(file_path,) = TestBashActivator(mocker.MagicMock()).generate(mocker.MagicMock())
assert b"Test_file\n" * 10 == file_path.read_bytes()

0 comments on commit 4246291

Please sign in to comment.