summaryrefslogtreecommitdiff
path: root/src/upgrade.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2011-09-14 10:38:26 +0300
committerTimo Teräs <timo.teras@iki.fi>2011-09-14 10:57:51 +0300
commitf51aa6d42d0dc53ac58c6d5bce23ddc464051f91 (patch)
treeb2cb095ab5f461777449a52dc36911bc83c8eb67 /src/upgrade.c
parent1817b0a3c3ebd57e5332a80c15c70c46ec3eb8c0 (diff)
downloadapk-tools-f51aa6d42d0dc53ac58c6d5bce23ddc464051f91.tar.gz
apk-tools-f51aa6d42d0dc53ac58c6d5bce23ddc464051f91.tar.bz2
apk-tools-f51aa6d42d0dc53ac58c6d5bce23ddc464051f91.tar.xz
apk-tools-f51aa6d42d0dc53ac58c6d5bce23ddc464051f91.zip
upgrade: reimplement self-upgrade (after solver merge)
Diffstat (limited to 'src/upgrade.c')
-rw-r--r--src/upgrade.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/upgrade.c b/src/upgrade.c
index f33da17..38c5496 100644
--- a/src/upgrade.c
+++ b/src/upgrade.c
@@ -36,28 +36,36 @@ static int upgrade_parse(void *ctx, struct apk_db_options *dbopts,
return 0;
}
-int apk_do_self_upgrade(struct apk_database *db)
+int apk_do_self_upgrade(struct apk_database *db, unsigned short solver_flags)
{
-#if 0
- /* FIXME: Reimplement self-upgrade. */
- struct apk_dependency dep;
+ struct apk_name *name;
+ struct apk_changeset changeset = {};
+ struct apk_package_array *solution = NULL;
int r;
- apk_dep_from_blob(&dep, db, APK_BLOB_STR("apk-tools"));
+ name = apk_db_get_name(db, APK_BLOB_STR("apk-tools"));
+ apk_solver_set_name_flags(name, solver_flags);
+ db->performing_self_update = 1;
+
+ r = apk_solver_solve(db, 0, db->world, &solution, &changeset);
+ if (r != 0) {
+ if (apk_flags & APK_FORCE)
+ r = 0;
+ else
+ apk_solver_print_errors(db, solution, db->world, r);
+ goto ret;
+ }
- r = apk_state_lock_dependency(state, &dep);
- if (r != 0 || state->num_changes == 0)
- return r;
+ if (changeset.changes->num == 0)
+ goto ret;
if (apk_flags & APK_SIMULATE) {
apk_warning("This simulation is not reliable as apk-tools upgrade is available.");
- return 0;
+ goto ret;
}
apk_message("Upgrading critical system libraries and apk-tools:");
- state->print_ok = 0;
- r = apk_state_commit(state);
- apk_state_unref(state);
+ apk_solver_commit_changeset(db, &changeset, db->world);
apk_db_close(db);
apk_message("Continuing the upgrade transaction with new apk-tools:");
@@ -65,9 +73,13 @@ int apk_do_self_upgrade(struct apk_database *db)
apk_error("PANIC! Failed to re-execute new apk-tools!");
exit(1);
-#else
- return 0;
-#endif
+
+ret:
+ apk_package_array_free(&solution);
+ apk_change_array_free(&changeset.changes);
+ db->performing_self_update = 0;
+
+ return r;
}
static int upgrade_main(void *ctx, struct apk_database *db, int argc, char **argv)
@@ -78,7 +90,7 @@ static int upgrade_main(void *ctx, struct apk_database *db, int argc, char **arg
solver_flags = APK_SOLVERF_UPGRADE | uctx->solver_flags;
- r = apk_do_self_upgrade(db);
+ r = apk_do_self_upgrade(db, solver_flags);
if (r != 0)
return r;