summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJudd Vinet <judd@archlinux.org>2003-09-29 02:58:58 +0200
committerJudd Vinet <judd@archlinux.org>2003-09-29 02:58:58 +0200
commit16f42002ecc15d135cb444a36d84251ce015d34c (patch)
tree7c48a619b72e9be1d61a4bbd79917f3998b41cf8
parent9d9ffa6cecb7d1a5e875c9d39fb3f4a0580c52df (diff)
downloadpacman-16f42002ecc15d135cb444a36d84251ce015d34c.tar.gz
pacman-16f42002ecc15d135cb444a36d84251ce015d34c.tar.xz
Imported from pacman-2.6.2.tar.gz
-rw-r--r--ChangeLog10
-rw-r--r--Makefile.in2
-rw-r--r--doc/pacman.8.in4
-rwxr-xr-xscripts/gensync4
-rwxr-xr-xscripts/makepkg2
-rwxr-xr-xscripts/makeworld4
-rw-r--r--src/db.c20
-rw-r--r--src/list.c21
-rw-r--r--src/list.h2
-rw-r--r--src/package.c36
-rw-r--r--src/package.h2
-rw-r--r--src/pacman.c203
-rw-r--r--src/pacman.h2
-rw-r--r--src/pacsync.c3
14 files changed, 171 insertions, 144 deletions
diff --git a/ChangeLog b/ChangeLog
index 9373c7c1..6b646c84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
VERSION DESCRIPTION
-----------------------------------------------------------------------------
+2.6.2 - Fixed a memory cleanup bug
+ - Aurelien's patch:
+ - bug #159 implemented (for -S and -R)
+ - fixed a bug with pacman -Sg (pacman was browsing only one
+ db to get groups)
+ - fixed a bug with list_merge()
+ - fixed some MLK (in dumppkg() and with "-Qi --orphans")
+ - now "pacman -Sg" only displays groups (without content)
+ whereas "pacman -Sg target1 target2" displays groups
+ target1 and target2 with content
2.6.1 - Added http download support (Aurelien Foret)
- Improved makepkg's --builddeps behaviour when called via
makeworld
diff --git a/Makefile.in b/Makefile.in
index 7fbd6da3..de0462ab 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
-PACVER = 2.6.1
+PACVER = 2.6.2
TOPDIR = @srcdir@
SRCDIR = $(TOPDIR)/src/
diff --git a/doc/pacman.8.in b/doc/pacman.8.in
index 9855ae3a..778a5974 100644
--- a/doc/pacman.8.in
+++ b/doc/pacman.8.in
@@ -1,4 +1,4 @@
-.TH pacman 8 "September 01, 2003" "pacman #VERSION#" ""
+.TH pacman 8 "September 28, 2003" "pacman #VERSION#" ""
.SH NAME
pacman \- package manager utility
.SH SYNOPSIS
@@ -98,7 +98,7 @@ diskspace, you can remove these packages by using the --clean option.
.TP
.B "\-g, \-\-groups"
Display all the members for each package group specified. If no group
-names are provided, all groups and members will be listed.
+names are provided, all groups will be listed.
.TP
.B "\-s, \-\-search <string>"
This will search each package in the package list for names or descriptions
diff --git a/scripts/gensync b/scripts/gensync
index 71634b2a..ad12d16c 100755
--- a/scripts/gensync
+++ b/scripts/gensync
@@ -20,7 +20,7 @@
# USA.
#
-myver='2.6.1'
+myver='2.6.2'
usage() {
echo "gensync $myver"
@@ -36,7 +36,7 @@ usage() {
echo " generated database must reside in the same directory as your"
echo " custom packages (also configured in /etc/pacman.conf)"
echo
- echo "example: gensync /usr/abs/local /home/mypkgs/custom.db.tar.gz"
+ echo "example: gensync /var/abs/local /home/mypkgs/custom.db.tar.gz"
echo
echo
exit 0
diff --git a/scripts/makepkg b/scripts/makepkg
index d8b0687a..9fa75865 100755
--- a/scripts/makepkg
+++ b/scripts/makepkg
@@ -20,7 +20,7 @@
# USA.
#
-myver='2.6.1'
+myver='2.6.2'
startdir=`pwd`
# source Arch's abs.conf if it's present
diff --git a/scripts/makeworld b/scripts/makeworld
index 1e5348f8..1c61ed17 100755
--- a/scripts/makeworld
+++ b/scripts/makeworld
@@ -21,7 +21,7 @@
#
toplevel=`pwd`
-version="2.6.1"
+version="2.6.2"
usage() {
echo "makeworld version $version"
@@ -38,7 +38,7 @@ usage() {
echo " where <category> is one or more directory names under the ABS root"
echo " eg: makeworld -c /packages base lib editors"
echo
- echo " this should be run from the toplevel directory of ABS (usually /usr/abs)"
+ echo " this should be run from the toplevel directory of ABS (usually /var/abs)"
}
if [ $# -lt 2 ]; then
diff --git a/src/db.c b/src/db.c
index 347c9e87..a9e4270e 100644
--- a/src/db.c
+++ b/src/db.c
@@ -73,10 +73,7 @@ PMList* db_loadpkgs(pacdb_t *db, PMList *pkgcache)
/* if pm_packages already contains data, free it first */
for(lp = pkgcache; lp; lp = lp->next) {
- if(lp->data) {
- freepkg(lp->data);
- lp->data = NULL;
- }
+ FREEPKG(lp->data);
}
list_free(pkgcache);
@@ -522,8 +519,7 @@ PMList* db_find_conflicts(pacdb_t *db, PMList *targets, char *root)
}
}
}
- freepkg(dbpkg);
- dbpkg = NULL;
+ FREEPKG(dbpkg);
}
return(conflicts);
@@ -540,10 +536,10 @@ PMList *whatprovides(pacdb_t *db, char* package)
if(is_in(package, info->provides)) {
i = list_add(i, strdup(info->name));
}
- freepkg(info);
+ FREEPKG(info);
}
pkgs = list_sort(i);
- list_free(i);
+ FREELIST(i);
return(pkgs);
}
@@ -565,10 +561,10 @@ PMList *find_groups(pacdb_t *db)
i = list_add(i, strdup((char*)lp->data));
}
}
- freepkg(info);
+ FREEPKG(info);
}
groups = list_sort(i);
- list_free(i);
+ FREELIST(i);
return(groups);
}
@@ -590,10 +586,10 @@ PMList *pkg_ingroup(pacdb_t *db, char *group)
i = list_add(i, strdup(info->name));
}
}
- freepkg(info);
+ FREEPKG(info);
}
pkg = list_sort(i);
- list_free(i);
+ FREELIST(i);
return(pkg);
}
diff --git a/src/list.c b/src/list.c
index 37f96530..d3ccfc89 100644
--- a/src/list.c
+++ b/src/list.c
@@ -115,21 +115,28 @@ int is_in(char *needle, PMList *haystack)
}
/* List one is extended and returned
- * List two is freed (but not its data)
*/
PMList* list_merge(PMList *one, PMList *two)
{
- PMList *lp;
+ PMList *lp, *ptr;
+
+ if(two == NULL) {
+ return one;
+ }
+
+ ptr = one;
+ if(ptr == NULL) {
+ ptr = list_new();
+ }
for(lp = two; lp; lp = lp->next) {
if(lp->data) {
- list_add(one, lp->data);
+ ptr = list_add(ptr, lp->data);
lp->data = NULL;
}
}
- list_free(two);
- return(one);
+ return(ptr);
}
PMList* list_last(PMList *list)
@@ -193,7 +200,7 @@ void list_display(const char *title, PMList *list)
}
len = strlen(title);
- printf("%s", title);
+ printf("%s ", title);
if(list) {
for(lp = list, cols = len; lp; lp = lp->next) {
@@ -202,7 +209,7 @@ void list_display(const char *title, PMList *list)
int i;
cols = len;
printf("\n");
- for (i = 0; i < len; i++) {
+ for (i = 0; i < len+1; i++) {
printf(" ");
}
}
diff --git a/src/list.h b/src/list.h
index 16c7c19d..929c7d91 100644
--- a/src/list.h
+++ b/src/list.h
@@ -21,6 +21,8 @@
#ifndef _PAC_LIST_H
#define _PAC_LIST_H
+#define FREELIST(p) { list_free(p); p = NULL; }
+
/* your average linked list */
typedef struct __pmlist_t {
void* data;
diff --git a/src/package.c b/src/package.c
index b4a26387..cffc2f51 100644
--- a/src/package.c
+++ b/src/package.c
@@ -251,14 +251,14 @@ void freepkg(pkginfo_t *pkg)
return;
}
- list_free(pkg->files);
- list_free(pkg->backup);
- list_free(pkg->depends);
- list_free(pkg->conflicts);
- list_free(pkg->requiredby);
- list_free(pkg->groups);
- list_free(pkg->provides);
- list_free(pkg->replaces);
+ FREELIST(pkg->files);
+ FREELIST(pkg->backup);
+ FREELIST(pkg->depends);
+ FREELIST(pkg->conflicts);
+ FREELIST(pkg->requiredby);
+ FREELIST(pkg->groups);
+ FREELIST(pkg->provides);
+ FREELIST(pkg->replaces);
FREE(pkg);
return;
}
@@ -310,8 +310,8 @@ void dump_pkg(pkginfo_t *info)
printf("Name : %s\n", info->name);
printf("Version : %s\n", info->version);
pm = list_sort(info->groups);
- list_display("Groups : ", pm);
- FREE(pm);
+ list_display("Groups :", pm);
+ FREELIST(pm);
printf("Packager : %s\n", info->packager);
printf("URL : %s\n", (info->url ? info->url : "None"));
printf("Size : %ld\n", info->size);
@@ -319,17 +319,17 @@ void dump_pkg(pkginfo_t *info)
printf("Install Date : %s %s\n", info->installdate, strlen(info->installdate) ? "UTC" : "");
printf("Install Script : %s\n", (info->scriptlet ? "Yes" : "No"));
pm = list_sort(info->provides);
- list_display("Provides : ", pm);
- FREE(pm);
+ list_display("Provides :", pm);
+ FREELIST(pm);
pm = list_sort(info->depends);
- list_display("Depends On : ", pm);
- FREE(pm);
+ list_display("Depends On :", pm);
+ FREELIST(pm);
pm = list_sort(info->requiredby);
- list_display("Required By : ", pm);
- FREE(pm);
+ list_display("Required By :", pm);
+ FREELIST(pm);
pm = list_sort(info->conflicts);
- list_display("Conflicts With : ", pm);
- FREE(pm);
+ list_display("Conflicts With :", pm);
+ FREELIST(pm);
printf("Description : %s\n", info->desc);
}
diff --git a/src/package.h b/src/package.h
index 91d87e12..11547057 100644
--- a/src/package.h
+++ b/src/package.h
@@ -23,6 +23,8 @@
#include "list.h"
+#define FREEPKG(p) { freepkg(p); p = NULL; }
+
/* mods for depend_t.mod */
#define DEP_ANY 0
#define DEP_EQ 1
diff --git a/src/pacman.c b/src/pacman.c
index e9eb57eb..92476fe6 100644
--- a/src/pacman.c
+++ b/src/pacman.c
@@ -175,7 +175,7 @@ int main(int argc, char *argv[])
/* db location */
vprint("Top-level DB Path: %s%s\n", pmo_root, pmo_dbpath);
if(pmo_verbose) {
- list_display("Targets: ", pm_targets);
+ list_display("Targets:", pm_targets);
}
db_local = db_open(pmo_root, pmo_dbpath, "local");
@@ -213,6 +213,7 @@ int main(int argc, char *argv[])
ret = 1;
}
db_close(db_local);
+ FREELIST(pm_packages);
FREE(pmo_root);
FREE(pmo_dbpath);
cleanup(ret);
@@ -244,9 +245,8 @@ int pacman_deptest(pacdb_t *db, PMList *targets)
}
list = list_add(list, dummy);
deps = checkdeps(db, PM_ADD, list);
- freepkg(dummy);
- list->data = NULL;
- list_free(list);
+ FREELIST(list);
+ FREEPKG(dummy);
if(deps) {
/* return 126 = deps were missing, but successfully resolved
@@ -286,8 +286,7 @@ int pacman_deptest(pacdb_t *db, PMList *targets)
ret = 127;
}
}
- list_free(synctargs);
- synctargs = NULL;
+ FREELIST(synctargs);
return(ret);
}
return(0);
@@ -417,18 +416,18 @@ int pacman_sync(pacdb_t *db, PMList *targets)
i = list_add(i, strdup((char *)pm->data));
}
}
- list_free(k);
+ FREELIST(k);
}
allgroups = list_sort(i);
- list_free(i);
+ FREELIST(i);
if(targets) {
groups = NULL;
for(j = targets; j; j = j->next) {
if(is_in((char *)j->data, allgroups)) {
- groups = list_add(groups, (char *)j->data);
+ groups = list_add(groups, strdup((char *)j->data));
}
}
- list_free(allgroups);
+ FREELIST(allgroups);
} else {
groups = allgroups;
}
@@ -436,24 +435,22 @@ int pacman_sync(pacdb_t *db, PMList *targets)
for(pm = groups; pm; pm = pm->next) {
PMList *pkg;
printf("%s\n", (char *)pm->data);
+ if(targets == NULL) {
+ continue;
+ }
i = NULL;
for(j = databases; j; j = j->next) {
- PMList *lp;
dbsync_t *dbs = (dbsync_t*)j->data;
- k = pkg_ingroup(dbs->db, (char *)pm->data);
- for(lp = k; lp; lp = lp->next) {
- if(!is_in((char *)lp->data, i)) {
- i = list_add(i, strdup((char *)lp->data));
- }
- }
- list_free(k);
+ PMList *l = pkg_ingroup(dbs->db, (char *)pm->data);
+ i = list_merge(i, l);
+ FREELIST(l);
}
pkg = list_sort(i);
- list_free(i);
- list_display(" ", pkg);
- list_free(pkg);
+ FREELIST(i);
+ list_display(" ", pkg);
+ FREELIST(pkg);
}
- list_free(groups);
+ FREELIST(groups);
} else if(pmo_s_upgrade) {
int newer = 0;
int ignore = 0;
@@ -573,24 +570,17 @@ int pacman_sync(pacdb_t *db, PMList *targets)
/* process targets */
for(i = targets; i && allgood; i = i->next) {
if(i->data) {
- int cmp, found = 0, group = 0;
+ int cmp, found = 0;
pkginfo_t *local;
syncpkg_t *sync = NULL;
MALLOC(sync, sizeof(syncpkg_t));
sync->replaces = NULL;
- local = db_scan(db, (char*)i->data, INFRQ_DESC);
for(j = databases; !found && j; j = j->next) {
dbsync_t *dbs = (dbsync_t*)j->data;
for(k = dbs->pkgcache; !found && k; k = k->next) {
pkginfo_t *pkg = (pkginfo_t*)k->data;
- if(is_in((char*)i->data, pkg->groups)) {
- group = 1;
- if(!yesno(":: install %s from group %s? [Y/n] ", pkg->name, (char*)i->data)) {
- continue;
- }
- targets = list_add(targets, strdup(pkg->name));
- } else if(!strcmp((char*)i->data, pkg->name)) {
+ if(!strcmp((char*)i->data, pkg->name)) {
found = 1;
sync->dbs = dbs;
/* re-fetch the package record with dependency info */
@@ -601,37 +591,60 @@ int pacman_sync(pacdb_t *db, PMList *targets)
}
}
}
- if(!found || group) {
- if(!group) {
+ if(!found) {
+ /* target not found: check if it's a group */
+ k = NULL;
+ for(j = databases; j; j = j->next) {
+ dbsync_t *dbs = (dbsync_t*)j->data;
+ PMList *l = pkg_ingroup(dbs->db, (char *)i->data);
+ k = list_merge(k, l);
+ FREELIST(l);
+ }
+ if(k != NULL) {
+ printf(":: group %s:\n", (char*)i->data);
+ list_display(" ", k);
+ if(yesno(" Install whole content? [Y/n] ")) {
+ targets = list_merge(targets, k);
+ FREELIST(k);
+ } else {
+ PMList *l;
+ for(l = k; l; l = l->next) {
+ if(yesno(":: install %s from group %s? [Y/n] ", (char*)l->data, (char*)i->data)) {
+ targets = list_add(targets, strdup((char*)l->data));
+ }
+ }
+ }
+ FREELIST(k);
+ } else {
fprintf(stderr, "%s: not found in sync db\n", (char*)i->data);
allgood = 0;
}
- freepkg(local);
FREE(sync);
continue;
}
+ local = db_scan(db, (char*)i->data, INFRQ_DESC);
if(local && !pmo_s_downloadonly) {
/* this is an upgrade, compare versions and determine if it is necessary */
cmp = rpmvercmp(local->version, sync->pkg->version);
if(cmp > 0) {
/* local version is newer - get confirmation first */
if(!yesno(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] ", local->name, local->version)) {
- freepkg(local);
- freepkg(sync->pkg);
+ FREEPKG(local);
+ FREEPKG(sync->pkg);
FREE(sync);
continue;
}
} else if(cmp == 0) {
/* versions are identical */
if(!yesno(":: %s-%s: is up to date. Upgrade anyway? [Y/n] ", local->name, local->version)) {
- freepkg(local);
- freepkg(sync->pkg);
+ FREEPKG(local);
+ FREEPKG(sync->pkg);
FREE(sync);
continue;
}
}
}
- freepkg(local);
+ FREEPKG(local);
found = (find_pkginsync(sync->pkg->name, final) != NULL);
if(!found && !pmo_nodeps) {
@@ -739,8 +752,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
for(i = list; i; i = i->next) {
i->data = NULL;
}
- list_free(list);
- list = NULL;
+ FREELIST(list);
}
/* any packages in rmtargs need to be removed from final. */
@@ -761,7 +773,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
}
i->data = NULL;
}
- list_free(final);
+ FREELIST(final);
final = k;
/* list targets */
@@ -781,8 +793,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
printf("\nRemove: ");
indentprint(buildstring(list), 9);
printf("\n");
- list_free(list);
- list = NULL;
+ FREELIST(list);
}
for(i = final; i; i = i->next) {
syncpkg_t *s = (syncpkg_t*)i->data;
@@ -796,8 +807,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
printf("\nTargets: ");
indentprint(buildstring(list), 9);
printf("\n");
- list_free(list);
- list = NULL;
+ FREELIST(list);
}
/* get confirmation */
@@ -886,8 +896,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
allgood = 0;
}
count += list_count(files);
- list_free(files);
- files = NULL;
+ FREELIST(files);
}
if(count == list_count(final)) {
done = 1;
@@ -896,18 +905,14 @@ int pacman_sync(pacdb_t *db, PMList *targets)
printf("\n");
/* double-check */
- if(files) {
- list_free(files);
- files = NULL;
- }
+ FREELIST(files);
if(!pmo_s_downloadonly) {
/* remove any conflicting packages (WITH dep checks) */
if(rmtargs) {
int retcode;
retcode = pacman_remove(db, rmtargs);
- list_free(rmtargs);
- rmtargs = NULL;
+ FREELIST(rmtargs);
if(retcode == 1) {
fprintf(stderr, "\nupgrade aborted.\n");
allgood = 0;
@@ -915,8 +920,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
/* reload package cache */
pm_packages = db_loadpkgs(db, pm_packages);
}
- list_free(rmtargs);
- rmtargs = NULL;
+ FREELIST(rmtargs);
for(i = final; allgood && i; i = i->next) {
char *str;
syncpkg_t *sync = (syncpkg_t*)i->data;
@@ -927,7 +931,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
}
for(j = sync->replaces; j; j = j->next) {
pkginfo_t *pkg = (pkginfo_t*)j->data;
- rmtargs = list_add(rmtargs, pkg->name);
+ rmtargs = list_add(rmtargs, strdup(pkg->name));
}
}
/* remove to-be-replaced packages */
@@ -973,7 +977,7 @@ int pacman_sync(pacdb_t *db, PMList *targets)
}
}
db_write(db, new);
- freepkg(new);
+ FREEPKG(new);
}
}
}
@@ -991,12 +995,11 @@ int pacman_sync(pacdb_t *db, PMList *targets)
for(i = final; i; i = i->next) {
syncpkg_t *sync = (syncpkg_t*)i->data;
if(sync) {
- freepkg(sync->pkg);
+ FREEPKG(sync->pkg);
for(j = sync->replaces; j; j = j->next) {
- freepkg(j->data);
- j->data = NULL;
+ FREEPKG(j->data);
}
- list_free(sync->replaces);
+ FREELIST(sync->replaces);
}
FREE(sync);
i->data = NULL;
@@ -1016,14 +1019,14 @@ int pacman_sync(pacdb_t *db, PMList *targets)
j->data = NULL;
}
}
- list_free(dbs->pkgcache);
+ FREELIST(dbs->pkgcache);
FREE(dbs);
i->data = NULL;
}
- list_free(databases);
- list_free(final);
- list_free(trail);
- list_free(rmtargs);
+ FREELIST(databases);
+ FREELIST(final);
+ FREELIST(trail);
+ FREELIST(rmtargs);
return(!allgood);
}
@@ -1063,11 +1066,10 @@ int pacman_add(pacdb_t *db, PMList *targets)
/* only upgrade/install this package if it is already installed and at a lesser version */
pkginfo_t *dummy = db_scan(db, info->name, INFRQ_DESC);
if(dummy == NULL || rpmvercmp(dummy->version, info->version) >= 0) {
- freepkg(info);
- info = NULL;
+ FREEPKG(info);
continue;
}
- freepkg(dummy);
+ FREEPKG(dummy);
}
alltargs = list_add(alltargs, info);
filenames = list_add(filenames, strdup(targ->data));
@@ -1151,7 +1153,7 @@ int pacman_add(pacdb_t *db, PMList *targets)
}
lp->data = NULL;
}
- list_free(alltargs);
+ FREELIST(alltargs);
alltargs = k;
/* make sure pacman_remove does it's own dependency check */
pmo_upgrade = 0;
@@ -1167,7 +1169,7 @@ int pacman_add(pacdb_t *db, PMList *targets)
}
}
if(errorout) {
- list_free(lp);
+ FREELIST(lp);
return(1);
}
list_free(lp);
@@ -1180,7 +1182,7 @@ int pacman_add(pacdb_t *db, PMList *targets)
for(j = alltargs; j; j = j->next) {
j->data = NULL;
}
- list_free(alltargs);
+ FREELIST(alltargs);
alltargs = lp;
}
@@ -1194,11 +1196,11 @@ int pacman_add(pacdb_t *db, PMList *targets)
printf(" %s\n", (char*)j->data);
}
printf("\n");
- list_free(lp);
+ FREELIST(lp);
return(1);
}
printf("done.\n");
- list_free(lp);
+ FREELIST(lp);
}
/* this can get modified in the next for loop, so we reset it on each iteration */
@@ -1317,7 +1319,7 @@ int pacman_add(pacdb_t *db, PMList *targets)
/* 32 for the hash, 1 for the terminating NULL, and 1 for the tab delimiter */
MALLOC(fn, strlen(lp->data)+34);
sprintf(fn, "%s\t%s", (char*)lp->data, md5_pkg);
- free(lp->data);
+ FREE(lp->data);
lp->data = fn;
}
}
@@ -1519,11 +1521,10 @@ int pacman_add(pacdb_t *db, PMList *targets)
/* clean up */
for(lp = alltargs; lp; lp = lp->next) {
- freepkg((pkginfo_t*)lp->data);
- lp->data = NULL;
+ FREEPKG(lp->data);
}
- list_free(alltargs);
- list_free(filenames);
+ FREELIST(alltargs);
+ FREELIST(filenames);
/* run ldconfig if it exists */
snprintf(expath, PATH_MAX, "%setc/ld.so.conf", pmo_root);
@@ -1564,19 +1565,27 @@ int pacman_remove(pacdb_t *db, PMList *targets)
/* if the target is a group, ask if its packages should be removed */
groups = find_groups(db);
if(is_in((char *)lp->data, groups)) {
- PMList *pkg;
- pkg = pkg_ingroup(db, (char *)lp->data);
- for(j = pkg; j; j = j->next) {
- if(yesno(":: Remove %s from group %s? [Y/n] ", (char *)j->data, (char *)lp->data)) {
+ PMList *pkgs = pkg_ingroup(db, (char *)lp->data);
+ printf(":: group %s:\n", (char*)lp->data);
+ list_display(" ", pkgs);
+ if(yesno(" Remove whole content? [Y/n] ")) {
+ for(j = pkgs; j; j = j->next) {
info = db_scan(db, (char *)j->data, INFRQ_ALL);
alltargs = list_add(alltargs, info);
}
+ } else {
+ for(j = pkgs; j; j = j->next) {
+ if(yesno(":: remove %s from group %s? [Y/n] ", (char*)j->data, (char*)lp->data)) {
+ info = db_scan(db, (char *)j->data, INFRQ_ALL);
+ alltargs = list_add(alltargs, info);
+ }
+ }
}
- list_free(pkg);
- list_free(groups);
+ FREELIST(pkgs);
+ FREELIST(groups);
continue;
}
- list_free(groups);
+ FREELIST(groups);
fprintf(stderr, "error: could not find %s in database\n", (char*)lp->data);
return(1);
}
@@ -1599,7 +1608,7 @@ int pacman_remove(pacdb_t *db, PMList *targets)
lp = checkdeps(db, PM_REMOVE, alltargs);
}
/* list targets */
- list_display("\nTargets: ", alltargs);
+ list_display("\nTargets:", alltargs);
/* get confirmation */
if(yesno("\nDo you want to remove these packages? [Y/n] ") == 0) {
list_free(alltargs);
@@ -1758,7 +1767,7 @@ int pacman_remove(pacdb_t *db, PMList *targets)
}
}
- list_free(alltargs);
+ FREELIST(alltargs);
/* run ldconfig if it exists */
snprintf(line, PATH_MAX, "%setc/ld.so.conf", pmo_root);
@@ -1803,20 +1812,21 @@ int pacman_query(pacdb_t *db, PMList *targets)
for(q = pkg; q; q = q->next) {
printf("%s %s\n", (char *)lp->data, (char *)q->data);
}
- list_free(pkg);
+ FREELIST(pkg);
}
} else {
if(!is_in(package, groups)) {
fprintf(stderr, "Group \"%s\" was not found.\n", package);
+ FREELIST(groups);
return(2);
}
pkg = pkg_ingroup(db, package);
for(q = pkg; q; q = q->next) {
printf("%s %s\n", package, (char *)q->data);
}
- list_free(pkg);
+ FREELIST(pkg);
}
- list_free(groups);
+ FREELIST(groups);
continue;
}
@@ -1840,7 +1850,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
} else {
printf("%s %s\n", info->name, info->version);
}
- freepkg(info);
+ FREEPKG(info);
continue;
}
@@ -1862,7 +1872,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
gotcha = 1;
}
}
- freepkg(info);
+ FREEPKG(info);
}
if(!gotcha) {
fprintf(stderr, "No package owns %s\n", package);
@@ -1888,7 +1898,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
for(q = info->files; q; q = q->next) {
printf("%s %s%s\n", info->name, pmo_root, (char*)q->data);
}
- freepkg(info);
+ FREEPKG(info);
} else if(pmo_q_orphans) {
info = db_scan(db, tmpp->name, INFRQ_DESC | INFRQ_DEPENDS);
if(info == NULL) {
@@ -1897,6 +1907,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
if(info->requiredby == NULL) {
printf("%s %s\n", tmpp->name, tmpp->version);
}
+ FREEPKG(info);
} else {
printf("%s %s\n", tmpp->name, tmpp->version);
}
@@ -1937,7 +1948,7 @@ int pacman_query(pacdb_t *db, PMList *targets)
}
printf("%s %s\n", info->name, info->version);
}
- freepkg(info);
+ FREEPKG(info);
}
}
diff --git a/src/pacman.h b/src/pacman.h
index 20950094..c4810d39 100644
--- a/src/pacman.h
+++ b/src/pacman.h
@@ -22,7 +22,7 @@
#define _PAC_PACMAN_H
#ifndef PACVER
-#define PACVER "2.6.1"
+#define PACVER "2.6.2"
#endif
#ifndef PKGDIR
diff --git a/src/pacsync.c b/src/pacsync.c
index 60a0780a..a3d7a734 100644
--- a/src/pacsync.c
+++ b/src/pacsync.c
@@ -69,8 +69,7 @@ int sync_synctree()
fprintf(stderr, "failed to synchronize %s\n", sync->treename);
success = 0;
}
- list_free(files);
- files = NULL;
+ FREELIST(files);
snprintf(path, PATH_MAX, "%s/%s.db.tar.gz", ldir, sync->treename);
if(success) {