Add support for preloading lua modules. This is useful both when
providing lua bindings to applications based on librazor and when
producing static binaries using librazor (where otherwise the lua
POSIX library would need to be included as an additional dynamic
object).
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 #include <sys/types.h>
36 #include "razor-internal.h"
40 provider_satisfies_requirement(struct razor_property *provider,
41 const char *provider_strings,
46 const char *provided = &provider_strings[provider->version];
51 if (flags & RAZOR_PROPERTY_LESS)
57 cmp = razor_versioncmp(provided, required);
59 switch (flags & RAZOR_PROPERTY_RELATION_MASK) {
60 case RAZOR_PROPERTY_LESS:
63 case RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL:
66 /* fall through: FIXME, make sure this is correct */
68 case RAZOR_PROPERTY_EQUAL:
72 /* "foo == 1.1" is satisfied by "foo 1.1-2" */
73 len = strlen(required);
74 if (!strncmp(required, provided, len) && provided[len] == '-')
78 case RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL:
81 case RAZOR_PROPERTY_GREATER:
85 /* shouldn't happen */
89 #define TRANS_PACKAGE_PRESENT 1
90 #define TRANS_PACKAGE_UPDATE 2
91 #define TRANS_PROPERTY_SATISFIED 0x80000000
93 struct transaction_set {
94 struct razor_set *set;
99 struct razor_transaction {
100 int package_count, errors;
101 struct transaction_set system, upstream;
106 transaction_set_init(struct transaction_set *ts, struct razor_set *set)
111 count = set->packages.size / sizeof (struct razor_package);
112 ts->packages = zalloc(count * sizeof *ts->packages);
113 count = set->properties.size / sizeof (struct razor_property);
114 ts->properties = zalloc(count * sizeof *ts->properties);
118 transaction_set_release(struct transaction_set *ts)
121 free(ts->properties);
125 transaction_set_install_package(struct transaction_set *ts,
126 struct razor_package *package)
128 struct razor_package *pkgs;
132 pkgs = ts->set->packages.data;
134 if (ts->packages[i] == TRANS_PACKAGE_PRESENT)
137 ts->packages[i] = TRANS_PACKAGE_PRESENT;
139 prop = list_first(&package->properties, &ts->set->property_pool);
141 ts->properties[prop->data]++;
142 prop = list_next(prop);
147 transaction_set_remove_package(struct transaction_set *ts,
148 struct razor_package *package)
150 struct razor_package *pkgs;
154 pkgs = ts->set->packages.data;
156 if (ts->packages[i] == 0)
161 prop = list_first(&package->properties, &ts->set->property_pool);
163 ts->properties[prop->data]--;
164 prop = list_next(prop);
168 RAZOR_EXPORT struct razor_transaction *
169 razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
171 struct razor_transaction *trans;
172 struct razor_package *p, *spkgs, *pend;
174 trans = zalloc(sizeof *trans);
175 transaction_set_init(&trans->system, system);
176 transaction_set_init(&trans->upstream, upstream);
178 spkgs = trans->system.set->packages.data;
179 pend = trans->system.set->packages.data +
180 trans->system.set->packages.size;
181 for (p = spkgs; p < pend; p++)
182 transaction_set_install_package(&trans->system, p);
188 razor_transaction_install_package(struct razor_transaction *trans,
189 struct razor_package *package)
191 assert (trans != NULL);
192 assert (package != NULL);
194 transaction_set_install_package(&trans->upstream, package);
199 razor_transaction_remove_package(struct razor_transaction *trans,
200 struct razor_package *package)
202 assert (trans != NULL);
203 assert (package != NULL);
205 transaction_set_remove_package(&trans->system, package);
210 razor_transaction_update_package(struct razor_transaction *trans,
211 struct razor_package *package)
213 struct razor_package *spkgs, *upkgs, *end;
215 assert (trans != NULL);
216 assert (package != NULL);
218 spkgs = trans->system.set->packages.data;
219 upkgs = trans->upstream.set->packages.data;
220 end = trans->system.set->packages.data +
221 trans->system.set->packages.size;
222 if (spkgs <= package && package < end)
223 trans->system.packages[package - spkgs] |= TRANS_PACKAGE_UPDATE;
225 trans->upstream.packages[package - upkgs] |= TRANS_PACKAGE_UPDATE;
229 struct razor_property *p, *start, *end;
235 prop_iter_init(struct prop_iter *pi, struct transaction_set *ts)
237 pi->p = ts->set->properties.data;
238 pi->start = ts->set->properties.data;
239 pi->end = ts->set->properties.data + ts->set->properties.size;
240 pi->pool = ts->set->string_pool.data;
241 pi->present = ts->properties;
245 prop_iter_next(struct prop_iter *pi, uint32_t flags, struct razor_property **p)
247 while (pi->p < pi->end) {
248 if ((pi->present[pi->p - pi->start] & ~TRANS_PROPERTY_SATISFIED) &&
249 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) == flags) {
259 static struct razor_property *
260 prop_iter_seek_to(struct prop_iter *pi,
261 uint32_t flags, const char *match)
265 while (pi->p < pi->end && strcmp(&pi->pool[pi->p->name], match) < 0)
268 if (pi->p == pi->end || strcmp(&pi->pool[pi->p->name], match) > 0)
272 while (pi->p < pi->end &&
273 pi->p->name == name &&
274 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) != flags)
277 if (pi->p == pi->end || pi->p->name != name)
283 /* Remove packages from set that provide any of the matching (same
284 * name and type) providers from ppi onwards that match the
285 * requirement that rpi points to. */
287 remove_matching_providers(struct razor_transaction *trans,
288 struct prop_iter *ppi,
292 struct razor_property *p;
293 struct razor_package *pkg, *pkgs;
294 struct razor_package_iterator pkg_iter;
295 struct razor_set *set;
299 if (ppi->present == trans->system.properties)
300 set = trans->system.set;
302 set = trans->upstream.set;
304 pkgs = (struct razor_package *) set->packages.data;
305 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
308 p->name == ppi->p->name &&
309 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
311 if (!ppi->present[p - ppi->start])
313 if (!provider_satisfies_requirement(p, ppi->pool,
317 razor_package_iterator_init_for_property(&pkg_iter, set, p);
318 while (razor_package_iterator_next(&pkg_iter, &pkg,
319 RAZOR_DETAIL_NAME, &n,
320 RAZOR_DETAIL_VERSION, &v,
321 RAZOR_DETAIL_LAST)) {
322 fprintf(stderr, "removing %s-%s\n", n, v);
323 razor_transaction_remove_package(trans, pkg);
329 flag_matching_providers(struct razor_transaction *trans,
330 struct prop_iter *ppi,
331 struct razor_property *r,
332 struct prop_iter *rpi,
335 struct razor_property *p;
336 struct razor_package *pkg, *pkgs;
337 struct razor_package_iterator pkg_iter;
338 struct razor_set *set;
339 const char *name, *version;
340 uint32_t *flags, type;
342 if (ppi->present == trans->system.properties) {
343 set = trans->system.set;
344 flags = trans->system.packages;
346 set = trans->upstream.set;
347 flags = trans->upstream.packages;
350 pkgs = (struct razor_package *) set->packages.data;
351 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
354 p->name == ppi->p->name &&
355 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
357 if (!ppi->present[p - ppi->start])
359 if (!provider_satisfies_requirement(p, ppi->pool,
361 &rpi->pool[r->version]))
364 razor_package_iterator_init_for_property(&pkg_iter, set, p);
365 while (razor_package_iterator_next(&pkg_iter, &pkg,
366 RAZOR_DETAIL_NAME, &name,
367 RAZOR_DETAIL_VERSION, &version,
368 RAZOR_DETAIL_LAST)) {
370 fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
374 rpi->pool + r->version);
375 flags[pkg - pkgs] |= flag;
380 static struct razor_package *
381 pick_matching_provider(struct razor_set *set,
382 struct prop_iter *ppi,
386 struct razor_property *p;
387 struct razor_package *pkgs;
391 /* This is where we decide which pkgs to pull in to satisfy a
392 * requirement. There may be several different providers
393 * (different versions) and each version of a provider may
394 * come from a number of packages. We pick the first package
395 * from the first provider that matches. */
397 pkgs = set->packages.data;
398 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
401 p->name == ppi->p->name &&
402 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type &&
403 ppi->present[p - ppi->start] == 0;
405 if (!provider_satisfies_requirement(p, ppi->pool,
409 i = list_first(&p->packages, &set->package_pool);
411 return &pkgs[i->data];
418 remove_obsoleted_packages(struct razor_transaction *trans)
420 struct razor_property *up;
421 struct razor_package *spkgs;
422 struct prop_iter spi, upi;
424 spkgs = trans->system.set->packages.data;
425 prop_iter_init(&spi, &trans->system);
426 prop_iter_init(&upi, &trans->upstream);
428 while (prop_iter_next(&upi, RAZOR_PROPERTY_OBSOLETES, &up)) {
429 if (!prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
430 &upi.pool[up->name]))
432 remove_matching_providers(trans, &spi, up->flags,
433 &upi.pool[up->version]);
438 any_provider_satisfies_requirement(struct prop_iter *ppi,
442 struct razor_property *p;
445 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
448 p->name == ppi->p->name &&
449 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
451 if (ppi->present[p - ppi->start] > 0 &&
452 provider_satisfies_requirement(p, ppi->pool,
461 clear_requires_flags(struct transaction_set *ts)
463 struct razor_property *p;
467 count = ts->set->properties.size / sizeof *p;
468 p = ts->set->properties.data;
469 pool = ts->set->string_pool.data;
470 for (i = 0; i < count; i++) {
471 ts->properties[i] &= ~TRANS_PROPERTY_SATISFIED;
472 if (strncmp(&pool[p[i].name], "rpmlib(", 7) == 0)
473 ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
478 mark_satisfied_requires(struct razor_transaction *trans,
479 struct transaction_set *rts,
480 struct transaction_set *pts)
482 struct prop_iter rpi, ppi;
483 struct razor_property *rp;
485 prop_iter_init(&rpi, rts);
486 prop_iter_init(&ppi, pts);
488 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
489 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES,
490 &rpi.pool[rp->name]))
493 if (any_provider_satisfies_requirement(&ppi, rp->flags,
494 &rpi.pool[rp->version]))
495 rpi.present[rp - rpi.start] |= TRANS_PROPERTY_SATISFIED;
500 mark_all_satisfied_requires(struct razor_transaction *trans)
502 clear_requires_flags(&trans->system);
503 clear_requires_flags(&trans->upstream);
504 mark_satisfied_requires(trans, &trans->system, &trans->system);
505 mark_satisfied_requires(trans, &trans->system, &trans->upstream);
506 mark_satisfied_requires(trans, &trans->upstream, &trans->system);
507 mark_satisfied_requires(trans, &trans->upstream, &trans->upstream);
511 update_unsatisfied_packages(struct razor_transaction *trans)
513 struct razor_package *spkgs, *pkg;
514 struct razor_property *sp;
515 struct prop_iter spi;
516 struct razor_package_iterator pkg_iter;
519 spkgs = trans->system.set->packages.data;
520 prop_iter_init(&spi, &trans->system);
522 while (prop_iter_next(&spi, RAZOR_PROPERTY_REQUIRES, &sp)) {
523 if (spi.present[sp - spi.start] & TRANS_PROPERTY_SATISFIED)
526 razor_package_iterator_init_for_property(&pkg_iter,
529 while (razor_package_iterator_next(&pkg_iter, &pkg,
530 RAZOR_DETAIL_NAME, &name,
531 RAZOR_DETAIL_LAST)) {
532 fprintf(stderr, "updating %s because %s %s %s "
534 name, spi.pool + sp->name,
535 razor_property_relation_to_string(sp),
536 spi.pool + sp->version);
537 trans->system.packages[pkg - spkgs] |=
538 TRANS_PACKAGE_UPDATE;
544 razor_transaction_update_all(struct razor_transaction *trans)
546 struct razor_package *p;
549 assert (trans != NULL);
551 count = trans->system.set->packages.size / sizeof *p;
552 for (i = 0; i < count; i++)
553 trans->system.packages[i] |= TRANS_PACKAGE_UPDATE;
557 update_conflicted_packages(struct razor_transaction *trans)
559 struct razor_package *pkg, *spkgs;
560 struct razor_property *up, *sp;
561 struct prop_iter spi, upi;
562 struct razor_package_iterator pkg_iter;
563 const char *name, *version;
565 spkgs = trans->system.set->packages.data;
566 prop_iter_init(&spi, &trans->system);
567 prop_iter_init(&upi, &trans->upstream);
569 while (prop_iter_next(&spi, RAZOR_PROPERTY_CONFLICTS, &sp)) {
570 if (!prop_iter_seek_to(&upi, RAZOR_PROPERTY_PROVIDES,
571 &spi.pool[sp->name]))
574 if (!any_provider_satisfies_requirement(&upi, sp->flags,
575 &spi.pool[sp->version]))
578 razor_package_iterator_init_for_property(&pkg_iter,
581 while (razor_package_iterator_next(&pkg_iter, &pkg,
582 RAZOR_DETAIL_NAME, &name,
583 RAZOR_DETAIL_VERSION, &version,
584 RAZOR_DETAIL_LAST)) {
585 fprintf(stderr, "updating %s %s because it "
586 "conflicts with %s\n",
587 name, version, spi.pool + sp->name);
588 trans->system.packages[pkg - spkgs] |=
589 TRANS_PACKAGE_UPDATE;
593 prop_iter_init(&spi, &trans->system);
594 prop_iter_init(&upi, &trans->upstream);
596 while (prop_iter_next(&upi, RAZOR_PROPERTY_CONFLICTS, &up)) {
597 sp = prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
598 &upi.pool[upi.p->name]);
601 flag_matching_providers(trans, &spi, up, &upi,
602 TRANS_PACKAGE_UPDATE);
607 pull_in_requirements(struct razor_transaction *trans,
608 struct prop_iter *rpi, struct prop_iter *ppi)
610 struct razor_property *rp, *pp;
611 struct razor_package *pkg, *upkgs;
613 upkgs = trans->upstream.set->packages.data;
614 while (prop_iter_next(rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
615 if (rpi->present[rp - rpi->start] & TRANS_PROPERTY_SATISFIED)
618 pp = prop_iter_seek_to(ppi, RAZOR_PROPERTY_PROVIDES,
619 &rpi->pool[rp->name]);
622 pkg = pick_matching_provider(trans->upstream.set,
624 &rpi->pool[rp->version]);
628 rpi->present[rp - rpi->start] |= TRANS_PROPERTY_SATISFIED;
630 fprintf(stderr, "pulling in %s-%s.%s which provides %s %s %s "
631 "to satisfy %s %s %s\n",
632 ppi->pool + pkg->name,
633 ppi->pool + pkg->version,
634 ppi->pool + pkg->arch,
635 ppi->pool + pp->name,
636 razor_property_relation_to_string(pp),
637 ppi->pool + pp->version,
638 &rpi->pool[rp->name],
639 razor_property_relation_to_string(rp),
640 &rpi->pool[rp->version]);
642 trans->upstream.packages[pkg - upkgs] |= TRANS_PACKAGE_UPDATE;
647 pull_in_all_requirements(struct razor_transaction *trans)
649 struct prop_iter rpi, ppi;
651 prop_iter_init(&rpi, &trans->system);
652 prop_iter_init(&ppi, &trans->upstream);
653 pull_in_requirements(trans, &rpi, &ppi);
655 prop_iter_init(&rpi, &trans->upstream);
656 prop_iter_init(&ppi, &trans->upstream);
657 pull_in_requirements(trans, &rpi, &ppi);
661 flush_scheduled_system_updates(struct razor_transaction *trans)
663 struct razor_package_iterator *pi;
664 struct razor_package *p, *pkg, *spkgs;
665 struct prop_iter ppi;
666 const char *name, *version;
668 spkgs = trans->system.set->packages.data;
669 pi = razor_package_iterator_create(trans->system.set);
670 prop_iter_init(&ppi, &trans->upstream);
672 while (razor_package_iterator_next(pi, &p,
673 RAZOR_DETAIL_NAME, &name,
674 RAZOR_DETAIL_VERSION, &version,
675 RAZOR_DETAIL_LAST)) {
676 if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
679 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES, name))
682 pkg = pick_matching_provider(trans->upstream.set, &ppi,
683 RAZOR_PROPERTY_GREATER, version);
687 fprintf(stderr, "updating %s-%s to %s-%s\n",
689 &ppi.pool[pkg->name], &ppi.pool[pkg->version]);
691 razor_transaction_remove_package(trans, p);
692 razor_transaction_install_package(trans, pkg);
695 razor_package_iterator_destroy(pi);
699 flush_scheduled_upstream_updates(struct razor_transaction *trans)
701 struct razor_package_iterator *pi;
702 struct razor_package *p, *upkgs;
703 struct prop_iter spi;
704 const char *name, *version;
706 upkgs = trans->upstream.set->packages.data;
707 pi = razor_package_iterator_create(trans->upstream.set);
708 prop_iter_init(&spi, &trans->system);
710 while (razor_package_iterator_next(pi, &p,
711 RAZOR_DETAIL_NAME, &name,
712 RAZOR_DETAIL_VERSION, &version,
713 RAZOR_DETAIL_LAST)) {
714 if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
717 if (prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES, name))
718 remove_matching_providers(trans,
722 razor_transaction_install_package(trans, p);
723 fprintf(stderr, "installing %s-%s\n", name, version);
728 razor_transaction_resolve(struct razor_transaction *trans)
732 flush_scheduled_system_updates(trans);
733 flush_scheduled_upstream_updates(trans);
735 while (last < trans->changes) {
736 last = trans->changes;
737 remove_obsoleted_packages(trans);
738 mark_all_satisfied_requires(trans);
739 update_unsatisfied_packages(trans);
740 update_conflicted_packages(trans);
741 pull_in_all_requirements(trans);
742 flush_scheduled_system_updates(trans);
743 flush_scheduled_upstream_updates(trans);
746 return trans->changes;
750 describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
752 struct razor_package_iterator pi;
753 struct razor_package *pkg;
754 const char *name, *version, *arch, *pool;
756 pool = set->string_pool.data;
757 if (pool[rp->version] == '\0') {
758 razor_package_iterator_init_for_property(&pi, set, rp);
759 while (razor_package_iterator_next(&pi, &pkg,
760 RAZOR_DETAIL_NAME, &name,
761 RAZOR_DETAIL_VERSION, &version,
762 RAZOR_DETAIL_ARCH, &arch,
764 fprintf(stderr, "%s is needed by %s-%s.%s\n",
766 name, version, arch);
768 razor_package_iterator_init_for_property(&pi, set, rp);
769 while (razor_package_iterator_next(&pi, &pkg,
770 RAZOR_DETAIL_NAME, &name,
771 RAZOR_DETAIL_VERSION, &version,
772 RAZOR_DETAIL_ARCH, &arch,
774 fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
776 razor_property_relation_to_string(rp),
778 name, version, arch);
783 razor_transaction_describe(struct razor_transaction *trans)
785 struct prop_iter rpi;
786 struct razor_property *rp;
789 flush_scheduled_system_updates(trans);
790 flush_scheduled_upstream_updates(trans);
791 mark_all_satisfied_requires(trans);
794 prop_iter_init(&rpi, &trans->system);
795 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
796 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
797 describe_unsatisfied(trans->system.set, rp);
802 prop_iter_init(&rpi, &trans->upstream);
803 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
804 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
805 describe_unsatisfied(trans->upstream.set, rp);
814 razor_transaction_unsatisfied_property(struct razor_transaction *trans,
820 struct razor_property *p;
822 prop_iter_init(&pi, &trans->system);
823 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
824 if (!(trans->system.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
826 strcmp(&pi.pool[p->name], name) == 0 &&
827 strcmp(&pi.pool[p->version], version) == 0)
832 prop_iter_init(&pi, &trans->upstream);
833 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
834 if (!(trans->upstream.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
836 strcmp(&pi.pool[p->name], name) == 0 &&
837 strcmp(&pi.pool[p->version], version) == 0)
845 RAZOR_EXPORT struct razor_set *
846 razor_transaction_finish(struct razor_transaction *trans)
848 struct razor_merger *merger;
849 struct razor_package *u, *uend, *upkgs, *s, *send, *spkgs;
853 s = trans->system.set->packages.data;
854 spkgs = trans->system.set->packages.data;
855 send = trans->system.set->packages.data +
856 trans->system.set->packages.size;
857 spool = trans->system.set->string_pool.data;
859 u = trans->upstream.set->packages.data;
860 upkgs = trans->upstream.set->packages.data;
861 uend = trans->upstream.set->packages.data +
862 trans->upstream.set->packages.size;
863 upool = trans->upstream.set->string_pool.data;
865 merger = razor_merger_create(trans->system.set, trans->upstream.set);
866 while (s < send || u < uend) {
867 if (s < send && u < uend)
868 cmp = strcmp(&spool[s->name], &upool[u->name]);
875 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
876 razor_merger_add_package(merger, s);
878 } else if (cmp == 0) {
879 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
880 razor_merger_add_package(merger, s);
881 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
882 razor_merger_add_package(merger, u);
887 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
888 razor_merger_add_package(merger, u);
893 razor_transaction_destroy(trans);
895 return razor_merger_finish(merger);
899 razor_transaction_destroy(struct razor_transaction *trans)
901 assert (trans != NULL);
903 transaction_set_release(&trans->system);
904 transaction_set_release(&trans->upstream);