diff options
author | sobomax <sobomax@FreeBSD.org> | 2001-03-15 10:47:00 +0000 |
---|---|---|
committer | sobomax <sobomax@FreeBSD.org> | 2001-03-15 10:47:00 +0000 |
commit | 801d4794c43ef1ce0dd0ad2fc50cc62c37ccd254 (patch) | |
tree | 494d42bf9a9d558387f64ce96c787ef441418fe0 /usr.sbin/pkg_install/delete | |
parent | 31506730180d3458142004a1c65d53a06429a691 (diff) | |
download | FreeBSD-src-801d4794c43ef1ce0dd0ad2fc50cc62c37ccd254.zip FreeBSD-src-801d4794c43ef1ce0dd0ad2fc50cc62c37ccd254.tar.gz |
When creating a package sort dependencies in such a way that if dependency
A depends on dependency B then dependency A will be in all cases listed
before B, so ``pkg_add -r'' will fetch/install packages in the correct order.
Previously dependencies were sorted just by its names, which is why
``pkg_add -r'' never actually worked properly.
To be usefull, hovewer, this fix requires that all packages have been
rebuilt, so it will take some time until users would be able to feel
posititive improvements. For the same reasons it is desirable to propagate
these changes to the 4-stable package building cluster *before* 4.3 ports
freeze, so packages for 4.3-RELEASE would be properly prepared.
Prompted by: kris
Insanely appreciated by: obrien
Silently approved by: jkh, -ports
Diffstat (limited to 'usr.sbin/pkg_install/delete')
-rw-r--r-- | usr.sbin/pkg_install/delete/perform.c | 71 |
1 files changed, 3 insertions, 68 deletions
diff --git a/usr.sbin/pkg_install/delete/perform.c b/usr.sbin/pkg_install/delete/perform.c index d5fe32a..120622c 100644 --- a/usr.sbin/pkg_install/delete/perform.c +++ b/usr.sbin/pkg_install/delete/perform.c @@ -30,7 +30,6 @@ static const char rcsid[] = static int pkg_do(char *); static void sanity_check(char *); static void undepend(PackingList, char *); -static int chkifdepends(char *pkgname1, char *pkgname2); static char LogDir[FILENAME_MAX]; @@ -38,10 +37,9 @@ int pkg_perform(char **pkgs) { char **matched; - char *tmp; - int i, j; + int i; int err_cnt = 0; - int loop_cnt, errcode; + int errcode; if (MatchType != MATCH_EXACT) { matched = matchinstalled(MatchType, pkgs, &errcode); @@ -65,36 +63,8 @@ pkg_perform(char **pkgs) } } + err_cnt += sortdeps(pkgs); for (i = 0; pkgs[i]; i++) { - /* - * Check to see if any other package in pkgs[i+1:] depends - * on pkgs[i] and deffer removal of pkgs[i] if so. - */ - loop_cnt = 0; - for (j = i + 1; pkgs[j]; j++) { - if (chkifdepends(pkgs[j], pkgs[i]) == 1) { - /* - * Try to avoid deadlock if package A depends on B which in - * turn depends on C and C due to an error depends on A. - * Use ugly but simple method, becase it Should Never - * Happen[tm] in the real life anyway. - */ - if (loop_cnt > 4096) { - warnx("dependency loop detected for package %s", pkgs[j]); - err_cnt++; - break; - } - loop_cnt++; - tmp = pkgs[i]; - pkgs[i] = pkgs[j]; - pkgs[j] = tmp; - /* - * Another iteration requred to check if new pkgs[i] - * itself has any packages that depend on it - */ - j = i + 1; - } - } err_cnt += pkg_do(pkgs[i]); } @@ -364,38 +334,3 @@ undepend(PackingList p, char *pkgname) return; } -/* - * Check to see if pkgname1 depends on pkgname2. - * Returns 1 if depends, 0 if not, and -1 if error occured. - */ -static int -chkifdepends(char *pkgname1, char *pkgname2) -{ - FILE *fp; - char fname[FILENAME_MAX]; - char fbuf[FILENAME_MAX]; - char *tmp; - int retval; - - sprintf(fname, "%s/%s/%s", - (tmp = getenv(PKG_DBDIR)) ? tmp : DEF_LOG_DIR, - pkgname2, REQUIRED_BY_FNAME); - fp = fopen(fname, "r"); - if (fp == NULL) { - /* Probably pkgname2 doesn't have any packages that depend on it */ - return 0; - } - - retval = 0; - while (fgets(fbuf, sizeof(fbuf), fp) != NULL) { - if (fbuf[strlen(fbuf)-1] == '\n') - fbuf[strlen(fbuf)-1] = '\0'; - if (strcmp(fbuf, pkgname1) == 0) { /* match */ - retval = 1; - break; - } - } - - fclose(fp); - return retval; -} |