# HG changeset patch # User Yuya Nishihara # Date 2018-11-19 11:50:45 # Node ID 80d6e3415636142a3b9734776dbef4d71bad4f15 # Parent 065048e66f3269d366baee9f6cbef8a36aff3b0f rust-chg: update name of the server process This is a copy of updateprocname() of hgclient.c. At this point, rust-chg is basically functional. I did dogfooding for a couple of weeks in 2018. There are a few remaining tasks: a. loop detection by CHGINTERNALMARK b. forward unsupported commands (notably serve -d) to real hg c. better handling of early server exception d. modernize codebase (2018 edition, impl trait, async/await) For (d), we'll probably want to switch to async-std, but I'm thinking of upgrading to Tokio 0.2 as an intermediate step since process API isn't ported to async-std yet. I'm pretty sure future migration to async-std will be painless compared to the mass rewrite from futures-0.1 to 0.3. https://github.com/async-rs/async-std/issues/22 Differential Revision: https://phab.mercurial-scm.org/D8383 diff --git a/rust/chg/src/clientext.rs b/rust/chg/src/clientext.rs --- a/rust/chg/src/clientext.rs +++ b/rust/chg/src/clientext.rs @@ -42,6 +42,11 @@ where I: IntoIterator, P: AsRef; + /// Changes the process title of the server. + fn set_process_name

(self, name: P) -> OneShotRequest + where + P: AsRef; + /// Changes the umask of the server process. fn set_umask(self, mask: u32) -> OneShotRequest; @@ -94,6 +99,13 @@ where OneShotRequest::start_with_args(self, b"setenv", message::pack_env_vars_os(vars)) } + fn set_process_name

(self, name: P) -> OneShotRequest + where + P: AsRef, + { + OneShotRequest::start_with_args(self, b"setprocname", name.as_ref().as_bytes()) + } + fn set_umask(self, mask: u32) -> OneShotRequest { let mut args = BytesMut::with_capacity(mem::size_of_val(&mask)); args.put_u32_be(mask); diff --git a/rust/chg/src/locator.rs b/rust/chg/src/locator.rs --- a/rust/chg/src/locator.rs +++ b/rust/chg/src/locator.rs @@ -196,6 +196,17 @@ impl Locator { Ok((loc, client)) }) .and_then(|(loc, client)| { + // It's purely optional, and the server might not support this command. + if client.server_spec().capabilities.contains("setprocname") { + let fut = client + .set_process_name(format!("chg[worker/{}]", loc.process_id)) + .map(|client| (loc, client)); + Either::A(fut) + } else { + Either::B(future::ok((loc, client))) + } + }) + .and_then(|(loc, client)| { client .set_current_dir(&loc.current_dir) .map(|client| (loc, client))