[Zope-Checkins] SVN: Zope/branches/2.10/ Merged from branches/slinkp-zopectl-exitcode-143813; fixes # 143813: zopectl should exit non-zero if child processes fail.

Paul Winkler pw_lists at slinkp.com
Fri Apr 25 15:06:17 EDT 2008


Log message for revision 85729:
  Merged from branches/slinkp-zopectl-exitcode-143813; fixes # 143813: zopectl should exit non-zero if child processes fail.

Changed:
  U   Zope/branches/2.10/doc/CHANGES.txt
  U   Zope/branches/2.10/lib/python/Zope2/Startup/zopectl.py

-=-
Modified: Zope/branches/2.10/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.10/doc/CHANGES.txt	2008-04-25 18:55:45 UTC (rev 85728)
+++ Zope/branches/2.10/doc/CHANGES.txt	2008-04-25 19:06:16 UTC (rev 85729)
@@ -8,6 +8,9 @@
 
     Bugs fixed
 
+      - Launchpad #143813: zopectl now exits non-zero when
+        child processes fail.
+
       - Launchpad #173658:  Removed dead code in OFS.Traversable's
         'unrestrictedTraverse' (apparent NameError).
 

Modified: Zope/branches/2.10/lib/python/Zope2/Startup/zopectl.py
===================================================================
--- Zope/branches/2.10/lib/python/Zope2/Startup/zopectl.py	2008-04-25 18:55:45 UTC (rev 85728)
+++ Zope/branches/2.10/lib/python/Zope2/Startup/zopectl.py	2008-04-25 19:06:16 UTC (rev 85729)
@@ -138,6 +138,8 @@
 
 class ZopeCmd(ZDCmd):
 
+    _exitstatus = 0
+
     def _get_override(self, opt, name, svalue=None, flag=0):
         # Suppress the config file, and pass all configuration via the
         # command line.  This avoids needing to specialize the zdrun
@@ -203,7 +205,7 @@
             cmd += '[sys.argv.append(x) for x in %s];' % argv
         cmd += 'import Zope2; app=Zope2.app(); execfile(\'%s\')' % script
         cmdline = self.get_startup_cmd(self.options.python, cmd)
-        os.system(cmdline)
+        self._exitstatus = os.system(cmdline)
 
     def help_run(self):
         print "run <script> [args] -- run a Python script with the Zope "
@@ -269,10 +271,11 @@
         # Parent process running (execv replaces process in child
         while True:
             try:
-                os.waitpid(pid, 0)
+                pid, status = os.waitpid(pid, 0)
             except (OSError, KeyboardInterrupt):
                 continue
             else:
+                self._exitstatus = status
                 break
 
     def help_test(self):
@@ -298,6 +301,8 @@
         print "program:", " ".join(options.program)
         c.do_status()
         c.cmdloop()
+    else:
+        return min(c._exitstatus, 1)
 
 def _ignoreSIGCHLD(*unused):
     while 1:
@@ -326,4 +331,5 @@
         # SIGCHILD is unset, just don't bother registering a SIGCHILD
         # signal handler at all.
         signal.signal(signal.SIGCHLD, _ignoreSIGCHLD)
-    main()
+    exitstatus = main()
+    sys.exit(exitstatus)



More information about the Zope-Checkins mailing list