On 29/07/2010 17:28, Jon TURNEY wrote:
On 28/07/2010 15:58, Christopher Faylor wrote:
On Wed, Jul 28, 2010 at 03:25:17PM +0100, Jon TURNEY wrote:
Anyhow, here's another attempt, which unfortunately changes rather more than I
wanted to. It adds a new page, which is displayed if any script failed, and
reports which packages and scripts failed.

That is great. Please check in (with a ChangeLog of course).

Due to the way I tested this change, I'd failed to notice that when a package is installed with a failing postinstall script, this will list the failing script twice, once with the package name and once as 'no package'.

Attached is a patch to remedy that.
Index: postinstall.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/postinstall.cc,v
retrieving revision 2.25
diff -u -r2.25 postinstall.cc
--- postinstall.cc      30 Jul 2010 20:53:42 -0000      2.25
+++ postinstall.cc      27 Aug 2010 17:06:39 -0000
@@ -161,13 +161,29 @@
       Progress.SetBar2 (k, numpkg);
     }
 
-  // Look for any scripts in /etc/postinstall which haven't been renamed .done,
-  // and try to run them...
+  // Look for any scripts in /etc/postinstall which haven't been renamed .done
   std::string postinst = cygpath ("/etc/postinstall");
   vector<Script> scripts;
   RunFindVisitor myVisitor (&scripts);
   Find (postinst).accept (myVisitor);
 
+  // Remove anything which we just tried to run (so we don't try twice)
+  for (i = packages.begin (); i != packages.end (); ++i)
+    {
+       packagemeta & pkg = **i;
+       for (std::vector<Script>::const_iterator j = 
pkg.installed.scripts().begin();
+            j != pkg.installed.scripts().end();
+            j++)
+         {
+           std::vector<Script>::iterator p = find(scripts.begin(), 
scripts.end(), *j);
+           if (p != scripts.end())
+             {
+               scripts.erase(p);
+             }
+         }
+    }
+
+  // and try to run what's left...
   {
     RunScript scriptRunner("No package", scripts);
     scriptRunner.run_all(s);
Index: script.h
===================================================================
RCS file: /cvs/cygwin-apps/setup/script.h,v
retrieving revision 2.13
diff -u -r2.13 script.h
--- script.h    16 Apr 2006 15:37:49 -0000      2.13
+++ script.h    27 Aug 2010 17:06:39 -0000
@@ -35,6 +35,7 @@
    or command.com (9x).  Returns the exit status of the process, or 
    negative error if any.  */
   int run() const;
+  bool operator == (const Script s) { return s.scriptName == scriptName; } ;
 private:
   std::string scriptName;
   static char const ETCPostinstall[];

Reply via email to