diff --git a/kittens/transfer/send.go b/kittens/transfer/send.go index db59316f2..98fa112ab 100644 --- a/kittens/transfer/send.go +++ b/kittens/transfer/send.go @@ -1251,7 +1251,9 @@ func send_loop(opts *Options, files []*File) (err error, rc int) { } rc = 1 } - + if lp.ExitCode() != 0 { + rc = lp.ExitCode() + } return } diff --git a/kitty_tests/__init__.py b/kitty_tests/__init__.py index 1bebdcfc0..2b1be7ff0 100644 --- a/kitty_tests/__init__.py +++ b/kitty_tests/__init__.py @@ -307,12 +307,13 @@ def wait_till(self, q, timeout=10): def wait_till_child_exits(self, timeout=10, require_exit_code=None): end_time = time.monotonic() + timeout while time.monotonic() <= end_time: - status = os.waitid(os.P_PID, self.child_pid, os.WNOHANG | os.WEXITED) - if status is not None and status.si_pid == self.child_pid: + si_pid, status = os.waitpid(self.child_pid, os.WNOHANG) + if si_pid == self.child_pid and os.WIFEXITED(status): + ec = os.waitstatus_to_exitcode(status) self.child_waited_for = True - if require_exit_code is not None and os.waitstatus_to_exitcode(status.si_status) != require_exit_code: + if require_exit_code is not None and ec != require_exit_code: raise AssertionError( - f'Child exited with exit status: {status} code: {os.waitstatus_to_exitcode(status.si_status)} != {require_exit_code}.' + f'Child exited with exit status: {status} code: {ec} != {require_exit_code}.' f' Screen contents:\n{self.screen_contents()}') return status self.process_input_from_child(timeout=0.02) diff --git a/kitty_tests/file_transmission.py b/kitty_tests/file_transmission.py index cd8e26ff5..1a3b4bdca 100644 --- a/kitty_tests/file_transmission.py +++ b/kitty_tests/file_transmission.py @@ -165,6 +165,7 @@ def __init__(self, pty, allow=True): def write_ftc_to_child(self, payload: FileTransmissionCommand, appendleft: bool = False, use_pending: bool = True) -> bool: self.pty.write_to_child('\x1b]' + payload.serialize(prefix_with_osc_code=True) + '\x1b\\', flush=False) + return True class TransferPTY(PTY): @@ -467,12 +468,12 @@ def test_rsync_hashers(self): self.assertEqual(h128.hexdigest(), '8d6b60383dfa90c21be79eecd1b1353d') @contextmanager - def run_kitten(self, cmd, home_dir=''): + def run_kitten(self, cmd, home_dir='', allow=True): homedir_ephemeral = not home_dir home_dir = self.home_dir = home_dir or os.path.realpath(tempfile.mkdtemp()) cmd = [kitten_exe(), 'transfer'] + cmd try: - pty = TransferPTY(cmd, cwd=home_dir) + pty = TransferPTY(cmd, cwd=home_dir, allow=allow) i = 10 while i > 0 and not pty.screen_contents().strip(): pty.process_input_from_child() @@ -484,8 +485,26 @@ def run_kitten(self, cmd, home_dir=''): def test_transfer_send(self): src = os.path.join(self.tdir, 'src') + self.src_data = os.urandom(9137) with open(src, 'wb') as s: - s.write(os.urandom(9137)) + s.write(self.src_data) dest = os.path.join(self.tdir, 'dest') - with self.run_kitten([src, dest]) as pty: - pty.wait_till_child_exits(require_exit_code=0) + + with self.run_kitten([src, dest], allow=False) as pty: + pty.wait_till_child_exits(require_exit_code=1) + self.assertFalse(os.path.exists(dest)) + + def single_file(*cmd): + with self.run_kitten(list(cmd) + [src, dest]) as pty: + pty.wait_till_child_exits(require_exit_code=0) + with open(dest, 'rb') as f: + self.assertEqual(self.src_data, f.read()) + + single_file() + single_file() + single_file('--transmit-deltas') + with open(dest, 'wb') as d: + d.write(os.urandom(1023)) + single_file('--transmit-deltas') + os.remove(dest) + single_file('--transmit-deltas')