diff options
author | Nagy Gabor <ngaba@bibl.u-szeged.hu> | 2008-11-09 17:34:49 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2009-04-11 20:54:25 +0200 |
commit | 77efd512165ca2066dc6547bda52082f8bd11db2 (patch) | |
tree | 328c1cbd81550ff8949751ed677200dda29ececa | |
parent | 93ca155b48a29685914ffa10b11be42ef5d4734a (diff) | |
download | pacman-77efd512165ca2066dc6547bda52082f8bd11db2.tar.gz pacman-77efd512165ca2066dc6547bda52082f8bd11db2.tar.xz |
New error type: PM_ERR_PKG_IGNORED
This patch fixes FS#12059.
Now sync_addtarget can return with PM_ERR_PKG_IGNORED, which indicates that
although the requested package was found it is in ignorepkg, so alpm could
not add it to the transaction. So the front-end can decide what to do.
Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu>
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/alpm.h | 1 | ||||
-rw-r--r-- | lib/libalpm/deps.c | 10 | ||||
-rw-r--r-- | lib/libalpm/error.c | 2 | ||||
-rw-r--r-- | lib/libalpm/sync.c | 3 | ||||
-rw-r--r-- | src/pacman/sync.c | 7 |
5 files changed, 18 insertions, 5 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 43df31c1..e3a512a1 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -493,6 +493,7 @@ enum _pmerrno_t { PM_ERR_TRANS_DOWNLOADING, /* Packages */ PM_ERR_PKG_NOT_FOUND, + PM_ERR_PKG_IGNORED, PM_ERR_PKG_INVALID, PM_ERR_PKG_OPEN, PM_ERR_PKG_LOAD, diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 694e5be5..dd5bd207 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -520,6 +520,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, alpm_list_t *excluding, int prompt) { alpm_list_t *i, *j; + int ignored = 0; /* 1. literals */ for(i = dbs; i; i = i->next) { pmpkg_t *pkg = _alpm_db_get_pkgfromcache(i->data, dep->name); @@ -531,6 +532,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, NULL, NULL, &install); } if(!install) { + ignored = 1; continue; } } @@ -550,6 +552,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, pkg, NULL, NULL, &install); } if(!install) { + ignored = 1; continue; } } @@ -559,6 +562,11 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, } } } + if(ignored) { /* resolvedeps will override these */ + pm_errno = PM_ERR_PKG_IGNORED; + } else { + pm_errno = PM_ERR_PKG_NOT_FOUND; + } return(NULL); } @@ -640,7 +648,7 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg, alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_depmiss_free); alpm_list_free(deps); return(-1); - } else { + } else { _alpm_log(PM_LOG_DEBUG, "pulling dependency %s (needed by %s)\n", alpm_pkg_get_name(spkg), alpm_pkg_get_name(tpkg)); *packages = alpm_list_add(*packages, spkg); diff --git a/lib/libalpm/error.c b/lib/libalpm/error.c index 1f605806..01dc758c 100644 --- a/lib/libalpm/error.c +++ b/lib/libalpm/error.c @@ -106,6 +106,8 @@ const char SYMEXPORT *alpm_strerror(int err) /* Packages */ case PM_ERR_PKG_NOT_FOUND: return _("could not find or read package"); + case PM_ERR_PKG_IGNORED: + return _("operation cancelled due to ignorepkg"); case PM_ERR_PKG_INVALID: return _("invalid or corrupted package"); case PM_ERR_PKG_OPEN: diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 49ea3c27..4cbdb621 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -297,7 +297,8 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy FREE(targline); if(spkg == NULL) { - RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); + /* pm_errno is set by _alpm_resolvedep */ + return(-1); } if(_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) { diff --git a/src/pacman/sync.c b/src/pacman/sync.c index d8a63481..0e193551 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -574,11 +574,12 @@ static int sync_trans(alpm_list_t *targets) char *targ = alpm_list_getdata(i); if(alpm_trans_addtarget(targ) == -1) { pmgrp_t *grp = NULL; - int found=0; + int found = 0; alpm_list_t *j; - if(pm_errno == PM_ERR_TRANS_DUP_TARGET) { - /* just ignore duplicate targets */ + if(pm_errno == PM_ERR_TRANS_DUP_TARGET || pm_errno == PM_ERR_PKG_IGNORED) { + /* just skip duplicate or ignored targets */ + pm_printf(PM_LOG_WARNING, _("skipping target: %s\n"), targ); continue; } if(pm_errno != PM_ERR_PKG_NOT_FOUND) { |