summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-07-29 15:35:59 -0500
committerDan McGee <dan@archlinux.org>2011-09-28 04:52:37 -0500
commit7edeb276b63efeea7e8f266dfee792e2709ba412 (patch)
tree2f4b52b2c12b564b99825c99ec9ad874d8ed945a
parentbd83c8e7562a2d6794d4322845c23cc21985979a (diff)
downloadpacman-7edeb276b63efeea7e8f266dfee792e2709ba412.tar.xz
Keep track of explicitly added and removed packages
This allows us to sort the output list by showing all pulled dependencies first, followed by the explicitly specified targets. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--src/pacman/conf.c4
-rw-r--r--src/pacman/conf.h3
-rw-r--r--src/pacman/remove.c10
-rw-r--r--src/pacman/sync.c1
-rw-r--r--src/pacman/upgrade.c1
-rw-r--r--src/pacman/util.c18
-rw-r--r--src/pacman/util.h1
7 files changed, 33 insertions, 5 deletions
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 337522b8..fe2ebb3e 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -68,6 +68,9 @@ int config_free(config_t *oldconfig)
return -1;
}
+ alpm_list_free(oldconfig->explicit_adds);
+ alpm_list_free(oldconfig->explicit_removes);
+
FREELIST(oldconfig->holdpkg);
FREELIST(oldconfig->syncfirst);
FREELIST(oldconfig->ignorepkg);
@@ -84,7 +87,6 @@ int config_free(config_t *oldconfig)
free(oldconfig->print_format);
free(oldconfig->arch);
free(oldconfig);
- oldconfig = NULL;
return 0;
}
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 396cde5a..9e14925a 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -93,6 +93,9 @@ typedef struct __config_t {
/* our connection to libalpm */
alpm_handle_t *handle;
+
+ alpm_list_t *explicit_adds;
+ alpm_list_t *explicit_removes;
} config_t;
/* Operations */
diff --git a/src/pacman/remove.c b/src/pacman/remove.c
index 95a728ee..3fc8279c 100644
--- a/src/pacman/remove.c
+++ b/src/pacman/remove.c
@@ -33,16 +33,17 @@
static int remove_target(const char *target)
{
- alpm_pkg_t *info;
+ alpm_pkg_t *pkg;
alpm_db_t *db_local = alpm_option_get_localdb(config->handle);
alpm_list_t *p;
- if((info = alpm_db_get_pkg(db_local, target)) != NULL) {
- if(alpm_remove_pkg(config->handle, info) == -1) {
+ if((pkg = alpm_db_get_pkg(db_local, target)) != NULL) {
+ if(alpm_remove_pkg(config->handle, pkg) == -1) {
pm_fprintf(stderr, ALPM_LOG_ERROR, "'%s': %s\n", target,
alpm_strerror(alpm_errno(config->handle)));
return -1;
}
+ config->explicit_removes = alpm_list_add(config->explicit_removes, pkg);
return 0;
}
@@ -53,12 +54,13 @@ static int remove_target(const char *target)
return -1;
}
for(p = grp->packages; p; p = alpm_list_next(p)) {
- alpm_pkg_t *pkg = alpm_list_getdata(p);
+ pkg = alpm_list_getdata(p);
if(alpm_remove_pkg(config->handle, pkg) == -1) {
pm_fprintf(stderr, ALPM_LOG_ERROR, "'%s': %s\n", target,
alpm_strerror(alpm_errno(config->handle)));
return -1;
}
+ config->explicit_removes = alpm_list_add(config->explicit_removes, pkg);
}
return 0;
}
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 20a83b23..48ae30cf 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -612,6 +612,7 @@ static int process_pkg(alpm_pkg_t *pkg)
return 1;
}
}
+ config->explicit_adds = alpm_list_add(config->explicit_adds, pkg);
return 0;
}
diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c
index 565fb922..3d4e34c1 100644
--- a/src/pacman/upgrade.c
+++ b/src/pacman/upgrade.c
@@ -89,6 +89,7 @@ int pacman_upgrade(alpm_list_t *targets)
trans_release();
return 1;
}
+ config->explicit_adds = alpm_list_add(config->explicit_adds, pkg);
}
/* now that targets are resolved, we can hand it all off to the sync code */
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 2c02d963..aa93357e 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -892,6 +892,10 @@ static int target_cmp(const void *p1, const void *p2)
{
const pm_target_t *targ1 = p1;
const pm_target_t *targ2 = p2;
+ /* explicit are always sorted after implicit (e.g. deps, pulled targets) */
+ if(targ1->is_explicit != targ2->is_explicit) {
+ return targ1->is_explicit > targ2->is_explicit;
+ }
const char *name1 = targ1->install ?
alpm_pkg_get_name(targ1->install) : alpm_pkg_get_name(targ1->remove);
const char *name2 = targ2->install ?
@@ -899,6 +903,14 @@ static int target_cmp(const void *p1, const void *p2)
return strcmp(name1, name2);
}
+static int pkg_cmp(const void *p1, const void *p2)
+{
+ /* explicit cast due to (un)necessary removal of const */
+ alpm_pkg_t *pkg1 = (alpm_pkg_t *)p1;
+ alpm_pkg_t *pkg2 = (alpm_pkg_t *)p2;
+ return strcmp(alpm_pkg_get_name(pkg1), alpm_pkg_get_name(pkg2));
+}
+
void display_targets(void)
{
alpm_list_t *i, *targets = NULL;
@@ -910,6 +922,9 @@ void display_targets(void)
if(!targ) return;
targ->install = pkg;
targ->remove = alpm_db_get_pkg(db_local, alpm_pkg_get_name(pkg));
+ if(alpm_list_find(config->explicit_adds, pkg, pkg_cmp)) {
+ targ->is_explicit = 1;
+ }
targets = alpm_list_add(targets, targ);
}
for(i = alpm_trans_get_remove(config->handle); i; i = alpm_list_next(i)) {
@@ -917,6 +932,9 @@ void display_targets(void)
pm_target_t *targ = calloc(1, sizeof(pm_target_t));
if(!targ) return;
targ->remove = pkg;
+ if(alpm_list_find(config->explicit_removes, pkg, pkg_cmp)) {
+ targ->is_explicit = 1;
+ }
targets = alpm_list_add(targets, targ);
}
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 95b0d991..275f9913 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -42,6 +42,7 @@
typedef struct _pm_target_t {
alpm_pkg_t *remove;
alpm_pkg_t *install;
+ int is_explicit;
} pm_target_t;
void trans_init_error(void);