xbps-bin(8): remove specified pkgs first in recursive case.

Previously the specified pkg(s) were added at the tail of the
array, which was wrong. Add pkg(s) to the head of the array so that:

$ xbps-bin -Rp remove foo blah

foo and blah will be removed before any of its automatic dependecies.
This commit is contained in:
Juan RP 2011-10-24 10:23:07 +02:00
parent 4f8e6c00af
commit 746d9894c2

View File

@ -123,17 +123,20 @@ int
remove_installed_pkgs(int argc, char **argv, bool yes, bool purge, remove_installed_pkgs(int argc, char **argv, bool yes, bool purge,
bool force_rm_with_deps, bool recursive_rm) bool force_rm_with_deps, bool recursive_rm)
{ {
prop_array_t sorted_pkgs, orphans, reqby, orphans_user = NULL; prop_array_t sorted, unsorted, orphans, reqby, orphans_user = NULL;
prop_dictionary_t dict; prop_dictionary_t dict;
size_t x; size_t x;
const char *version, *pkgver, *pkgname; const char *version, *pkgver, *pkgname;
int i, rv = 0; int i, rv = 0;
bool found = false, reqby_force = false; bool found = false, reqby_force = false;
sorted_pkgs = prop_array_create(); unsorted = prop_array_create();
if (sorted_pkgs == NULL) if (unsorted == NULL)
return -1; return -1;
sorted = prop_array_create();
if (sorted == NULL)
return -1;
/* /*
* If recursively removing packages, find out which packages * If recursively removing packages, find out which packages
* would be orphans if the supplied packages were already removed. * would be orphans if the supplied packages were already removed.
@ -154,7 +157,7 @@ remove_installed_pkgs(int argc, char **argv, bool yes, bool purge,
return EINVAL; return EINVAL;
} }
for (x = 0; x < prop_array_count(orphans); x++) for (x = 0; x < prop_array_count(orphans); x++)
prop_array_add(sorted_pkgs, prop_array_get(orphans, x)); prop_array_add(unsorted, prop_array_get(orphans, x));
prop_object_release(orphans); prop_object_release(orphans);
} }
@ -171,7 +174,7 @@ remove_installed_pkgs(int argc, char **argv, bool yes, bool purge,
* Check that current package is not required by * Check that current package is not required by
* other installed packages. * other installed packages.
*/ */
prop_array_add(sorted_pkgs, dict); prop_array_add(sorted, dict);
found = true; found = true;
prop_dictionary_get_cstring_nocopy(dict, "pkgver", &pkgver); prop_dictionary_get_cstring_nocopy(dict, "pkgver", &pkgver);
reqby = prop_dictionary_get(dict, "requiredby"); reqby = prop_dictionary_get(dict, "requiredby");
@ -193,44 +196,50 @@ remove_installed_pkgs(int argc, char **argv, bool yes, bool purge,
prop_object_release(dict); prop_object_release(dict);
} }
if (!found) { if (!found) {
prop_object_release(sorted_pkgs); prop_object_release(unsorted);
return 0; return 0;
} }
if (reqby_force && !force_rm_with_deps) { if (reqby_force && !force_rm_with_deps) {
prop_object_release(sorted_pkgs); prop_object_release(unsorted);
prop_object_release(sorted);
return EINVAL; return EINVAL;
} }
for (x = 0; x < prop_array_count(unsorted); x++) {
dict = prop_array_get(unsorted, x);
prop_array_add(sorted, dict);
}
prop_object_release(unsorted);
/* /*
* Show the list of going-to-be removed packages. * Show the list of going-to-be removed packages.
*/ */
printf("The following packages will be removed:\n\n"); printf("The following packages will be removed:\n\n");
for (x = 0; x < prop_array_count(sorted_pkgs); x++) { for (x = 0; x < prop_array_count(sorted); x++) {
dict = prop_array_get(sorted_pkgs, x); dict = prop_array_get(sorted, x);
prop_dictionary_get_cstring_nocopy(dict, "pkgver", &pkgver); prop_dictionary_get_cstring_nocopy(dict, "pkgver", &pkgver);
print_package_line(pkgver, false); print_package_line(pkgver, false);
} }
printf("\n\n"); printf("\n\n");
printf("%u package%s will be removed%s.\n\n", printf("%u package%s will be removed%s.\n\n",
prop_array_count(sorted_pkgs), prop_array_count(sorted),
prop_array_count(sorted_pkgs) == 1 ? "" : "s", prop_array_count(sorted) == 1 ? "" : "s",
purge ? " and purged" : ""); purge ? " and purged" : "");
if (!yes && !noyes("Do you want to continue?")) { if (!yes && !noyes("Do you want to continue?")) {
printf("Cancelling!\n"); printf("Cancelling!\n");
prop_object_release(sorted_pkgs); prop_object_release(sorted);
return 0; return 0;
} }
for (x = 0; x < prop_array_count(sorted_pkgs); x++) { for (x = 0; x < prop_array_count(sorted); x++) {
dict = prop_array_get(sorted_pkgs, x); dict = prop_array_get(sorted, x);
prop_dictionary_get_cstring_nocopy(dict, "pkgname", &pkgname); prop_dictionary_get_cstring_nocopy(dict, "pkgname", &pkgname);
prop_dictionary_get_cstring_nocopy(dict, "version", &version); prop_dictionary_get_cstring_nocopy(dict, "version", &version);
if ((rv = pkg_remove_and_purge(pkgname, version, purge)) != 0) { if ((rv = pkg_remove_and_purge(pkgname, version, purge)) != 0) {
prop_object_release(sorted_pkgs); prop_object_release(sorted);
return rv; return rv;
} }
} }
prop_object_release(sorted_pkgs); prop_object_release(sorted);
return 0; return 0;
} }