diff --git a/git_review/cmd.py b/git_review/cmd.py index 9215b5d1..566bf224 100644 --- a/git_review/cmd.py +++ b/git_review/cmd.py @@ -373,9 +373,17 @@ def set_hooks_commit_msg(remote, target_file): userhost = hostname # OS independent target file scp_target_file = target_file.replace(os.sep, "/") + + # Get scp options + scp_out = run_command("scp") + scp_opts = scp_out[scp_out.index("[") + 2:scp_out.index("]")] + cmd = ["scp", userhost + ":hooks/commit-msg", scp_target_file] if port is not None: cmd.insert(1, "-P%s" % port) + # Force scp protocol if the -O option is available + if "O" in scp_opts: + cmd.insert(1, "-O") if VERBOSE: hook_url = 'scp://%s%s/hooks/commit-msg' \ diff --git a/releasenotes/notes/scp-subsystem-c8d78aa8f7f69f66.yaml b/releasenotes/notes/scp-subsystem-c8d78aa8f7f69f66.yaml new file mode 100644 index 00000000..15214450 --- /dev/null +++ b/releasenotes/notes/scp-subsystem-c8d78aa8f7f69f66.yaml @@ -0,0 +1,15 @@ +--- +fixes: + - | + OpenSSH has deprecated its use of scp/rcp protocol in favor of + SFTP, which the embedded Apache mina-sshd in widely-deployed + Gerrit versions does not yet support. The default officially + changed in OpenSSH 9.0 (some distributions, such as Fedora and + CentOS, switched their default behavior to this as early as + OpenSSH 8.7 or 8.8), leading to a ``subsystem request failed on + channel 0`` error during commit-msg hook retrieval. Now + git-review will attempt to detect whether scp's -O option is + available to force use of the legacy scp/rcp protocol, and apply + it if so. Future git-review versions may change the fallback + behavior once an SFTP subsystem is implemented and available for + a new Gerrit release.