[PATCH] Stop automatic dependency selection on setup.exe chooser screen

Corinna Vinschen corinna-cygwin@cygwin.com
Fri Aug 6 20:08:00 GMT 2010


On Aug  6 19:21, Andy Koppe wrote:
> On 6 August 2010 18:09, Andy Koppe wrote:
> > On 6 August 2010 17:00, Corinna Vinschen wrote:
> >>> On Fri, Aug 06, 2010 at 01:25:54PM +0100, Andy Koppe wrote:
> >>> >The dependency resolver page only adds direct
> >>> >dependencies of packages that have been selected, not indirect ones,
> >>> >so you end up with missing DLLs. (They do get added before the package
> >>> >selection screen if you run setup.exe again.)
> >>
> >> I'm looking into it, but it's tricky for people not quite up to speed
> >> with STL.  Basically the elements in unmap also have to be tested for
> >> unsatisfied dependencies.  One problem is that unmet is a map, so, when
> >> adding elements to unmet, there has to be some marker which allows to
> >> recognize elements which already have been tested for dependencies,
> >> otherwise it will be rather slow.
> >
> > I'm hoping this won't need to be implemented from scratch, given
> > indirect dependencies already do work elsewhere.
> 
> Misplaced hope, because packageversion::set_requirements, which is
> used on the chooser page, selects packages right away, whereas on the
> PreReq page they're first collected into a list of packages (and their
> requirees) to display to the user.
> 
> I'll have a go at PrereqChecker::isMet() then.

I had a go at it, see below.  Does it make sense?  I tested this by
selecting *only* the flac-devel package, which resulted in the following
"Resolve Dependecies" dialog:

  Package: libFLAC++6
	  Required by: flac-devel

  Package: libFLAC8
	  Required by: flac-devel

  Package: libogg-devel
	  Required by: flac-devel

  Package: libogg0
	  Required by: libogg-devel

Looks good, doesn't it?  Do you have another useful test for this code?


Index: package_meta.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/package_meta.cc,v
retrieving revision 2.57
diff -u -p -r2.57 package_meta.cc
--- package_meta.cc	17 Apr 2010 12:36:45 -0000	2.57
+++ package_meta.cc	6 Aug 2010 19:55:43 -0000
@@ -675,6 +675,18 @@ packagemeta::visited() const
 }
 
 void
+packagemeta::prereq_checked(bool const &aBool)
+{
+  prereq_checked_ = aBool;
+}
+
+bool
+packagemeta::prereq_checked() const
+{
+  return prereq_checked_;
+}
+
+void
 packagemeta::logSelectionStatus() const
 {
   packagemeta const & pkg = *this;
Index: package_meta.h
===================================================================
RCS file: /cvs/cygwin-apps/setup/package_meta.h,v
retrieving revision 2.38
diff -u -p -r2.38 package_meta.h
--- package_meta.h	13 Dec 2009 19:23:43 -0000	2.38
+++ package_meta.h	6 Aug 2010 19:55:43 -0000
@@ -36,7 +36,8 @@ public:
   packagemeta (packagemeta const &);
   packagemeta (const std::string& pkgname):name (pkgname), key(pkgname), installed_from (),
   prevtimestamp (0), currtimestamp (0),
-    exptimestamp (0), architecture (), priority(), visited_(false)
+    exptimestamp (0), architecture (), priority(), visited_(false),
+    prereq_checked_(false)
   {
   }
 
@@ -44,7 +45,8 @@ public:
 	       const std::string& installedfrom):name (pkgname), key(pkgname),
 	       installed_from (installedfrom),
     prevtimestamp (0), currtimestamp (0),
-    exptimestamp (0), architecture (), priority(), visited_(false)
+    exptimestamp (0), architecture (), priority(), visited_(false),
+    prereq_checked_(false)
   {
   }
 
@@ -54,6 +56,8 @@ public:
   void set_installed (packageversion &);
   void visited(bool const &);
   bool visited() const;
+  void prereq_checked(bool const &);
+  bool prereq_checked() const;
   void addToCategoryBase();
   bool hasNoCategories() const;
   void setDefaultCategories();
@@ -157,6 +161,7 @@ protected:
 private:
   std::string trustLabel(packageversion const &) const;
   bool visited_;
+  bool prereq_checked_;
 };
 
 #endif /* SETUP_PACKAGE_META_H */
Index: prereq.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/prereq.cc,v
retrieving revision 2.3
diff -u -p -r2.3 prereq.cc
--- prereq.cc	13 Dec 2009 19:23:43 -0000	2.3
+++ prereq.cc	6 Aug 2010 19:55:43 -0000
@@ -189,6 +189,39 @@ PrereqChecker::isMet ()
             }
         }
     }
+
+  bool foundUnmet2ndLevel = foundUnmet;
+  	
+  while (foundUnmet2ndLevel)
+    {
+      foundUnmet2ndLevel = false;
+
+      map <packagemeta *, vector <packagemeta *>, packagemeta_ltcomp>::iterator n;
+      for (n = unmet.begin (); n != unmet.end (); ++n)
+	{
+	  if (!(*n).first->prereq_checked ())
+	    {
+	      (*n).first->prereq_checked (true);
+	      for (vector <vector <PackageSpecification *> *>::iterator i =
+		   (*n).first->curr.depends ()->begin ();
+		   i < (*n).first->curr.depends ()->end (); ++i)
+		{
+		  PackageSpecification *spec = (*i)->at(0);
+		  packagemeta *pack = db.findBinary (*spec);
+		  if (!pack)
+		    continue;
+		  if (pack->desired && spec->satisfies (pack->desired))
+		    ;
+		  else if (unmet.find (pack) == unmet.end ())
+		    {
+		      foundUnmet2ndLevel = true;
+		      unmet[pack].push_back ((*n).first);
+		    }
+		}
+	    }
+
+	}
+    }
     
   return !foundUnmet;
 }


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat



More information about the Cygwin-apps mailing list