]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add support for conda constrains
authorMichael Schroeder <mls@suse.de>
Thu, 14 Nov 2019 13:16:59 +0000 (14:16 +0100)
committerMichael Schroeder <mls@suse.de>
Thu, 14 Nov 2019 13:16:59 +0000 (14:16 +0100)
ext/repo_conda.c
ext/repo_testcase.c
src/knownid.h
src/problems.c
src/rules.c
src/rules.h

index 0828aff6b3b56cd498f86d344448b391b91315e2..9352b71e3cec517acc7ef990f827218f0c83a59c 100644 (file)
@@ -42,6 +42,24 @@ parse_deps(struct parsedata *pd, struct solv_jsonparser *jp, Offset *depp)
   return type;
 }
 
+static int
+parse_otherdeps(struct parsedata *pd, struct solv_jsonparser *jp, Id handle, Id keyname)
+{
+  int type = JP_ARRAY;
+  while (type > 0 && (type = jsonparser_parse(jp)) > 0 && type != JP_ARRAY_END)
+    {
+      if (type == JP_STRING)
+       {
+         Id id = pool_conda_matchspec(pd->pool, jp->value);
+         if (id)
+           repodata_add_idarray(pd->data, handle, keyname, id);
+       }
+      else
+       type = jsonparser_skip(jp, type);
+    }
+  return type;
+}
+
 static int
 parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
 {
@@ -64,6 +82,8 @@ parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
        type = parse_deps(pd, jp, &s->requires);
       else if (type == JP_ARRAY && !strcmp(jp->key, "requires"))
        type = parse_deps(pd, jp, &s->requires);
+      else if (type == JP_ARRAY && !strcmp(jp->key, "constrains"))
+       type = parse_otherdeps(pd, jp, handle, SOLVABLE_CONSTRAINS);
       else if (type == JP_STRING && !strcmp(jp->key, "license"))
        repodata_add_poolstr_array(data, handle, SOLVABLE_LICENSE, jp->value);
       else if (type == JP_STRING && !strcmp(jp->key, "md5"))
index 48d8a0eda14d5a130fba02b07a1eed3c623721e2..5cc03271458ff051da38a5cc1b245e2214cd2d7c 100644 (file)
@@ -461,6 +461,14 @@ testcase_write_testtags(Repo *repo, FILE *fp)
            fprintf(fp, "%s\n", testcase_dep2str(pool, q.elements[i]));
          fprintf(fp, "-Ipr:\n");
        }
+      if (solvable_lookup_idarray(s, SOLVABLE_CONSTRAINS, &q))
+       {
+         int i;
+         fprintf(fp, "+Cns:\n");
+         for (i = 0; i < q.count; i++)
+           fprintf(fp, "%s\n", testcase_dep2str(pool, q.elements[i]));
+         fprintf(fp, "-Cns:\n");
+       }
       if (s->vendor)
        fprintf(fp, "=Vnd: %s\n", pool_id2str(pool, s->vendor));
       if (solvable_lookup_idarray(s, SOLVABLE_BUILDFLAVOR, &q))
@@ -690,6 +698,9 @@ testcase_add_testtags(Repo *repo, FILE *fp, int flags)
            repodata_add_idarray(data, s - pool->solvables, SOLVABLE_PREREQ_IGNOREINST, id);
            break;
          }
+       case 'C' << 16 | 'n' << 8 | 's':
+         repodata_add_idarray(data, s - pool->solvables, SOLVABLE_CONSTRAINS, testcase_str2dep(pool, line + 6));
+         break;
        case 'F' << 16 | 'l' << 8 | 'v':
          repodata_add_poolstr_array(data, s - pool->solvables, SOLVABLE_BUILDFLAVOR, line + 6);
          break;
index 3a88ee263e4fe13afe0a252167d24ac27beb834d..96c9adf019d0be3e0136aa3b5cf23b78cff57625 100644 (file)
@@ -265,6 +265,8 @@ KNOWNID(UPDATE_STATUS,                      "update:status"),               /* "stable", "testing", ...*/
 
 KNOWNID(LIBSOLV_SELF_DESTRUCT_PKG,      "libsolv-self-destruct-pkg()"),        /* this package will self-destruct on installation */
 
+KNOWNID(SOLVABLE_CONSTRAINS,           "solvable:constrains"),         /* conda */
+
 KNOWNID(ID_NUM_INTERNAL,               0)
 
 #ifdef KNOWNID_INITIALIZE
index b46d6249013fe0102b587100dee77161c9df5b4b..bcce038d45c96cfbf9cc8edba864265488301fe4 100644 (file)
@@ -1341,6 +1341,10 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ
       return pool_tmpappend(pool, s, pool_dep2str(pool, dep), 0);
     case SOLVER_RULE_BLACK:
       return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " can only be installed by a direct request");
+    case SOLVER_RULE_PKG_CONSTRAINS:
+      s = pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), 0);
+      s = pool_tmpappend(pool, s, " has a constraint ", pool_dep2str(pool, dep));
+      return pool_tmpappend(pool, s, " conflicting with ", pool_solvid2str(pool, target));
     default:
       return "bad problem rule type";
     }
index cb8d17dd55a6ad8e06936c7d9f8f86260eaa6fcf..dc4b4137c158ade8bd9241995763a3f0c3a14228 100644 (file)
@@ -665,6 +665,30 @@ add_complex_deprules(Solver *solv, Id p, Id dep, int type, int dontfix, Queue *w
 
 #endif
 
+#ifdef ENABLE_CONDA
+void
+add_conda_constrains_rule(Solver *solv, Id n, Id dep)
+{
+  Pool *pool = solv->pool;
+  Reldep *rd;
+  Id p, pp, pdep;
+  if (!ISRELDEP(dep))
+    return;
+  rd = GETRELDEP(pool, dep);
+  pdep = pool_whatprovides(pool, dep);
+  FOR_PROVIDES(p, pp, rd->name)
+    {
+      Id p2;
+      while ((p2 = pool->whatprovidesdata[pdep]) != 0 && p2 < p)
+       pdep++;
+      if (p == p2)
+       pdep++;
+      else
+        addpkgrule(solv, -n, -p, 0, SOLVER_RULE_PKG_CONSTRAINS, dep);
+    }
+}
+#endif
+
 /*-------------------------------------------------------------------
  *
  * add dependency rules for solvable
@@ -896,6 +920,17 @@ solver_addpkgrulesforsolvable(Solver *solv, Solvable *s, Map *m)
            }
        }
 
+#ifdef ENABLE_CONDA
+      if (pool->disttype == DISTTYPE_CONDA)
+       {
+         if (prereqq.count)            /* reuse the prereq queue */
+           queue_empty(&prereqq);
+         solvable_lookup_idarray(s, SOLVABLE_CONSTRAINS, &prereqq);
+         for (i = 0; i < prereqq.count; i++)
+           add_conda_constrains_rule(solv, n, prereqq.elements[i]);
+       }
+#endif
+
       /* that's all we check for src packages */
       if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
        continue;
index 92860908f809513f9f83cf7b5fe7d9f120f957ae..3fcede076013806fdd9821a623cedbd1955ab40e 100644 (file)
@@ -59,6 +59,7 @@ typedef enum {
   SOLVER_RULE_PKG_IMPLICIT_OBSOLETES,
   SOLVER_RULE_PKG_INSTALLED_OBSOLETES,
   SOLVER_RULE_PKG_RECOMMENDS,
+  SOLVER_RULE_PKG_CONSTRAINS,
   SOLVER_RULE_UPDATE = 0x200,
   SOLVER_RULE_FEATURE = 0x300,
   SOLVER_RULE_JOB = 0x400,