diff --git a/src/apk_package.h b/src/apk_package.h index 0d61e23..77b66c0 100644 --- a/src/apk_package.h +++ b/src/apk_package.h @@ -114,9 +114,10 @@ struct apk_package { struct apk_dependency_array *depends, *install_if, *provides; size_t installed_size, size; time_t build_time; + unsigned repos : APK_MAX_REPOS; unsigned marked : 1; unsigned uninstallable : 1; - unsigned repos : APK_MAX_REPOS; + unsigned cached_non_repository : 1; struct apk_checksum csum; }; APK_ARRAY(apk_package_array, struct apk_package *); diff --git a/src/commit.c b/src/commit.c index 8766cc8..bf3b4a2 100644 --- a/src/commit.c +++ b/src/commit.c @@ -379,6 +379,9 @@ static void print_pinning_errors(struct print_state *ps, struct apk_package *pkg if (!(pkg->repos & db->available_repos)) { label_start(ps, "masked in:"); apk_print_indented_fmt(&ps->i, "--no-network"); + } else if (pkg->repos == BIT(APK_REPOSITORY_CACHED)) { + label_start(ps, "masked in:"); + apk_print_indented_fmt(&ps->i, "cache"); } else { if (pkg->repos & apk_db_get_pinning_mask_repos(db, APK_DEFAULT_PINNING_MASK | BIT(tag))) return; diff --git a/src/database.c b/src/database.c index 356ba22..3f1b6f6 100644 --- a/src/database.c +++ b/src/database.c @@ -760,6 +760,8 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) if (repo >= 0) { pkg->repos |= BIT(repo); + } else if (repo == -2) { + pkg->cached_non_repository = 1; } else if (repo == -1 && ipkg == NULL) { /* Installed package without files */ ipkg = apk_pkg_install(db, pkg); diff --git a/src/solver.c b/src/solver.c index 2b35924..59edb1c 100644 --- a/src/solver.c +++ b/src/solver.c @@ -197,6 +197,7 @@ static void discover_name(struct apk_solver_state *ss, struct apk_name *name) * or it's a 'virtual' package with install_size zero */ pkg->ss.pkg_selectable = (pkg->repos & db->available_repos) || + pkg->cached_non_repository || pkg->ipkg; /* Prune install_if packages that are no longer available, @@ -212,8 +213,11 @@ static void discover_name(struct apk_solver_state *ss, struct apk_name *name) pkg->ss.tag_preferred = (pkg->filename != NULL) || (pkg->installed_size == 0) || - !!(repos & ss->default_repos); - pkg->ss.tag_ok = pkg->ss.tag_preferred || pkg->ipkg; + (repos & ss->default_repos); + pkg->ss.tag_ok = + pkg->ss.tag_preferred || + pkg->cached_non_repository || + pkg->ipkg; foreach_array_item(dep, pkg->depends) { discover_name(ss, dep->name); diff --git a/test/basic16.test b/test/basic16.test new file mode 100644 index 0000000..f23bd5d --- /dev/null +++ b/test/basic16.test @@ -0,0 +1,8 @@ +@ARGS +--no-network +--test-repo !basic.repo +add a +@EXPECT +(1/2) Installing b (2) +(2/2) Installing a (2) +OK: 0 MiB in 0 packages