diff options
Diffstat (limited to 'src/del.c')
-rw-r--r-- | src/del.c | 30 |
1 files changed, 26 insertions, 4 deletions
@@ -11,12 +11,15 @@ #include <stdio.h> #include "apk_applet.h" +#include "apk_state.h" #include "apk_database.h" static int del_main(void *ctx, int argc, char **argv) { struct apk_database db; - int i, j; + struct apk_state *state; + struct apk_name *name; + int i, j, r; if (apk_db_open(&db, apk_root, APK_OPENF_WRITE) < 0) return -1; @@ -24,7 +27,13 @@ static int del_main(void *ctx, int argc, char **argv) if (db.world == NULL) goto out; + state = apk_state_new(&db); for (i = 0; i < argc; i++) { + struct apk_dependency dep; + + name = apk_db_get_name(&db, APK_BLOB_STR(argv[i])); + + /* Remove from world, so we get proper changeset */ for (j = 0; j < db.world->num; j++) { if (strcmp(db.world->item[j].name->name, argv[i]) == 0) { @@ -34,13 +43,26 @@ static int del_main(void *ctx, int argc, char **argv) apk_dependency_array_resize(db.world, db.world->num-1); } } - } + name->flags &= ~APK_NAME_TOPLEVEL; - apk_db_recalculate_and_commit(&db); + dep = (struct apk_dependency) { + .name = name, + .result_mask = APK_DEPMASK_CONFLICT, + }; + + r = apk_state_lock_dependency(state, &dep); + if (r != 0) { + apk_error("Unable to remove '%s'", name->name); + goto err; + } + } + r = apk_state_commit(state, &db); +err: + apk_state_unref(state); out: apk_db_close(&db); - return 0; + return r; } static struct apk_applet apk_del = { |