summaryrefslogtreecommitdiffstats
path: root/src/pacman/remove.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pacman/remove.c')
-rw-r--r--src/pacman/remove.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/pacman/remove.c b/src/pacman/remove.c
index 1e2cadaf..fb02e242 100644
--- a/src/pacman/remove.c
+++ b/src/pacman/remove.c
@@ -1,7 +1,7 @@
/*
* remove.c
*
- * Copyright (c) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org>
+ * Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org>
* Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
*
* This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,35 @@
#include "util.h"
#include "conf.h"
-extern pmdb_t *db_local;
+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.
@@ -64,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;
}