summaryrefslogtreecommitdiff
path: root/src/unpack.c
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2016-02-15 17:25:41 +0100
committerGuillem Jover <guillem@debian.org>2016-02-26 22:45:56 +0100
commit3e5881036f4800631f925ab78241d9a68b048ea7 (patch)
treee1bae5fee981386a9260e9103bb259a3e2216b21 /src/unpack.c
parent02c42aa6ddb9eb350ff34a80e9632c195b0db813 (diff)
downloaddpkg-3e5881036f4800631f925ab78241d9a68b048ea7.tar.gz
dpkg: Refactor pkg_remove_files_from_others()
Diffstat (limited to 'src/unpack.c')
-rw-r--r--src/unpack.c125
1 files changed, 69 insertions, 56 deletions
diff --git a/src/unpack.c b/src/unpack.c
index 081c269d6..7180982dc 100644
--- a/src/unpack.c
+++ b/src/unpack.c
@@ -494,6 +494,74 @@ pkgset_getting_in_sync(struct pkginfo *pkg)
return true;
}
+static void
+pkg_remove_files_from_others(struct pkginfo *pkg, struct fileinlist *newfileslist)
+{
+ struct fileinlist *cfile;
+ struct pkginfo *otherpkg;
+
+ for (cfile = newfileslist; cfile; cfile = cfile->next) {
+ struct filepackages_iterator *iter;
+ struct pkgset *divpkgset;
+
+ if (!(cfile->namenode->flags & fnnf_elide_other_lists))
+ continue;
+
+ if (cfile->namenode->divert && cfile->namenode->divert->useinstead) {
+ divpkgset = cfile->namenode->divert->pkgset;
+ if (divpkgset == pkg->set) {
+ debug(dbg_eachfile,
+ "process_archive not overwriting any '%s' (overriding, '%s')",
+ cfile->namenode->name, cfile->namenode->divert->useinstead->name);
+ continue;
+ } else {
+ debug(dbg_eachfile,
+ "process_archive looking for overwriting '%s' (overridden by %s)",
+ cfile->namenode->name, divpkgset ? divpkgset->name : "<local>");
+ }
+ } else {
+ divpkgset = NULL;
+ debug(dbg_eachfile, "process_archive looking for overwriting '%s'",
+ cfile->namenode->name);
+ }
+
+ iter = filepackages_iter_new(cfile->namenode);
+ while ((otherpkg = filepackages_iter_next(iter))) {
+ debug(dbg_eachfiledetail, "process_archive ... found in %s",
+ pkg_name(otherpkg, pnaw_always));
+
+ /* A pkgset can share files between instances, so there's no point
+ * in rewriting the file that's already in place. */
+ if (otherpkg->set == pkg->set)
+ continue;
+
+ if (otherpkg->set == divpkgset) {
+ debug(dbg_eachfiledetail, "process_archive ... diverted, skipping");
+ continue;
+ }
+
+ if (cfile->namenode->flags & fnnf_new_conff)
+ conffile_mark_obsolete(otherpkg, cfile->namenode);
+
+ /* If !fileslistvalid then it's one of the disappeared packages above
+ * or we have already updated the files list file, and we don't bother
+ * with it here, clearly. */
+ if (!otherpkg->clientdata->fileslistvalid)
+ continue;
+
+ /* Found one. We delete the list entry for this file,
+ * (and any others in the same package) and then mark the package
+ * as requiring a reread. */
+ write_filelist_except(otherpkg, &otherpkg->installed,
+ otherpkg->clientdata->files, fnnf_elide_other_lists);
+ ensure_package_clientdata(otherpkg);
+ debug(dbg_veryverbose, "process_archive overwrote from %s",
+ pkg_name(otherpkg, pnaw_always));
+ }
+ filepackages_iter_free(iter);
+ }
+}
+
void process_archive(const char *filename) {
static const struct tar_operations tf = {
.read = tarfileread,
@@ -1371,62 +1439,7 @@ void process_archive(const char *filename) {
* had the version we overwrote. To prevent this we make
* sure that we don't claim this package is OK until we
* have claimed ‘ownership’ of all its files. */
- for (cfile = newfiles_queue.head; cfile; cfile = cfile->next) {
- struct filepackages_iterator *iter;
- struct pkgset *divpkgset;
-
- if (!(cfile->namenode->flags & fnnf_elide_other_lists)) continue;
- if (cfile->namenode->divert && cfile->namenode->divert->useinstead) {
- divpkgset = cfile->namenode->divert->pkgset;
- if (divpkgset == pkg->set) {
- debug(dbg_eachfile,
- "process_archive not overwriting any '%s' (overriding, '%s')",
- cfile->namenode->name, cfile->namenode->divert->useinstead->name);
- continue;
- } else {
- debug(dbg_eachfile,
- "process_archive looking for overwriting '%s' (overridden by %s)",
- cfile->namenode->name, divpkgset ? divpkgset->name : "<local>");
- }
- } else {
- divpkgset = NULL;
- debug(dbg_eachfile, "process_archive looking for overwriting '%s'",
- cfile->namenode->name);
- }
- iter = filepackages_iter_new(cfile->namenode);
- while ((otherpkg = filepackages_iter_next(iter))) {
- debug(dbg_eachfiledetail, "process_archive ... found in %s",
- pkg_name(otherpkg, pnaw_always));
-
- /* A pkgset can share files between instances, so there's no point
- * in rewriting the file that's already in place. */
- if (otherpkg->set == pkg->set)
- continue;
- if (otherpkg->set == divpkgset) {
- debug(dbg_eachfiledetail, "process_archive ... diverted, skipping");
- continue;
- }
-
- if (cfile->namenode->flags & fnnf_new_conff)
- conffile_mark_obsolete(otherpkg, cfile->namenode);
-
- /* If !fileslistvalid then it's one of the disappeared packages above
- * or we have already updated the files list file, and we don't bother
- * with it here, clearly. */
- if (!otherpkg->clientdata->fileslistvalid)
- continue;
-
- /* Found one. We delete the list entry for this file,
- * (and any others in the same package) and then mark the package
- * as requiring a reread. */
- write_filelist_except(otherpkg, &otherpkg->installed,
- otherpkg->clientdata->files, fnnf_elide_other_lists);
- ensure_package_clientdata(otherpkg);
- debug(dbg_veryverbose, "process_archive overwrote from %s",
- pkg_name(otherpkg, pnaw_always));
- }
- filepackages_iter_free(iter);
- }
+ pkg_remove_files_from_others(pkg, newfiles_queue.head);
/* Right, the package we've unpacked is now in a reasonable state.
* The only thing that we have left to do with it is remove