diff --git a/src/solver.c b/src/solver.c index 59edb1c..d83bb6a 100644 --- a/src/solver.c +++ b/src/solver.c @@ -762,11 +762,20 @@ static void cset_check_removal_by_iif(struct apk_solver_state *ss, struct apk_na static void cset_gen_name_change(struct apk_solver_state *ss, struct apk_name *name) { struct apk_name **pname; - struct apk_package *pkg = name->ss.chosen.pkg, *opkg; + struct apk_package *pkg, *opkg; struct apk_dependency *d; - if (pkg == NULL || pkg->ss.in_changeset) + if (name->ss.in_changeset) return; + + pkg = name->ss.chosen.pkg; + if (pkg == NULL) { + /* Package removal */ + opkg = name->ss.installed_pkg; + if (opkg) cset_gen_name_remove(ss, opkg); + name->ss.in_changeset = 1; return; + } + if (pkg->ss.in_changeset) return; pkg->ss.in_changeset = 1; pkg->name->ss.in_changeset = 1; diff --git a/test/upgrade.installed b/test/upgrade.installed new file mode 100644 index 0000000..544ffae --- /dev/null +++ b/test/upgrade.installed @@ -0,0 +1,13 @@ +C:Q1EyN5AdpAOBJWKMR89pp/C66o+OE= +P:libold +V:1 +S:1 +I:1 + +C:Q1eVpkasfqZAukAXFYbgwt4xAEEEe= +P:app +V:1 +S:1 +I:1 +D:libold + diff --git a/test/upgrade.repo b/test/upgrade.repo new file mode 100644 index 0000000..032a29b --- /dev/null +++ b/test/upgrade.repo @@ -0,0 +1,27 @@ +C:Q1EyN5AdpAOBJWKMR89pp/C66o+OE= +P:libold +V:1 +S:1 +I:1 + +C:Q1EyN5AdpAOBJWKMR89pp/C66o+FE= +P:libnew +V:1 +S:1 +I:1 +D:!libold + +C:Q1eVpkasfqZAukAXFYbgwt4xAEEEe= +P:app +V:1 +S:1 +I:1 +D:libold + +C:Q1EyN5AdpAOBJWKMR89pp/C77FFFF= +P:app +V:2 +S:1 +I:1 +D:libnew + diff --git a/test/upgrade1.test b/test/upgrade1.test new file mode 100644 index 0000000..f437590 --- /dev/null +++ b/test/upgrade1.test @@ -0,0 +1,10 @@ +@ARGS +--test-repo upgrade.repo +--test-instdb upgrade.installed +--test-world app +upgrade +@EXPECT +(1/3) Purging libold (1) +(2/3) Installing libnew (1) +(3/3) Upgrading app (1 -> 2) +OK: 0 MiB in 2 packages