Mercurial > hg
annotate rust/chg/src/uihandler.rs @ 39974:a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
This could be inlined into the ChgRunCommand state to be introduced by
the next patch, but it seemed good to separate any user interactions from
the IPC code.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 24 Sep 2018 18:18:35 +0900 |
parents | |
children | e70b616a077b |
rev | line source |
---|---|
39974
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
1 // Copyright 2018 Yuya Nishihara <yuya@tcha.org> |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
2 // |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
3 // This software may be used and distributed according to the terms of the |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
4 // GNU General Public License version 2 or any later version. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
5 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
6 use futures::Future; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
7 use futures::future::IntoFuture; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
8 use std::io; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
9 use std::os::unix::io::AsRawFd; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
10 use std::os::unix::process::ExitStatusExt; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
11 use std::process::{Command, Stdio}; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
12 use tokio; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
13 use tokio_process::{ChildStdin, CommandExt}; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
14 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
15 use super::message::CommandSpec; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
16 use super::procutil; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
17 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
18 /// Callback to process shell command requests received from server. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
19 pub trait SystemHandler: Sized { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
20 type PagerStdin: AsRawFd; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
21 type SpawnPagerResult: IntoFuture<Item = (Self, Self::PagerStdin), Error = io::Error>; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
22 type RunSystemResult: IntoFuture<Item = (Self, i32), Error = io::Error>; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
23 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
24 /// Handles pager command request. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
25 /// |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
26 /// Returns the pipe to be attached to the server if the pager is spawned. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
27 fn spawn_pager(self, spec: CommandSpec) -> Self::SpawnPagerResult; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
28 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
29 /// Handles system command request. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
30 /// |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
31 /// Returns command exit code (positive) or signal number (negative). |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
32 fn run_system(self, spec: CommandSpec) -> Self::RunSystemResult; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
33 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
34 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
35 /// Default cHg implementation to process requests received from server. |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
36 pub struct ChgUiHandler { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
37 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
38 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
39 impl ChgUiHandler { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
40 pub fn new() -> ChgUiHandler { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
41 ChgUiHandler {} |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
42 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
43 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
44 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
45 impl SystemHandler for ChgUiHandler { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
46 type PagerStdin = ChildStdin; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
47 type SpawnPagerResult = io::Result<(Self, Self::PagerStdin)>; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
48 type RunSystemResult = Box<dyn Future<Item = (Self, i32), Error = io::Error> + Send>; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
49 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
50 fn spawn_pager(self, spec: CommandSpec) -> Self::SpawnPagerResult { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
51 let mut pager = new_shell_command(&spec) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
52 .stdin(Stdio::piped()) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
53 .spawn_async()?; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
54 let pin = pager.stdin().take().unwrap(); |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
55 procutil::set_blocking_fd(pin.as_raw_fd())?; |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
56 tokio::spawn(pager.map(|_| ()).map_err(|_| ())); // just ignore errors |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
57 Ok((self, pin)) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
58 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
59 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
60 fn run_system(self, spec: CommandSpec) -> Self::RunSystemResult { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
61 let fut = new_shell_command(&spec) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
62 .spawn_async() |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
63 .into_future() |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
64 .flatten() |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
65 .map(|status| { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
66 let code = status.code().or_else(|| status.signal().map(|n| -n)) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
67 .expect("either exit code or signal should be set"); |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
68 (self, code) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
69 }); |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
70 Box::new(fut) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
71 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
72 } |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
73 |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
74 fn new_shell_command(spec: &CommandSpec) -> Command { |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
75 let mut builder = Command::new("/bin/sh"); |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
76 builder |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
77 .arg("-c") |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
78 .arg(&spec.command) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
79 .current_dir(&spec.current_dir) |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
80 .env_clear() |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
81 .envs(spec.envs.iter().cloned()); |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
82 builder |
a9c5fc436fd5
rust-chg: add callback to handle pager and shell command requests
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
83 } |