Skip to content

Commit

Permalink
[vcpkg] fix checking out git registry ports (microsoft#16009)
Browse files Browse the repository at this point in the history
* [vcpkg] fix checking out git registry ports

* fix the new issues in builtinregistryentry

* fix tests

* fix tests boogaloo

* [vcpkg] Fix issue where baseline is requested for overlay during version resolution

* split BuiltinRegistryEntry into two types

Co-authored-by: Robert Schumacher <[email protected]>
  • Loading branch information
strega-nil and ras0219 authored Feb 3, 2021
1 parent a84190e commit dc4d1b7
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 24 deletions.
32 changes: 31 additions & 1 deletion scripts/azure-pipelines/end-to-end-tests-dir/registries.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,45 @@ try
$CurrentTest = 'git init .'
git @gitConfigOptions init .
Throw-IfFailed
Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../../e2e_ports/versions" -Destination .
Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../../e2e_ports/vcpkg-internal-e2e-test-port" -Destination .
New-Item -Path './vcpkg-internal-e2e-test-port/foobar' -Value 'this is just to get a distinct git tree'

$CurrentTest = 'git add -A'
git @gitConfigOptions add -A
Throw-IfFailed
$CurrentTest = 'git commit'
git @gitConfigOptions commit -m 'initial commit'
Throw-IfFailed

$vcpkgInternalE2eTestPortGitTree = git rev-parse 'HEAD:vcpkg-internal-e2e-test-port'
$vcpkgInternalE2eTestPortVersionsJson = @{
"versions" = @(
@{
"version-string" = "1.0.0";
"git-tree" = $vcpkgInternalE2eTestPortGitTree
}
)
}
$vcpkgBaseline = @{
"default" = @{
"vcpkg-internal-e2e-test-port" = @{
"baseline" = "1.0.0"
}
}
}

New-Item -Path './versions' -ItemType Directory
New-Item -Path './versions/v-' -ItemType Directory

New-Item -Path './versions/baseline.json' -Value (ConvertTo-Json -Depth 5 -InputObject $vcpkgBaseline)
New-Item -Path './versions/v-/vcpkg-internal-e2e-test-port.json' -Value (ConvertTo-Json -Depth 5 -InputObject $vcpkgInternalE2eTestPortVersionsJson)

$CurrentTest = 'git add -A'
git @gitConfigOptions add -A
Throw-IfFailed
$CurrentTest = 'git commit'
git @gitConfigOptions commit --amend --no-edit
Throw-IfFailed
}
finally
{
Expand Down
3 changes: 3 additions & 0 deletions toolsrc/src/vcpkg/build.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,9 @@ namespace vcpkg::Build
"for more information.\n");
Checks::exit_maybe_upgrade(VCPKG_LINE_INFO);
#else
(void)target_architecture;
(void)toolset;
(void)all_toolsets;
Checks::exit_with_message(VCPKG_LINE_INFO,
"Error: vcvars-based toolchains are only usable on Windows platforms.");
#endif
Expand Down
53 changes: 40 additions & 13 deletions toolsrc/src/vcpkg/dependencies.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1256,6 +1256,8 @@ namespace vcpkg::Dependencies
VersionSchemeInfo& vsi,
const std::string& feature);

Optional<Versions::Version> dep_to_version(const std::string& name, const DependencyConstraint& dc);

std::vector<std::string> m_errors;
};

Expand Down Expand Up @@ -1452,17 +1454,31 @@ namespace vcpkg::Dependencies
const Dependency& dep,
const std::string& origin)
{
auto base_ver = m_base_provider.get_baseline_version(dep.name);
auto dep_ver = to_version(dep.constraint);

if (auto dv = dep_ver.get())
auto maybe_overlay = m_o_provider.get_control_file(ref.first.name());
auto over_it = m_overrides.find(ref.first.name());
if (auto p_overlay = maybe_overlay.get())
{
add_constraint(ref, *dv, origin);
auto overlay_version = to_version(*p_overlay->source_control_file);
add_constraint(ref, overlay_version, origin);
}

if (auto bv = base_ver.get())
else if (over_it != m_overrides.end())
{
add_constraint(ref, *bv, origin);
add_constraint(ref, over_it->second, origin);
}
else
{
auto base_ver = m_base_provider.get_baseline_version(dep.name);
auto dep_ver = to_version(dep.constraint);

if (auto dv = dep_ver.get())
{
add_constraint(ref, *dv, origin);
}

if (auto bv = base_ver.get())
{
add_constraint(ref, *bv, origin);
}
}

for (auto&& f : dep.features)
Expand Down Expand Up @@ -1569,18 +1585,29 @@ namespace vcpkg::Dependencies
return *m_graph.emplace(spec, PackageNode{}).first;
}

static Optional<Versions::Version> dep_to_version(const std::string& name,
const DependencyConstraint& dc,
const PortFileProvider::IBaselineProvider& base_provider)
Optional<Versions::Version> VersionedPackageGraph::dep_to_version(const std::string& name,
const DependencyConstraint& dc)
{
auto maybe_overlay = m_o_provider.get_control_file(name);
if (auto p_overlay = maybe_overlay.get())
{
return to_version(*p_overlay->source_control_file);
}

auto over_it = m_overrides.find(name);
if (over_it != m_overrides.end())
{
return over_it->second;
}

auto maybe_cons = to_version(dc);
if (maybe_cons)
{
return maybe_cons;
}
else
{
return base_provider.get_baseline_version(name);
return m_base_provider.get_baseline_version(name);
}
}

Expand Down Expand Up @@ -1779,7 +1806,7 @@ namespace vcpkg::Dependencies
{
continue;
}
auto maybe_cons = dep_to_version(dep.name, dep.constraint, m_base_provider);
auto maybe_cons = dep_to_version(dep.name, dep.constraint);

if (auto cons = maybe_cons.get())
{
Expand Down
59 changes: 49 additions & 10 deletions toolsrc/src/vcpkg/registries.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ namespace
DelayedInit<Baseline> m_baseline;
};

struct BuiltinRegistryEntry final : RegistryEntry
struct BuiltinPortTreeRegistryEntry final : RegistryEntry
{
View<VersionT> get_port_versions() const override { return {&version, 1}; }
ExpectedS<fs::path> get_path_to_version(const VcpkgPaths&, const VersionT& v) const override
Expand All @@ -108,6 +108,7 @@ namespace
{
return path;
}

return {Strings::format("Error: no version entry for %s at version %s.\n"
"We are currently using the version in the ports tree (%s).",
name,
Expand All @@ -121,6 +122,19 @@ namespace
VersionT version;
};

struct BuiltinGitRegistryEntry final : RegistryEntry
{
View<VersionT> get_port_versions() const override { return port_versions; }
ExpectedS<fs::path> get_path_to_version(const VcpkgPaths&, const VersionT& version) const override;

std::string port_name;

// these two map port versions to git trees
// these shall have the same size, and git_trees[i] shall be the git tree for port_versions[i]
std::vector<VersionT> port_versions;
std::vector<std::string> git_trees;
};

struct FilesystemRegistryEntry final : RegistryEntry
{
explicit FilesystemRegistryEntry(std::string&& port_name) : port_name(port_name) { }
Expand Down Expand Up @@ -248,14 +262,14 @@ namespace
VCPKG_LINE_INFO, maybe_version_entries.has_value(), "Error: " + maybe_version_entries.error());
auto version_entries = std::move(maybe_version_entries).value_or_exit(VCPKG_LINE_INFO);

auto gre = std::make_unique<GitRegistryEntry>();
gre->port_name = port_name.to_string();
auto res = std::make_unique<BuiltinGitRegistryEntry>();
res->port_name = port_name.to_string();
for (auto&& version_entry : version_entries)
{
gre->port_versions.push_back(version_entry.version);
gre->git_trees.push_back(version_entry.git_tree);
res->port_versions.push_back(version_entry.version);
res->git_trees.push_back(version_entry.git_tree);
}
return gre;
return res;
}
}

Expand All @@ -275,10 +289,10 @@ namespace

if (scf->core_paragraph->name == port_name)
{
auto res = std::make_unique<BuiltinRegistryEntry>();
res->version = scf->core_paragraph->to_versiont();
res->path = std::move(port_directory);
auto res = std::make_unique<BuiltinPortTreeRegistryEntry>();
res->name = std::move(scf->core_paragraph->name);
res->path = std::move(port_directory);
res->version = scf->to_versiont();
return res;
}
Checks::exit_maybe_upgrade(VCPKG_LINE_INFO,
Expand Down Expand Up @@ -583,6 +597,31 @@ namespace

// { RegistryEntry

// { BuiltinRegistryEntry::RegistryEntry
ExpectedS<fs::path> BuiltinGitRegistryEntry::get_path_to_version(const VcpkgPaths& paths,
const VersionT& version) const
{
auto it = std::find(port_versions.begin(), port_versions.end(), version);
if (it == port_versions.end())
{
return {Strings::concat("Error: No version entry for ",
port_name,
" at version ",
version,
". This may be fixed by updating vcpkg to the latest master via `git "
"pull`.\nAvailable versions:\n",
Strings::join("",
port_versions,
[](const VersionT& v) { return Strings::concat(" ", v, "\n"); }),
"\nSee `vcpkg help versioning` for more information."),
expected_right_tag};
}

const auto& git_tree = git_trees[it - port_versions.begin()];
return paths.git_checkout_port(port_name, git_tree, paths.root / fs::u8path(".git"));
}
// } BuiltinRegistryEntry::RegistryEntry

// { FilesystemRegistryEntry::RegistryEntry
ExpectedS<fs::path> FilesystemRegistryEntry::get_path_to_version(const VcpkgPaths&, const VersionT& version) const
{
Expand Down Expand Up @@ -617,7 +656,7 @@ namespace
}

const auto& git_tree = git_trees[it - port_versions.begin()];
return paths.git_checkout_port(port_name, git_tree, paths.root / fs::u8path(".git"));
return paths.git_checkout_object_from_remote_registry(git_tree);
}
// } GitRegistryEntry::RegistryEntry

Expand Down

0 comments on commit dc4d1b7

Please sign in to comment.