@@ -241,6 +241,11 @@ void ensure_ninja(const Env& env, bool quiet,
241241// Returns true if index is present and fresh, false otherwise.
242242bool is_index_fresh (const Env& env, std::int64_t ttlSeconds);
243243
244+ // Check whether xlings' official xim index data exists and is fresh.
245+ // This is separate from mcpp's default mcpplibs index because xlings
246+ // toolchains live in xim-pkgindex, while modular libraries live in mcpplibs.
247+ bool is_official_index_fresh (const Env& env, std::int64_t ttlSeconds);
248+
244249// Run `xlings update` to refresh all index repos. Streams output to stdout.
245250// Returns the xlings exit code.
246251int update_index (const Env& env, bool quiet = false );
@@ -250,6 +255,9 @@ int update_index(const Env& env, bool quiet = false);
250255// when no update is needed.
251256void ensure_index_fresh (const Env& env, std::int64_t ttlSeconds, bool quiet = false );
252257
258+ // Ensure xlings' official xim index is present and fresh.
259+ void ensure_official_index_fresh (const Env& env, std::int64_t ttlSeconds, bool quiet = false );
260+
253261// ─── run_capture utility ────────────────────────────────────────────
254262
255263std::expected<std::string, std::string> run_capture (const std::string& cmd);
@@ -278,21 +286,23 @@ std::filesystem::path default_index_dir(const Env& env) {
278286 return paths::index_data (env) / " mcpplibs" ;
279287}
280288
281- std::filesystem::path default_index_pkgs_dir (const Env& env) {
282- return default_index_dir (env) / " pkgs " ;
289+ std::filesystem::path official_index_dir (const Env& env) {
290+ return paths::index_data (env) / " xim-pkgindex " ;
283291}
284292
285- std::filesystem::path default_index_refresh_marker (const Env& env ) {
286- return default_index_dir (env) / " .mcpp-index-updated " ;
293+ std::filesystem::path index_pkgs_dir (const std::filesystem::path& indexDir ) {
294+ return indexDir / " pkgs " ;
287295}
288296
289- void mark_default_index_refreshed (const Env& env ) {
290- if (!env. projectDir . empty ()) return ;
291- if (! std::filesystem::exists ( default_index_pkgs_dir (env))) return ;
297+ std::filesystem::path index_refresh_marker (const std::filesystem::path& indexDir ) {
298+ return indexDir / " .mcpp-index-updated " ;
299+ }
292300
301+ void mark_index_refreshed (const std::filesystem::path& indexDir) {
302+ if (!std::filesystem::exists (index_pkgs_dir (indexDir))) return ;
293303 std::error_code ec;
294- std::filesystem::create_directories (default_index_dir (env) , ec);
295- auto marker = default_index_refresh_marker (env );
304+ std::filesystem::create_directories (indexDir , ec);
305+ auto marker = index_refresh_marker (indexDir );
296306 {
297307 std::ofstream os (marker, std::ios::trunc);
298308 if (!os) return ;
@@ -302,6 +312,27 @@ void mark_default_index_refreshed(const Env& env) {
302312 marker, std::filesystem::file_time_type::clock::now (), ec);
303313}
304314
315+ void mark_known_indexes_refreshed (const Env& env) {
316+ if (!env.projectDir .empty ()) return ;
317+ mark_index_refreshed (default_index_dir (env));
318+ mark_index_refreshed (official_index_dir (env));
319+ }
320+
321+ bool is_index_dir_fresh (const std::filesystem::path& indexDir, std::int64_t ttlSeconds) {
322+ std::error_code ec;
323+ if (!std::filesystem::exists (index_pkgs_dir (indexDir))) return false ;
324+
325+ auto marker = index_refresh_marker (indexDir);
326+ if (!std::filesystem::exists (marker)) return false ;
327+
328+ auto newest = std::filesystem::last_write_time (marker, ec);
329+ if (ec) return false ;
330+
331+ auto now = std::filesystem::file_time_type::clock::now ();
332+ auto age = std::chrono::duration_cast<std::chrono::seconds>(now - newest);
333+ return age.count () < ttlSeconds;
334+ }
335+
305336void write_file (const std::filesystem::path& p, std::string_view content) {
306337 std::error_code ec;
307338 std::filesystem::create_directories (p.parent_path (), ec);
@@ -978,20 +1009,11 @@ void ensure_ninja(const Env& env, bool quiet,
9781009// ─── Index freshness ────────────────────────────────────────────────
9791010
9801011bool is_index_fresh (const Env& env, std::int64_t ttlSeconds) {
981- std::error_code ec;
982- auto pkgsDir = default_index_pkgs_dir (env);
983- if (!std::filesystem::exists (pkgsDir)) return false ;
984-
985- auto marker = default_index_refresh_marker (env);
986- if (!std::filesystem::exists (marker)) return false ;
987-
988- auto newest = std::filesystem::last_write_time (marker, ec);
989- if (ec) return false ;
1012+ return is_index_dir_fresh (default_index_dir (env), ttlSeconds);
1013+ }
9901014
991- // Check TTL
992- auto now = std::filesystem::file_time_type::clock::now ();
993- auto age = std::chrono::duration_cast<std::chrono::seconds>(now - newest);
994- return age.count () < ttlSeconds;
1015+ bool is_official_index_fresh (const Env& env, std::int64_t ttlSeconds) {
1016+ return is_index_dir_fresh (official_index_dir (env), ttlSeconds);
9951017}
9961018
9971019int update_index (const Env& env, bool quiet) {
@@ -1000,7 +1022,7 @@ int update_index(const Env& env, bool quiet) {
10001022 [quiet](std::string_view line) {
10011023 if (!quiet) std::println (" {}" , line);
10021024 });
1003- if (rc == 0 ) mark_default_index_refreshed (env);
1025+ if (rc == 0 ) mark_known_indexes_refreshed (env);
10041026 return rc;
10051027}
10061028
@@ -1011,4 +1033,11 @@ void ensure_index_fresh(const Env& env, std::int64_t ttlSeconds, bool quiet) {
10111033 update_index (env, /* quiet=*/ true );
10121034}
10131035
1036+ void ensure_official_index_fresh (const Env& env, std::int64_t ttlSeconds, bool quiet) {
1037+ if (is_official_index_fresh (env, ttlSeconds)) return ;
1038+ if (!quiet)
1039+ print_status (" Updating" , " package index (auto-refresh)" );
1040+ update_index (env, /* quiet=*/ true );
1041+ }
1042+
10141043} // namespace mcpp::xlings
0 commit comments