##// END OF EJS Templates
rust-revlog: fix incorrect results with NULL_NODE prefixes...
rust-revlog: fix incorrect results with NULL_NODE prefixes In case a short hash is a prefix of `NULL_NODE`, the correct revision number lookup is `NULL_REVISION` only if there is no match in the nodemap. Indeed, if there is a single nodemap match, then it is an ambiguity with the always matching `NULL_NODE`. Before this change, using the Mercurial development repository as a testbed (it has public changesets with node ID starting with `0005` and `0009`), this is what `rhg` did (plain `hg` provided for reference) ``` $ rust/target/debug/rhg cat -r 000 README README: no such file in rev 000000000000 $ hg cat -r 000 README abort: ambiguous revision identifier: 000 ``` Here is the expected output for `rhg` on ambiguous prefixes (again, before this change): ``` $ rust/target/debug/rhg cat -r 0001 README abort: ambiguous revision identifier: 0001 ``` The test provided by 8c29af0f6d6e in `test-rhg.t` could become flaky with this change, unless all hashes are fixed. We expect reviewers to be more sure about that than we are.

File last commit:

r45240:27fe8cc1 default
r51637:bca40373 stable
Show More
attachio.rs
68 lines | 2.4 KiB | application/rls-services+xml | RustLexer
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008 // 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;
Yuya Nishihara
rust-chg: reimplement attach_io operation as async function...
r45232 use tokio_hglib::{Connection, Protocol};
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008
Yuya Nishihara
rust-chg: use "crate::" to import local modules...
r45180 use crate::message;
use crate::procutil;
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008
Yuya Nishihara
rust-chg: reimplement attach_io operation as async function...
r45232 /// Sends client-side fds over the command server channel.
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008 ///
/// 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.
///
Yuya Nishihara
rust-chg: have attach_io() simply take reference of AsRawFd object...
r45233 /// The client-side fds may be dropped once duplicated to the server.
Yuya Nishihara
rust-chg: reimplement attach_io operation as async function...
r45232 pub async fn attach_io(
proto: &mut Protocol<impl Connection + AsRawFd>,
Yuya Nishihara
rust-chg: have attach_io() simply take reference of AsRawFd object...
r45233 stdin: &impl AsRawFd,
stdout: &impl AsRawFd,
stderr: &impl AsRawFd,
Yuya Nishihara
rust-chg: reimplement attach_io operation as async function...
r45232 ) -> io::Result<()> {
Yuya Nishihara
rust-chg: clean up excessive indents...
r45240 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 {
Gregory Szorc
rust: run rustfmt...
r44270 return Err(io::Error::new(
io::ErrorKind::InvalidData,
Yuya Nishihara
rust-chg: clean up excessive indents...
r45240 "unexpected attachio result",
Gregory Szorc
rust: run rustfmt...
r44270 ));
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008 }
}
Yuya Nishihara
rust-chg: clean up excessive indents...
r45240 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",
));
}
Yuya Nishihara
rust-chg: add future that handles "attachio" request...
r40008 }
}
}