Hello community,

here is the log from the commit of package libsolv for openSUSE:Factory checked 
in at 2012-12-21 10:15:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libsolv (Old)
 and      /work/SRC/openSUSE:Factory/.libsolv.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libsolv", Maintainer is ""

Changes:
--------
--- /work/SRC/openSUSE:Factory/libsolv/libsolv.changes  2012-12-07 
14:42:06.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.libsolv.new/libsolv.changes     2012-12-21 
10:15:47.000000000 +0100
@@ -1,0 +2,8 @@
+Tue Dec 18 19:20:19 CET 2012 - [email protected]
+
+- fix potential access to freed memory
+- improve find_problemrule speed
+- add support for special namespaceprovides jobs
+- bump version to 0.2.3
+
+-------------------------------------------------------------------

Old:
----
  libsolv-0.2.2.tar.bz2

New:
----
  libsolv-0.2.3.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libsolv.spec ++++++
--- /var/tmp/diff_new_pack.VIU2iq/_old  2012-12-21 10:15:48.000000000 +0100
+++ /var/tmp/diff_new_pack.VIU2iq/_new  2012-12-21 10:15:48.000000000 +0100
@@ -16,7 +16,7 @@
 #
 
 Name:           libsolv
-Version:        0.2.2
+Version:        0.2.3
 Release:        0
 Url:            git://gitorious.org/opensuse/libsolv.git
 Source:         libsolv-%{version}.tar.bz2
@@ -63,11 +63,7 @@
 BuildRequires:  swig
 %endif
 %if %{with ruby_binding}
-%if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 
600
-%global ruby_vendorarch %(ruby -rrbconfig -e 'puts 
Config::CONFIG["sitearchdir"]')
-%else
-%global ruby_vendorarch %(ruby -rrbconfig -e 'puts 
Config::CONFIG["vendorarchdir"]')
-%endif
+%global ruby_vendorarch %(ruby  -r rbconfig -e "puts 
Config::CONFIG['vendorarchdir'].nil? ? Config::CONFIG['sitearchdir'] : 
Config::CONFIG['vendorarchdir']")
 BuildRequires:  ruby
 BuildRequires:  ruby-devel
 BuildRequires:  swig

++++++ libsolv-0.2.2.tar.bz2 -> libsolv-0.2.3.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/VERSION.cmake 
new/libsolv-0.2.3/VERSION.cmake
--- old/libsolv-0.2.2/VERSION.cmake     2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/VERSION.cmake     2012-12-19 15:41:18.000000000 +0100
@@ -49,5 +49,5 @@
 
 SET(LIBSOLV_MAJOR "0")
 SET(LIBSOLV_MINOR "2")
-SET(LIBSOLV_PATCH "2")
+SET(LIBSOLV_PATCH "3")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/bindings/solv.i 
new/libsolv-0.2.3/bindings/solv.i
--- old/libsolv-0.2.2/bindings/solv.i   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/bindings/solv.i   2012-12-19 15:41:18.000000000 +0100
@@ -2459,6 +2459,7 @@
   static const int SOLVER_RULE_FEATURE = SOLVER_RULE_FEATURE;
   static const int SOLVER_RULE_JOB = SOLVER_RULE_JOB;
   static const int SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP = 
SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
+  static const int SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM = 
SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
   static const int SOLVER_RULE_DISTUPGRADE = SOLVER_RULE_DISTUPGRADE;
   static const int SOLVER_RULE_INFARCH = SOLVER_RULE_INFARCH;
   static const int SOLVER_RULE_CHOICE = SOLVER_RULE_CHOICE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/examples/pysolv 
new/libsolv-0.2.3/examples/pysolv
--- old/libsolv-0.2.2/examples/pysolv   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/examples/pysolv   2012-12-19 15:41:18.000000000 +0100
@@ -762,7 +762,7 @@
     if not problems:
         break
     for problem in problems:
-        print "Problem %d:" % problem.id
+        print "Problem %d/%d:" % (problem.id, len(problems))
         r = problem.findproblemrule()
         ri = r.info()
         print ri.problemstr()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/examples/rbsolv 
new/libsolv-0.2.3/examples/rbsolv
--- old/libsolv-0.2.2/examples/rbsolv   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/examples/rbsolv   2012-12-19 15:41:18.000000000 +0100
@@ -638,7 +638,7 @@
   problems = solver.solve(jobs)
   break if problems.empty?
   for problem in problems
-    puts "Problem #{problem.id}:"
+    puts "Problem #{problem.id}/#{problems.count}:"
     puts problem.findproblemrule.info.problemstr
     solutions = problem.solutions
     for solution in solutions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/examples/solv.c 
new/libsolv-0.2.3/examples/solv.c
--- old/libsolv-0.2.2/examples/solv.c   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/examples/solv.c   2012-12-19 15:41:18.000000000 +0100
@@ -2214,6 +2214,19 @@
         }
       return bestp;
     }
+#if 0
+  if (name == NAMESPACE_LANGUAGE)
+    {
+      if (!strcmp(pool_id2str(pool, evr), "ja"))
+       return 1;
+      if (!strcmp(pool_id2str(pool, evr), "de"))
+       return 1;
+      if (!strcmp(pool_id2str(pool, evr), "en"))
+       return 1;
+      if (!strcmp(pool_id2str(pool, evr), "en_US"))
+       return 1;
+    }
+#endif
   return 0;
 }
 
@@ -2808,6 +2821,10 @@
   // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, 
pool_str2id(pool, "kernel-pae", 1));
   // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, 
pool_str2id(pool, "kernel-pae-base", 1));
   // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, 
pool_str2id(pool, "kernel-pae-extra", 1));
+#if 0
+  queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, 
NAMESPACE_LANGUAGE, 0, REL_NAMESPACE, 1));
+  queue_push2(&job, SOLVER_ERASE|SOLVER_CLEANDEPS|SOLVER_SOLVABLE_PROVIDES, 
pool_rel2id(pool, NAMESPACE_LANGUAGE, 0, REL_NAMESPACE, 1));
+#endif
 
 #ifdef SOFTLOCKS_PATH
   addsoftlocks(pool, &job);
@@ -2834,7 +2851,7 @@
       for (problem = 1; problem <= pcnt; problem++)
        {
          int take = 0;
-         printf("Problem %d:\n", problem);
+         printf("Problem %d/%d:\n", problem, pcnt);
          solver_printprobleminfo(solv, problem);
          printf("\n");
          scnt = solver_solution_count(solv, problem);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/ext/CMakeLists.txt 
new/libsolv-0.2.3/ext/CMakeLists.txt
--- old/libsolv-0.2.2/ext/CMakeLists.txt        2012-12-05 14:38:04.000000000 
+0100
+++ new/libsolv-0.2.3/ext/CMakeLists.txt        2012-12-19 15:41:18.000000000 
+0100
@@ -74,10 +74,22 @@
 SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
 SET (CMAKE_SHARED_LINKER_FLAGS "${LINK_FLAGS} 
-Wl,--version-script=${CMAKE_SOURCE_DIR}/ext/libsolvext.ver")
 
+SET (SYSTEM_LIBRARIES ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
+IF (ENABLE_LZMA_COMPRESSION)
+SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${LZMA_LIBRARY})
+ENDIF (ENABLE_LZMA_COMPRESSION)
+IF (ENABLE_BZIP2_COMPRESSION)
+SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${BZIP2_LIBRARIES})
+ENDIF (ENABLE_BZIP2_COMPRESSION)
+IF (ENABLE_RPMDB)
+SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES})
+ENDIF (ENABLE_RPMDB)
+
 IF (DISABLE_SHARED)
 ADD_LIBRARY (libsolvext STATIC ${libsolvext_SRCS})
 ELSE (DISABLE_SHARED)
 ADD_LIBRARY (libsolvext SHARED ${libsolvext_SRCS})
+TARGET_LINK_LIBRARIES(libsolvext ${SYSTEM_LIBRARIES})
 ENDIF (DISABLE_SHARED)
 
 SET_TARGET_PROPERTIES(libsolvext PROPERTIES OUTPUT_NAME "solvext")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/ext/repo_rpmdb.c 
new/libsolv-0.2.3/ext/repo_rpmdb.c
--- old/libsolv-0.2.2/ext/repo_rpmdb.c  2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/ext/repo_rpmdb.c  2012-12-19 15:41:18.000000000 +0100
@@ -450,24 +450,19 @@
 
   strong = flags & (MAKEDEPS_FILTER_STRONG|MAKEDEPS_FILTER_WEAK);
   n = headstringarray(rpmhead, tagn, &nc);
-  if (!n)
+  if (!n || !nc)
     return 0;
+  vc = fc = 0;
   v = headstringarray(rpmhead, tagv, &vc);
-  if (!v)
-    {
-      solv_free(n);
-      return 0;
-    }
   f = headint32array(rpmhead, tagf, &fc);
-  if (!f)
+  if (!v || !f || nc != vc || nc != fc)
     {
+      char *pkgname = rpm_query(rpmhead, 0);
+      fprintf(stderr, "bad dependency entries for %s: %d %d %d\n", pkgname ? 
pkgname : "<NULL>", nc, vc, fc);
+      solv_free(pkgname);
       solv_free(n);
-      free(v);
-      return 0;
-    }
-  if (nc != vc || nc != fc)
-    {
-      fprintf(stderr, "bad dependency entries\n");
+      solv_free(v);
+      solv_free(f);
       return 0;
     }
 
@@ -2269,12 +2264,10 @@
       if (!arch)
        arch = "noarch";
       evr = headtoevr(rpmhead);
-      if (!evr)
-       break;
-      l = strlen(name) + 1 + strlen(evr) + 1 + strlen(arch) + 1;
+      l = strlen(name) + 1 + strlen(evr ? evr : "") + 1 + strlen(arch) + 1;
       r = solv_malloc(l);
-      sprintf(r, "%s-%s.%s", name, evr, arch);
-      free(evr);
+      sprintf(r, "%s-%s.%s", name, evr ? evr : "", arch);
+      solv_free(evr);
       break;
     case SOLVABLE_NAME:
       name = headstring(rpmhead, TAG_NAME);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/ext/testcase.c 
new/libsolv-0.2.3/ext/testcase.c
--- old/libsolv-0.2.2/ext/testcase.c    2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/ext/testcase.c    2012-12-19 15:41:18.000000000 +0100
@@ -657,7 +657,25 @@
       for (sp = pieces[2]; sp < pieces[npieces - 1]; sp++)
        if (*sp == 0)
          *sp = ' ';
-      what = testcase_str2dep(pool, pieces[2]);
+      what = 0;
+      if (pieces[1][0] == 'p' && strncmp(pieces[2], "namespace:", 10) == 0)
+       {
+         char *spe = strchr(pieces[2], '(');
+         int l = strlen(pieces[2]);
+         if (spe && pieces[2][l - 1] == ')')
+           {
+             /* special namespace provides */
+             if (strcmp(spe, "(<NULL>)") != 0)
+               {
+                 pieces[2][l - 1] = 0;
+                 what = testcase_str2dep(pool, spe + 1);
+                 pieces[2][l - 1] = ')';
+               }
+             what = pool_rel2id(pool, pool_strn2id(pool, pieces[2], spe - 
pieces[2], 1), what, REL_NAMESPACE, 1);
+           }
+       }
+      if (!what)
+        what = testcase_str2dep(pool, pieces[2]);
       if (pieces[1][0] == 'n')
        job |= SOLVER_SOLVABLE_NAME;
       else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/package/libsolv.changes 
new/libsolv-0.2.3/package/libsolv.changes
--- old/libsolv-0.2.2/package/libsolv.changes   2012-12-05 14:38:04.000000000 
+0100
+++ new/libsolv-0.2.3/package/libsolv.changes   2012-12-19 15:41:18.000000000 
+0100
@@ -1,4 +1,12 @@
 -------------------------------------------------------------------
+Tue Dec 18 19:20:19 CET 2012 - [email protected]
+
+- fix potential access to freed memory
+- improve find_problemrule speed
+- add support for special namespaceprovides jobs
+- bump version to 0.2.3
+
+-------------------------------------------------------------------
 Wed Dec  5 14:37:39 CET 2012 - [email protected]
 
 - many Selection improvements
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/package/libsolv.spec.in 
new/libsolv-0.2.3/package/libsolv.spec.in
--- old/libsolv-0.2.2/package/libsolv.spec.in   2012-12-05 14:38:04.000000000 
+0100
+++ new/libsolv-0.2.3/package/libsolv.spec.in   2012-12-19 15:41:18.000000000 
+0100
@@ -63,11 +63,7 @@
 BuildRequires:  swig
 %endif
 %if %{with ruby_binding}
-%if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 
600
-%global ruby_vendorarch %(ruby -rrbconfig -e 'puts 
Config::CONFIG["sitearchdir"]')
-%else
-%global ruby_vendorarch %(ruby -rrbconfig -e 'puts 
Config::CONFIG["vendorarchdir"]')
-%endif
+%global ruby_vendorarch %(ruby  -r rbconfig -e "puts 
Config::CONFIG['vendorarchdir'].nil? ? Config::CONFIG['sitearchdir'] : 
Config::CONFIG['vendorarchdir']")
 BuildRequires:  ruby
 BuildRequires:  ruby-devel
 BuildRequires:  swig
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/pool.c new/libsolv-0.2.3/src/pool.c
--- old/libsolv-0.2.2/src/pool.c        2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/pool.c        2012-12-19 15:41:18.000000000 +0100
@@ -287,7 +287,7 @@
     return;
   sorted = solv_malloc2(pool->ss.nstrings, sizeof(Id));
   for (i = id = 0; id < pool->ss.nstrings; id++)
-    if (pool->whatprovides[id] && pool->whatprovides[id] != 1)
+    if (pool->whatprovides[id] >= 4)
       sorted[i++] = id;
   n = i;
   solv_sort(sorted, n, sizeof(Id), pool_shrink_whatprovides_sortcmp, pool);
@@ -319,11 +319,11 @@
       lastid = id;
     }
   solv_free(sorted);
-  dp = pool->whatprovidesdata + 2;
+  dp = pool->whatprovidesdata + 4;
   for (id = 1; id < pool->ss.nstrings; id++)
     {
       o = pool->whatprovides[id];
-      if (o == 0 || o == 1)
+      if (!o)
        continue;
       if ((Id)o < 0)
        {
@@ -333,6 +333,8 @@
          pool->whatprovides[id] = pool->whatprovides[i];
          continue;
        }
+      if (o < 4)
+       continue;
       lp = pool->whatprovidesdata + o;
       if (lp < dp)
        abort();
@@ -408,7 +410,7 @@
        }
     }
 
-  off = 2;     /* first entry is undef, second is empty list */
+  off = 4;     /* first entry is undef, second is empty list, third is system 
solvable  */
   np = 0;                             /* number of names provided */
   for (i = 0, idp = whatprovides; i < num; i++, idp++)
     {
@@ -431,6 +433,7 @@
 
   /* alloc space for all providers + extra */
   whatprovidesdata = solv_calloc(off + extra, sizeof(Id));
+  whatprovidesdata[2] = SYSTEMSOLVABLE;
 
   /* now fill data for all provides */
   for (i = pool->nsolvables - 1; i > 0; i--)
@@ -488,10 +491,9 @@
 /*
  * pool_queuetowhatprovides  - add queue contents to whatprovidesdata
  * 
- * on-demand filling of provider information
- * move queue data into whatprovidesdata
- * q: queue of Ids
- * returns: Offset into whatprovides
+ * used for whatprovides, jobs, learnt rules, selections
+ * input: q: queue of Ids
+ * returns: Offset into whatprovidesdata
  *
  */
 Id
@@ -502,8 +504,10 @@
 
   if (count == 0)                     /* queue empty -> 1 */
     return 1;
+  if (count == 1 && q->elements[0] == SYSTEMSOLVABLE)
+    return 2;
 
-  /* extend whatprovidesdata if needed, +1 for ID_NULL-termination */
+  /* extend whatprovidesdata if needed, +1 for 0-termination */
   if (pool->whatprovidesdataleft < count + 1)
     {
       POOL_DEBUG(SOLV_DEBUG_STATS, "growing provides hash data...\n");
@@ -515,9 +519,9 @@
   off = pool->whatprovidesdataoff;
   memcpy(pool->whatprovidesdata + pool->whatprovidesdataoff, q->elements, 
count * sizeof(Id));
 
-  /* adapt count and ID_NULL-terminate */
+  /* adapt count and 0-terminate */
   pool->whatprovidesdataoff += count;
-  pool->whatprovidesdata[pool->whatprovidesdataoff++] = ID_NULL;
+  pool->whatprovidesdata[pool->whatprovidesdataoff++] = 0;
   pool->whatprovidesdataleft -= count + 1;
 
   return (Id)off;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/problems.c 
new/libsolv-0.2.3/src/problems.c
--- old/libsolv-0.2.2/src/problems.c    2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/problems.c    2012-12-19 15:41:18.000000000 +0100
@@ -844,7 +844,7 @@
  */
 
 static void
-findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id 
*sysrp, Id *jobrp)
+findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id 
*sysrp, Id *jobrp, Map *rseen)
 {
   Id rid, d;
   Id lreqr, lconr, lsysr, ljobr;
@@ -873,7 +873,12 @@
     {
       assert(rid > 0);
       if (rid >= solv->learntrules)
-       findproblemrule_internal(solv, solv->learnt_why.elements[rid - 
solv->learntrules], &lreqr, &lconr, &lsysr, &ljobr);
+       {
+         if (MAPTST(rseen, rid - solv->learntrules))
+           continue;
+         MAPSET(rseen, rid - solv->learntrules);
+         findproblemrule_internal(solv, solv->learnt_why.elements[rid - 
solv->learntrules], &lreqr, &lconr, &lsysr, &ljobr, rseen);
+       }
       else if ((rid >= solv->jobrules && rid < solv->jobrules_end) || (rid >= 
solv->infarchrules && rid < solv->infarchrules_end) || (rid >= solv->duprules 
&& rid < solv->duprules_end) || (rid >= solv->bestrules && rid < 
solv->bestrules_end))
        {
          if (!*jobrp)
@@ -949,8 +954,11 @@
 {
   Id reqr, conr, sysr, jobr;
   Id idx = solv->problems.elements[2 * problem - 2];
+  Map rseen;
   reqr = conr = sysr = jobr = 0;
-  findproblemrule_internal(solv, idx, &reqr, &conr, &sysr, &jobr);
+  map_init(&rseen, solv->learntrules ? solv->nrules - solv->learntrules : 0);
+  findproblemrule_internal(solv, idx, &reqr, &conr, &sysr, &jobr, &rseen);
+  map_free(&rseen);
   if (reqr)
     return reqr;       /* some requires */
   if (conr)
@@ -966,14 +974,17 @@
 /*-------------------------------------------------------------------*/
 
 static void
-findallproblemrules_internal(Solver *solv, Id idx, Queue *rules)
+findallproblemrules_internal(Solver *solv, Id idx, Queue *rules, Map *rseen)
 {
   Id rid;
   while ((rid = solv->learnt_pool.elements[idx++]) != 0)
     {
       if (rid >= solv->learntrules)
         {
-         findallproblemrules_internal(solv, solv->learnt_why.elements[rid - 
solv->learntrules], rules);
+         if (MAPTST(rseen, rid - solv->learntrules))
+           continue;
+         MAPSET(rseen, rid - solv->learntrules);
+         findallproblemrules_internal(solv, solv->learnt_why.elements[rid - 
solv->learntrules], rules, rseen);
           continue;
        }
       queue_pushunique(rules, rid);
@@ -991,8 +1002,11 @@
 void
 solver_findallproblemrules(Solver *solv, Id problem, Queue *rules)
 {
+  Map rseen;
   queue_empty(rules);
-  findallproblemrules_internal(solv, solv->problems.elements[2 * problem - 2], 
rules);
+  map_init(&rseen, solv->learntrules ? solv->nrules - solv->learntrules : 0);
+  findallproblemrules_internal(solv, solv->problems.elements[2 * problem - 2], 
rules, &rseen);
+  map_free(&rseen);
 }
 
 /* EOF */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/rules.c 
new/libsolv-0.2.3/src/rules.c
--- old/libsolv-0.2.2/src/rules.c       2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/rules.c       2012-12-19 15:41:18.000000000 +0100
@@ -35,8 +35,8 @@
 /*-------------------------------------------------------------------
  * Check if dependency is possible
  * 
- * mirrors solver_dep_fulfilled but uses map m instead of the decisionmap
- * used in solver_addrpmrulesforweak and solver_createcleandepsmap
+ * mirrors solver_dep_fulfilled but uses map m instead of the decisionmap.
+ * used in solver_addrpmrulesforweak and solver_createcleandepsmap.
  */
 
 static inline int
@@ -2132,10 +2132,14 @@
        *depp = solv->job.elements[jidx + 1];
       if ((r->d == 0 || r->d == -1) && r->w2 == 0 && r->p == -SYSTEMSOLVABLE)
        {
-         if ((solv->job.elements[jidx] & SOLVER_SELECTMASK) == 
SOLVER_SOLVABLE_NAME)
+         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) 
== (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME))
            return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
-         if ((solv->job.elements[jidx] & SOLVER_SELECTMASK) == 
SOLVER_SOLVABLE_PROVIDES)
+         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) 
== (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES))
            return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP;
+         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) 
== (SOLVER_ERASE|SOLVER_SOLVABLE_NAME))
+           return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
+         if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) 
== (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES))
+           return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM;
        }
       return SOLVER_RULE_JOB;
     }
@@ -2410,14 +2414,15 @@
          if (i == q.count)
            continue;   /* already added that one */
        }
-
       d = q.count ? pool_queuetowhatprovides(pool, &q) : 0;
-      solver_addrule(solv, r->p, d);
-      queue_push(&solv->weakruleq, solv->nrules - 1);
-      solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
+
       lastaddedp = r->p;
       lastaddedd = d;
       lastaddedcnt = q.count;
+
+      solver_addrule(solv, r->p, d);
+      queue_push(&solv->weakruleq, solv->nrules - 1);
+      solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid;
 #if 0
       printf("OLD ");
       solver_printrule(solv, SOLV_DEBUG_RESULT, solv->rules + rid);
@@ -2671,6 +2676,59 @@
       queue_push(q, p);
 }
 
+static int
+check_xsupp(Solver *solv, Queue *depq, Id dep)
+{
+  Pool *pool = solv->pool;
+  Id p, pp;
+
+  if (ISRELDEP(dep))
+    {
+      Reldep *rd = GETRELDEP(pool, dep);
+      if (rd->flags >= 8)
+       {
+         if (rd->flags == REL_AND)
+           {
+             if (!check_xsupp(solv, depq, rd->name))
+               return 0;
+             return check_xsupp(solv, depq, rd->evr);
+           }
+         if (rd->flags == REL_OR)
+           {
+             if (check_xsupp(solv, depq, rd->name))
+               return 1;
+             return check_xsupp(solv, depq, rd->evr);
+           }
+         if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
+           return solver_splitprovides(solv, rd->evr);
+         if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
+           return solver_dep_installed(solv, rd->evr);
+       }
+      if (depq && rd->flags == REL_NAMESPACE)
+       {
+         int i;
+         for (i = 0; i < depq->count; i++)
+           if (depq->elements[i] == dep || depq->elements[i] == rd->name)
+            return 1;
+       }
+    }
+  FOR_PROVIDES(p, pp, dep)
+    if (p == SYSTEMSOLVABLE || pool->solvables[p].repo == solv->installed)
+      return 1;
+  return 0;
+}
+
+static inline int
+queue_contains(Queue *q, Id id)
+{
+  int i;
+  for (i = 0; i < q->count; i++)
+    if (q->elements[i] == id)
+      return 1;
+  return 0;
+}
+
+
 /*
  * Find all installed packages that are no longer
  * needed regarding the current solver job.
@@ -2707,7 +2765,7 @@
   Id p, pp, ip, jp;
   Id req, *reqp, sup, *supp;
   Solvable *s;
-  Queue iq, iqcopy;
+  Queue iq, iqcopy, xsuppq;
   int i;
 
   map_empty(cleandepsmap);
@@ -2717,6 +2775,7 @@
   map_init(&im, pool->nsolvables);
   map_init(&installedm, pool->nsolvables);
   queue_init(&iq);
+  queue_init(&xsuppq);
 
   for (i = 0; i < job->count; i += 2)
     {
@@ -2732,6 +2791,50 @@
            if (pool->solvables[p].repo == installed)
              MAPSET(&userinstalled, p - installed->start);
        }
+      if ((how & (SOLVER_JOBMASK | SOLVER_SELECTMASK)) == (SOLVER_ERASE | 
SOLVER_SOLVABLE_PROVIDES))
+       {
+         what = job->elements[i + 1];
+         if (ISRELDEP(what))
+           {
+             Reldep *rd = GETRELDEP(pool, what);
+             if (rd->flags != REL_NAMESPACE)
+               continue;
+             if (rd->evr == 0)
+               {
+                 queue_pushunique(&iq, rd->name);
+                 continue;
+               }
+             FOR_PROVIDES(p, pp, what)
+               if (p)
+                 break;
+             if (p)
+               continue;
+             queue_pushunique(&iq, what);
+           }
+       }
+    }
+
+  /* have special namespace cleandeps erases */
+  if (iq.count)
+    {
+      for (ip = solv->installed->start; ip < solv->installed->end; ip++)
+       {
+         s = pool->solvables + ip;
+         if (s->repo != installed)
+           continue;
+         if (!s->supplements)
+           continue;
+         supp = s->repo->idarraydata + s->supplements;
+         while ((sup = *supp++) != 0)
+           if (check_xsupp(solv, &iq, sup) && !check_xsupp(solv, 0, sup))
+             {
+#ifdef CLEANDEPSDEBUG
+               printf("xsupp %s from %s\n", pool_dep2str(pool, sup), 
pool_solvid2str(pool, ip));
+#endif
+               queue_pushunique(&xsuppq, sup);
+             }
+       }
+      queue_empty(&iq);
     }
 
   /* also add visible patterns to userinstalled for openSUSE */
@@ -2904,6 +3007,8 @@
        continue;
       MAPSET(&im, p);
     }
+  MAPSET(&installedm, SYSTEMSOLVABLE);
+  MAPSET(&im, SYSTEMSOLVABLE);
 
 #ifdef CLEANDEPSDEBUG
   printf("REMOVE PASS\n");
@@ -2916,7 +3021,7 @@
          if (unneeded)
            break;
          /* supplements pass */
-         for (ip = solv->installed->start; ip < solv->installed->end; ip++)
+         for (ip = installed->start; ip < installed->end; ip++)
            {
              if (!MAPTST(&installedm, ip))
                continue;
@@ -2935,7 +3040,7 @@
                {
                  supp = s->repo->idarraydata + s->supplements;
                  while ((sup = *supp++) != 0)
-                   if (dep_possible(solv, sup, &installedm))
+                   if (dep_possible(solv, sup, &installedm) || (xsuppq.count 
&& queue_contains(&xsuppq, sup)))
                      {
                        /* no longer supplemented, also erase */
                        int iqcount = iq.count;
@@ -2949,14 +3054,14 @@
                          }
                        queue_truncate(&iq, iqcount);
 #ifdef CLEANDEPSDEBUG
-                       printf("%s supplemented\n", pool_solvid2str(pool, ip));
+                       printf("%s supplemented [%s]\n", pool_solvid2str(pool, 
ip), pool_dep2str(pool, sup));
 #endif
                        queue_push(&iq, ip);
                      }
                }
            }
          if (!iq.count)
-           break;
+           break;      /* no supplementing package found, we're done */
        }
       ip = queue_shift(&iq);
       s = pool->solvables + ip;
@@ -2988,7 +3093,7 @@
 #endif
              FOR_PROVIDES(p, pp, req)
                {
-                 if (MAPTST(&im, p))
+                 if (p != SYSTEMSOLVABLE && MAPTST(&im, p))
                    {
 #ifdef CLEANDEPSDEBUG
                      printf("%s requires %s\n", pool_solvid2str(pool, ip), 
pool_solvid2str(pool, p));
@@ -3013,7 +3118,7 @@
 #endif
              FOR_PROVIDES(p, pp, req)
                {
-                 if (MAPTST(&im, p))
+                 if (p != SYSTEMSOLVABLE && MAPTST(&im, p))
                    {
 #ifdef CLEANDEPSDEBUG
                      printf("%s recommends %s\n", pool_solvid2str(pool, ip), 
pool_solvid2str(pool, p));
@@ -3037,6 +3142,7 @@
       if (pool->solvables[p].repo == installed)
         MAPSET(&userinstalled, p - installed->start);
     }
+  MAPSET(&im, SYSTEMSOLVABLE); /* in case we cleared it above */
   for (p = installed->start; p < installed->end; p++)
     if (MAPTST(&im, p))
       queue_push(&iq, p);
@@ -3109,6 +3215,11 @@
          while ((req = *reqp++) != 0)
            {
              FOR_PROVIDES(p, pp, req)
+               if (MAPTST(&im, p))
+                 break;
+             if (p)
+               continue;
+             FOR_PROVIDES(p, pp, req)
                {
                  if (!MAPTST(&im, p) && MAPTST(&installedm, p))
                    {
@@ -3131,6 +3242,11 @@
          while ((req = *reqp++) != 0)
            {
              FOR_PROVIDES(p, pp, req)
+               if (MAPTST(&im, p))
+                 break;
+             if (p)
+               continue;
+             FOR_PROVIDES(p, pp, req)
                {
                  if (!MAPTST(&im, p) && MAPTST(&installedm, p))
                    {
@@ -3171,6 +3287,7 @@
   map_free(&im);
   map_free(&installedm);
   map_free(&userinstalled);
+  queue_free(&xsuppq);
 #ifdef CLEANDEPSDEBUG
   printf("=== final cleandeps map:\n");
   for (p = installed->start; p < installed->end; p++)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/rules.h 
new/libsolv-0.2.3/src/rules.h
--- old/libsolv-0.2.2/src/rules.h       2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/rules.h       2012-12-19 15:41:18.000000000 +0100
@@ -62,6 +62,7 @@
   SOLVER_RULE_FEATURE = 0x300,
   SOLVER_RULE_JOB = 0x400,
   SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP,
+  SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM,
   SOLVER_RULE_DISTUPGRADE = 0x500,
   SOLVER_RULE_INFARCH = 0x600,
   SOLVER_RULE_CHOICE = 0x700,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/selection.c 
new/libsolv-0.2.3/src/selection.c
--- old/libsolv-0.2.2/src/selection.c   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/selection.c   2012-12-19 15:41:18.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Novell Inc.
+ * Copyright (c) 2012, Novell Inc.
  *
  * This program is licensed under the BSD license, read LICENSE.BSD
  * for further information
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/selection.h 
new/libsolv-0.2.3/src/selection.h
--- old/libsolv-0.2.2/src/selection.h   2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/selection.h   2012-12-19 15:41:18.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Novell Inc.
+ * Copyright (c) 2012, Novell Inc.
  *
  * This program is licensed under the BSD license, read LICENSE.BSD
  * for further information
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/solver.c 
new/libsolv-0.2.3/src/solver.c
--- old/libsolv-0.2.2/src/solver.c      2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/solver.c      2012-12-19 15:41:18.000000000 +0100
@@ -103,6 +103,64 @@
   return 0;
 }
 
+/* mirrors solver_dep_installed, but returns 2 if a
+ * dependency listed in solv->installsuppdepq was involved */
+static int
+solver_check_installsuppdepq_dep(Solver *solv, Id dep)
+{
+  Pool *pool = solv->pool;
+  Id p, pp;
+  Queue *q;
+
+  if (ISRELDEP(dep))
+    {
+      Reldep *rd = GETRELDEP(pool, dep);
+      if (rd->flags == REL_AND)
+        {
+         int r2, r1 = solver_check_installsuppdepq_dep(solv, rd->name);
+          if (!r1)
+            return 0;
+         r2 = solver_check_installsuppdepq_dep(solv, rd->evr);
+         if (!r2)
+           return 0;
+          return r1 == 2 || r2 == 2 ? 2 : 1;
+        }
+      if (rd->flags == REL_OR)
+       {
+         int r2, r1 = solver_check_installsuppdepq_dep(solv, rd->name);
+         r2 = solver_check_installsuppdepq_dep(solv, rd->evr);
+         if (!r1 && !r2)
+           return 0;
+          return r1 == 2 || r2 == 2 ? 2 : 1;
+       }
+      if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES)
+        return solver_splitprovides(solv, rd->evr);
+      if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED)
+        return solver_dep_installed(solv, rd->evr);
+      if (rd->flags == REL_NAMESPACE && (q = solv->installsuppdepq) != 0)
+       {
+         int i;
+         for (i = 0; i < q->count; i++)
+           if (q->elements[i] == dep || q->elements[i] == rd->name)
+             return 2;
+       }
+    }
+  FOR_PROVIDES(p, pp, dep)
+    if (solv->decisionmap[p] > 0)
+      return 1;
+  return 0;
+}
+
+static int
+solver_check_installsuppdepq(Solver *solv, Solvable *s)
+{
+  Id sup, *supp;
+  supp = s->repo->idarraydata + s->supplements;
+  while ((sup = *supp++) != 0)
+    if (solver_check_installsuppdepq_dep(solv, sup) == 2)
+      return 1;
+  return 0;
+}
 
 static Id
 autouninstall(Solver *solv, Id *problem)
@@ -1430,6 +1488,11 @@
       queue_free(solv->update_targets);
       solv->update_targets = solv_free(solv->update_targets);
     }
+  if (solv->installsuppdepq)
+    {
+      queue_free(solv->installsuppdepq);
+      solv->installsuppdepq = solv_free(solv->installsuppdepq);
+    }
 
   map_free(&solv->recommendsmap);
   map_free(&solv->suggestsmap);
@@ -2151,6 +2214,8 @@
                    continue;
                  if (!solver_is_supplementing(solv, s))
                    dqs.elements[j++] = p;
+                 else if (s->supplements && solv->installsuppdepq && 
solver_check_installsuppdepq(solv, s))
+                   dqs.elements[j++] = p;
                }
              dqs.count = j;
              /* undo turning off */
@@ -3140,6 +3205,21 @@
              p = queue_shift(&q);      /* get first candidate */
              d = !q.count ? 0 : pool_queuetowhatprovides(pool, &q);    /* 
internalize */
            }
+         /* force install of namespace supplements hack */
+         if (select == SOLVER_SOLVABLE_PROVIDES && !d && (p == SYSTEMSOLVABLE 
|| p == -SYSTEMSOLVABLE) && ISRELDEP(what))
+           {
+             Reldep *rd = GETRELDEP(pool, what);
+             if (rd->flags == REL_NAMESPACE)
+               {
+                 p = SYSTEMSOLVABLE;
+                 if (!solv->installsuppdepq)
+                   {
+                     solv->installsuppdepq = solv_calloc(1, sizeof(Queue));
+                     queue_init(solv->installsuppdepq);
+                   }
+                 queue_pushunique(solv->installsuppdepq, rd->evr == 0 ? 
rd->name : what);
+               }
+           }
          solver_addjobrule(solv, p, d, i, weak);
           if (how & SOLVER_FORCEBEST)
            hasbestinstalljob = 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/solver.h 
new/libsolv-0.2.3/src/solver.h
--- old/libsolv-0.2.2/src/solver.h      2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/solver.h      2012-12-19 15:41:18.000000000 +0100
@@ -225,6 +225,8 @@
   Queue *cleandeps_mistakes;           /* mistakes we made */
 
   Queue *update_targets;               /* update to specific packages */
+
+  Queue *installsuppdepq;              /* deps from the install namespace 
provides hack */
 #endif /* LIBSOLV_INTERNAL */
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/solverdebug.c 
new/libsolv-0.2.3/src/solverdebug.c
--- old/libsolv-0.2.2/src/solverdebug.c 2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/solverdebug.c 2012-12-19 15:41:18.000000000 +0100
@@ -569,6 +569,9 @@
     case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
       POOL_DEBUG(SOLV_DEBUG_RESULT, "nothing provides requested %s\n", 
pool_dep2str(pool, dep));
       return;
+    case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
+      POOL_DEBUG(SOLV_DEBUG_RESULT, "%s is provided by the system\n", 
pool_dep2str(pool, dep));
+      return;
     case SOLVER_RULE_RPM:
       POOL_DEBUG(SOLV_DEBUG_RESULT, "some dependency problem\n");
       return;
@@ -996,6 +999,8 @@
       return "conflicting requests";
     case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
       return pool_tmpjoin(pool, "nothing provides requested ", 
pool_dep2str(pool, dep), 0);
+    case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
+      return pool_tmpjoin(pool, pool_dep2str(pool, dep), " is provided by the 
system", 0);
     case SOLVER_RULE_RPM:
       return "some dependency problem";
     case SOLVER_RULE_RPM_NOT_INSTALLABLE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/src/transaction.c 
new/libsolv-0.2.3/src/transaction.c
--- old/libsolv-0.2.2/src/transaction.c 2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/src/transaction.c 2012-12-19 15:41:18.000000000 +0100
@@ -77,22 +77,20 @@
        return;
       if (q > 0)
        {
+         /* only a single obsoleting package */
          queue_push(pkgs, q);
          return;
        }
       /* find which packages obsolete us */
       for (i = 0; i < ti->count; i += 2)
        if (ti->elements[i + 1] == p)
-         {
-           queue_push(pkgs, p);
-           queue_push(pkgs, ti->elements[i]);
-         }
+         queue_push2(pkgs, p, ti->elements[i]);
       /* sort obsoleters */
       if (pkgs->count > 2)
        solv_sort(pkgs->elements, pkgs->count / 2, 2 * sizeof(Id), 
obsq_sortcmp, pool);
       for (i = 0; i < pkgs->count; i += 2)
        pkgs->elements[i / 2] = pkgs->elements[i + 1];
-      pkgs->count /= 2;
+      queue_truncate(pkgs, pkgs->count / 2);
     }
   else
     {
@@ -112,8 +110,8 @@
 {
   Pool *pool = trans->pool;
   Solvable *s = pool->solvables + p;
-  Queue ti;
-  Id tibuf[5];
+  Queue *ti;
+  int i;
 
   if (p <= 0 || !s->repo)
     return 0;
@@ -122,11 +120,11 @@
       p = trans->transaction_installed[p - pool->installed->start];
       return p < 0 ? -p : p;
     }
-  queue_init_buffer(&ti, tibuf, sizeof(tibuf)/sizeof(*tibuf));
-  transaction_all_obs_pkgs(trans, p, &ti);
-  p = ti.count ? ti.elements[0] : 0;
-  queue_free(&ti);
-  return p;
+  ti = &trans->transaction_info;
+  for (i = 0; i < ti->count; i += 2)
+    if (ti->elements[i] == p)
+      return ti->elements[i + 1];
+  return 0;
 }
 
 
@@ -209,6 +207,7 @@
   if (!s->repo)
     return SOLVER_TRANSACTION_IGNORE;
 
+  /* XXX: SUSE only? */
   if (!(mode & SOLVER_TRANSACTION_KEEP_PSEUDO))
     {
       const char *n = pool_id2str(pool, s->name);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libsolv-0.2.2/test/testcases/namespace/namespaceprovides.t 
new/libsolv-0.2.3/test/testcases/namespace/namespaceprovides.t
--- old/libsolv-0.2.2/test/testcases/namespace/namespaceprovides.t      
1970-01-01 01:00:00.000000000 +0100
+++ new/libsolv-0.2.3/test/testcases/namespace/namespaceprovides.t      
2012-12-19 15:41:18.000000000 +0100
@@ -0,0 +1,59 @@
+repo system 0 testtags <inline>
+#>=Pkg: B 1 1 noarch
+#>=Prv: locale(en)
+#>=Pkg: C 1 1 noarch
+repo test 0 testtags <inline>
+#>=Pkg: A 1 1 noarch
+#>=Prv: locale(de)
+#>=Pkg: C-de 1 1 noarch
+#>=Prv: locale(C:de)
+#>=Pkg: C-en 1 1 noarch
+#>=Prv: locale(C:en)
+system i686 rpm system
+
+# first test an empty job
+namespace namespace:language(de) @SYSTEM
+result transaction,problems <inline>
+
+# then test addalreadyrecommended
+nextjob
+namespace namespace:language(de) @SYSTEM
+solverflags addalreadyrecommended
+result transaction,problems <inline>
+#>install A-1-1.noarch@test
+#>install C-de-1-1.noarch@test
+
+nextjob
+namespace namespace:language(de) @SYSTEM
+job install provides namespace:language(de)
+result transaction,problems <inline>
+#>install A-1-1.noarch@test
+#>install C-de-1-1.noarch@test
+
+nextjob
+namespace namespace:language(de) @SYSTEM
+job erase provides namespace:language(en) [cleandeps]
+result transaction,problems <inline>
+#>erase B-1-1.noarch@system
+
+nextjob
+namespace namespace:language(de) @SYSTEM
+job install provides namespace:language(<NULL>)
+result transaction,problems <inline>
+#>install A-1-1.noarch@test
+#>install C-de-1-1.noarch@test
+
+nextjob
+namespace namespace:language(de) @SYSTEM
+job erase provides namespace:language(<NULL>) [cleandeps]
+result transaction,problems <inline>
+#>erase B-1-1.noarch@system
+
+nextjob
+namespace namespace:language(de) @SYSTEM
+job install provides namespace:language(<NULL>)
+job erase provides namespace:language(<NULL>) [cleandeps]
+result transaction,problems <inline>
+#>erase B-1-1.noarch@system
+#>install A-1-1.noarch@test
+#>install C-de-1-1.noarch@test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/test/testcases/sat/assert-system.repo 
new/libsolv-0.2.3/test/testcases/sat/assert-system.repo
--- old/libsolv-0.2.2/test/testcases/sat/assert-system.repo     2012-12-05 
14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/test/testcases/sat/assert-system.repo     1970-01-01 
01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-=Pkg: A 1 1 x86_64
-=Prv: AA
-=Pkg: B 1 1 x86_64
-=Prv: AA
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/test/testcases/sat/assert.t 
new/libsolv-0.2.3/test/testcases/sat/assert.t
--- old/libsolv-0.2.2/test/testcases/sat/assert.t       2012-12-05 
14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/test/testcases/sat/assert.t       2012-12-19 
15:41:18.000000000 +0100
@@ -1,4 +1,8 @@
-repo system 0 testtags assert-system.repo
+repo system 0 testtags <inline>
+#>=Pkg: A 1 1 x86_64
+#>=Prv: AA
+#>=Pkg: B 1 1 x86_64
+#>=Prv: AA
 system x86_64 rpm system
 job erase provides AA [weak]
 job install pkg B-1-1.x86_64@system
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/tools/dumpsolv.c 
new/libsolv-0.2.3/tools/dumpsolv.c
--- old/libsolv-0.2.2/tools/dumpsolv.c  2012-12-05 14:38:04.000000000 +0100
+++ new/libsolv-0.2.3/tools/dumpsolv.c  2012-12-19 15:41:18.000000000 +0100
@@ -24,11 +24,11 @@
   Repodata *data;
   if (repo->nrepodata == 0)
     return;
-  printf("repo contains %d repodata sections:\n", repo->nrepodata);
+  printf("repo contains %d repodata sections:\n", repo->nrepodata - 1);
   FOR_REPODATAS(repo, i, data)
     {
       unsigned int j;
-      printf("\nrepodata %d has %d keys, %d schemata\n", i + 1, data->nkeys - 
1, data->nschemata - 1);
+      printf("\nrepodata %d has %d keys, %d schemata\n", i, data->nkeys - 1, 
data->nschemata - 1);
       for (j = 1; j < data->nkeys; j++)
         printf("  %s (type %s size %d storage %d)\n", pool_id2str(repo->pool, 
data->keys[j].name), pool_id2str(repo->pool, data->keys[j].type), 
data->keys[j].size, data->keys[j].storage);
       if (data->localpool)
@@ -178,18 +178,16 @@
 
 
 static int
-loadcallback (Pool *pool, Repodata *data, void *vdata)
+loadcallback(Pool *pool, Repodata *data, void *vdata)
 {
   FILE *fp = 0;
   int r;
   const char *location;
 
-printf("LOADCALLBACK\n");
   location = repodata_lookup_str(data, SOLVID_META, REPOSITORY_LOCATION);
-printf("loc %s\n", location);
   if (!location || !with_attr)
     return 0;
-  fprintf (stderr, "Loading SOLV file %s\n", location);
+  fprintf (stderr, "[Loading SOLV file %s]\n", location);
   fp = fopen (location, "r");
   if (!fp)
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/tools/installcheck.c 
new/libsolv-0.2.3/tools/installcheck.c
--- old/libsolv-0.2.2/tools/installcheck.c      2012-12-05 14:38:04.000000000 
+0100
+++ new/libsolv-0.2.3/tools/installcheck.c      2012-12-19 15:41:18.000000000 
+0100
@@ -379,6 +379,7 @@
                          printf("  %s can not be updated\n", 
pool_solvable2str(pool, s));
                          break;
                        case SOLVER_RULE_JOB:
+                       case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
                          break;
                        case SOLVER_RULE_RPM:
                          printf("  some dependency problem\n");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.2.2/tools/patchcheck.c 
new/libsolv-0.2.3/tools/patchcheck.c
--- old/libsolv-0.2.2/tools/patchcheck.c        2012-12-05 14:38:04.000000000 
+0100
+++ new/libsolv-0.2.3/tools/patchcheck.c        2012-12-19 15:41:18.000000000 
+0100
@@ -93,6 +93,7 @@
                      }
                  break;
                case SOLVER_RULE_JOB:
+               case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
                  break;
                case SOLVER_RULE_RPM:
                  printf("  some dependency problem\n");

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to