Explorar el Código

Update diversions to work with pkgset instead of pkginfo

A diversion is recorded against a package name, thus a pkgset. This is
due to the fact that different instances of the same pkgset cannot have
conflicting pathnames, if they do the pathname object should be the
same.

Sponsored-by: Linaro Limited

Signed-off-by: Guillem Jover <guillem@debian.org>
Raphaël Hertzog hace 15 años
padre
commit
667b5fae57
Se han modificado 8 ficheros con 49 adiciones y 45 borrados
  1. 13 11
      src/archives.c
  2. 16 16
      src/divertcmd.c
  3. 3 2
      src/divertdb.c
  4. 1 1
      src/filesdb.h
  5. 2 2
      src/help.c
  6. 7 6
      src/processarc.c
  7. 6 6
      src/querycmd.c
  8. 1 1
      src/remove.c

+ 13 - 11
src/archives.c

@@ -114,7 +114,8 @@ filesavespackage(struct fileinlist *file,
                  struct pkginfo *pkgbeinginstalled)
 {
   struct filepackages_iterator *iter;
-  struct pkginfo *divpkg, *thirdpkg;
+  struct pkgset *divpkgset;
+  struct pkginfo *thirdpkg;
 
   debug(dbg_eachfiledetail,"filesavespackage file `%s' package %s",
         file->namenode->name, pkgtobesaved->set->name);
@@ -124,8 +125,8 @@ filesavespackage(struct fileinlist *file,
    * we're installing then they're not actually the same file, so
    * we can't disappear the package - it is saved by this file. */
   if (file->namenode->divert && file->namenode->divert->useinstead) {
-    divpkg= file->namenode->divert->pkg;
-    if (divpkg == pkgtobesaved || divpkg == pkgbeinginstalled) {
+    divpkgset = file->namenode->divert->pkgset;
+    if (divpkgset == pkgtobesaved->set || divpkgset == pkgbeinginstalled->set) {
       debug(dbg_eachfiledetail,"filesavespackage ... diverted -- save!");
       return true;
     }
@@ -445,7 +446,8 @@ tarobject(void *ctx, struct tar_entry *ti)
   char databuf[TARBLKSZ];
   struct file_stat *st;
   struct fileinlist *nifd, **oldnifd;
-  struct pkginfo *divpkg, *otherpkg;
+  struct pkgset *divpkgset;
+  struct pkginfo *otherpkg;
 
   ensureobstackinit();
 
@@ -469,14 +471,14 @@ tarobject(void *ctx, struct tar_entry *ti)
         ? nifd->namenode->divert->useinstead->name : "<none>");
 
   if (nifd->namenode->divert && nifd->namenode->divert->camefrom) {
-    divpkg= nifd->namenode->divert->pkg;
+    divpkgset = nifd->namenode->divert->pkgset;
 
-    if (divpkg) {
+    if (divpkgset) {
       forcibleerr(fc_overwritediverted,
                   _("trying to overwrite `%.250s', which is the "
                     "diverted version of `%.250s' (package: %.100s)"),
                   nifd->namenode->name, nifd->namenode->divert->camefrom->name,
-                  divpkg->set->name);
+                  divpkgset->name);
     } else {
       forcibleerr(fc_overwritediverted,
                   _("trying to overwrite `%.250s', which is the "
@@ -577,10 +579,10 @@ tarobject(void *ctx, struct tar_entry *ti)
         /* Right, so we may be diverting this file. This makes the conflict
          * OK iff one of us is the diverting package (we don't need to
          * check for both being the diverting package, obviously). */
-        divpkg = nifd->namenode->divert->pkg;
-        debug(dbg_eachfile, "tarobject ... diverted, divpkg=%s",
-              divpkg ? divpkg->set->name : "<none>");
-        if (otherpkg == divpkg || tc->pkg == divpkg)
+        divpkgset = nifd->namenode->divert->pkgset;
+        debug(dbg_eachfile, "tarobject ... diverted, divpkgset=%s",
+              divpkgset ? divpkgset->name : "<none>");
+        if (otherpkg->set == divpkgset || tc->pkg->set == divpkgset)
           continue;
       }
 

+ 16 - 16
src/divertcmd.c

@@ -267,10 +267,10 @@ file_rename(struct file *src, struct file *dst)
 static const char *
 diversion_pkg_name(struct diversion *d)
 {
-	if (d->pkg == NULL)
+	if (d->pkgset == NULL)
 		return ":";
 	else
-		return d->pkg->set->name;
+		return d->pkgset->name;
 }
 
 static const char *
@@ -332,10 +332,10 @@ diversion_describe(struct diversion *d)
 		name_to = d->useinstead->name;
 	}
 
-	if (d->pkg == NULL)
+	if (d->pkgset == NULL)
 		pkgname = NULL;
 	else
-		pkgname = d->pkg->set->name;
+		pkgname = d->pkgset->name;
 
 	return varbuf_diversion(&str, pkgname, name_from, name_to);
 }
@@ -397,7 +397,7 @@ diversion_add(const char *const *argv)
 	struct file file_from, file_to;
 	struct diversion *contest, *altname;
 	struct filenamenode *fnn_from, *fnn_to;
-	struct pkginfo *pkg;
+	struct pkgset *pkgset;
 
 	opt_pkgname_match_any = false;
 
@@ -438,9 +438,9 @@ diversion_add(const char *const *argv)
 
 	/* Handle package name. */
 	if (opt_pkgname == NULL)
-		pkg = NULL;
+		pkgset = NULL;
 	else
-		pkg = pkg_db_find(opt_pkgname);
+		pkgset = pkg_db_find_set(opt_pkgname);
 
 	/* Check we are not stomping over an existing diversion. */
 	if (fnn_from->divert || fnn_to->divert) {
@@ -448,7 +448,7 @@ diversion_add(const char *const *argv)
 		    strcmp(fnn_to->divert->camefrom->name, filename) == 0 &&
 		    fnn_from->divert && fnn_from->divert->useinstead &&
 		    strcmp(fnn_from->divert->useinstead->name, opt_divertto) == 0 &&
-		    fnn_from->divert->pkg == pkg) {
+		    fnn_from->divert->pkgset == pkgset) {
 			if (opt_verbose > 0)
 				printf(_("Leaving '%s'\n"),
 				       diversion_describe(fnn_from->divert));
@@ -469,12 +469,12 @@ diversion_add(const char *const *argv)
 	altname->camefrom = fnn_from;
 	altname->camefrom->divert = contest;
 	altname->useinstead = NULL;
-	altname->pkg = pkg;
+	altname->pkgset = pkgset;
 
 	contest->useinstead = fnn_to;
 	contest->useinstead->divert = altname;
 	contest->camefrom = NULL;
-	contest->pkg = pkg;
+	contest->pkgset = pkgset;
 
 	/* Update database and file system if needed. */
 	if (opt_verbose > 0)
@@ -497,7 +497,7 @@ diversion_remove(const char *const *argv)
 	struct filenamenode *namenode;
 	struct diversion *contest, *altname;
 	struct file file_from, file_to;
-	struct pkginfo *pkg;
+	struct pkgset *pkgset;
 
 	if (!filename || argv[1])
 		badusage(_("--%s needs a single argument"), cipaction->olong);
@@ -513,9 +513,9 @@ diversion_remove(const char *const *argv)
 	}
 
 	if (opt_pkgname == NULL)
-		pkg = NULL;
+		pkgset = NULL;
 	else
-		pkg = pkg_db_find(opt_pkgname);
+		pkgset = pkg_db_find_set(opt_pkgname);
 
 	contest = namenode->divert;
 	altname = contest->useinstead->divert;
@@ -528,7 +528,7 @@ diversion_remove(const char *const *argv)
 		       diversion_current(filename),
 		       diversion_describe(contest));
 
-	if (!opt_pkgname_match_any && pkg != contest->pkg)
+	if (!opt_pkgname_match_any && pkgset != contest->pkgset)
 		ohshit(_("mismatch on package\n"
 		         "  when removing `%s'\n"
 		         "  found `%s'"),
@@ -635,12 +635,12 @@ diversion_listpackage(const char *const *argv)
 	if (namenode == NULL)
 		return 0;
 
-	if (namenode->divert->pkg == NULL)
+	if (namenode->divert->pkgset == NULL)
 		/* Indicate package is local using something not in package
 		 * namespace. */
 		printf("LOCAL\n");
 	else
-		printf("%s\n", namenode->divert->pkg->set->name);
+		printf("%s\n", namenode->divert->pkgset->name);
 
 	return 0;
 }

+ 3 - 2
src/divertdb.c

@@ -105,8 +105,9 @@ ensure_diversions(void)
 		oicontest->camefrom = NULL;
 
 		fgets_must(linebuf, sizeof(linebuf), file, diversionsname);
-		oicontest->pkg = oialtname->pkg = strcmp(linebuf, ":") ?
-		                                  pkg_db_find(linebuf) : NULL;
+		oicontest->pkgset = strcmp(linebuf, ":") ?
+		                    pkg_db_find_set(linebuf) : NULL;
+		oialtname->pkgset = oicontest->pkgset;
 
 		if (oialtname->camefrom->divert ||
 		    oicontest->useinstead->divert)

+ 1 - 1
src/filesdb.h

@@ -126,7 +126,7 @@ struct fileinlist {
 struct diversion {
   struct filenamenode *useinstead;
   struct filenamenode *camefrom;
-  struct pkginfo *pkg;
+  struct pkgset *pkgset;
 
   /* The ‘contested’ halves are in this list for easy cleanup. */
   struct diversion *next;

+ 2 - 2
src/help.c

@@ -67,14 +67,14 @@ struct filenamenode *namenodetouse(struct filenamenode *namenode, struct pkginfo
         namenode->name, pkg->set->name);
 
   r=
-    (namenode->divert->useinstead && namenode->divert->pkg != pkg)
+    (namenode->divert->useinstead && namenode->divert->pkgset != pkg->set)
       ? namenode->divert->useinstead : namenode;
 
   debug(dbg_eachfile,
         "namenodetouse ... useinstead=%s camefrom=%s pkg=%s return %s",
         namenode->divert->useinstead ? namenode->divert->useinstead->name : "<none>",
         namenode->divert->camefrom ? namenode->divert->camefrom->name : "<none>",
-        namenode->divert->pkg ? namenode->divert->pkg->set->name : "<none>",
+        namenode->divert->pkgset ? namenode->divert->pkgset->name : "<none>",
         r->name);
 
   return r;

+ 7 - 6
src/processarc.c

@@ -395,7 +395,7 @@ void process_archive(const char *filename) {
   int r, i;
   pid_t pid;
   struct pkgiterator *it;
-  struct pkginfo *pkg, *otherpkg, *divpkg;
+  struct pkginfo *pkg, *otherpkg;
   char *cidirrest, *p;
   char conffilenamebuf[MAXCONFFILENAME];
   char *psize;
@@ -1230,11 +1230,12 @@ void process_archive(const char *filename) {
    * have claimed ‘ownership’ of all its files. */
   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) {
-      divpkg= cfile->namenode->divert->pkg;
-      if (divpkg == pkg) {
+      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);
@@ -1242,10 +1243,10 @@ void process_archive(const char *filename) {
       } else {
         debug(dbg_eachfile,
               "process_archive looking for overwriting `%s' (overridden by %s)",
-              cfile->namenode->name, divpkg ? divpkg->set->name : "<local>");
+              cfile->namenode->name, divpkgset ? divpkgset->name : "<local>");
       }
     } else {
-      divpkg = NULL;
+      divpkgset = NULL;
       debug(dbg_eachfile, "process_archive looking for overwriting `%s'",
             cfile->namenode->name);
     }
@@ -1257,7 +1258,7 @@ void process_archive(const char *filename) {
        * and we don't bother with it here, clearly. */
       if (otherpkg == pkg || !otherpkg->clientdata->fileslistvalid)
         continue;
-      if (otherpkg == divpkg) {
+      if (otherpkg->set == divpkgset) {
         debug(dbg_eachfiledetail, "process_archive ... diverted, skipping");
         continue;
       }

+ 6 - 6
src/querycmd.c

@@ -271,11 +271,11 @@ static int searchoutput(struct filenamenode *namenode) {
     const char *name_to = namenode->divert->useinstead ?
                           namenode->divert->useinstead->name : namenode->name;
 
-    if (namenode->divert->pkg) {
+    if (namenode->divert->pkgset) {
       printf(_("diversion by %s from: %s\n"),
-             namenode->divert->pkg->set->name, name_from);
+             namenode->divert->pkgset->name, name_from);
       printf(_("diversion by %s to: %s\n"),
-             namenode->divert->pkg->set->name, name_to);
+             namenode->divert->pkgset->name, name_to);
     } else {
       printf(_("local diversion from: %s\n"), name_from);
       printf(_("local diversion to: %s\n"), name_to);
@@ -424,15 +424,15 @@ enqperpackage(const char *const *argv)
             namenode= file->namenode;
             puts(namenode->name);
             if (namenode->divert && !namenode->divert->camefrom) {
-              if (!namenode->divert->pkg)
+              if (!namenode->divert->pkgset)
 		printf(_("locally diverted to: %s\n"),
 		       namenode->divert->useinstead->name);
-              else if (pkg == namenode->divert->pkg)
+              else if (pkg->set == namenode->divert->pkgset)
 		printf(_("package diverts others to: %s\n"),
 		       namenode->divert->useinstead->name);
               else
 		printf(_("diverted by %s to: %s\n"),
-		       namenode->divert->pkg->set->name,
+		       namenode->divert->pkgset->name,
 		       namenode->divert->useinstead->name);
             }
             file= file->next;

+ 1 - 1
src/remove.c

@@ -431,7 +431,7 @@ static void removal_bulk_remove_configfiles(struct pkginfo *pkg) {
       } else if (searchfile->namenode->divert &&
                  (searchfile->namenode->divert->camefrom ||
                   (searchfile->namenode->divert->useinstead &&
-                   searchfile->namenode->divert->pkg != pkg))) {
+                   searchfile->namenode->divert->pkgset != pkg->set))) {
         debug(dbg_conff, "removal_bulk conffile '%s' ignored due to diversion",
               conff->name);
         *lconffp= conff->next;