[vcpkg] Resolve relative overlay ports to the current working directory. (#11233)

Fixes #10771.
This commit is contained in:
Robert Schumacher 2020-05-08 12:41:44 -07:00 коммит произвёл GitHub
Родитель 62d5125c5d
Коммит 8de3f323dc
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 29 добавлений и 11 удалений

Просмотреть файл

@ -61,7 +61,8 @@ namespace vcpkg
const Optional<fs::path>& install_root_dir, const Optional<fs::path>& install_root_dir,
const Optional<fs::path>& vcpkg_scripts_root_dir, const Optional<fs::path>& vcpkg_scripts_root_dir,
const std::string& default_vs_path, const std::string& default_vs_path,
const std::vector<std::string>* triplets_dirs); const std::vector<std::string>* triplets_dirs,
fs::path original_cwd);
fs::path package_dir(const PackageSpec& spec) const; fs::path package_dir(const PackageSpec& spec) const;
fs::path build_info_file_path(const PackageSpec& spec) const; fs::path build_info_file_path(const PackageSpec& spec) const;
@ -72,6 +73,7 @@ namespace vcpkg
const std::vector<TripletFile>& get_available_triplets() const; const std::vector<TripletFile>& get_available_triplets() const;
const fs::path get_triplet_file_path(Triplet triplet) const; const fs::path get_triplet_file_path(Triplet triplet) const;
fs::path original_cwd;
fs::path root; fs::path root;
fs::path packages; fs::path packages;
fs::path buildtrees; fs::path buildtrees;

Просмотреть файл

@ -119,22 +119,30 @@ static void inner(const VcpkgCmdArguments& args)
Debug::print("Using vcpkg-root: ", vcpkg_root_dir.u8string(), '\n'); Debug::print("Using vcpkg-root: ", vcpkg_root_dir.u8string(), '\n');
Optional<fs::path> install_root_dir; Optional<fs::path> install_root_dir;
if (args.install_root_dir) { if (args.install_root_dir)
{
install_root_dir = Files::get_real_filesystem().canonical(VCPKG_LINE_INFO, fs::u8path(*args.install_root_dir)); install_root_dir = Files::get_real_filesystem().canonical(VCPKG_LINE_INFO, fs::u8path(*args.install_root_dir));
Debug::print("Using install-root: ", install_root_dir.value_or_exit(VCPKG_LINE_INFO).u8string(), '\n'); Debug::print("Using install-root: ", install_root_dir.value_or_exit(VCPKG_LINE_INFO).u8string(), '\n');
} }
Optional<fs::path> vcpkg_scripts_root_dir = nullopt; Optional<fs::path> vcpkg_scripts_root_dir;
if (args.scripts_root_dir) if (args.scripts_root_dir)
{ {
vcpkg_scripts_root_dir = Files::get_real_filesystem().canonical(VCPKG_LINE_INFO, fs::u8path(*args.scripts_root_dir)); vcpkg_scripts_root_dir =
Files::get_real_filesystem().canonical(VCPKG_LINE_INFO, fs::u8path(*args.scripts_root_dir));
Debug::print("Using scripts-root: ", vcpkg_scripts_root_dir.value_or_exit(VCPKG_LINE_INFO).u8string(), '\n'); Debug::print("Using scripts-root: ", vcpkg_scripts_root_dir.value_or_exit(VCPKG_LINE_INFO).u8string(), '\n');
} }
auto default_vs_path = System::get_environment_variable("VCPKG_VISUAL_STUDIO_PATH").value_or(""); auto default_vs_path = System::get_environment_variable("VCPKG_VISUAL_STUDIO_PATH").value_or("");
const Expected<VcpkgPaths> expected_paths = auto original_cwd = Files::get_real_filesystem().current_path(VCPKG_LINE_INFO);
VcpkgPaths::create(vcpkg_root_dir, install_root_dir, vcpkg_scripts_root_dir, default_vs_path, args.overlay_triplets.get());
const Expected<VcpkgPaths> expected_paths = VcpkgPaths::create(vcpkg_root_dir,
install_root_dir,
vcpkg_scripts_root_dir,
default_vs_path,
args.overlay_triplets.get(),
original_cwd);
Checks::check_exit(VCPKG_LINE_INFO, Checks::check_exit(VCPKG_LINE_INFO,
!expected_paths.error(), !expected_paths.error(),
"Error: Invalid vcpkg root directory %s: %s", "Error: Invalid vcpkg root directory %s: %s",

Просмотреть файл

@ -1,5 +1,6 @@
#include <pch.h> #include <pch.h>
#include <vcpkg/base/system.debug.h>
#include <vcpkg/paragraphs.h> #include <vcpkg/paragraphs.h>
#include <vcpkg/portfileprovider.h> #include <vcpkg/portfileprovider.h>
#include <vcpkg/sourceparagraph.h> #include <vcpkg/sourceparagraph.h>
@ -34,7 +35,9 @@ namespace vcpkg::PortFileProvider
{ {
if (!overlay_path.empty()) if (!overlay_path.empty())
{ {
auto overlay = fs.canonical(VCPKG_LINE_INFO, fs::u8path(overlay_path)); auto overlay = fs.canonical(VCPKG_LINE_INFO, paths.original_cwd / fs::u8path(overlay_path));
Debug::print("Using overlay: ", overlay.u8string(), "\n");
Checks::check_exit(VCPKG_LINE_INFO, Checks::check_exit(VCPKG_LINE_INFO,
filesystem.exists(overlay), filesystem.exists(overlay),

Просмотреть файл

@ -17,7 +17,8 @@ namespace vcpkg
const Optional<fs::path>& install_root_dir, const Optional<fs::path>& install_root_dir,
const Optional<fs::path>& vcpkg_scripts_root_dir, const Optional<fs::path>& vcpkg_scripts_root_dir,
const std::string& default_vs_path, const std::string& default_vs_path,
const std::vector<std::string>* triplets_dirs) const std::vector<std::string>* triplets_dirs,
fs::path original_cwd)
{ {
auto& fs = Files::get_real_filesystem(); auto& fs = Files::get_real_filesystem();
std::error_code ec; std::error_code ec;
@ -30,6 +31,7 @@ namespace vcpkg
VcpkgPaths paths; VcpkgPaths paths;
paths.root = canonical_vcpkg_root_dir; paths.root = canonical_vcpkg_root_dir;
paths.default_vs_path = default_vs_path; paths.default_vs_path = default_vs_path;
paths.original_cwd = original_cwd;
if (paths.root.empty()) if (paths.root.empty())
{ {
@ -66,9 +68,12 @@ namespace vcpkg
} }
paths.ports = paths.root / "ports"; paths.ports = paths.root / "ports";
if (auto d = install_root_dir.get()) { if (auto d = install_root_dir.get())
paths.installed = fs.absolute(VCPKG_LINE_INFO, std::move(*d)); {
} else { paths.installed = fs.absolute(VCPKG_LINE_INFO, *d);
}
else
{
paths.installed = paths.root / "installed"; paths.installed = paths.root / "installed";
} }
paths.triplets = paths.root / "triplets"; paths.triplets = paths.root / "triplets";