Commit 1bd87200 authored by Paul Winkler's avatar Paul Winkler

Merged from branches/slinkp-zopectl-exitcode-143813; fixes # 143813: zopectl...

Merged from branches/slinkp-zopectl-exitcode-143813; fixes # 143813: zopectl should exit non-zero if child processes fail.
parent 9146ec9f
...@@ -8,6 +8,9 @@ Zope Changes ...@@ -8,6 +8,9 @@ Zope Changes
Bugs fixed Bugs fixed
- Launchpad #143813: zopectl now exits non-zero when
child processes fail.
- Launchpad #173658: Removed dead code in OFS.Traversable's - Launchpad #173658: Removed dead code in OFS.Traversable's
'unrestrictedTraverse' (apparent NameError). 'unrestrictedTraverse' (apparent NameError).
......
...@@ -138,6 +138,8 @@ class ZopeCtlOptions(ZDOptions): ...@@ -138,6 +138,8 @@ class ZopeCtlOptions(ZDOptions):
class ZopeCmd(ZDCmd): class ZopeCmd(ZDCmd):
_exitstatus = 0
def _get_override(self, opt, name, svalue=None, flag=0): def _get_override(self, opt, name, svalue=None, flag=0):
# Suppress the config file, and pass all configuration via the # Suppress the config file, and pass all configuration via the
# command line. This avoids needing to specialize the zdrun # command line. This avoids needing to specialize the zdrun
...@@ -203,7 +205,7 @@ class ZopeCmd(ZDCmd): ...@@ -203,7 +205,7 @@ class ZopeCmd(ZDCmd):
cmd += '[sys.argv.append(x) for x in %s];' % argv cmd += '[sys.argv.append(x) for x in %s];' % argv
cmd += 'import Zope2; app=Zope2.app(); execfile(\'%s\')' % script cmd += 'import Zope2; app=Zope2.app(); execfile(\'%s\')' % script
cmdline = self.get_startup_cmd(self.options.python, cmd) cmdline = self.get_startup_cmd(self.options.python, cmd)
os.system(cmdline) self._exitstatus = os.system(cmdline)
def help_run(self): def help_run(self):
print "run <script> [args] -- run a Python script with the Zope " print "run <script> [args] -- run a Python script with the Zope "
...@@ -269,10 +271,11 @@ class ZopeCmd(ZDCmd): ...@@ -269,10 +271,11 @@ class ZopeCmd(ZDCmd):
# Parent process running (execv replaces process in child # Parent process running (execv replaces process in child
while True: while True:
try: try:
os.waitpid(pid, 0) pid, status = os.waitpid(pid, 0)
except (OSError, KeyboardInterrupt): except (OSError, KeyboardInterrupt):
continue continue
else: else:
self._exitstatus = status
break break
def help_test(self): def help_test(self):
...@@ -298,6 +301,8 @@ def main(args=None): ...@@ -298,6 +301,8 @@ def main(args=None):
print "program:", " ".join(options.program) print "program:", " ".join(options.program)
c.do_status() c.do_status()
c.cmdloop() c.cmdloop()
else:
return min(c._exitstatus, 1)
def _ignoreSIGCHLD(*unused): def _ignoreSIGCHLD(*unused):
while 1: while 1:
...@@ -326,4 +331,5 @@ if __name__ == "__main__": ...@@ -326,4 +331,5 @@ if __name__ == "__main__":
# SIGCHILD is unset, just don't bother registering a SIGCHILD # SIGCHILD is unset, just don't bother registering a SIGCHILD
# signal handler at all. # signal handler at all.
signal.signal(signal.SIGCHLD, _ignoreSIGCHLD) signal.signal(signal.SIGCHLD, _ignoreSIGCHLD)
main() exitstatus = main()
sys.exit(exitstatus)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment