From 5e463beb347e114bb4e4b2733f9576ada82a2772 Mon Sep 17 00:00:00 2001 From: ticktock35 Date: Mon, 15 Dec 2008 05:27:24 +0000 Subject: [PATCH] [opkg] Remove the orphan packages while upgrading git-svn-id: http://opkg.googlecode.com/svn/trunk@147 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- libopkg/opkg_install.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c index 370410a..e503d0a 100644 --- a/libopkg/opkg_install.c +++ b/libopkg/opkg_install.c @@ -627,6 +627,59 @@ static int unpack_pkg_control_files(opkg_conf_t *conf, pkg_t *pkg) return 0; } +static int pkg_remove_orphan_dependent(opkg_conf_t *conf, pkg_t *pkg, pkg_t *old_pkg) +{ + int i, j, found; + char *buf, *d_str; + pkg_t *p; + if (!old_pkg) + return 0; + if (!pkg) { + fprintf(stderr, "pkg shall not be NULL here. please send to the bugzilla!! [%s %d]\n", __FILE__, __LINE__); + return -1; + } + if (old_pkg->depends_count == 0) + return 0; + for (i=0;idepends_count;i++) { + found = 0; + for (j=0;jdepends_count;j++) { + if (!strcmp(old_pkg->depends_str[i], pkg->depends_str[j])) { + found = 1; + break; + } + } + if (found) + continue; + d_str = old_pkg->depends_str[i]; + buf = malloc (strlen (d_str) + 1); + j=0; + while (d_str[j] != '\0' && d_str[j] != ' ') { + buf[j]=d_str[j]; + ++j; + } + buf[j]='\0'; + buf = realloc (buf, strlen (buf) + 1); + p = pkg_hash_fetch_installed_by_name (&conf->pkg_hash, buf); + if (!p) { + fprintf(stderr, "The pkg %s had been removed!!\n", buf); + free(buf); + continue; + } + if (p->auto_installed) { + int deps; + abstract_pkg_t **dependents; + deps = pkg_has_installed_dependents(conf, NULL, p, &dependents); + if (deps == 0) { + opkg_message (conf, OPKG_NOTICE,"%s was autoinstalled but is now orphaned, remove it.\n", buf); + opkg_remove_pkg(conf, p, 0); + } else + opkg_message (conf, OPKG_INFO, "%s was autoinstalled and is still required by %d installed packages\n", buf, deps); + } + free(buf); + } + return 0; +} + /* returns number of installed replacees */ int pkg_get_installed_replacees(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t *installed_replacees) { @@ -908,6 +961,8 @@ int opkg_install_pkg(opkg_conf_t *conf, pkg_t *pkg, int from_upgrade) opkg_state_changed++; pkg->state_flag |= SF_FILELIST_CHANGED; + pkg_remove_orphan_dependent(conf, pkg, old_pkg); + /* XXX: BUG: we really should treat replacement more like an upgrade * Instead, we're going to remove the replacees */ -- 2.25.1