aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorBilly O'Neal <bion@microsoft.com>2020-10-27 20:48:14 -0700
committerGitHub <noreply@github.com>2020-10-27 20:48:14 -0700
commita6a1722cfa94caa5db98848679b99377bc5a0112 (patch)
tree0f17c63e4a0551866280600e466f21267c8ae1ce /toolsrc/src
parentc34c4189ebbf0795e1f8e2de562c527a854c8db4 (diff)
downloadvcpkg-a6a1722cfa94caa5db98848679b99377bc5a0112.tar.gz
vcpkg-a6a1722cfa94caa5db98848679b99377bc5a0112.zip
[vcpkg, jsonnet, openssl-uwp] Enable use of the system powershell-core if it is present. (#13805)
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg-test/files.cpp15
-rw-r--r--toolsrc/src/vcpkg/base/files.cpp33
-rw-r--r--toolsrc/src/vcpkg/build.cpp7
-rw-r--r--toolsrc/src/vcpkg/tools.cpp38
4 files changed, 82 insertions, 11 deletions
diff --git a/toolsrc/src/vcpkg-test/files.cpp b/toolsrc/src/vcpkg-test/files.cpp
index 429a4ba15..94cf7e1dd 100644
--- a/toolsrc/src/vcpkg-test/files.cpp
+++ b/toolsrc/src/vcpkg-test/files.cpp
@@ -250,6 +250,21 @@ TEST_CASE ("win32_fix_path_case", "[files]")
}
#endif // _WIN32
+TEST_CASE ("add_filename", "[files]")
+{
+ using vcpkg::Files::add_filename;
+ using vcpkg::Files::preferred_separator;
+
+ CHECK(add_filename("a/b", "c") == std::string("a/b") + preferred_separator + "c");
+ CHECK(add_filename("a/b/", "c") == "a/b/c");
+ CHECK(add_filename("a/b\\", "c") == "a/b\\c");
+ CHECK(add_filename("", "c") == "c");
+
+ // note that we don't special case slashes in the second argument; the caller shouldn't do that
+ CHECK(add_filename("a/b/", "\\c") == "a/b/\\c");
+ CHECK(add_filename("a/b\\", "/c") == "a/b\\/c");
+}
+
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
TEST_CASE ("remove all -- benchmarks", "[files][!benchmark]")
{
diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp
index 2d82e1df1..d00b9b7a6 100644
--- a/toolsrc/src/vcpkg/base/files.cpp
+++ b/toolsrc/src/vcpkg/base/files.cpp
@@ -23,7 +23,6 @@
#include <algorithm>
#include <string>
-#if defined(_WIN32)
namespace
{
struct IsSlash
@@ -32,7 +31,11 @@ namespace
};
constexpr IsSlash is_slash;
+} // unnamed namespace
+#if defined(_WIN32)
+namespace
+{
template<size_t N>
bool wide_starts_with(const std::wstring& haystack, const wchar_t (&needle)[N]) noexcept
{
@@ -1182,14 +1185,14 @@ namespace vcpkg::Files
auto paths = Strings::split_paths(System::get_environment_variable("PATH").value_or_exit(VCPKG_LINE_INFO));
std::vector<fs::path> ret;
- std::error_code ec;
for (auto&& path : paths)
{
- auto base = path + "/" + name;
+ auto base = add_filename(path, name);
+
for (auto&& ext : EXTS)
{
auto p = fs::u8path(base + ext.c_str());
- if (Util::find(ret, p) == ret.end() && this->exists(p, ec))
+ if (Util::find(ret, p) == ret.end() && this->exists(p, ignore_errors))
{
ret.push_back(p);
Debug::print("Found path: ", fs::u8string(p), '\n');
@@ -1372,4 +1375,26 @@ namespace vcpkg::Files
return fs::path(std::move(in_progress));
}
#endif // _WIN32
+
+ std::string add_filename(StringView base, StringView file)
+ {
+ std::string result;
+ const auto base_size = base.size();
+ const auto file_size = file.size();
+ if (base_size != 0 && !is_slash(base.data()[base_size - 1]))
+ {
+ result.reserve(base_size + file_size + 1);
+ result.append(base.data(), base_size);
+ result.push_back(preferred_separator);
+ result.append(file.data(), file_size);
+ }
+ else
+ {
+ result.reserve(base_size + file_size);
+ result.append(base.data(), base_size);
+ result.append(file.data(), file_size);
+ }
+
+ return result;
+ }
}
diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp
index 9b4e7b428..7eaaf6aad 100644
--- a/toolsrc/src/vcpkg/build.cpp
+++ b/toolsrc/src/vcpkg/build.cpp
@@ -338,13 +338,6 @@ namespace vcpkg::Build
return base_env.cmd_cache.get_lazy(build_env_cmd, [&]() {
const fs::path& powershell_exe_path = paths.get_tool_exe("powershell-core");
- auto& fs = paths.get_filesystem();
- if (!fs.exists(powershell_exe_path.parent_path() / "powershell.exe"))
- {
- fs.copy(
- powershell_exe_path, powershell_exe_path.parent_path() / "powershell.exe", fs::copy_options::none);
- }
-
auto clean_env = System::get_modified_clean_environment(
base_env.env_map, fs::u8string(powershell_exe_path.parent_path()) + ";");
if (build_env_cmd.empty())
diff --git a/toolsrc/src/vcpkg/tools.cpp b/toolsrc/src/vcpkg/tools.cpp
index 5531a1dac..d308290ae 100644
--- a/toolsrc/src/vcpkg/tools.cpp
+++ b/toolsrc/src/vcpkg/tools.cpp
@@ -464,6 +464,36 @@ Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-2 Wed Feb 26 23:23:50
}
};
+ struct PowerShellCoreProvider : ToolProvider
+ {
+ std::string m_exe = "pwsh";
+
+ virtual const std::string& tool_data_name() const override { return m_exe; }
+ virtual const std::string& exe_stem() const override { return m_exe; }
+ virtual std::array<int, 3> default_min_version() const override { return {7, 0, 3}; }
+
+ virtual Optional<std::string> get_version(const VcpkgPaths&, const fs::path& path_to_exe) const override
+ {
+ const auto pwsh_invocation = System::cmd_execute_and_capture_output(
+ System::CmdLineBuilder().path_arg(path_to_exe).string_arg("--version").extract());
+ if (pwsh_invocation.exit_code != 0)
+ {
+ return nullopt;
+ }
+
+ // Sample output: PowerShell 7.0.3\r\n
+ auto output = std::move(pwsh_invocation.output);
+ if (!Strings::starts_with(output, "PowerShell "))
+ {
+ Checks::exit_with_message(
+ VCPKG_LINE_INFO, "Unexpected format of powershell-core version string: %s", output);
+ }
+
+ output.erase(0, 11);
+ return Strings::trim(std::move(output));
+ }
+ };
+
struct ToolCacheImpl final : ToolCache
{
vcpkg::Cache<std::string, fs::path> path_only_cache;
@@ -511,6 +541,14 @@ Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-2 Wed Feb 26 23:23:50
}
return get_path(paths, NinjaProvider());
}
+ if (tool == Tools::POWERSHELL_CORE)
+ {
+ if (System::get_environment_variable("VCPKG_FORCE_SYSTEM_BINARIES").has_value())
+ {
+ return {"pwsh", "0"};
+ }
+ return get_path(paths, PowerShellCoreProvider());
+ }
if (tool == Tools::NUGET) return get_path(paths, NuGetProvider());
if (tool == Tools::IFW_INSTALLER_BASE) return get_path(paths, IfwInstallerBaseProvider());
if (tool == Tools::MONO) return get_path(paths, MonoProvider());