diff options
Diffstat (limited to 'src/pacman/remove.c')
-rw-r--r-- | src/pacman/remove.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/pacman/remove.c b/src/pacman/remove.c index 82d1c384..fb02e242 100644 --- a/src/pacman/remove.c +++ b/src/pacman/remove.c @@ -31,6 +31,36 @@ #include "util.h" #include "conf.h" +static int remove_target(char *target) +{ + pmpkg_t *info; + pmdb_t *db_local = alpm_option_get_localdb(); + alpm_list_t *p; + + if((info = alpm_db_get_pkg(db_local, target)) != NULL) { + if(alpm_remove_pkg(info) == -1) { + pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", target, alpm_strerrorlast()); + return(-1); + } + return(0); + } + + /* fallback to group */ + pmgrp_t *grp = alpm_db_readgrp(db_local, target); + if(grp == NULL) { + pm_fprintf(stderr, PM_LOG_ERROR, "'%s': target not found\n", target); + return(-1); + } + for(p = alpm_grp_get_pkgs(grp); p; p = alpm_list_next(p)) { + pmpkg_t *pkg = alpm_list_getdata(p); + if(alpm_remove_pkg(pkg) == -1) { + pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", target, alpm_strerrorlast()); + return(-1); + } + } + return(0); +} + /** * @brief Remove a specified list of packages. * @@ -62,8 +92,7 @@ int pacman_remove(alpm_list_t *targets) } else { targ = target; } - if(alpm_remove_target(targ) == -1) { - pm_fprintf(stderr, PM_LOG_ERROR, "'%s': %s\n", targ, alpm_strerrorlast()); + if(remove_target(targ) == -1) { retval = 1; goto cleanup; } |