Make SbyProc hide Windows differences in retcode handling
authorJannis Harder <me@jix.one>
Wed, 6 Jul 2022 09:19:51 +0000 (11:19 +0200)
committerJannis Harder <me@jix.one>
Wed, 6 Jul 2022 09:22:59 +0000 (11:22 +0200)
Without this, we don't properly detect missing solver binaries and do
not properly handle the return status of the pono solver.

sbysrc/sby_core.py

index 5580d09c15998a4a7f47137acfc976f551dd53ae..372cbebf098d550aa86d4f0e9eae6f59fe40cb70 100644 (file)
@@ -176,7 +176,7 @@ class SbyProc:
                 fcntl.fcntl(self.p.stdout, fcntl.F_SETFL, fl | os.O_NONBLOCK)
 
             else:
-                self.p = subprocess.Popen(self.cmdline, shell=True, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
+                self.p = subprocess.Popen(self.cmdline + " & exit !errorlevel!", shell=True, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
                         stderr=(subprocess.STDOUT if self.logstderr else None))
 
             self.task.update_proc_running(self)
@@ -200,23 +200,31 @@ class SbyProc:
             self.running = False
             self.exited = True
 
-            if self.p.returncode == 127:
+            if os.name == "nt":
+                if self.p.returncode == 9009:
+                    returncode = 127
+                else:
+                    returncode = self.p.returncode & 0xff
+            else:
+                returncode = self.p.returncode
+
+            if returncode == 127:
                 if not self.silent:
                     self.task.log(f"{self.info}: COMMAND NOT FOUND. ERROR.")
-                self.handle_error(self.p.returncode)
+                self.handle_error(returncode)
                 self.terminated = True
                 self.task.proc_failed(self)
                 return
 
-            if self.checkretcode and self.p.returncode not in self.retcodes:
+            if self.checkretcode and returncode not in self.retcodes:
                 if not self.silent:
                     self.task.log(f"{self.info}: task failed. ERROR.")
-                self.handle_error(self.p.returncode)
+                self.handle_error(returncode)
                 self.terminated = True
                 self.task.proc_failed(self)
                 return
 
-            self.handle_exit(self.p.returncode)
+            self.handle_exit(returncode)
 
             self.finished = True
             for next_proc in self.notify: