Drop drive letter from path to razor root when RAZOR_ROOT set.
If the RAZOR_ROOT environment variable was set to eg., /root then on
Microsoft Windows we were trying to use paths such as /rootC:/Programs
which is obviously wrong. Instead we should drop the drive letter
giving paths of the form /root/Programs. Note that the drive letter is
_not_ migrated to C:/root/Programs: If a root of C:/root was desired
then RAZOR_ROOT would have been set to C:/root.
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009, 2011, 2012 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.
29 #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)
112 ts->set = razor_set_ref(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)
122 razor_set_unref(ts->set);
124 free(ts->properties);
128 transaction_set_install_package(struct transaction_set *ts,
129 struct razor_package *package)
131 struct razor_package *pkgs;
135 pkgs = ts->set->packages.data;
137 if (ts->packages[i] & TRANS_PACKAGE_PRESENT)
140 ts->packages[i] |= TRANS_PACKAGE_PRESENT;
142 prop = list_first(&package->properties, &ts->set->property_pool);
144 ts->properties[prop->data]++;
145 prop = list_next(prop);
150 transaction_set_remove_package(struct transaction_set *ts,
151 struct razor_package *package)
153 struct razor_package *pkgs;
157 pkgs = ts->set->packages.data;
159 if (!(ts->packages[i] & TRANS_PACKAGE_PRESENT))
162 ts->packages[i] &= ~TRANS_PACKAGE_PRESENT;
164 prop = list_first(&package->properties, &ts->set->property_pool);
166 ts->properties[prop->data]--;
167 prop = list_next(prop);
171 RAZOR_EXPORT struct razor_transaction *
172 razor_transaction_create(struct razor_set *system, struct razor_set *upstream)
174 struct razor_transaction *trans;
175 struct razor_package *p, *spkgs, *pend;
177 trans = zalloc(sizeof *trans);
178 transaction_set_init(&trans->system, system);
179 transaction_set_init(&trans->upstream, upstream);
181 spkgs = trans->system.set->packages.data;
182 pend = trans->system.set->packages.data +
183 trans->system.set->packages.size;
184 for (p = spkgs; p < pend; p++)
185 transaction_set_install_package(&trans->system, p);
191 razor_transaction_install_package(struct razor_transaction *trans,
192 struct razor_package *package)
194 assert (trans != NULL);
195 assert (package != NULL);
197 transaction_set_install_package(&trans->upstream, package);
202 razor_transaction_remove_package(struct razor_transaction *trans,
203 struct razor_package *package)
205 assert (trans != NULL);
206 assert (package != NULL);
208 transaction_set_remove_package(&trans->system, package);
213 razor_transaction_update_package(struct razor_transaction *trans,
214 struct razor_package *package)
216 struct razor_package *spkgs, *upkgs, *end;
218 assert (trans != NULL);
219 assert (package != NULL);
221 spkgs = trans->system.set->packages.data;
222 upkgs = trans->upstream.set->packages.data;
223 end = trans->system.set->packages.data +
224 trans->system.set->packages.size;
225 if (spkgs <= package && package < end)
226 trans->system.packages[package - spkgs] |= TRANS_PACKAGE_UPDATE;
228 trans->upstream.packages[package - upkgs] |= TRANS_PACKAGE_UPDATE;
232 struct razor_property *p, *start, *end;
238 prop_iter_init(struct prop_iter *pi, struct transaction_set *ts)
240 pi->p = ts->set->properties.data;
241 pi->start = ts->set->properties.data;
242 pi->end = ts->set->properties.data + ts->set->properties.size;
243 pi->pool = ts->set->string_pool.data;
244 pi->present = ts->properties;
248 prop_iter_next(struct prop_iter *pi, uint32_t flags, struct razor_property **p)
250 while (pi->p < pi->end) {
251 if ((pi->present[pi->p - pi->start] & ~TRANS_PROPERTY_SATISFIED) &&
252 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) == flags) {
262 static struct razor_property *
263 prop_iter_seek_to(struct prop_iter *pi,
264 uint32_t flags, const char *match)
268 while (pi->p < pi->end && strcmp(&pi->pool[pi->p->name], match) < 0)
271 if (pi->p == pi->end || strcmp(&pi->pool[pi->p->name], match) > 0)
275 while (pi->p < pi->end &&
276 pi->p->name == name &&
277 (pi->p->flags & RAZOR_PROPERTY_TYPE_MASK) != flags)
280 if (pi->p == pi->end || pi->p->name != name)
286 /* Remove packages from set that provide any of the matching (same
287 * name and type) providers from ppi onwards that match the
288 * requirement that rpi points to. */
290 remove_matching_providers(struct razor_transaction *trans,
291 struct prop_iter *ppi,
295 struct razor_property *p;
296 struct razor_package *pkg, *pkgs;
297 struct razor_package_iterator pkg_iter;
298 struct razor_set *set;
302 if (ppi->present == trans->system.properties)
303 set = trans->system.set;
305 set = trans->upstream.set;
307 pkgs = (struct razor_package *) set->packages.data;
308 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
311 p->name == ppi->p->name &&
312 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
314 if (!ppi->present[p - ppi->start])
316 if (!provider_satisfies_requirement(p, ppi->pool,
320 razor_package_iterator_init_for_property(&pkg_iter, set, p);
321 while (razor_package_iterator_next(&pkg_iter, &pkg,
322 RAZOR_DETAIL_NAME, &n,
323 RAZOR_DETAIL_VERSION, &v,
324 RAZOR_DETAIL_LAST)) {
326 fprintf(stderr, "removing %s-%s\n", n, v);
328 razor_transaction_remove_package(trans, pkg);
334 flag_matching_providers(struct razor_transaction *trans,
335 struct prop_iter *ppi,
336 struct razor_property *r,
337 struct prop_iter *rpi,
340 struct razor_property *p;
341 struct razor_package *pkg, *pkgs;
342 struct razor_package_iterator pkg_iter;
343 struct razor_set *set;
344 const char *name, *version;
345 uint32_t *flags, type;
347 if (ppi->present == trans->system.properties) {
348 set = trans->system.set;
349 flags = trans->system.packages;
351 set = trans->upstream.set;
352 flags = trans->upstream.packages;
355 pkgs = (struct razor_package *) set->packages.data;
356 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
359 p->name == ppi->p->name &&
360 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
362 if (!ppi->present[p - ppi->start])
364 if (!provider_satisfies_requirement(p, ppi->pool,
366 &rpi->pool[r->version]))
369 razor_package_iterator_init_for_property(&pkg_iter, set, p);
370 while (razor_package_iterator_next(&pkg_iter, &pkg,
371 RAZOR_DETAIL_NAME, &name,
372 RAZOR_DETAIL_VERSION, &version,
373 RAZOR_DETAIL_LAST)) {
376 fprintf(stderr, "flagging %s-%s for providing %s matching %s %s\n",
380 rpi->pool + r->version);
382 flags[pkg - pkgs] |= flag;
387 static struct razor_package *
388 pick_matching_provider(struct razor_set *set,
389 struct prop_iter *ppi,
393 struct razor_property *p;
394 struct razor_package *pkgs;
398 /* This is where we decide which pkgs to pull in to satisfy a
399 * requirement. There may be several different providers
400 * (different versions) and each version of a provider may
401 * come from a number of packages. We pick the first package
402 * from the first provider that matches. */
404 pkgs = set->packages.data;
405 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
408 p->name == ppi->p->name &&
409 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type &&
410 ppi->present[p - ppi->start] == 0;
412 if (!provider_satisfies_requirement(p, ppi->pool,
416 i = list_first(&p->packages, &set->package_pool);
418 return &pkgs[i->data];
425 remove_obsoleted_packages(struct razor_transaction *trans)
427 struct razor_property *up;
428 struct razor_package *spkgs;
429 struct prop_iter spi, upi;
431 spkgs = trans->system.set->packages.data;
432 prop_iter_init(&spi, &trans->system);
433 prop_iter_init(&upi, &trans->upstream);
435 while (prop_iter_next(&upi, RAZOR_PROPERTY_OBSOLETES, &up)) {
436 if (!prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
437 &upi.pool[up->name]))
439 remove_matching_providers(trans, &spi, up->flags,
440 &upi.pool[up->version]);
445 any_provider_satisfies_requirement(struct prop_iter *ppi,
449 struct razor_property *p;
452 type = ppi->p->flags & RAZOR_PROPERTY_TYPE_MASK;
455 p->name == ppi->p->name &&
456 (p->flags & RAZOR_PROPERTY_TYPE_MASK) == type;
458 if (ppi->present[p - ppi->start] > 0 &&
459 provider_satisfies_requirement(p, ppi->pool,
468 clear_requires_flags(struct transaction_set *ts)
470 struct razor_property *p;
475 count = ts->set->properties.size / sizeof *p;
476 p = ts->set->properties.data;
477 pool = ts->set->string_pool.data;
478 for (i = 0; i < count; i++) {
479 ts->properties[i] &= ~TRANS_PROPERTY_SATISFIED;
480 sub = strchr(&pool[p[i].name], '(');
481 if (sub && sub[strlen(sub) - 1] == ')') {
482 sub = strdup(sub + 1);
483 sub[strlen(sub) - 1] = '\0';
484 if (strncmp(&pool[p[i].name], "rpmlib(", 7) == 0)
485 ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
486 if (strncmp(&pool[p[i].name], "lua(", 4) == 0 &&
487 razor_get_lua_loader(sub) &&
488 p[i].flags & RAZOR_PROPERTY_SCRIPT_MASK)
489 ts->properties[i] |= TRANS_PROPERTY_SATISFIED;
496 mark_satisfied_requires(struct razor_transaction *trans,
497 struct transaction_set *rts,
498 struct transaction_set *pts)
500 struct prop_iter rpi, ppi;
501 struct razor_property *rp;
503 prop_iter_init(&rpi, rts);
504 prop_iter_init(&ppi, pts);
506 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
507 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES,
508 &rpi.pool[rp->name]))
511 if (any_provider_satisfies_requirement(&ppi, rp->flags,
512 &rpi.pool[rp->version]))
513 rpi.present[rp - rpi.start] |= TRANS_PROPERTY_SATISFIED;
518 mark_all_satisfied_requires(struct razor_transaction *trans)
520 clear_requires_flags(&trans->system);
521 clear_requires_flags(&trans->upstream);
522 mark_satisfied_requires(trans, &trans->system, &trans->system);
523 mark_satisfied_requires(trans, &trans->system, &trans->upstream);
524 mark_satisfied_requires(trans, &trans->upstream, &trans->system);
525 mark_satisfied_requires(trans, &trans->upstream, &trans->upstream);
529 update_unsatisfied_packages(struct razor_transaction *trans)
531 struct razor_package *spkgs, *pkg;
532 struct razor_property *sp;
533 struct prop_iter spi;
534 struct razor_package_iterator pkg_iter;
537 spkgs = trans->system.set->packages.data;
538 prop_iter_init(&spi, &trans->system);
540 while (prop_iter_next(&spi, RAZOR_PROPERTY_REQUIRES, &sp)) {
541 if (spi.present[sp - spi.start] & TRANS_PROPERTY_SATISFIED)
544 razor_package_iterator_init_for_property(&pkg_iter,
547 while (razor_package_iterator_next(&pkg_iter, &pkg,
548 RAZOR_DETAIL_NAME, &name,
549 RAZOR_DETAIL_LAST)) {
550 if (!(trans->system.packages[pkg - spkgs] & TRANS_PACKAGE_PRESENT))
554 fprintf(stderr, "updating %s because %s %s %s "
556 name, spi.pool + sp->name,
557 razor_property_relation_to_string(sp),
558 spi.pool + sp->version);
560 trans->system.packages[pkg - spkgs] |=
561 TRANS_PACKAGE_UPDATE;
567 razor_transaction_update_all(struct razor_transaction *trans)
569 struct razor_package *p;
572 assert (trans != NULL);
574 count = trans->system.set->packages.size / sizeof *p;
575 for (i = 0; i < count; i++)
576 trans->system.packages[i] |= TRANS_PACKAGE_UPDATE;
580 update_conflicted_packages(struct razor_transaction *trans)
582 struct razor_package *pkg, *spkgs;
583 struct razor_property *up, *sp;
584 struct prop_iter spi, upi;
585 struct razor_package_iterator pkg_iter;
586 const char *name, *version;
588 spkgs = trans->system.set->packages.data;
589 prop_iter_init(&spi, &trans->system);
590 prop_iter_init(&upi, &trans->upstream);
592 while (prop_iter_next(&spi, RAZOR_PROPERTY_CONFLICTS, &sp)) {
593 if (!prop_iter_seek_to(&upi, RAZOR_PROPERTY_PROVIDES,
594 &spi.pool[sp->name]))
597 if (!any_provider_satisfies_requirement(&upi, sp->flags,
598 &spi.pool[sp->version]))
601 razor_package_iterator_init_for_property(&pkg_iter,
604 while (razor_package_iterator_next(&pkg_iter, &pkg,
605 RAZOR_DETAIL_NAME, &name,
606 RAZOR_DETAIL_VERSION, &version,
607 RAZOR_DETAIL_LAST)) {
609 fprintf(stderr, "updating %s %s because it "
610 "conflicts with %s\n",
611 name, version, spi.pool + sp->name);
613 trans->system.packages[pkg - spkgs] |=
614 TRANS_PACKAGE_UPDATE;
618 prop_iter_init(&spi, &trans->system);
619 prop_iter_init(&upi, &trans->upstream);
621 while (prop_iter_next(&upi, RAZOR_PROPERTY_CONFLICTS, &up)) {
622 sp = prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES,
623 &upi.pool[upi.p->name]);
626 flag_matching_providers(trans, &spi, up, &upi,
627 TRANS_PACKAGE_UPDATE);
632 pull_in_requirements(struct razor_transaction *trans,
633 struct prop_iter *rpi, struct prop_iter *ppi)
635 struct razor_property *rp, *pp;
636 struct razor_package *pkg, *upkgs;
638 upkgs = trans->upstream.set->packages.data;
639 while (prop_iter_next(rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
640 if (rpi->present[rp - rpi->start] & TRANS_PROPERTY_SATISFIED)
643 pp = prop_iter_seek_to(ppi, RAZOR_PROPERTY_PROVIDES,
644 &rpi->pool[rp->name]);
647 pkg = pick_matching_provider(trans->upstream.set,
649 &rpi->pool[rp->version]);
653 rpi->present[rp - rpi->start] |= TRANS_PROPERTY_SATISFIED;
656 fprintf(stderr, "pulling in %s-%s.%s which provides %s %s %s "
657 "to satisfy %s %s %s\n",
658 ppi->pool + pkg->name,
659 ppi->pool + pkg->version,
660 ppi->pool + pkg->arch,
661 ppi->pool + pp->name,
662 razor_property_relation_to_string(pp),
663 ppi->pool + pp->version,
664 &rpi->pool[rp->name],
665 razor_property_relation_to_string(rp),
666 &rpi->pool[rp->version]);
669 trans->upstream.packages[pkg - upkgs] |= TRANS_PACKAGE_UPDATE;
674 pull_in_all_requirements(struct razor_transaction *trans)
676 struct prop_iter rpi, ppi;
678 prop_iter_init(&rpi, &trans->system);
679 prop_iter_init(&ppi, &trans->upstream);
680 pull_in_requirements(trans, &rpi, &ppi);
682 prop_iter_init(&rpi, &trans->upstream);
683 prop_iter_init(&ppi, &trans->upstream);
684 pull_in_requirements(trans, &rpi, &ppi);
688 flush_scheduled_system_updates(struct razor_transaction *trans)
690 struct razor_package_iterator *pi;
691 struct razor_package *p, *pkg, *spkgs;
692 struct prop_iter ppi;
693 const char *name, *version;
695 spkgs = trans->system.set->packages.data;
696 pi = razor_package_iterator_create(trans->system.set);
697 prop_iter_init(&ppi, &trans->upstream);
699 while (razor_package_iterator_next(pi, &p,
700 RAZOR_DETAIL_NAME, &name,
701 RAZOR_DETAIL_VERSION, &version,
702 RAZOR_DETAIL_LAST)) {
703 if (!(trans->system.packages[p - spkgs] & TRANS_PACKAGE_UPDATE))
705 trans->system.packages[p - spkgs] &= ~TRANS_PACKAGE_UPDATE;
707 if (!prop_iter_seek_to(&ppi, RAZOR_PROPERTY_PROVIDES, name))
710 if (any_provider_satisfies_requirement(&ppi,
711 RAZOR_PROPERTY_GREATER,
713 razor_transaction_remove_package(trans, p);
717 pkg = pick_matching_provider(trans->upstream.set, &ppi,
718 RAZOR_PROPERTY_GREATER, version);
722 razor_transaction_remove_package(trans, p);
723 razor_transaction_install_package(trans, pkg);
726 razor_package_iterator_destroy(pi);
730 flush_scheduled_upstream_updates(struct razor_transaction *trans)
732 struct razor_package_iterator *pi;
733 struct razor_package *p, *upkgs;
734 struct prop_iter spi;
735 const char *name, *version;
737 upkgs = trans->upstream.set->packages.data;
738 pi = razor_package_iterator_create(trans->upstream.set);
739 prop_iter_init(&spi, &trans->system);
741 while (razor_package_iterator_next(pi, &p,
742 RAZOR_DETAIL_NAME, &name,
743 RAZOR_DETAIL_VERSION, &version,
744 RAZOR_DETAIL_LAST)) {
745 if (!(trans->upstream.packages[p - upkgs] & TRANS_PACKAGE_UPDATE))
747 trans->upstream.packages[p - upkgs] &= ~TRANS_PACKAGE_UPDATE;
749 if (prop_iter_seek_to(&spi, RAZOR_PROPERTY_PROVIDES, name))
750 remove_matching_providers(trans,
754 razor_transaction_install_package(trans, p);
756 fprintf(stderr, "installing %s-%s\n", name, version);
762 razor_transaction_resolve(struct razor_transaction *trans)
766 flush_scheduled_system_updates(trans);
767 flush_scheduled_upstream_updates(trans);
769 while (last < trans->changes) {
770 last = trans->changes;
771 remove_obsoleted_packages(trans);
772 mark_all_satisfied_requires(trans);
773 update_unsatisfied_packages(trans);
774 update_conflicted_packages(trans);
775 pull_in_all_requirements(trans);
776 flush_scheduled_system_updates(trans);
777 flush_scheduled_upstream_updates(trans);
780 return trans->changes;
784 describe_unsatisfied(struct razor_set *set, struct razor_property *rp)
786 struct razor_package_iterator pi;
787 struct razor_package *pkg;
788 const char *name, *version, *arch, *pool;
790 pool = set->string_pool.data;
791 if (pool[rp->version] == '\0') {
792 razor_package_iterator_init_for_property(&pi, set, rp);
793 while (razor_package_iterator_next(&pi, &pkg,
794 RAZOR_DETAIL_NAME, &name,
795 RAZOR_DETAIL_VERSION, &version,
796 RAZOR_DETAIL_ARCH, &arch,
798 fprintf(stderr, "%s is needed by %s-%s.%s\n",
800 name, version, arch);
802 razor_package_iterator_init_for_property(&pi, set, rp);
803 while (razor_package_iterator_next(&pi, &pkg,
804 RAZOR_DETAIL_NAME, &name,
805 RAZOR_DETAIL_VERSION, &version,
806 RAZOR_DETAIL_ARCH, &arch,
808 fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
810 razor_property_relation_to_string(rp),
812 name, version, arch);
817 razor_transaction_describe(struct razor_transaction *trans)
819 struct prop_iter rpi;
820 struct razor_property *rp;
823 flush_scheduled_system_updates(trans);
824 flush_scheduled_upstream_updates(trans);
825 mark_all_satisfied_requires(trans);
828 prop_iter_init(&rpi, &trans->system);
829 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
830 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
831 describe_unsatisfied(trans->system.set, rp);
836 prop_iter_init(&rpi, &trans->upstream);
837 while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
838 if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
839 describe_unsatisfied(trans->upstream.set, rp);
848 razor_transaction_unsatisfied_property(struct razor_transaction *trans,
854 struct razor_property *p;
856 prop_iter_init(&pi, &trans->system);
857 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
858 if (!(trans->system.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
860 strcmp(&pi.pool[p->name], name) == 0 &&
861 strcmp(&pi.pool[p->version], version) == 0)
866 prop_iter_init(&pi, &trans->upstream);
867 while (prop_iter_next(&pi, flags & RAZOR_PROPERTY_TYPE_MASK, &p)) {
868 if (!(trans->upstream.properties[p - pi.start] & TRANS_PROPERTY_SATISFIED) &&
870 strcmp(&pi.pool[p->name], name) == 0 &&
871 strcmp(&pi.pool[p->version], version) == 0)
879 RAZOR_EXPORT struct razor_set *
880 razor_transaction_commit(struct razor_transaction *trans)
882 struct razor_package *u, *uend, *upkgs, *s, *send, *spkgs;
886 s = trans->system.set->packages.data;
887 spkgs = trans->system.set->packages.data;
888 send = trans->system.set->packages.data +
889 trans->system.set->packages.size;
890 spool = trans->system.set->string_pool.data;
892 u = trans->upstream.set->packages.data;
893 upkgs = trans->upstream.set->packages.data;
894 uend = trans->upstream.set->packages.data +
895 trans->upstream.set->packages.size;
896 upool = trans->upstream.set->string_pool.data;
898 trans->merger = razor_merger_create(trans->system.set,
899 trans->upstream.set);
900 while (s < send || u < uend) {
901 if (s < send && u < uend)
902 cmp = strcmp(&spool[s->name], &upool[u->name]);
909 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
910 razor_merger_add_package(trans->merger, s);
912 } else if (cmp == 0) {
913 if (trans->system.packages[s - spkgs] & TRANS_PACKAGE_PRESENT)
914 razor_merger_add_package(trans->merger, s);
915 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
916 razor_merger_add_package(trans->merger, u);
921 if (trans->upstream.packages[u - upkgs] & TRANS_PACKAGE_PRESENT)
922 razor_merger_add_package(trans->merger, u);
927 return razor_merger_commit(trans->merger);
931 razor_transaction_fixup_package(struct razor_transaction *trans,
932 struct razor_package *package,
933 struct razor_rpm *rpm)
935 const char *preunprog, *preun, *postunprog, *postun;
937 razor_rpm_get_details(rpm,
938 RAZOR_DETAIL_PREUNPROG, &preunprog,
939 RAZOR_DETAIL_PREUN, &preun,
940 RAZOR_DETAIL_POSTUNPROG, &postunprog,
941 RAZOR_DETAIL_POSTUN, &postun,
944 razor_merger_package_add_script(trans->merger, package,
945 RAZOR_PROPERTY_PREUN,
947 razor_merger_package_add_script(trans->merger, package,
948 RAZOR_PROPERTY_POSTUN,
953 razor_transaction_destroy(struct razor_transaction *trans)
955 assert (trans != NULL);
958 razor_merger_destroy(trans->merger);
959 transaction_set_release(&trans->system);
960 transaction_set_release(&trans->upstream);