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;
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 },
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;
}
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;
}
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;
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)
#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);
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);
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)
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;
{
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:
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;
/* 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);
*-------------------------------------------------------------------------------------------------------------*/
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 */
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 */
#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
#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);
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)
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);