Go back to having all info in one rzdb file.
We can still split the rzdb file into a main file and a file data and a details file, but that's only for optimizing the required download size. On the system we always combine the parts back into one rzdb file once downloaded.
committer: J. Ali Harlow <ali@juiblex.co.uk>
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include <sys/types.h>
37 #include "razor-internal.h"
41 provider_satisfies_requirement(struct razor_property *provider,
42 const char *provider_strings,
47 const char *provided = &provider_strings[provider->version];
52 if (flags & RAZOR_PROPERTY_LESS)
58 cmp = razor_versioncmp(provided, required);
60 switch (flags & RAZOR_PROPERTY_RELATION_MASK) {
61 case RAZOR_PROPERTY_LESS:
64 case RAZOR_PROPERTY_LESS | RAZOR_PROPERTY_EQUAL:
67 /* fall through: FIXME, make sure this is correct */
69 case RAZOR_PROPERTY_EQUAL:
73 /* "foo == 1.1" is satisfied by "foo 1.1-2" */
74 len = strlen(required);
75 if (!strncmp(required, provided, len) && provided[len] == '-')
79 case RAZOR_PROPERTY_GREATER | RAZOR_PROPERTY_EQUAL:
82 case RAZOR_PROPERTY_GREATER:
86 /* shouldn't happen */
90 #define TRANS_PACKAGE_PRESENT 1
91 #define TRANS_PACKAGE_UPDATE 2
92 #define TRANS_PROPERTY_SATISFIED 0x80000000
94 struct transaction_set {
95 struct razor_set *set;
100 struct razor_transaction {
101 int package_count, errors;
102 struct transaction_set system, upstream;
104 struct razor_merger *merger;
108 transaction_set_init(struct transaction_set *ts, struct razor_set *set)
113 count = set->packages.size / sizeof (struct razor_package);
114 ts->packages = zalloc(count * sizeof *ts->packages);
115 count = set->properties.size / sizeof (struct razor_property);
116 ts->properties = zalloc(count * sizeof *ts->properties);
120 transaction_set_release(struct transaction_set *ts)
123 free(ts->properties);
127 transaction_set_install_package(struct transaction_set *ts,
128 struct razor_package *package)
130 struct razor_package *pkgs;
134 pkgs = ts->set->packages.data;
136 if (ts->packages[i] == TRANS_PACKAGE_PRESENT)
139 ts->packages[i] = TRANS_PACKAGE_PRESENT;
141 prop = list_first(&package->properties, &ts->set->property_pool);
143 ts->properties[prop->data]++;
144 prop = list_next(prop);
149 transaction_set_remove_package(struct transaction_set *ts,
150 struct razor_package *package)
152 struct razor_package *pkgs;
156 pkgs = ts->set->packages.data;
158 if (ts->packages[i] == 0)
163 prop = list_first(&package->properties, &ts->set->property_pool);
165 ts->properties[prop->data]--;
166 prop = list_next(prop);
170 RAZOR_EXPORT struct razor_transaction *
171 razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
173 struct razor_transaction *trans;
174 struct razor_package *p, *spkgs, *pend;
176 trans = zalloc(sizeof *trans);
177 transaction_set_init(&trans->system, system);
178 transaction_set_init(&trans->upstream, upstream);
180 spkgs = trans->system.set->packages.data;
181 pend = trans->system.set->packages.data +
182 trans->system.set->packages.size;
183 for (p = spkgs; p < pend; p++)
184 transaction_set_install_package(&trans->system, p);
190 razor_transaction_install_package(struct razor_transaction *trans,
191 struct razor_package *package)
193 assert (trans != NULL);
194 assert (package != NULL);
196 transaction_set_install_package(&trans->upstream, package);
201 razor_transaction_remove_package(struct razor_transaction *trans,
202 struct razor_package *package)
204 assert (trans != NULL);
205 assert (package != NULL);
207 transaction_set_remove_package(&trans->system, package);
212 razor_transaction_update_package(struct razor_transaction *trans,
213 struct razor_package *package)
215 struct razor_package *spkgs, *upkgs, *end;
217 assert (trans != NULL);
218 assert (package != NULL);
220 spkgs = trans->system.set->packages.data;
221 upkgs = trans->upstream.set->packages.data;
222 end = trans->system.set->packages.data +
223 trans->system.set->packages.size;
224 if (spkgs <= package && package < end)
225 trans->system.packages[package - spkgs] |= TRANS_PACKAGE_UPDATE;
227 trans->upstream.packages[package - upkgs] |= TRANS_PACKAGE_UPDATE;
231 struct razor_property *p, *start, *end;
237 prop_iter_init(struct prop_iter *pi, struct transaction_set *ts)
239 pi->p = ts->set->properties.data;
240 pi->start = ts->set->properties.data;
241 pi->end = ts->set->properties.data + ts->set->properties.size;
242 pi->pool = ts->set->string_pool.data;
243 pi->present = ts->properties;
247 prop_iter_next(struct prop_iter *pi, uint32_t flags, struct razor_property **p)
249 while (pi->p < pi->end) {
250 if ((pi->present[pi->p - pi->start] & ~TRANS_PROPERTY_SATISFIED) &&
251 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) == flags) {
261 static struct razor_property *
262 prop_iter_seek_to(struct prop_iter *pi,
263 uint32_t flags, const char *match)
267 while (pi->p < pi->end && strcmp(&pi->pool[pi->p->name], match) < 0)
270 if (pi->p == pi->end || strcmp(&pi->pool[pi->p->name], match) > 0)
274 while (pi->p < pi->end &&
275 pi->p->name == name &&
276 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) != flags)
279 if (pi->p == pi->end || pi->p->name != name)
285 /* Remove packages from set that provide any of the matching (same
286 * name and type) providers from ppi onwards that match the
287 * requirement that rpi points to. */
289 remove_matching_providers(struct razor_transaction *trans,
290 struct prop_iter *ppi,
294 struct razor_property *p;
295 struct razor_package *pkg, *pkgs;
296 struct razor_package_iterator pkg_iter;
297 struct razor_set *set;
301 if (ppi->present == trans->system.properties)
302 set = trans->system.set;
304 set = trans->upstream.set;
306 pkgs = (struct razor_package *) set->packages.data;
307 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
310 p->name == ppi->p->name &&
311 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
313 if (!ppi->present[p - ppi->start])
315 if (!provider_satisfies_requirement(p, ppi->pool,
319 razor_package_iterator_init_for_property(&pkg_iter, set, p);
320 while (razor_package_iterator_next(&pkg_iter, &pkg,
321 RAZOR_DETAIL_NAME, &n,
322 RAZOR_DETAIL_VERSION, &v,
323 RAZOR_DETAIL_LAST)) {
324 fprintf(stderr, "removing %s-%s\n", n, v);
325 razor_transaction_remove_package(trans, pkg);
331 flag_matching_providers(struct razor_transaction *trans,
332 struct prop_iter *ppi,
333 struct razor_property *r,
334 struct prop_iter *rpi,
337 struct razor_property *p;
338 struct razor_package *pkg, *pkgs;
339 struct razor_package_iterator pkg_iter;
340 struct razor_set *set;
341 const char *name, *version;
342 uint32_t *flags, type;
344 if (ppi->present == trans->system.properties) {
345 set = trans->system.set;
346 flags = trans->system.packages;
348 set = trans->upstream.set;
349 flags = trans->upstream.packages;
352 pkgs = (struct razor_package *) set->packages.data;
353 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
356 p->name == ppi->p->name &&
357 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
359 if (!ppi->present[p - ppi->start])
361 if (!provider_satisfies_requirement(p, ppi->pool,
363 &rpi->pool[r->version]))
366 razor_package_iterator_init_for_property(&pkg_iter, set, p);
367 while (razor_package_iterator_next(&pkg_iter, &pkg,
368 RAZOR_DETAIL_NAME, &name,
369 RAZOR_DETAIL_VERSION, &version,
370 RAZOR_DETAIL_LAST)) {
372 fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
376 rpi->pool + r->version);
377 flags[pkg - pkgs] |= flag;
382 static struct razor_package *
383 pick_matching_provider(struct razor_set *set,
384 struct prop_iter *ppi,
388 struct razor_property *p;
389 struct razor_package *pkgs;
393 /* This is where we decide which pkgs to pull in to satisfy a
394 * requirement. There may be several different providers
395 * (different versions) and each version of a provider may
396 * come from a number of packages. We pick the first package
397 * from the first provider that matches. */
399 pkgs = set->packages.data;
400 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
403 p->name == ppi->p->name &&
404 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type &&
405 ppi->present[p - ppi->start] == 0;
407 if (!provider_satisfies_requirement(p, ppi->pool,
411 i = list_first(&p->packages, &set->package_pool);
413 return &pkgs[i->data];
420 remove_obsoleted_packages(struct razor_transaction *trans)
422 struct razor_property *up;
423 struct razor_package *spkgs;
424 struct prop_iter spi, upi;
426 spkgs = trans->system.set->packages.data;
427 prop_iter_init(&spi, &trans->system);
428 prop_iter_init(&upi, &trans->upstream);
430 while (prop_iter_next(&upi, RAZOR_PROPERTY_OBSOLETES, &up)) {
431 if (!prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
432 &upi.pool[up->name]))
434 remove_matching_providers(trans, &spi, up->flags,
435 &upi.pool[up->version]);
440 any_provider_satisfies_requirement(struct prop_iter *ppi,
444 struct razor_property *p;
447 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
450 p->name == ppi->p->name &&
451 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
453 if (ppi->present[p - ppi->start] > 0 &&
454 provider_satisfies_requirement(p, ppi->pool,
463 clear_requires_flags(struct transaction_set *ts)
465 struct razor_property *p;
470 count = ts->set->properties.size / sizeof *p;
471 p = ts->set->properties.data;
472 pool = ts->set->string_pool.data;
473 for (i = 0; i < count; i++) {
474 ts->properties[i] &= ~TRANS_PROPERTY_SATISFIED;
475 sub = strchr(&pool[p[i].name], '(');
476 if (sub && sub[strlen(sub) - 1] == ')') {
477 sub = strdup(sub + 1);
478 sub[strlen(sub) - 1] = '\0';
479 if (strncmp(&pool[p[i].name], "rpmlib(", 7) == 0)
480 ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
481 if (strncmp(&pool[p[i].name], "lua(", 4) == 0 &&
482 razor_get_lua_loader(sub) &&
483 p[i].flags & RAZOR_PROPERTY_SCRIPT_MASK)
484 ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
491 mark_satisfied_requires(struct razor_transaction *trans,
492 struct transaction_set *rts,
493 struct transaction_set *pts)
495 struct prop_iter rpi, ppi;
496 struct razor_property *rp;
498 prop_iter_init(&rpi, rts);
499 prop_iter_init(&ppi, pts);
501 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
502 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES,
503 &rpi.pool[rp->name]))
506 if (any_provider_satisfies_requirement(&ppi, rp->flags,
507 &rpi.pool[rp->version]))
508 rpi.present[rp - rpi.start] |= TRANS_PROPERTY_SATISFIED;
513 mark_all_satisfied_requires(struct razor_transaction *trans)
515 clear_requires_flags(&trans->system);
516 clear_requires_flags(&trans->upstream);
517 mark_satisfied_requires(trans, &trans->system, &trans->system);
518 mark_satisfied_requires(trans, &trans->system, &trans->upstream);
519 mark_satisfied_requires(trans, &trans->upstream, &trans->system);
520 mark_satisfied_requires(trans, &trans->upstream, &trans->upstream);
524 update_unsatisfied_packages(struct razor_transaction *trans)
526 struct razor_package *spkgs, *pkg;
527 struct razor_property *sp;
528 struct prop_iter spi;
529 struct razor_package_iterator pkg_iter;
532 spkgs = trans->system.set->packages.data;
533 prop_iter_init(&spi, &trans->system);
535 while (prop_iter_next(&spi, RAZOR_PROPERTY_REQUIRES, &sp)) {
536 if (spi.present[sp - spi.start] & TRANS_PROPERTY_SATISFIED)
539 razor_package_iterator_init_for_property(&pkg_iter,
542 while (razor_package_iterator_next(&pkg_iter, &pkg,
543 RAZOR_DETAIL_NAME, &name,
544 RAZOR_DETAIL_LAST)) {
545 fprintf(stderr, "updating %s because %s %s %s "
547 name, spi.pool + sp->name,
548 razor_property_relation_to_string(sp),
549 spi.pool + sp->version);
550 trans->system.packages[pkg - spkgs] |=
551 TRANS_PACKAGE_UPDATE;
557 razor_transaction_update_all(struct razor_transaction *trans)
559 struct razor_package *p;
562 assert (trans != NULL);
564 count = trans->system.set->packages.size / sizeof *p;
565 for (i = 0; i < count; i++)
566 trans->system.packages[i] |= TRANS_PACKAGE_UPDATE;
570 update_conflicted_packages(struct razor_transaction *trans)
572 struct razor_package *pkg, *spkgs;
573 struct razor_property *up, *sp;
574 struct prop_iter spi, upi;
575 struct razor_package_iterator pkg_iter;
576 const char *name, *version;
578 spkgs = trans->system.set->packages.data;
579 prop_iter_init(&spi, &trans->system);
580 prop_iter_init(&upi, &trans->upstream);
582 while (prop_iter_next(&spi, RAZOR_PROPERTY_CONFLICTS, &sp)) {
583 if (!prop_iter_seek_to(&upi, RAZOR_PROPERTY_PROVIDES,
584 &spi.pool[sp->name]))
587 if (!any_provider_satisfies_requirement(&upi, sp->flags,
588 &spi.pool[sp->version]))
591 razor_package_iterator_init_for_property(&pkg_iter,
594 while (razor_package_iterator_next(&pkg_iter, &pkg,
595 RAZOR_DETAIL_NAME, &name,
596 RAZOR_DETAIL_VERSION, &version,
597 RAZOR_DETAIL_LAST)) {
598 fprintf(stderr, "updating %s %s because it "
599 "conflicts with %s\n",
600 name, version, spi.pool + sp->name);
601 trans->system.packages[pkg - spkgs] |=
602 TRANS_PACKAGE_UPDATE;
606 prop_iter_init(&spi, &trans->system);
607 prop_iter_init(&upi, &trans->upstream);
609 while (prop_iter_next(&upi, RAZOR_PROPERTY_CONFLICTS, &up)) {
610 sp = prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
611 &upi.pool[upi.p->name]);
614 flag_matching_providers(trans, &spi, up, &upi,
615 TRANS_PACKAGE_UPDATE);
620 pull_in_requirements(struct razor_transaction *trans,
621 struct prop_iter *rpi, struct prop_iter *ppi)
623 struct razor_property *rp, *pp;
624 struct razor_package *pkg, *upkgs;
626 upkgs = trans->upstream.set->packages.data;
627 while (prop_iter_next(rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
628 if (rpi->present[rp - rpi->start] & TRANS_PROPERTY_SATISFIED)
631 pp = prop_iter_seek_to(ppi, RAZOR_PROPERTY_PROVIDES,
632 &rpi->pool[rp->name]);
635 pkg = pick_matching_provider(trans->upstream.set,
637 &rpi->pool[rp->version]);
641 rpi->present[rp - rpi->start] |= TRANS_PROPERTY_SATISFIED;
643 fprintf(stderr, "pulling in %s-%s.%s which provides %s %s %s "
644 "to satisfy %s %s %s\n",
645 ppi->pool + pkg->name,
646 ppi->pool + pkg->version,
647 ppi->pool + pkg->arch,
648 ppi->pool + pp->name,
649 razor_property_relation_to_string(pp),
650 ppi->pool + pp->version,
651 &rpi->pool[rp->name],
652 razor_property_relation_to_string(rp),
653 &rpi->pool[rp->version]);
655 trans->upstream.packages[pkg - upkgs] |= TRANS_PACKAGE_UPDATE;
660 pull_in_all_requirements(struct razor_transaction *trans)
662 struct prop_iter rpi, ppi;
664 prop_iter_init(&rpi, &trans->system);
665 prop_iter_init(&ppi, &trans->upstream);
666 pull_in_requirements(trans, &rpi, &ppi);
668 prop_iter_init(&rpi, &trans->upstream);
669 prop_iter_init(&ppi, &trans->upstream);
670 pull_in_requirements(trans, &rpi, &ppi);
674 flush_scheduled_system_updates(struct razor_transaction *trans)
676 struct razor_package_iterator *pi;
677 struct razor_package *p, *pkg, *spkgs;
678 struct prop_iter ppi;
679 const char *name, *version;
681 spkgs = trans->system.set->packages.data;
682 pi = razor_package_iterator_create(trans->system.set);
683 prop_iter_init(&ppi, &trans->upstream);
685 while (razor_package_iterator_next(pi, &p,
686 RAZOR_DETAIL_NAME, &name,
687 RAZOR_DETAIL_VERSION, &version,
688 RAZOR_DETAIL_LAST)) {
689 if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
692 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES, name))
695 pkg = pick_matching_provider(trans->upstream.set, &ppi,
696 RAZOR_PROPERTY_GREATER, version);
700 fprintf(stderr, "updating %s-%s to %s-%s\n",
702 &ppi.pool[pkg->name], &ppi.pool[pkg->version]);
704 razor_transaction_remove_package(trans, p);
705 razor_transaction_install_package(trans, pkg);
708 razor_package_iterator_destroy(pi);
712 flush_scheduled_upstream_updates(struct razor_transaction *trans)
714 struct razor_package_iterator *pi;
715 struct razor_package *p, *upkgs;
716 struct prop_iter spi;
717 const char *name, *version;
719 upkgs = trans->upstream.set->packages.data;
720 pi = razor_package_iterator_create(trans->upstream.set);
721 prop_iter_init(&spi, &trans->system);
723 while (razor_package_iterator_next(pi, &p,
724 RAZOR_DETAIL_NAME, &name,
725 RAZOR_DETAIL_VERSION, &version,
726 RAZOR_DETAIL_LAST)) {
727 if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
730 if (prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES, name))
731 remove_matching_providers(trans,
735 razor_transaction_install_package(trans, p);
736 fprintf(stderr, "installing %s-%s\n", name, version);
741 razor_transaction_resolve(struct razor_transaction *trans)
745 flush_scheduled_system_updates(trans);
746 flush_scheduled_upstream_updates(trans);
748 while (last < trans->changes) {
749 last = trans->changes;
750 remove_obsoleted_packages(trans);
751 mark_all_satisfied_requires(trans);
752 update_unsatisfied_packages(trans);
753 update_conflicted_packages(trans);
754 pull_in_all_requirements(trans);
755 flush_scheduled_system_updates(trans);
756 flush_scheduled_upstream_updates(trans);
759 return trans->changes;
763 describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
765 struct razor_package_iterator pi;
766 struct razor_package *pkg;
767 const char *name, *version, *arch, *pool;
769 pool = set->string_pool.data;
770 if (pool[rp->version] == '\0') {
771 razor_package_iterator_init_for_property(&pi, set, rp);
772 while (razor_package_iterator_next(&pi, &pkg,
773 RAZOR_DETAIL_NAME, &name,
774 RAZOR_DETAIL_VERSION, &version,
775 RAZOR_DETAIL_ARCH, &arch,
777 fprintf(stderr, "%s is needed by %s-%s.%s\n",
779 name, version, arch);
781 razor_package_iterator_init_for_property(&pi, set, rp);
782 while (razor_package_iterator_next(&pi, &pkg,
783 RAZOR_DETAIL_NAME, &name,
784 RAZOR_DETAIL_VERSION, &version,
785 RAZOR_DETAIL_ARCH, &arch,
787 fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
789 razor_property_relation_to_string(rp),
791 name, version, arch);
796 razor_transaction_describe(struct razor_transaction *trans)
798 struct prop_iter rpi;
799 struct razor_property *rp;
802 flush_scheduled_system_updates(trans);
803 flush_scheduled_upstream_updates(trans);
804 mark_all_satisfied_requires(trans);
807 prop_iter_init(&rpi, &trans->system);
808 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
809 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
810 describe_unsatisfied(trans->system.set, rp);
815 prop_iter_init(&rpi, &trans->upstream);
816 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
817 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
818 describe_unsatisfied(trans->upstream.set, rp);
827 razor_transaction_unsatisfied_property(struct razor_transaction *trans,
833 struct razor_property *p;
835 prop_iter_init(&pi, &trans->system);
836 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
837 if (!(trans->system.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
839 strcmp(&pi.pool[p->name], name) == 0 &&
840 strcmp(&pi.pool[p->version], version) == 0)
845 prop_iter_init(&pi, &trans->upstream);
846 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
847 if (!(trans->upstream.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
849 strcmp(&pi.pool[p->name], name) == 0 &&
850 strcmp(&pi.pool[p->version], version) == 0)
858 RAZOR_EXPORT struct razor_set *
859 razor_transaction_commit(struct razor_transaction *trans)
861 struct razor_package *u, *uend, *upkgs, *s, *send, *spkgs;
865 s = trans->system.set->packages.data;
866 spkgs = trans->system.set->packages.data;
867 send = trans->system.set->packages.data +
868 trans->system.set->packages.size;
869 spool = trans->system.set->string_pool.data;
871 u = trans->upstream.set->packages.data;
872 upkgs = trans->upstream.set->packages.data;
873 uend = trans->upstream.set->packages.data +
874 trans->upstream.set->packages.size;
875 upool = trans->upstream.set->string_pool.data;
877 trans->merger = razor_merger_create(trans->system.set,
878 trans->upstream.set);
879 while (s < send || u < uend) {
880 if (s < send && u < uend)
881 cmp = strcmp(&spool[s->name], &upool[u->name]);
888 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
889 razor_merger_add_package(trans->merger, s);
891 } else if (cmp == 0) {
892 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
893 razor_merger_add_package(trans->merger, s);
894 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
895 razor_merger_add_package(trans->merger, u);
900 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
901 razor_merger_add_package(trans->merger, u);
906 return razor_merger_commit(trans->merger);
910 razor_transaction_fixup_package(struct razor_transaction *trans,
911 struct razor_package *package,
912 struct razor_rpm *rpm)
914 const char *preunprog, *preun, *postunprog, *postun;
916 razor_rpm_get_details(rpm,
917 RAZOR_DETAIL_PREUNPROG, &preunprog,
918 RAZOR_DETAIL_PREUN, &preun,
919 RAZOR_DETAIL_POSTUNPROG, &postunprog,
920 RAZOR_DETAIL_POSTUN, &postun,
923 razor_merger_package_add_script(trans->merger, package,
924 RAZOR_PROPERTY_PREUN,
926 razor_merger_package_add_script(trans->merger, package,
927 RAZOR_PROPERTY_POSTUN,
932 razor_transaction_destroy(struct razor_transaction *trans)
934 assert (trans != NULL);
937 razor_merger_destroy(trans->merger);
938 transaction_set_release(&trans->system);
939 transaction_set_release(&trans->upstream);