##// END OF EJS Templates
absorb: preserve changesets which were already empty...
absorb: preserve changesets which were already empty Most commands in Mercurial (commit, rebase, absorb itself) don’t create empty changesets or drop them if they become empty. If there’s a changeset that’s empty, it must be a deliberate choice of the user. At least it shouldn’t be absorb’s responsibility to prune them. The fact that changesets that became empty during absorb are pruned, is unaffected by this. This case was found while writing patches which make it possible to configure absorb and rebase to not drop empty changesets. Even without having such config set, I think it’s valuable to preserve changesets which were already empty.

File last commit:

r45240:27fe8cc1 default
r45518:1ca0047f default
Show More
uihandler.rs
87 lines | 2.6 KiB | application/rls-services+xml | RustLexer
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 // 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.
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 use async_trait::async_trait;
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 use std::io;
use std::os::unix::io::AsRawFd;
use std::os::unix::process::ExitStatusExt;
Yuya Nishihara
rust-chg: upgrade to futures-0.3 based libraries...
r45231 use std::process::Stdio;
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 use tokio;
Yuya Nishihara
rust-chg: do not terminate tokio runtime until pager exits...
r45239 use tokio::process::{Child, ChildStdin, Command};
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010
Yuya Nishihara
rust-chg: use "crate::" to import local modules...
r45180 use crate::message::CommandSpec;
use crate::procutil;
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010
/// Callback to process shell command requests received from server.
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 #[async_trait]
pub trait SystemHandler {
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 type PagerStdin: AsRawFd;
/// Handles pager command request.
///
/// Returns the pipe to be attached to the server if the pager is spawned.
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 async fn spawn_pager(&mut self, spec: &CommandSpec) -> io::Result<Self::PagerStdin>;
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010
/// Handles system command request.
///
/// Returns command exit code (positive) or signal number (negative).
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 async fn run_system(&mut self, spec: &CommandSpec) -> io::Result<i32>;
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 }
/// Default cHg implementation to process requests received from server.
Yuya Nishihara
rust-chg: do not terminate tokio runtime until pager exits...
r45239 pub struct ChgUiHandler {
pager: Option<Child>,
}
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010
impl ChgUiHandler {
pub fn new() -> ChgUiHandler {
Yuya Nishihara
rust-chg: do not terminate tokio runtime until pager exits...
r45239 ChgUiHandler { pager: None }
}
/// Waits until the pager process exits.
pub async fn wait_pager(&mut self) -> io::Result<()> {
if let Some(p) = self.pager.take() {
p.await?;
}
Ok(())
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 }
}
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 #[async_trait]
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 impl SystemHandler for ChgUiHandler {
type PagerStdin = ChildStdin;
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 async fn spawn_pager(&mut self, spec: &CommandSpec) -> io::Result<Self::PagerStdin> {
Yuya Nishihara
rust-chg: upgrade to futures-0.3 based libraries...
r45231 let mut pager = new_shell_command(&spec).stdin(Stdio::piped()).spawn()?;
let pin = pager.stdin.take().unwrap();
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 procutil::set_blocking_fd(pin.as_raw_fd())?;
Yuya Nishihara
rust-chg: remove SIGCHLD handler which won't work in oxidized chg...
r40155 // TODO: if pager exits, notify the server with SIGPIPE immediately.
// otherwise the server won't get SIGPIPE if it does not write
// anything. (issue5278)
// kill(peerpid, SIGPIPE);
Yuya Nishihara
rust-chg: do not terminate tokio runtime until pager exits...
r45239 self.pager = Some(pager);
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 Ok(pin)
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 }
Yuya Nishihara
rust-chg: reimplement uihandler by using async-trait and tokio-0.2...
r45234 async fn run_system(&mut self, spec: &CommandSpec) -> io::Result<i32> {
let status = new_shell_command(&spec).spawn()?.await?;
Yuya Nishihara
rust-chg: clean up excessive indents...
r45240 let code = status
.code()
.or_else(|| status.signal().map(|n| -n))
.expect("either exit code or signal should be set");
Ok(code)
Yuya Nishihara
rust-chg: add callback to handle pager and shell command requests...
r40010 }
}
fn new_shell_command(spec: &CommandSpec) -> Command {
let mut builder = Command::new("/bin/sh");
builder
.arg("-c")
.arg(&spec.command)
.current_dir(&spec.current_dir)
.env_clear()
.envs(spec.envs.iter().cloned());
builder
Gregory Szorc
rust: run rustfmt...
r44270 }