- add "allownamechange" flag for completeness
authorMichael Schroeder <mls@suse.de>
Mon, 26 Mar 2012 11:38:08 +0000 (13:38 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 26 Mar 2012 11:38:08 +0000 (13:38 +0200)
examples/solv.c
ext/testcase.c
src/policy.c
src/policy.h
src/rules.c
src/solver.c
src/solver.h
src/solverdebug.c

index 49bc038..4baa6cf 100644 (file)
@@ -2127,14 +2127,17 @@ limitrepo(Pool *pool, Id repofilter, Queue *job)
       if (mq.count)
        {
          /* here we assume that repo == vendor, so we also set SOLVER_SETVENDOR */
+         Id flags = (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
+         if ((job->elements[i] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_NAME)
+           flags |= SOLVER_SETNAME;
          if (mq.count == 1)
            {
-             job->elements[j] = SOLVER_SOLVABLE | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_NOAUTOSET;
+             job->elements[j] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET | flags;
              job->elements[j + 1] = mq.elements[0];
            }
          else
            {
-             job->elements[j] = SOLVER_SOLVABLE_ONE_OF | (job->elements[i] & SOLVER_SETMASK) | SOLVER_SETVENDOR | SOLVER_SETREPO;
+             job->elements[j] = SOLVER_SOLVABLE_ONE_OF | flags;
              job->elements[j + 1] = pool_queuetowhatprovides(pool, &mq);
            }
          j += 2;
index 2d5fff3..701a69f 100644 (file)
@@ -81,6 +81,7 @@ static struct solverflags2str {
   int def;
 } solverflags2str[] = {
   { SOLVER_FLAG_ALLOW_DOWNGRADE,            "allowdowngrade", 0 },
+  { SOLVER_FLAG_ALLOW_NAMECHANGE,           "allownamechange", 1 },
   { SOLVER_FLAG_ALLOW_ARCHCHANGE,           "allowarchchange", 0 },
   { SOLVER_FLAG_ALLOW_VENDORCHANGE,         "allowvendorchange", 0 },
   { SOLVER_FLAG_ALLOW_UNINSTALL,            "allowuninstall", 0 },
index 40fe50e..3e8a6ed 100644 (file)
@@ -748,6 +748,11 @@ policy_is_illegal(Solver *solv, Solvable *is, Solvable *s, int ignore)
       if (is->vendor != s->vendor && policy_illegal_vendorchange(solv, is, s))
        ret |= POLICY_ILLEGAL_VENDORCHANGE;
     }
+  if (!(ignore & POLICY_ILLEGAL_NAMECHANGE) && !(duppkg ? solv->dup_allownamechange : !solv->allownamechange))
+    {
+      if (is->name != s->name)
+       ret |= POLICY_ILLEGAL_NAMECHANGE;
+    }
   return ret;
 }
 
@@ -854,11 +859,13 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
   Solvable *ps;
   int haveprovobs = 0;
   int allowdowngrade = allow_all ? 1 : solv->allowdowngrade;
+  int allownamechange = allow_all ? 1 : solv->allownamechange;
   int allowarchchange = allow_all ? 1 : solv->allowarchchange;
   int allowvendorchange = allow_all ? 1 : solv->allowvendorchange;
   if (allow_all == 2)
     {
       allowdowngrade = solv->dup_allowdowngrade;
+      allownamechange = solv->dup_allownamechange;
       allowarchchange = solv->dup_allowarchchange;
       allowvendorchange = solv->dup_allowvendorchange;
     }
@@ -886,6 +893,8 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
          if (!allowdowngrade && pool_evrcmp(pool, s->evr, ps->evr, EVRCMP_COMPARE) > 0)
            continue;
        }
+      else if (!allownamechange)
+       continue;
       else if (!solv->noupdateprovide && ps->obsoletes)   /* provides/obsoletes combination ? */
        {
          obsp = ps->repo->idarraydata + ps->obsoletes;
@@ -919,6 +928,8 @@ policy_findupdatepackages(Solver *solv, Solvable *s, Queue *qs, int allow_all)
        continue;
       queue_push(qs, p);
     }
+  if (!allownamechange)
+    return;
   /* if we have found some valid candidates and noupdateprovide is not set, we're
      done. otherwise we fallback to all obsoletes */
   if (!solv->noupdateprovide && haveprovobs)
index 734ffde..8f81ca3 100644 (file)
@@ -20,6 +20,7 @@
 #define POLICY_ILLEGAL_DOWNGRADE       1
 #define POLICY_ILLEGAL_ARCHCHANGE      2
 #define POLICY_ILLEGAL_VENDORCHANGE    4
+#define POLICY_ILLEGAL_NAMECHANGE      8
 
 extern void policy_filter_unwanted(Solver *solv, Queue *plist, int mode);
 extern int  policy_illegal_archchange(Solver *solv, Solvable *s1, Solvable *s2);
index 66b9706..59a04a0 100644 (file)
@@ -1455,8 +1455,10 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
       if (!(set & SOLVER_NOAUTOSET))
        {
          /* automatically add set bits by analysing the job */
+         if (select == SOLVER_SOLVABLE_NAME)
+           set |= SOLVER_SETNAME;
          if (select == SOLVER_SOLVABLE)
-           set |= SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
+           set |= SOLVER_SETNAME | SOLVER_SETARCH | SOLVER_SETVENDOR | SOLVER_SETREPO | SOLVER_SETEVR;
          else if ((select == SOLVER_SOLVABLE_NAME || select == SOLVER_SOLVABLE_PROVIDES) && ISRELDEP(what))
            {
              Reldep *rd = GETRELDEP(pool, what);
@@ -1582,6 +1584,8 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
              s = pool->solvables + p;
              if ((set & SOLVER_SETEVR) != 0)
                illegal |= POLICY_ILLEGAL_DOWNGRADE;    /* ignore */
+             if ((set & SOLVER_SETNAME) != 0)
+               illegal |= POLICY_ILLEGAL_NAMECHANGE;   /* ignore */
              if ((set & SOLVER_SETARCH) != 0)
                illegal |= POLICY_ILLEGAL_ARCHCHANGE;   /* ignore */
              if ((set & SOLVER_SETVENDOR) != 0)
index 9bc36af..23a8d71 100644 (file)
@@ -1360,7 +1360,10 @@ solver_create(Pool *pool)
   solv->pool = pool;
   solv->installed = pool->installed;
 
+  solv->allownamechange = 1;
+
   solv->dup_allowdowngrade = 1;
+  solv->dup_allownamechange = 1;
   solv->dup_allowarchchange = 1;
   solv->dup_allowvendorchange = 1;
 
@@ -1452,6 +1455,8 @@ solver_get_flag(Solver *solv, int flag)
   {
   case SOLVER_FLAG_ALLOW_DOWNGRADE:
     return solv->allowdowngrade;
+  case SOLVER_FLAG_ALLOW_NAMECHANGE:
+    return solv->allownamechange;
   case SOLVER_FLAG_ALLOW_ARCHCHANGE:
     return solv->allowarchchange;
   case SOLVER_FLAG_ALLOW_VENDORCHANGE:
@@ -1483,6 +1488,9 @@ solver_set_flag(Solver *solv, int flag, int value)
   case SOLVER_FLAG_ALLOW_DOWNGRADE:
     solv->allowdowngrade = value;
     break;
+  case SOLVER_FLAG_ALLOW_NAMECHANGE:
+    solv->allownamechange = value;
+    break;
   case SOLVER_FLAG_ALLOW_ARCHCHANGE:
     solv->allowarchchange = value;
     break;
@@ -2559,7 +2567,7 @@ solver_solve(Solver *solv, Queue *job)
   /* log solver options */
   POOL_DEBUG(SOLV_DEBUG_STATS, "solver started\n");
   POOL_DEBUG(SOLV_DEBUG_STATS, "dosplitprovides=%d, noupdateprovide=%d noinfarchcheck=%d\n", solv->dosplitprovides, solv->noupdateprovide, solv->noinfarchcheck);
-  POOL_DEBUG(SOLV_DEBUG_STATS, "allowuninstall=%d, allowdowngrade=%d, allowarchchange=%d, allowvendorchange=%d\n", solv->allowuninstall, solv->allowdowngrade, solv->allowarchchange, solv->allowvendorchange);
+  POOL_DEBUG(SOLV_DEBUG_STATS, "allowuninstall=%d, allowdowngrade=%d, allownamechange=%d, allowarchchange=%d, allowvendorchange=%d\n", solv->allowuninstall, solv->allowdowngrade, solv->allownamechange, solv->allowarchchange, solv->allowvendorchange);
   POOL_DEBUG(SOLV_DEBUG_STATS, "promoteepoch=%d, forbidselfconflicts=%d\n", pool->promoteepoch, pool->forbidselfconflicts);
   POOL_DEBUG(SOLV_DEBUG_STATS, "obsoleteusesprovides=%d, implicitobsoleteusesprovides=%d, obsoleteusescolors=%d\n", pool->obsoleteusesprovides, pool->implicitobsoleteusesprovides, pool->obsoleteusescolors);
   POOL_DEBUG(SOLV_DEBUG_STATS, "dontinstallrecommended=%d, addalreadyrecommended=%d\n", solv->dontinstallrecommended, solv->addalreadyrecommended);
index 033956c..84ffb8e 100644 (file)
@@ -183,6 +183,7 @@ struct _Solver {
    *-------------------------------------------------------------------------------------------------------------*/
 
   int allowdowngrade;                  /* allow to downgrade installed solvable */
+  int allownamechange;                 /* allow to change name of installed solvables */
   int allowarchchange;                 /* allow to change architecture of installed solvables */
   int allowvendorchange;               /* allow to change vendor of installed solvables */
   int allowuninstall;                  /* allow removal of installed solvables */
@@ -199,6 +200,7 @@ struct _Solver {
   int dupmap_all;                      /* dup all packages */
   Map dupinvolvedmap;                  /* packages involved in dup process */
   int dup_allowdowngrade;              /* dup mode: allow to downgrade installed solvable */
+  int dup_allownamechange;             /* dup mode: allow to change name of installed solvable */
   int dup_allowarchchange;             /* dup mode: allow to change architecture of installed solvables */
   int dup_allowvendorchange;           /* dup mode: allow to change vendor of installed solvables */
 
@@ -253,8 +255,9 @@ typedef struct _Solver Solver;
 #define SOLVER_SETVENDOR               0x08000000
 #define SOLVER_SETREPO                 0x10000000
 #define SOLVER_NOAUTOSET               0x20000000
+#define SOLVER_SETNAME                 0x40000000
 
-#define SOLVER_SETMASK                 0x2f000000
+#define SOLVER_SETMASK                 0x7f000000
 
 #define SOLVER_REASON_UNRELATED                0
 #define SOLVER_REASON_UNIT_RULE                1
@@ -279,6 +282,7 @@ typedef struct _Solver Solver;
 #define SOLVER_FLAG_IGNORE_RECOMMENDED         7
 #define SOLVER_FLAG_ADD_ALREADY_RECOMMENDED    8
 #define SOLVER_FLAG_NO_INFARCHCHECK            9
+#define SOLVER_FLAG_ALLOW_NAMECHANGE           10
 
 extern Solver *solver_create(Pool *pool);
 extern void solver_free(Solver *solv);
index a33e7ad..408fc6e 100644 (file)
@@ -711,6 +711,8 @@ solver_printsolution(Solver *solv, Id problem, Id solution)
              int illegal = policy_is_illegal(solv, s, sd, 0);
              if ((illegal & POLICY_ILLEGAL_DOWNGRADE) != 0)
                POOL_DEBUG(SOLV_DEBUG_RESULT, "  - allow downgrade of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd));
+             if ((illegal & POLICY_ILLEGAL_NAMECHANGE) != 0)
+               POOL_DEBUG(SOLV_DEBUG_RESULT, "  - allow name change of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd));
              if ((illegal & POLICY_ILLEGAL_ARCHCHANGE) != 0)
                POOL_DEBUG(SOLV_DEBUG_RESULT, "  - allow architecture change of %s to %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, sd));
              if ((illegal & POLICY_ILLEGAL_VENDORCHANGE) != 0)
@@ -1026,6 +1028,11 @@ policy_illegal2str(Solver *solv, int illegal, Solvable *s, Solvable *rs)
       str = pool_tmpjoin(pool, "downgrade of ", pool_solvable2str(pool, s), 0);
       return pool_tmpappend(pool, str, " to ", pool_solvable2str(pool, rs));
     }
+  if (illegal == POLICY_ILLEGAL_NAMECHANGE)
+    {
+      str = pool_tmpjoin(pool, "name change of ", pool_solvable2str(pool, s), 0);
+      return pool_tmpappend(pool, str, " to ", pool_solvable2str(pool, rs));
+    }
   if (illegal == POLICY_ILLEGAL_ARCHCHANGE)
     {
       str = pool_tmpjoin(pool, "architecture change of ", pool_solvable2str(pool, s), 0);