diff options
author | Dan McGee <dan@archlinux.org> | 2011-08-11 01:00:47 -0500 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-08-11 11:19:04 -0500 |
commit | f3fa77bcf1d792971c314f8c0de255866e89f3f3 (patch) | |
tree | 101a954e5f50f1e4fdbcb036d498af9c25a173d9 /lib | |
parent | 1f6afe6b0b3e1f222b5624e93af6e6272afea423 (diff) |
Add -S --recursive operation
This closely matches what we had before for -R --recursive. Basically,
when specifying a target (e.g., pacman), we can now recursively pull all
dependencies, regardless of version specifiers and whether they are
already satisfied in the local database. This could be used to update
pacman on a system with an old glibc, for example, as both pacman and
glibc would get pulled into the transaction.
This is most useful with --needed to prevent needless reinstalls as
described in the man page changes.
The end goal of this change is to wire it into SyncFirst and have it be
the default mode of operation there, but that belongs in a separate
changeset.
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/deps.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 51ae0fb9..992ebe23 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -701,6 +701,12 @@ int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs, return 0; } + if(handle->trans->flags & ALPM_TRANS_FLAG_RECURSE) { + /* removing local packages from the equation causes the entire dep chain to + * get pulled for each target- e.g., pactree -u output */ + localpkgs = NULL; + } + /* Create a copy of the packages list, so that it can be restored on error */ packages_copy = alpm_list_copy(*packages); @@ -753,6 +759,29 @@ int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs, alpm_list_free(deps); } + if(handle->trans->flags & ALPM_TRANS_FLAG_NEEDED) { + /* remove any deps that were pulled that match installed version */ + /* odd loop syntax so we can modify the list as we iterate */ + i = *packages; + while(i) { + alpm_pkg_t *tpkg = i->data; + alpm_pkg_t *local = _alpm_db_get_pkgfromcache( + handle->db_local, tpkg->name); + if(local && _alpm_pkg_compare_versions(tpkg, local) == 0) { + /* with the NEEDED flag, packages up to date are not reinstalled */ + _alpm_log(handle, ALPM_LOG_DEBUG, + "not adding dep %s-%s as it is not needed, same version\n", + local->name, local->version); + j = i; + i = i->next; + *packages = alpm_list_remove_item(*packages, j); + free(j); + } else { + i = i->next; + } + } + } + if(ret != 0) { alpm_list_free(*packages); *packages = packages_copy; |