From f8d7cd6b2623a864aa85fbdcdd629f3ff92a631c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 25 Jul 2010 22:31:55 -0500 Subject: Maintain a list of seen packages when installing a group As reported in FS#20221, we don't always do the right thing when installing a group and using the --needed option. This was due to the code pulling packages based on what was already in the transaction's add list, but completely ignoring the fact that we may have already seen and skipped this same package in an earlier repository. Add a list to the private _alpm_sync_pkg() function that allows us to have this extra information so we don't mistakenly downgrade a package when using --needed. Signed-off-by: Dan McGee --- lib/libalpm/sync.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'lib/libalpm/sync.c') diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 68ee8dc7..bc7c3dc2 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -202,7 +202,7 @@ int SYMEXPORT alpm_sync_sysupgrade(int enable_downgrade) return(0); } -int _alpm_sync_pkg(pmpkg_t *spkg) +int _alpm_sync_pkg(pmpkg_t *spkg, alpm_list_t *pkg_list) { pmtrans_t *trans; pmdb_t *db_local; @@ -213,7 +213,7 @@ int _alpm_sync_pkg(pmpkg_t *spkg) trans = handle->trans; db_local = handle->db_local; - if(_alpm_pkg_find(trans->add, alpm_pkg_get_name(spkg))) { + if(_alpm_pkg_find(pkg_list, alpm_pkg_get_name(spkg))) { RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1); } @@ -251,6 +251,7 @@ int _alpm_sync_pkg(pmpkg_t *spkg) int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) { alpm_list_t *i, *j; + alpm_list_t *known_pkgs = NULL; pmpkg_t *spkg; pmdepend_t *dep; /* provisions and dependencies are also allowed */ pmgrp_t *grp; @@ -267,7 +268,7 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) _alpm_dep_free(dep); if(spkg != NULL) { - return(_alpm_sync_pkg(spkg)); + return(_alpm_sync_pkg(spkg, handle->trans->add)); } _alpm_log(PM_LOG_DEBUG, "%s package not found, searching for group...\n", target); @@ -278,17 +279,20 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) found = 1; for(j = alpm_grp_get_pkgs(grp); j; j = j->next) { pmpkg_t *pkg = j->data; - if(_alpm_sync_pkg(pkg) == -1) { + if(_alpm_sync_pkg(pkg, known_pkgs) == -1) { if(pm_errno == PM_ERR_TRANS_DUP_TARGET || pm_errno == PM_ERR_PKG_IGNORED) { /* just skip duplicate or ignored targets */ continue; } else { + alpm_list_free(known_pkgs); return(-1); } } + known_pkgs = alpm_list_add(known_pkgs, pkg); } } } + alpm_list_free(known_pkgs); if(!found) { /* pass through any 'found but ignored' errors */ -- cgit v1.2.3-70-g09d2 From fa4f25626c462e88ca0f6457bf9942980a5bd329 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 25 Jul 2010 22:50:54 -0500 Subject: Mark sync_pkg and sync_target as static functions We no longer use these anywhere outside of sync.c, so do the rename and add static to their definition to meet our coding standards. Signed-off-by: Dan McGee --- lib/libalpm/sync.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'lib/libalpm/sync.c') diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index bc7c3dc2..f8193962 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -202,7 +202,7 @@ int SYMEXPORT alpm_sync_sysupgrade(int enable_downgrade) return(0); } -int _alpm_sync_pkg(pmpkg_t *spkg, alpm_list_t *pkg_list) +static int sync_pkg(pmpkg_t *spkg, alpm_list_t *pkg_list) { pmtrans_t *trans; pmdb_t *db_local; @@ -248,7 +248,7 @@ int _alpm_sync_pkg(pmpkg_t *spkg, alpm_list_t *pkg_list) return(0); } -int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) +static int sync_target(alpm_list_t *dbs_sync, char *target) { alpm_list_t *i, *j; alpm_list_t *known_pkgs = NULL; @@ -268,7 +268,7 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) _alpm_dep_free(dep); if(spkg != NULL) { - return(_alpm_sync_pkg(spkg, handle->trans->add)); + return(sync_pkg(spkg, handle->trans->add)); } _alpm_log(PM_LOG_DEBUG, "%s package not found, searching for group...\n", target); @@ -279,7 +279,7 @@ int _alpm_sync_target(alpm_list_t *dbs_sync, char *target) found = 1; for(j = alpm_grp_get_pkgs(grp); j; j = j->next) { pmpkg_t *pkg = j->data; - if(_alpm_sync_pkg(pkg, known_pkgs) == -1) { + if(sync_pkg(pkg, known_pkgs) == -1) { if(pm_errno == PM_ERR_TRANS_DUP_TARGET || pm_errno == PM_ERR_PKG_IGNORED) { /* just skip duplicate or ignored targets */ continue; @@ -333,7 +333,7 @@ int SYMEXPORT alpm_sync_dbtarget(char *dbname, char *target) if(dbs == NULL) { RET_ERR(PM_ERR_PKG_REPO_NOT_FOUND, -1); } - return(_alpm_sync_target(dbs, target)); + return(sync_target(dbs, target)); } /** Add a sync target to the transaction. @@ -350,7 +350,7 @@ int SYMEXPORT alpm_sync_target(char *target) ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1)); dbs_sync = handle->dbs_sync; - return(_alpm_sync_target(dbs_sync,target)); + return(sync_target(dbs_sync,target)); } /** Compute the size of the files that will be downloaded to install a -- cgit v1.2.3-70-g09d2