Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove double application of env vars from profile #4380

Merged
merged 10 commits into from Jan 28, 2019
1 change: 0 additions & 1 deletion conans/client/loader.py
Expand Up @@ -174,7 +174,6 @@ def _parse_conan_txt(self, contents, path, display_name, processed_profile):

# imports method
conanfile.imports = parser.imports_method(conanfile)
conanfile._conan_env_values.update(processed_profile._env_values)
return conanfile

def load_virtual(self, references, processed_profile, scope_options=True,
Expand Down
46 changes: 32 additions & 14 deletions conans/test/functional/configuration/profile_test.py
@@ -1,4 +1,5 @@
import os
import platform
import unittest
from collections import OrderedDict
from textwrap import dedent
Expand Down Expand Up @@ -27,7 +28,6 @@ def build(self):
self.run("SET")
else:
self.run("env")

"""


Expand All @@ -44,23 +44,37 @@ class ProfileTest(unittest.TestCase):
def setUp(self):
self.client = TestClient()

def profile_conanfile_txt_test(self):
"""
Test prepended env variables are applied correctrly from a profile
"""
self.client.save({"conanfile.txt": ""})
create_profile(self.client.cache.profiles_path, "envs", settings={},
env=[("A_VAR", "A_VALUE"), ("PREPEND_VAR", ["new_path", "other_path"])],
package_env={"Hello0": [("OTHER_VAR", "2")]})
self.client.run("install . -pr envs -g virtualenv")
danimtb marked this conversation as resolved.
Show resolved Hide resolved
content = load(os.path.join(self.client.current_folder, "activate.sh"))
self.assertIn(":".join(["PREPEND_VAR=\"new_path\"", "\"other_path\"", "$PREPEND_VAR"]),
content)
if platform.system() == "Windows":
content = load(os.path.join(self.client.current_folder, "activate.bat"))
self.assertIn(";".join(["PREPEND_VAR=new_path", "other_path", "%PREPEND_VAR%"]),
content)

def test_profile_relative_cwd(self):
client = TestClient()
client.save({"conanfile.txt": "",
"sub/sub/profile": ""})
client.current_folder = os.path.join(client.current_folder, "sub")
client.run("install .. -pr=sub/profile2", assert_error=True)
self.assertIn("ERROR: Profile not found: sub/profile2", client.out)
client.run("install .. -pr=sub/profile")
self.assertIn("conanfile.txt: Installing package", client.out)
self.client.save({"conanfile.txt": "", "sub/sub/profile": ""})
self.client.current_folder = os.path.join(self.client.current_folder, "sub")
self.client.run("install .. -pr=sub/profile2", assert_error=True)
self.assertIn("ERROR: Profile not found: sub/profile2", self.client.out)
self.client.run("install .. -pr=sub/profile")
self.assertIn("conanfile.txt: Installing package", self.client.out)

def base_profile_generated_test(self):
"""we are testing that the default profile is created (when not existing, fresh install)
even when you run a create with a profile"""
client = TestClient()
client.save({CONANFILE: conanfile_scope_env,
"myprofile": "include(default)\n[settings]\nbuild_type=Debug"})
client.run("create . conan/testing --profile myprofile")
self.client.save({CONANFILE: conanfile_scope_env,
"myprofile": "include(default)\n[settings]\nbuild_type=Debug"})
self.client.run("create . conan/testing --profile myprofile")

def bad_syntax_test(self):
self.client.save({CONANFILE: conanfile_scope_env})
Expand Down Expand Up @@ -148,11 +162,15 @@ def install_profile_env_test(self):
files["conanfile.py"] = conanfile_scope_env

create_profile(self.client.cache.profiles_path, "envs", settings={},
env=[("A_VAR", "A_VALUE")], package_env={"Hello0": [("OTHER_VAR", "2")]})
env=[("A_VAR", "A_VALUE"),
("PREPEND_VAR", ["new_path", "other_path"])],
package_env={"Hello0": [("OTHER_VAR", "2")]})

self.client.save(files)
self.client.run("export . lasote/stable")
self.client.run("install Hello0/0.1@lasote/stable --build missing -pr envs")
self._assert_env_variable_printed("PREPEND_VAR", os.pathsep.join(["new_path", "other_path"]))
self.assertEqual(1, str(self.client.out).count("PREPEND_VAR=new_path")) # prepended once
self._assert_env_variable_printed("A_VAR", "A_VALUE")
self._assert_env_variable_printed("OTHER_VAR", "2")

Expand Down
22 changes: 22 additions & 0 deletions conans/test/unittests/client/generators/virtualenv_test.py
@@ -0,0 +1,22 @@
import platform
import unittest

from conans import ConanFile, Settings
from conans.client.generators.virtualenv import VirtualEnvGenerator
from conans.model.env_info import EnvValues
from conans.test.utils.tools import TestBufferConanOutput


class VirtualenvGeneratorTest(unittest.TestCase):

def prepend_values_test(self):
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test checks that is not the fault of the virtualenv generator

"""
Check list values are only prepended once
"""
conanfile = ConanFile(TestBufferConanOutput(), None)
conanfile.initialize(Settings({}), EnvValues.loads("PATH=[1,2,three]"))
gen = VirtualEnvGenerator(conanfile)
content = gen.content
self.assertIn("PATH=\"1\":\"2\":\"three\":$PATH", content["activate.sh"])
if platform.system() == "Windows":
self.assertIn("PATH=1;2;three;%PATH%", content["activate.bat"])
69 changes: 69 additions & 0 deletions conans/test/unittests/client/loader_test.py
@@ -0,0 +1,69 @@
import os
import textwrap
import unittest

from conans import Settings
from conans.client.graph.python_requires import ConanPythonRequire
from conans.client.loader import ConanFileLoader
from conans.model.env_info import EnvValues
from conans.model.profile import Profile
from conans.model.ref import ConanFileReference
from conans.test.utils.conanfile import MockSettings
from conans.test.utils.runner import TestRunner
from conans.test.utils.test_files import temp_folder
from conans.test.utils.tools import TestBufferConanOutput
from conans.util.files import save


class LoadConanfileTxtTest(unittest.TestCase):

def setUp(self):
settings = Settings()
self.profile = Profile()
self.profile._settings = settings
self.profile._user_options = None
self.profile._env_values = None
self.conanfile_txt_path = os.path.join(temp_folder(), "conanfile.txt")
output = TestBufferConanOutput()
self.loader = ConanFileLoader(TestRunner(output), output, None)

def env_test(self):
env_values = EnvValues()
env_values.add("PREPEND_PATH", ["hello", "bye"])
env_values.add("VAR", ["var_value"])
self.profile._env_values = env_values
save(self.conanfile_txt_path, "")
conanfile = self.loader.load_conanfile_txt(self.conanfile_txt_path, self.profile)
self.assertEquals(conanfile.env, {"PREPEND_PATH": ["hello", "bye"], "VAR": ["var_value"]})


class LoadConanfileTest(unittest.TestCase):

def setUp(self):
settings = Settings()
self.profile = Profile()
self.profile._settings = settings
self.profile._user_options = None
self.profile._env_values = None
self.profile._dev_reference = None
self.profile._package_settings = None
self.conanfile_path = os.path.join(temp_folder(), "conanfile.py")
output = TestBufferConanOutput()
self.loader = ConanFileLoader(TestRunner(output), output, ConanPythonRequire(None, None))

def env_test(self):
env_values = EnvValues()
env_values.add("PREPEND_PATH", ["hello", "bye"])
env_values.add("VAR", ["var_value"])
self.profile._env_values = env_values
save(self.conanfile_path,
textwrap.dedent("""
from conans import ConanFile

class TestConan(ConanFile):
name = "hello"
version = "1.0"
"""))
ref = ConanFileReference("hello", "1.0", "user", "channel")
conanfile = self.loader.load_conanfile(self.conanfile_path, self.profile, ref)
self.assertEquals(conanfile.env, {"PREPEND_PATH": ["hello", "bye"], "VAR": ["var_value"]})