Skip to content

Commit 05b70f5

Browse files
committed
[RFC] make it possible to _not_ have a baseline for git registries
Internally to reMarkable, we want to not have a baseline for our internal dependencies, and only use `"version>="` constraints; this current set of changes does work for our current workflow, but of course we can make the code better; I just want to put it out there to see if there's interest (and so we can maybe avoid a fork).
1 parent 2e629c3 commit 05b70f5

File tree

8 files changed

+71
-53
lines changed

8 files changed

+71
-53
lines changed

include/vcpkg/portfileprovider.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ namespace vcpkg
9797

9898
struct IBaselineProvider
9999
{
100-
virtual ExpectedL<Version> get_baseline_version(StringView port_name) const = 0;
100+
virtual ExpectedL<Optional<Version>> get_baseline_version(StringView port_name) const = 0;
101101
virtual ~IBaselineProvider() = default;
102102
};
103103

include/vcpkg/registries.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ namespace vcpkg
153153
std::unique_ptr<RegistryImplementation> make_git_registry(const VcpkgPaths& paths,
154154
std::string repo,
155155
std::string reference,
156-
std::string baseline);
156+
Optional<std::string> baseline);
157157
std::unique_ptr<RegistryImplementation> make_filesystem_registry(const ReadOnlyFilesystem& fs,
158158
Path path,
159159
std::string baseline);

src/vcpkg-test/dependencies.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct MockBaselineProvider : IBaselineProvider
2626
{
2727
mutable std::map<std::string, Version, std::less<>> v;
2828

29-
ExpectedL<Version> get_baseline_version(StringView name) const override
29+
ExpectedL<Optional<Version>> get_baseline_version(StringView name) const override
3030
{
3131
auto it = v.find(name);
3232
if (it == v.end())

src/vcpkg-test/registries.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,10 @@ TEST_CASE ("registry_parsing", "[registries]")
368368
)json");
369369
{
370370
Json::Reader r{"test"};
371-
visit_default_registry(r, std::move(test_json));
372-
CHECK(r.messages().any_errors());
371+
auto registry_impl = visit_default_registry(r, std::move(test_json));
372+
REQUIRE(registry_impl);
373+
INFO(r.messages().join());
374+
CHECK_FALSE(r.messages().any_errors());
373375
}
374376

375377
test_json = parse_json(R"json(

src/vcpkg/configuration.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,7 @@ namespace
234234
r.required_object_field(
235235
msg::format(msgAGitRegistry), obj, JsonIdRepository, res.repo.emplace(), GitUrlDeserializer::instance);
236236
r.optional_object_field_emplace(obj, JsonIdReference, res.reference, GitReferenceDeserializer::instance);
237-
r.required_object_field(msg::format(msgAGitRegistry),
238-
obj,
239-
JsonIdBaseline,
240-
res.baseline.emplace(),
241-
BaselineShaDeserializer::instance);
237+
r.optional_object_field_emplace(obj, JsonIdBaseline, res.baseline, BaselineShaDeserializer::instance);
242238
r.check_for_unexpected_fields(obj, valid_git_fields, msg::format(msgAGitRegistry));
243239
}
244240
else if (kind == JsonIdArtifact)
@@ -897,7 +893,7 @@ namespace vcpkg
897893
return make_git_registry(paths,
898894
config.repo.value_or_exit(VCPKG_LINE_INFO),
899895
config.reference.value_or("HEAD"),
900-
config.baseline.value_or_exit(VCPKG_LINE_INFO));
896+
config.baseline);
901897
}
902898
else if (*k == JsonIdFilesystem)
903899
{

src/vcpkg/dependencies.cpp

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <vcpkg/base/graphs.h>
33
#include <vcpkg/base/optional.h>
44
#include <vcpkg/base/strings.h>
5+
#include <vcpkg/base/system.debug.h>
56
#include <vcpkg/base/util.h>
67

78
#include <vcpkg/cmakevars.h>
@@ -1456,7 +1457,9 @@ namespace vcpkg
14561457

14571458
// Add an initial requirement for a package.
14581459
// Returns a reference to the node to place additional constraints
1459-
Optional<PackageNode&> require_package(const PackageSpec& spec, const std::string& origin);
1460+
Optional<PackageNode&> require_package(const PackageSpec& spec,
1461+
const std::string& origin,
1462+
Optional<Version> maybe_declared_ver);
14601463

14611464
void require_scfl(PackageNode& ref, const SourceControlFileAndLocation* scfl, const std::string& origin);
14621465

@@ -1512,14 +1515,15 @@ namespace vcpkg
15121515
if (!dep.platform.is_empty() && !dep.platform.evaluate(batch_load_vars(frame.spec))) continue;
15131516

15141517
PackageSpec dep_spec(dep.name, dep.host ? m_host_triplet : frame.spec.triplet());
1515-
auto maybe_node = require_package(dep_spec, frame.spec.name());
1518+
1519+
auto maybe_dep_ver = dep.constraint.try_get_minimum_version();
1520+
auto maybe_node = require_package(dep_spec, frame.spec.name(), maybe_dep_ver);
15161521
if (auto node = maybe_node.get())
15171522
{
15181523
// If the node is overlayed or overridden, don't apply version constraints
15191524
// If the baseline is a version_string, it occludes other constraints
15201525
if (!node->second.overlay_or_override)
15211526
{
1522-
const auto maybe_dep_ver = dep.constraint.try_get_minimum_version();
15231527
if (auto dep_ver = maybe_dep_ver.get())
15241528
{
15251529
auto maybe_scfl = m_ver_provider.get_control_file({dep.name, *dep_ver});
@@ -1639,8 +1643,8 @@ namespace vcpkg
16391643
return *it;
16401644
}
16411645

1642-
Optional<VersionedPackageGraph::PackageNode&> VersionedPackageGraph::require_package(const PackageSpec& spec,
1643-
const std::string& origin)
1646+
Optional<VersionedPackageGraph::PackageNode&> VersionedPackageGraph::require_package(
1647+
const PackageSpec& spec, const std::string& origin, Optional<Version> maybe_declared_ver)
16441648
{
16451649
// Implicit defaults are disabled if spec is requested from top-level spec.
16461650
const bool default_features_mask = origin != m_toplevel.name();
@@ -1686,9 +1690,24 @@ namespace vcpkg
16861690
}
16871691
else
16881692
{
1689-
auto maybe_scfl = m_base_provider.get_baseline_version(spec.name()).then([&](const Version& ver) {
1690-
return m_ver_provider.get_control_file({spec.name(), ver});
1691-
});
1693+
auto maybe_scfl =
1694+
m_base_provider.get_baseline_version(spec.name())
1695+
.then([&](const Optional<Version>& ver) -> ExpectedL<const SourceControlFileAndLocation&> {
1696+
if (auto baseline_ver = ver.get())
1697+
{
1698+
return m_ver_provider.get_control_file({spec.name(), *baseline_ver});
1699+
}
1700+
else if (auto declared_ver = maybe_declared_ver.get())
1701+
{
1702+
return m_ver_provider.get_control_file({spec.name(), *declared_ver});
1703+
}
1704+
else
1705+
{
1706+
// TODO: this should be a PortNotInBaselineAndNoVersion
1707+
Debug::println("port {} not in baseline, no declared version", spec.name());
1708+
return msg::format_error(msgPortNotInBaseline, msg::package_name = spec.name());
1709+
}
1710+
});
16921711
if (auto p_scfl = maybe_scfl.get())
16931712
{
16941713
it = m_graph.emplace(spec, PackageNodeData{}).first;

src/vcpkg/portfileprovider.cpp

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,17 @@ namespace vcpkg
372372
{
373373
return *scfl;
374374
}
375-
auto maybe_baseline = m_baseline->get_baseline_version(spec);
376-
if (auto baseline = maybe_baseline.get())
377-
{
378-
return m_versioned->get_control_file({spec, *baseline});
379-
}
380-
else
381-
{
382-
return std::move(maybe_baseline).error();
383-
}
375+
return m_baseline->get_baseline_version(spec).then(
376+
[&](const Optional<Version>& ver) -> ExpectedL<const SourceControlFileAndLocation&> {
377+
if (auto v = ver.get())
378+
{
379+
return m_versioned->get_control_file({spec, *v});
380+
}
381+
else
382+
{
383+
return msg::format_error(msgPortNotInBaseline, msg::package_name = spec);
384+
}
385+
});
384386
}
385387

386388
std::vector<const SourceControlFileAndLocation*> PathsPortFileProvider::load_all_control_files() const
@@ -399,25 +401,16 @@ namespace vcpkg
399401
BaselineProviderImpl(const BaselineProviderImpl&) = delete;
400402
BaselineProviderImpl& operator=(const BaselineProviderImpl&) = delete;
401403

402-
virtual ExpectedL<Version> get_baseline_version(StringView port_name) const override
404+
virtual ExpectedL<Optional<Version>> get_baseline_version(StringView port_name) const override
403405
{
404-
return m_baseline_cache.get_lazy(port_name, [this, port_name]() -> ExpectedL<Version> {
405-
return registry_set.baseline_for_port(port_name).then(
406-
[&](Optional<Version>&& maybe_version) -> ExpectedL<Version> {
407-
auto version = maybe_version.get();
408-
if (!version)
409-
{
410-
return msg::format_error(msgPortNotInBaseline, msg::package_name = port_name);
411-
}
412-
413-
return std::move(*version);
414-
});
406+
return m_baseline_cache.get_lazy(port_name, [this, port_name]() -> ExpectedL<Optional<Version>> {
407+
return registry_set.baseline_for_port(port_name);
415408
});
416409
}
417410

418411
private:
419412
const RegistrySet& registry_set;
420-
Cache<std::string, ExpectedL<Version>> m_baseline_cache;
413+
Cache<std::string, ExpectedL<Optional<Version>>> m_baseline_cache;
421414
};
422415

423416
struct VersionedPortfileProviderImpl : IFullVersionedPortfileProvider

src/vcpkg/registries.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ namespace
7373

7474
struct GitRegistry final : RegistryImplementation
7575
{
76-
GitRegistry(const VcpkgPaths& paths, std::string&& repo, std::string&& reference, std::string&& baseline)
76+
GitRegistry(const VcpkgPaths& paths,
77+
std::string&& repo,
78+
std::string&& reference,
79+
Optional<std::string>&& baseline)
7780
: m_paths(paths)
7881
, m_repo(std::move(repo))
7982
, m_reference(std::move(reference))
@@ -202,7 +205,7 @@ namespace
202205

203206
std::string m_repo;
204207
std::string m_reference;
205-
std::string m_baseline_identifier;
208+
Optional<std::string> m_baseline_identifier;
206209
DelayedInit<ExpectedL<LockFile::Entry>> m_lock_entry;
207210
mutable Optional<Path> m_stale_versions_tree;
208211
DelayedInit<ExpectedL<Path>> m_versions_tree;
@@ -730,9 +733,15 @@ namespace
730733

731734
ExpectedL<Optional<Version>> GitRegistry::get_baseline_version(StringView port_name) const
732735
{
736+
if (!m_baseline_identifier)
737+
{
738+
return nullopt;
739+
}
740+
733741
return lookup_in_maybe_baseline(m_baseline.get([this, port_name]() -> ExpectedL<Baseline> {
734742
// We delay baseline validation until here to give better error messages and suggestions
735-
if (!is_git_sha(m_baseline_identifier))
743+
auto baseline_id = m_baseline_identifier.value_or_exit(VCPKG_LINE_INFO);
744+
if (!is_git_sha(baseline_id))
736745
{
737746
auto& maybe_lock_entry = get_lock_entry();
738747
auto lock_entry = maybe_lock_entry.get();
@@ -752,7 +761,7 @@ namespace
752761
}
753762

754763
auto path_to_baseline = Path(FileVersions) / FileBaselineDotJson;
755-
auto maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline);
764+
auto maybe_contents = m_paths.git_show_from_remote_registry(baseline_id, path_to_baseline);
756765
if (!maybe_contents)
757766
{
758767
auto& maybe_lock_entry = get_lock_entry();
@@ -768,13 +777,13 @@ namespace
768777
return std::move(maybe_up_to_date).error();
769778
}
770779

771-
maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline);
780+
maybe_contents = m_paths.git_show_from_remote_registry(baseline_id, path_to_baseline);
772781
}
773782

774783
if (!maybe_contents)
775784
{
776785
msg::println(msgFetchingBaselineInfo, msg::package_name = m_repo);
777-
auto maybe_err = m_paths.git_fetch(m_repo, m_baseline_identifier);
786+
auto maybe_err = m_paths.git_fetch(m_repo, baseline_id);
778787
if (!maybe_err)
779788
{
780789
get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline);
@@ -783,15 +792,15 @@ namespace
783792
.append(maybe_err.error());
784793
}
785794

786-
maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline);
795+
maybe_contents = m_paths.git_show_from_remote_registry(baseline_id, path_to_baseline);
787796
}
788797

789798
if (!maybe_contents)
790799
{
791800
get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline);
792801
return msg::format_error(msgCouldNotFindBaselineInCommit,
793802
msg::url = m_repo,
794-
msg::commit_sha = m_baseline_identifier,
803+
msg::commit_sha = baseline_id,
795804
msg::package_name = port_name)
796805
.append_raw('\n')
797806
.append_raw(maybe_contents.error());
@@ -801,9 +810,8 @@ namespace
801810
return parse_baseline_versions(*contents, JsonIdDefault, path_to_baseline)
802811
.map_error([&](LocalizedString&& error) {
803812
get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline);
804-
return msg::format_error(msgErrorWhileFetchingBaseline,
805-
msg::value = m_baseline_identifier,
806-
msg::package_name = m_repo)
813+
return msg::format_error(
814+
msgErrorWhileFetchingBaseline, msg::value = baseline_id, msg::package_name = m_repo)
807815
.append_raw('\n')
808816
.append(error);
809817
});
@@ -1509,7 +1517,7 @@ namespace vcpkg
15091517
std::unique_ptr<RegistryImplementation> make_git_registry(const VcpkgPaths& paths,
15101518
std::string repo,
15111519
std::string reference,
1512-
std::string baseline)
1520+
Optional<std::string> baseline)
15131521
{
15141522
return std::make_unique<GitRegistry>(paths, std::move(repo), std::move(reference), std::move(baseline));
15151523
}

0 commit comments

Comments
 (0)