Skip to content

Commit ef0320c

Browse files
committed
refactor(pm): isolate legacy compat helpers
1 parent 350089e commit ef0320c

2 files changed

Lines changed: 71 additions & 66 deletions

File tree

src/pm/compat.cppm

Lines changed: 5 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// mcpp.pm.compat — backward-compatibility shims for evolving package
2-
// conventions. Centralises all migration logic so it can be retired
3-
// cleanly in a future major version.
1+
// mcpp.pm.compat — compatibility facade for evolving package conventions.
2+
// Legacy-only behavior lives under src/pm/compat/ so it has an explicit
3+
// retirement boundary.
44
//
55
// DEPRECATION SCHEDULE:
66
// The shims in this module are slated for removal in mcpp 1.0.0.
@@ -20,6 +20,8 @@
2020

2121
export module mcpp.pm.compat;
2222

23+
export import mcpp.pm.compat.legacy;
24+
2325
import std;
2426
import mcpp.pm.dep_spec;
2527

@@ -82,69 +84,6 @@ inline std::string qualified_name(std::string_view ns,
8284
return std::format("{}.{}", ns, shortName);
8385
}
8486

85-
// ─── Legacy dependency key parsing ─────────────────────────────────
86-
//
87-
// COMPAT: legacy flat dependency keys used quoted dotted names under a
88-
// dependency table:
89-
//
90-
// [dependencies]
91-
// "mcpplibs.cmdline" = "0.0.2"
92-
//
93-
// Canonical projects should use namespaced TOML tables instead:
94-
//
95-
// [dependencies.mcpplibs]
96-
// cmdline = "0.0.2"
97-
//
98-
// Nested default-namespace packages can also be written without quotes:
99-
//
100-
// [dependencies]
101-
// capi.lua = "0.0.3"
102-
//
103-
// This compatibility parser is slated for removal in mcpp 1.0.0.
104-
105-
struct LegacyDependencyKey {
106-
std::string namespace_;
107-
std::string shortName;
108-
bool legacyDottedKey = false;
109-
};
110-
111-
inline LegacyDependencyKey split_legacy_dependency_key(std::string_view key)
112-
{
113-
auto dot = key.find('.');
114-
if (dot == std::string_view::npos) {
115-
return LegacyDependencyKey {
116-
.namespace_ = std::string(mcpp::pm::kDefaultNamespace),
117-
.shortName = std::string(key),
118-
.legacyDottedKey = false,
119-
};
120-
}
121-
122-
return LegacyDependencyKey {
123-
.namespace_ = std::string(key.substr(0, dot)),
124-
.shortName = std::string(key.substr(dot + 1)),
125-
.legacyDottedKey = true,
126-
};
127-
}
128-
129-
// Normalize legacy nested names after the first-dot split:
130-
// ns="mcpplibs", shortName="capi.lua" → ns="mcpplibs.capi", shortName="lua".
131-
//
132-
// This preserves the fully qualified name while making dependency de-dup use
133-
// the same structured key as canonical [dependencies.mcpplibs] capi.lua.
134-
inline void normalize_nested_namespace(std::string& ns,
135-
std::string& shortName,
136-
bool legacyDottedKey)
137-
{
138-
if (!legacyDottedKey) return;
139-
if (ns.empty()) return;
140-
auto dot = shortName.rfind('.');
141-
if (dot == std::string::npos || dot + 1 >= shortName.size()) return;
142-
143-
ns += ".";
144-
ns += shortName.substr(0, dot);
145-
shortName = shortName.substr(dot + 1);
146-
}
147-
14887
// ─── Index directory naming ──────────────────────────────────────────
14988
//
15089
// Maps (indexName, namespace, shortName) → the xpkgs subdirectory name

src/pm/compat/legacy.cppm

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// mcpp.pm.compat.legacy — legacy dependency-key compatibility.
2+
//
3+
// COMPAT: This module exists only to keep pre-namespace dependency syntax
4+
// working during migration. It is slated for removal in mcpp 1.0.0.
5+
//
6+
// Deprecated:
7+
//
8+
// [dependencies]
9+
// "mcpplibs.cmdline" = "0.0.2"
10+
//
11+
// Canonical:
12+
//
13+
// [dependencies.mcpplibs]
14+
// cmdline = "0.0.2"
15+
16+
export module mcpp.pm.compat.legacy;
17+
18+
import std;
19+
import mcpp.pm.dep_spec;
20+
21+
export namespace mcpp::pm::compat {
22+
23+
struct LegacyDependencyKey {
24+
std::string namespace_;
25+
std::string shortName;
26+
bool legacyDottedKey = false;
27+
};
28+
29+
inline LegacyDependencyKey split_legacy_dependency_key(std::string_view key)
30+
{
31+
auto dot = key.find('.');
32+
if (dot == std::string_view::npos) {
33+
return LegacyDependencyKey {
34+
.namespace_ = std::string(mcpp::pm::kDefaultNamespace),
35+
.shortName = std::string(key),
36+
.legacyDottedKey = false,
37+
};
38+
}
39+
40+
return LegacyDependencyKey {
41+
.namespace_ = std::string(key.substr(0, dot)),
42+
.shortName = std::string(key.substr(dot + 1)),
43+
.legacyDottedKey = true,
44+
};
45+
}
46+
47+
// Normalize legacy nested names after the first-dot split:
48+
// ns="mcpplibs", shortName="capi.lua" -> ns="mcpplibs.capi", shortName="lua".
49+
//
50+
// This preserves the fully qualified name while making dependency de-dup use
51+
// the same structured key as canonical [dependencies.mcpplibs] capi.lua.
52+
inline void normalize_nested_namespace(std::string& ns,
53+
std::string& shortName,
54+
bool legacyDottedKey)
55+
{
56+
if (!legacyDottedKey) return;
57+
if (ns.empty()) return;
58+
auto dot = shortName.rfind('.');
59+
if (dot == std::string::npos || dot + 1 >= shortName.size()) return;
60+
61+
ns += ".";
62+
ns += shortName.substr(0, dot);
63+
shortName = shortName.substr(dot + 1);
64+
}
65+
66+
} // namespace mcpp::pm::compat

0 commit comments

Comments
 (0)