summaryrefslogtreecommitdiff
path: root/lib/libalpm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm')
-rw-r--r--lib/libalpm/add.c18
-rw-r--r--lib/libalpm/remove.c28
2 files changed, 26 insertions, 20 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index e9225da1..86e80778 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -295,18 +295,26 @@ static int upgrade_remove(pmpkg_t *oldpkg, pmpkg_t *newpkg, pmtrans_t *trans, pm
tr->skip_remove = alpm_list_strdup(trans->skip_remove);
const alpm_list_t *b;
- /* Add files in the NEW package's backup array to the noupgrade array
+ /* Add files in the OLD and NEW backup array to the NoUpgrade array
* so this removal operation doesn't kill them */
- /* TODO if we add here, all backup=() entries for all targets, new and
- * old, we cover all bases, including backup=() locations changing hands.
- * But is this viable? */
alpm_list_t *old_noupgrade = alpm_list_strdup(handle->noupgrade);
- for(b = alpm_pkg_get_backup(newpkg); b; b = b->next) {
+ /* old package backup list */
+ for(b = alpm_pkg_get_backup(oldpkg); b; b = b->next) {
const char *backup = b->data;
_alpm_log(PM_LOG_DEBUG, "adding %s to the NoUpgrade array temporarily\n",
backup);
handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(backup));
}
+ /* new package backup list */
+ for(b = alpm_pkg_get_backup(newpkg); b; b = b->next) {
+ const char *backup = b->data;
+ /* make sure we don't add duplicate entries */
+ if(!alpm_list_find(handle->noupgrade, backup)) {
+ _alpm_log(PM_LOG_DEBUG, "adding %s to the NoUpgrade array temporarily\n",
+ backup);
+ handle->noupgrade = alpm_list_add(handle->noupgrade, strdup(backup));
+ }
+ }
int ret = _alpm_remove_commit(tr, db);
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index 6f119ba1..7fbf675a 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -200,7 +200,8 @@ static void unlink_file(pmpkg_t *info, alpm_list_t *lp, pmtrans_t *trans)
if(trans->type == PM_TRANS_TYPE_REMOVEUPGRADE) {
/* check noupgrade */
if(alpm_list_find_str(handle->noupgrade, lp->data)) {
- _alpm_log(PM_LOG_DEBUG, "Skipping removal of '%s' due to NoUpgrade\n", file);
+ _alpm_log(PM_LOG_DEBUG, "Skipping removal of '%s' due to NoUpgrade\n",
+ file);
return;
}
}
@@ -212,7 +213,7 @@ static void unlink_file(pmpkg_t *info, alpm_list_t *lp, pmtrans_t *trans)
if(S_ISDIR(buf.st_mode)) {
if(rmdir(file)) {
- /* this is okay, other pakcages are probably using it (like /usr) */
+ /* this is okay, other packages are probably using it (like /usr) */
_alpm_log(PM_LOG_DEBUG, "keeping directory %s\n", file);
} else {
_alpm_log(PM_LOG_DEBUG, "removing directory %s\n", file);
@@ -222,22 +223,19 @@ static void unlink_file(pmpkg_t *info, alpm_list_t *lp, pmtrans_t *trans)
* see the big comment block in db_find_conflicts() for an
* explanation. */
if(alpm_list_find_str(trans->skip_remove, file)) {
- _alpm_log(PM_LOG_DEBUG, "%s is in trans->skip_remove, skipping removal\n", file);
+ _alpm_log(PM_LOG_DEBUG, "%s is in trans->skip_remove, skipping removal\n",
+ file);
return;
} else if(needbackup) {
/* if the file is flagged, back it up to .pacsave */
- if(!(trans->type == PM_TRANS_TYPE_REMOVEUPGRADE)) {
- /* if it was an upgrade, the file would be left alone because
- * pacman_add() would handle it */
- if(!(trans->flags & PM_TRANS_FLAG_NOSAVE)) {
- char newpath[PATH_MAX];
- snprintf(newpath, PATH_MAX, "%s.pacsave", file);
- rename(file, newpath);
- _alpm_log(PM_LOG_WARNING, _("%s saved as %s\n"), file, newpath);
- return;
- } else {
- _alpm_log(PM_LOG_DEBUG, "transaction is set to NOSAVE, not backing up '%s'\n", file);
- }
+ if(!(trans->flags & PM_TRANS_FLAG_NOSAVE)) {
+ char newpath[PATH_MAX];
+ snprintf(newpath, PATH_MAX, "%s.pacsave", file);
+ rename(file, newpath);
+ _alpm_log(PM_LOG_WARNING, _("%s saved as %s\n"), file, newpath);
+ return;
+ } else {
+ _alpm_log(PM_LOG_DEBUG, "transaction is set to NOSAVE, not backing up '%s'\n", file);
}
}
_alpm_log(PM_LOG_DEBUG, "unlinking %s\n", file);