From 797b3dad4652a696bc003ea894f06e8d36ad1ee7 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Thu, 2 Apr 2009 03:08:20 +0200 Subject: [PATCH] Remove currrent installed pkg first while updating a package. --HG-- extra : convert_revision : 8d93d1a59f47edf468781c66116bba45a3ecd70b --- bin/xbps-bin/main.c | 4 ++-- include/remove.h | 2 +- lib/install.c | 11 +++++++++-- lib/remove.c | 27 +++++++++++++++------------ 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/bin/xbps-bin/main.c b/bin/xbps-bin/main.c index bcf28adfcff..cd5849c0dbb 100644 --- a/bin/xbps-bin/main.c +++ b/bin/xbps-bin/main.c @@ -281,7 +281,7 @@ main(int argc, char **argv) (void)fflush(stdout); - rv = xbps_remove_binary_pkg(argv[1]); + rv = xbps_remove_binary_pkg(argv[1], false); if (rv != 0) { if (!verbose) printf("failed! (%s)\n", strerror(rv)); @@ -380,7 +380,7 @@ main(int argc, char **argv) (void)fflush(stdout); - rv = xbps_remove_binary_pkg(pkgname); + rv = xbps_remove_binary_pkg(pkgname, false); if (rv != 0) { if (!verbose) printf("failed! (%s)\n", strerror(rv)); diff --git a/include/remove.h b/include/remove.h index 47ea064d2c0..81734be6e3a 100644 --- a/include/remove.h +++ b/include/remove.h @@ -27,7 +27,7 @@ #define _XBPS_REMOVE_H_ /* From lib/remove.c */ -int xbps_remove_binary_pkg(const char *); +int xbps_remove_binary_pkg(const char *, bool); int xbps_unregister_pkg(const char *); #endif /* !_XBPS_REMOVE_H_ */ diff --git a/lib/install.c b/lib/install.c index 14b7c78748c..c0d85e4037f 100644 --- a/lib/install.c +++ b/lib/install.c @@ -58,15 +58,22 @@ xbps_install_binary_pkg_fini(prop_dictionary_t repo, prop_dictionary_t pkgrd, automatic = true; if (update == true) { + /* + * Update a package, firstly removing current package. + */ instpkg = xbps_find_pkg_installed_from_plist(pkgname); if (instpkg == NULL) return EINVAL; prop_dictionary_get_cstring_nocopy(instpkg, "version", &instver); - printf("Updating %s-%s to %s ...\n", pkgname, - instver, version); + printf("Removing current package %s-%s ...\n", pkgname, + instver); prop_object_release(instpkg); + rv = xbps_remove_binary_pkg(pkgname, update); + if (rv != 0) + return rv; + printf("Installing new package %s-%s ...\n", pkgname, version); } else { printf("Installing %s%s: found version %s ...\n", automatic ? "dependency " : "", pkgname, version); diff --git a/lib/remove.c b/lib/remove.c index 82e7a8da11e..1bf7a7b84b8 100644 --- a/lib/remove.c +++ b/lib/remove.c @@ -205,7 +205,7 @@ out: } int -xbps_remove_binary_pkg(const char *pkgname) +xbps_remove_binary_pkg(const char *pkgname, bool update) { prop_dictionary_t dict; const char *rootdir = xbps_get_rootdir(); @@ -305,18 +305,21 @@ xbps_remove_binary_pkg(const char *pkgname) free(buf); /* - * Update the required_by array of all required dependencies. + * Update the required_by array of all required dependencies + * and unregister package if this is really a removal and + * not an update. */ - rv = xbps_requiredby_pkg_remove(pkgname); - if (rv != 0) - return rv; - - /* - * Unregister pkg from database. - */ - rv = xbps_unregister_pkg(pkgname); - if (rv != 0) - return rv; + if (update == false) { + rv = xbps_requiredby_pkg_remove(pkgname); + if (rv != 0) + return rv; + /* + * Unregister pkg from database. + */ + rv = xbps_unregister_pkg(pkgname); + if (rv != 0) + return rv; + } /* * Remove pkg metadata directory.