Patchwork D8443: rust-chg: have attach_io() simply take reference of AsRawFd object

login
register
mail settings
Submitter phabricator
Date April 16, 2020, 12:30 p.m.
Message ID <differential-rev-PHID-DREV-jwnrunreciwazv5zrg5v-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46147/
State Superseded
Headers show

Comments

phabricator - April 16, 2020, 12:30 p.m.
yuja created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We no longer have to deal with the restriction of the Future type.
  Before, these file objects couldn't be references and that's the only
  reason why we had to make stderr an Option<T>.
  
  This fixes future type deduction issue of stderr = None, where rustc would
  complain that T of Option<T> couldn't be deduced.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8443

AFFECTED FILES
  rust/chg/src/attachio.rs

CHANGE DETAILS




To: yuja, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/rust/chg/src/attachio.rs b/rust/chg/src/attachio.rs
--- a/rust/chg/src/attachio.rs
+++ b/rust/chg/src/attachio.rs
@@ -21,14 +21,12 @@ 
 /// 3. Client sends fds with 1-byte dummy payload in response.
 /// 4. Server returns the number of the fds received.
 ///
-/// If the stderr is omitted, it will be redirected to the stdout. This
-/// allows us to attach the pager stdin to both stdout and stderr, and
-/// dispose of the client-side handle once attached.
+/// 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: Option<impl AsRawFd>,
+    stdin: &impl AsRawFd,
+    stdout: &impl AsRawFd,
+    stderr: &impl AsRawFd,
 ) -> io::Result<()> {
     // TODO: unindent
     {
@@ -56,7 +54,7 @@ 
                     let sock_fd = proto.as_raw_fd();
                     let ifd = stdin.as_raw_fd();
                     let ofd = stdout.as_raw_fd();
-                    let efd = stderr.as_ref().map_or(ofd, |f| f.as_raw_fd());
+                    let efd = stderr.as_raw_fd();
                     procutil::send_raw_fds(sock_fd, &[ifd, ofd, efd])?;
                 }
                 ChannelMessage::InputRequest(..)