1
0
mirror of git://projects.qi-hardware.com/wernermisc.git synced 2024-11-15 09:13:43 +02:00

qpkg: also consider conflicts introduced by package about to be added

- prereq.c (conflicts, resolve, prereq): renamed "conflicts" to
  "old_conflicts"
- prereq.c (new_conflicts, resolve, prereq): also test whether any of the
  conflicts of the package we're about to add matches an installed or
  considered package
- test/conflict, test/instconf: test for conflicts introduced by package
  about to be added
This commit is contained in:
Werner Almesberger 2010-11-22 06:52:53 -03:00
parent c44510ade1
commit b89bcdfd93
3 changed files with 129 additions and 4 deletions

View File

@ -111,7 +111,7 @@ static int satisfies(const struct pkg *pkg, const struct ref *ref)
} }
static int conflicts(const struct pkg *pkg, const struct list *conf) static int old_conflicts(const struct pkg *pkg, const struct list *conf)
{ {
const struct ref *ref; const struct ref *ref;
@ -125,6 +125,21 @@ static int conflicts(const struct pkg *pkg, const struct list *conf)
} }
static int new_conflicts(const struct ref *refs)
{
const struct ref *ref;
const struct pkg *pkg;
for (ref = refs; ref; ref = ref->next)
for (pkg = ref->pkg->jrb->val; pkg; pkg = pkg->more)
if ((pkg->flags & (QPKG_INSTALLED | QPKG_ADDING)) ||
pkg->mark)
if (satisfies(pkg, ref))
return 1;
return 0;
}
/* ----- Recurse through lists and layers of dependencies ------------------ */ /* ----- Recurse through lists and layers of dependencies ------------------ */
@ -186,11 +201,13 @@ static void resolve(struct list *next_dep, const struct ref *dep,
exit(1); exit(1);
} }
if ((pkg->flags & QPKG_INSTALLED) || pkg->mark) { if ((pkg->flags & QPKG_INSTALLED) || pkg->mark) {
assert(!conflicts(pkg, conf)); assert(!old_conflicts(pkg, conf));
resolve(next_dep, dep->next, top, conf); resolve(next_dep, dep->next, top, conf);
continue; continue;
} }
if (conflicts(pkg, conf)) if (old_conflicts(pkg, conf))
continue;
if (new_conflicts(pkg->conflicts))
continue; continue;
level++; level++;
append_install(pkg); append_install(pkg);
@ -268,7 +285,7 @@ struct pkg **prereq(struct pkg *pkg)
.next = installed_conflicts() .next = installed_conflicts()
}; };
if (conflicts(pkg, &conf)) { if (old_conflicts(pkg, &conf) || new_conflicts(pkg->conflicts)) {
fprintf(stderr, "%.*s conflicts with installed packages\n", fprintf(stderr, "%.*s conflicts with installed packages\n",
ID2PF(pkg->id)); ID2PF(pkg->id));
exit(1); exit(1);

View File

@ -155,3 +155,70 @@ EOF
expect <<EOF expect <<EOF
bar_0 bar_0
EOF EOF
###############################################################################
qpkg_fail "prerequisite conflicts with dependant" prereq A <<EOF
Package: B
Version: 0
Architecture: test
Conflicts: A
Filename: B
Package: A
Version: 0
Architecture: test
Depends: B
Filename: A
EOF
expect <<EOF
can't resolve A
EOF
###############################################################################
qpkg_fail "prerequisite conflicts with considered package (1)" prereq A <<EOF
Package: B
Version: 0
Architecture: test
Conflicts: C
Filename: B
Package: C
Version: 0
Architecture: test
Filename: C
Package: A
Version: 0
Architecture: test
Depends: B, C
Filename: A
EOF
expect <<EOF
can't resolve A
EOF
###############################################################################
qpkg_fail "prerequisite conflicts with considered package (1)" prereq A <<EOF
Package: B
Version: 0
Architecture: test
Filename: B
Package: C
Version: 0
Architecture: test
Conflicts: B
Filename: C
Package: A
Version: 0
Architecture: test
Depends: B, C
Filename: A
EOF
expect <<EOF
can't resolve A
EOF

View File

@ -48,3 +48,44 @@ EOF
expect <<EOF expect <<EOF
A conflicts with installed packages A conflicts with installed packages
EOF EOF
###############################################################################
qpkg_fail "prerequisite conflicts with installed package" prereq A <<EOF
Package: B
Version: 0
Architecture: test
Conflicts: C
Filename: B
Package: A
Version: 0
Architecture: test
Depends: B
Filename: A
Package: C
Version: 0
Architecture: test
Status: installed
EOF
expect <<EOF
can't resolve A
EOF
###############################################################################
qpkg_fail "initial package conflicts with installed package" prereq A <<EOF
Package: A
Version: 0
Architecture: test
Conflicts: C
Filename: A
Package: C
Version: 0
Architecture: test
Status: installed
EOF
expect <<EOF
A conflicts with installed packages