Read about our upcoming Code of Conduct on this issue

This instance was upgraded to Heptapod 0.28.0 today

Commit 0830ae63 authored by Yuya Nishihara's avatar Yuya Nishihara
Browse files

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
parent 065048e66f32
......@@ -42,6 +42,11 @@ where
I: IntoIterator<Item = (P, P)>,
P: AsRef<OsStr>;
/// Changes the process title of the server.
fn set_process_name<P>(self, name: P) -> OneShotRequest<C>
where
P: AsRef<OsStr>;
/// Changes the umask of the server process.
fn set_umask(self, mask: u32) -> OneShotRequest<C>;
......@@ -94,6 +99,13 @@ where
OneShotRequest::start_with_args(self, b"setenv", message::pack_env_vars_os(vars))
}
fn set_process_name<P>(self, name: P) -> OneShotRequest<C>
where
P: AsRef<OsStr>,
{
OneShotRequest::start_with_args(self, b"setprocname", name.as_ref().as_bytes())
}
fn set_umask(self, mask: u32) -> OneShotRequest<C> {
let mut args = BytesMut::with_capacity(mem::size_of_val(&mask));
args.put_u32_be(mask);
......
......@@ -195,6 +195,17 @@ impl Locator {
check_server_capabilities(client.server_spec())?;
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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment