db: sort world dependencies to layers
parent
9089edcc44
commit
f69ae30272
|
@ -101,6 +101,7 @@ struct apk_name {
|
|||
unsigned is_dependency : 1;
|
||||
unsigned auto_select_virtual: 1;
|
||||
unsigned priority : 2;
|
||||
unsigned layer : 4;
|
||||
unsigned int foreach_genid;
|
||||
union {
|
||||
struct apk_solver_name_state ss;
|
||||
|
|
|
@ -48,6 +48,7 @@ struct apk_dependency {
|
|||
unsigned conflict : 1;
|
||||
unsigned result_mask : 4;
|
||||
unsigned fuzzy : 1;
|
||||
unsigned layer : 4; // solver sets for 'world' dependencies only
|
||||
};
|
||||
APK_ARRAY(apk_dependency_array, struct apk_dependency);
|
||||
|
||||
|
@ -120,6 +121,8 @@ void apk_blob_push_deps(apk_blob_t *to, struct apk_database *, struct apk_depend
|
|||
void apk_blob_pull_dep(apk_blob_t *from, struct apk_database *, struct apk_dependency *);
|
||||
void apk_blob_pull_deps(apk_blob_t *from, struct apk_database *, struct apk_dependency_array **);
|
||||
|
||||
int apk_deps_write_layer(struct apk_database *db, struct apk_dependency_array *deps,
|
||||
struct apk_ostream *os, apk_blob_t separator, unsigned layer);
|
||||
int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps,
|
||||
struct apk_ostream *os, apk_blob_t separator);
|
||||
|
||||
|
|
|
@ -1819,11 +1819,16 @@ static int apk_db_write_layers(struct apk_database *db)
|
|||
ld->installed = apk_ostream_to_file(ld->fd, "installed", 0644);
|
||||
ld->scripts = apk_ostream_to_file(ld->fd, "scripts.tar", 0644);
|
||||
ld->triggers = apk_ostream_to_file(ld->fd, "triggers", 0644);
|
||||
}
|
||||
|
||||
if (i == 0)
|
||||
os = apk_ostream_to_file(db->root_fd, apk_world_file, 0644);
|
||||
if (!IS_ERR(os)) {
|
||||
apk_deps_write(db, db->world, os, APK_BLOB_PTR_LEN("\n", 1));
|
||||
else
|
||||
os = apk_ostream_to_file(ld->fd, "world", 0644);
|
||||
if (IS_ERR(os)) {
|
||||
if (!rr) rr = PTR_ERR(os);
|
||||
continue;
|
||||
}
|
||||
apk_deps_write_layer(db, db->world, os, APK_BLOB_PTR_LEN("\n", 1), i);
|
||||
apk_ostream_write(os, "\n", 1);
|
||||
r = apk_ostream_close(os);
|
||||
if (!rr) rr = r;
|
||||
|
|
|
@ -423,7 +423,7 @@ void apk_blob_push_deps(apk_blob_t *to, struct apk_database *db, struct apk_depe
|
|||
}
|
||||
}
|
||||
|
||||
int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps, struct apk_ostream *os, apk_blob_t separator)
|
||||
int apk_deps_write_layer(struct apk_database *db, struct apk_dependency_array *deps, struct apk_ostream *os, apk_blob_t separator, unsigned layer)
|
||||
{
|
||||
apk_blob_t blob;
|
||||
char tmp[256];
|
||||
|
@ -433,9 +433,10 @@ int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps, s
|
|||
return 0;
|
||||
|
||||
for (i = 0; i < deps->num; i++) {
|
||||
if (layer != -1 && deps->item[i].layer != layer) continue;
|
||||
|
||||
blob = APK_BLOB_BUF(tmp);
|
||||
if (i)
|
||||
apk_blob_push_blob(&blob, separator);
|
||||
if (n) apk_blob_push_blob(&blob, separator);
|
||||
apk_blob_push_dep(&blob, db, &deps->item[i]);
|
||||
|
||||
blob = apk_blob_pushed(APK_BLOB_BUF(tmp), blob);
|
||||
|
@ -449,6 +450,11 @@ int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps, s
|
|||
return n;
|
||||
}
|
||||
|
||||
int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps, struct apk_ostream *os, apk_blob_t separator)
|
||||
{
|
||||
return apk_deps_write_layer(db, deps, os, separator, -1);
|
||||
}
|
||||
|
||||
void apk_dep_from_adb(struct apk_dependency *dep, struct apk_database *db, struct adb_obj *d)
|
||||
{
|
||||
*dep = (struct apk_dependency) {
|
||||
|
|
|
@ -1093,6 +1093,11 @@ restart:
|
|||
goto restart;
|
||||
}
|
||||
|
||||
foreach_array_item(d, world) {
|
||||
if (!d->name->ss.chosen.pkg) continue;
|
||||
d->layer = d->name->ss.chosen.pkg->layer;
|
||||
}
|
||||
|
||||
apk_hash_foreach(&db->available.names, free_name, NULL);
|
||||
apk_hash_foreach(&db->available.packages, free_package, NULL);
|
||||
dbg_printf("solver done, errors=%d\n", ss->errors);
|
||||
|
|
Loading…
Reference in New Issue