Skip to content

Commit 25356d1

Browse files
committed
Add experimental support for self-destruct packages
Self-destruct packages will not be part of the transaction. But they still will obsolete packages, thus updating to a self-destruct package will lead to the erasure of the old package.
1 parent 4120051 commit 25356d1

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

src/knownid.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ KNOWNID(SOLVABLE_BUILDFLAVOR, "solvable:buildflavor"), /* conda */
263263

264264
KNOWNID(UPDATE_STATUS, "update:status"), /* "stable", "testing", ...*/
265265

266+
KNOWNID(LIBSOLV_SELF_DESTRUCT_PKG, "libsolv-self-destruct-pkg()"), /* this package will self-destruct on installation */
267+
266268
KNOWNID(ID_NUM_INTERNAL, 0)
267269

268270
#ifdef KNOWNID_INITIALIZE

src/transaction.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,8 @@ create_transaction_info(Transaction *trans, Queue *decisionq)
646646
s = pool->solvables + p;
647647
if (!s->repo || s->repo == installed)
648648
continue;
649+
if (!MAPTST(&trans->transactsmap, p))
650+
continue;
649651
multi = trans->multiversionmap.size && MAPTST(&trans->multiversionmap, p);
650652
FOR_PROVIDES(p2, pp2, s->name)
651653
{
@@ -726,16 +728,24 @@ transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap)
726728
{
727729
Repo *installed = pool->installed;
728730
int i, needmulti;
729-
Id p;
731+
Id p, pp;
730732
Solvable *s;
731733
Transaction *trans;
734+
Map selfdestructmap;
732735

733736
trans = transaction_create(pool);
734737
if (multiversionmap && !multiversionmap->size)
735738
multiversionmap = 0; /* ignore empty map */
736739
queue_empty(&trans->steps);
737740
map_init(&trans->transactsmap, pool->nsolvables);
738741
needmulti = 0;
742+
map_init(&selfdestructmap, 0);
743+
FOR_PROVIDES(p, pp, LIBSOLV_SELF_DESTRUCT_PKG)
744+
{
745+
if (!selfdestructmap.size)
746+
map_grow(&selfdestructmap, pool->nsolvables);
747+
MAPSET(&selfdestructmap, p);
748+
}
739749
for (i = 0; i < decisionq->count; i++)
740750
{
741751
p = decisionq->elements[i];
@@ -746,11 +756,14 @@ transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap)
746756
MAPSET(&trans->transactsmap, -p);
747757
if (!(installed && s->repo == installed) && p > 0)
748758
{
759+
if (selfdestructmap.size && MAPTST(&selfdestructmap, p))
760+
continue;
749761
MAPSET(&trans->transactsmap, p);
750762
if (multiversionmap && MAPTST(multiversionmap, p))
751763
needmulti = 1;
752764
}
753765
}
766+
map_free(&selfdestructmap);
754767
MAPCLR(&trans->transactsmap, SYSTEMSOLVABLE);
755768
if (needmulti)
756769
map_init_clone(&trans->multiversionmap, multiversionmap);

0 commit comments

Comments
 (0)