Mercurial > hg
view rust/chg/src/attachio.rs @ 47221:5eb5b866e517
requirements: no longer drop `generaldelta` requirement with revlogv2
A repository could use a mix of revlogv1 and revlogv2, making the requirements
still necessary. Overall we should move away from the "requirements" file being
used a way to configure the repository and stick to it "what do you need to
access this repository". However this is a wider work for another time.
In addition the logic we just dropped was confusing the `hg debugformat`
command, breaking the upgrade code and inconsistent (eg: `sparse-revlog` is also
implied by `revlogv2`).
Finally, multiple other config option would imply the use of the `revlogv2`
requirements, without drop the `generaldelta` one, leading to more
inconsistency.
Differential Revision: https://phab.mercurial-scm.org/D10612
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 12:28:58 +0200 |
parents | 27fe8cc1338f |
children |
line wrap: on
line source
// Copyright 2018 Yuya Nishihara <yuya@tcha.org> // // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. //! Functions to send client-side fds over the command server channel. use std::io; use std::os::unix::io::AsRawFd; use tokio_hglib::codec::ChannelMessage; use tokio_hglib::{Connection, Protocol}; use crate::message; use crate::procutil; /// Sends client-side fds over the command server channel. /// /// This works as follows: /// 1. Client sends "attachio" request. /// 2. Server sends back 1-byte input request. /// 3. Client sends fds with 1-byte dummy payload in response. /// 4. Server returns the number of the fds received. /// /// The client-side fds may be dropped once duplicated to the server. pub async fn attach_io( proto: &mut Protocol<impl Connection + AsRawFd>, stdin: &impl AsRawFd, stdout: &impl AsRawFd, stderr: &impl AsRawFd, ) -> io::Result<()> { proto.send_command("attachio").await?; loop { match proto.fetch_response().await? { ChannelMessage::Data(b'r', data) => { let fd_cnt = message::parse_result_code(data)?; if fd_cnt == 3 { return Ok(()); } else { return Err(io::Error::new( io::ErrorKind::InvalidData, "unexpected attachio result", )); } } ChannelMessage::Data(..) => { // just ignore data sent to uninteresting (optional) channel } ChannelMessage::InputRequest(1) => { // this may fail with EWOULDBLOCK in theory, but the // payload is quite small, and the send buffer should // be empty so the operation will complete immediately let sock_fd = proto.as_raw_fd(); let ifd = stdin.as_raw_fd(); let ofd = stdout.as_raw_fd(); let efd = stderr.as_raw_fd(); procutil::send_raw_fds(sock_fd, &[ifd, ofd, efd])?; } ChannelMessage::InputRequest(..) | ChannelMessage::LineRequest(..) | ChannelMessage::SystemRequest(..) => { return Err(io::Error::new( io::ErrorKind::InvalidData, "unsupported request while attaching io", )); } } } }