rust: run rustfmt
# skip-blame automated reformatting
Differential Revision: https://phab.mercurial-scm.org/D7578
--- a/rust/chg/src/attachio.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/attachio.rs Sat Dec 07 13:06:25 2019 -0800
@@ -8,9 +8,9 @@
use futures::{Async, Future, Poll};
use std::io;
use std::os::unix::io::AsRawFd;
-use tokio_hglib::{Client, Connection};
use tokio_hglib::codec::ChannelMessage;
use tokio_hglib::protocol::MessageLoop;
+use tokio_hglib::{Client, Connection};
use super::message;
use super::procutil;
@@ -28,7 +28,8 @@
/// dispose of the client-side handle once attached.
#[must_use = "futures do nothing unless polled"]
pub struct AttachIo<C, I, O, E>
- where C: Connection,
+where
+ C: Connection,
{
msg_loop: MessageLoop<C>,
stdin: I,
@@ -37,23 +38,34 @@
}
impl<C, I, O, E> AttachIo<C, I, O, E>
- where C: Connection + AsRawFd,
- I: AsRawFd,
- O: AsRawFd,
- E: AsRawFd,
+where
+ C: Connection + AsRawFd,
+ I: AsRawFd,
+ O: AsRawFd,
+ E: AsRawFd,
{
- pub fn with_client(client: Client<C>, stdin: I, stdout: O, stderr: Option<E>)
- -> AttachIo<C, I, O, E> {
+ pub fn with_client(
+ client: Client<C>,
+ stdin: I,
+ stdout: O,
+ stderr: Option<E>,
+ ) -> AttachIo<C, I, O, E> {
let msg_loop = MessageLoop::start(client, b"attachio");
- AttachIo { msg_loop, stdin, stdout, stderr }
+ AttachIo {
+ msg_loop,
+ stdin,
+ stdout,
+ stderr,
+ }
}
}
impl<C, I, O, E> Future for AttachIo<C, I, O, E>
- where C: Connection + AsRawFd,
- I: AsRawFd,
- O: AsRawFd,
- E: AsRawFd,
+where
+ C: Connection + AsRawFd,
+ I: AsRawFd,
+ O: AsRawFd,
+ E: AsRawFd,
{
type Item = Client<C>;
type Error = io::Error;
@@ -67,8 +79,10 @@
if fd_cnt == 3 {
return Ok(Async::Ready(client));
} else {
- return Err(io::Error::new(io::ErrorKind::InvalidData,
- "unexpected attachio result"));
+ return Err(io::Error::new(
+ io::ErrorKind::InvalidData,
+ "unexpected attachio result",
+ ));
}
}
ChannelMessage::Data(..) => {
@@ -86,10 +100,13 @@
procutil::send_raw_fds(sock_fd, &[ifd, ofd, efd])?;
self.msg_loop = MessageLoop::resume(client);
}
- ChannelMessage::InputRequest(..) | ChannelMessage::LineRequest(..) |
- ChannelMessage::SystemRequest(..) => {
- return Err(io::Error::new(io::ErrorKind::InvalidData,
- "unsupported request while attaching io"));
+ ChannelMessage::InputRequest(..)
+ | ChannelMessage::LineRequest(..)
+ | ChannelMessage::SystemRequest(..) => {
+ return Err(io::Error::new(
+ io::ErrorKind::InvalidData,
+ "unsupported request while attaching io",
+ ));
}
}
}
--- a/rust/chg/src/clientext.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/clientext.rs Sat Dec 07 13:06:25 2019 -0800
@@ -9,8 +9,8 @@
use std::os::unix::ffi::OsStrExt;
use std::os::unix::io::AsRawFd;
use std::path::Path;
+use tokio_hglib::protocol::OneShotRequest;
use tokio_hglib::{Client, Connection};
-use tokio_hglib::protocol::OneShotRequest;
use super::attachio::AttachIo;
use super::message;
@@ -18,46 +18,54 @@
use super::uihandler::SystemHandler;
pub trait ChgClientExt<C>
- where C: Connection + AsRawFd,
+where
+ C: Connection + AsRawFd,
{
/// Attaches the client file descriptors to the server.
fn attach_io<I, O, E>(self, stdin: I, stdout: O, stderr: E) -> AttachIo<C, I, O, E>
- where I: AsRawFd,
- O: AsRawFd,
- E: AsRawFd;
+ where
+ I: AsRawFd,
+ O: AsRawFd,
+ E: AsRawFd;
/// Changes the working directory of the server.
fn set_current_dir<P>(self, dir: P) -> OneShotRequest<C>
- where P: AsRef<Path>;
+ where
+ P: AsRef<Path>;
/// Runs the specified Mercurial command with cHg extension.
fn run_command_chg<I, P, H>(self, handler: H, args: I) -> ChgRunCommand<C, H>
- where I: IntoIterator<Item = P>,
- P: AsRef<OsStr>,
- H: SystemHandler;
+ where
+ I: IntoIterator<Item = P>,
+ P: AsRef<OsStr>,
+ H: SystemHandler;
}
impl<C> ChgClientExt<C> for Client<C>
- where C: Connection + AsRawFd,
+where
+ C: Connection + AsRawFd,
{
fn attach_io<I, O, E>(self, stdin: I, stdout: O, stderr: E) -> AttachIo<C, I, O, E>
- where I: AsRawFd,
- O: AsRawFd,
- E: AsRawFd,
+ where
+ I: AsRawFd,
+ O: AsRawFd,
+ E: AsRawFd,
{
AttachIo::with_client(self, stdin, stdout, Some(stderr))
}
fn set_current_dir<P>(self, dir: P) -> OneShotRequest<C>
- where P: AsRef<Path>,
+ where
+ P: AsRef<Path>,
{
OneShotRequest::start_with_args(self, b"chdir", dir.as_ref().as_os_str().as_bytes())
}
fn run_command_chg<I, P, H>(self, handler: H, args: I) -> ChgRunCommand<C, H>
- where I: IntoIterator<Item = P>,
- P: AsRef<OsStr>,
- H: SystemHandler,
+ where
+ I: IntoIterator<Item = P>,
+ P: AsRef<OsStr>,
+ H: SystemHandler,
{
ChgRunCommand::with_client(self, handler, message::pack_args_os(args))
}
--- a/rust/chg/src/locator.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/locator.rs Sat Dec 07 13:06:25 2019 -0800
@@ -91,11 +91,16 @@
/// Determines the default hg command.
pub fn default_hg_command() -> OsString {
// TODO: maybe allow embedding the path at compile time (or load from hgrc)
- env::var_os("CHGHG").or(env::var_os("HG")).unwrap_or(OsStr::new("hg").to_owned())
+ env::var_os("CHGHG")
+ .or(env::var_os("HG"))
+ .unwrap_or(OsStr::new("hg").to_owned())
}
fn default_timeout() -> Duration {
- let secs = env::var("CHGTIMEOUT").ok().and_then(|s| s.parse().ok()).unwrap_or(60);
+ let secs = env::var("CHGTIMEOUT")
+ .ok()
+ .and_then(|s| s.parse().ok())
+ .unwrap_or(60);
Duration::from_secs(secs)
}
@@ -103,19 +108,24 @@
///
/// If the directory already exists, tests its permission.
fn create_secure_dir<P>(path: P) -> io::Result<()>
- where P: AsRef<Path>,
+where
+ P: AsRef<Path>,
{
- DirBuilder::new().mode(0o700).create(path.as_ref()).or_else(|err| {
- if err.kind() == io::ErrorKind::AlreadyExists {
- check_secure_dir(path).map(|_| ())
- } else {
- Err(err)
- }
- })
+ DirBuilder::new()
+ .mode(0o700)
+ .create(path.as_ref())
+ .or_else(|err| {
+ if err.kind() == io::ErrorKind::AlreadyExists {
+ check_secure_dir(path).map(|_| ())
+ } else {
+ Err(err)
+ }
+ })
}
fn check_secure_dir<P>(path: P) -> io::Result<P>
- where P: AsRef<Path>,
+where
+ P: AsRef<Path>,
{
let a = fs::symlink_metadata(path.as_ref())?;
if a.is_dir() && a.uid() == procutil::get_effective_uid() && (a.mode() & 0o777) == 0o700 {
--- a/rust/chg/src/main.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/main.rs Sat Dec 07 13:06:25 2019 -0800
@@ -9,9 +9,9 @@
extern crate tokio;
extern crate tokio_hglib;
-use chg::{ChgClientExt, ChgUiHandler};
use chg::locator;
use chg::procutil;
+use chg::{ChgClientExt, ChgUiHandler};
use futures::sync::oneshot;
use std::env;
use std::io;
@@ -42,13 +42,19 @@
// just make the output looks similar to chg of C
let l = format!("{}", record.level()).to_lowercase();
let t = self.start.elapsed();
- writeln!(io::stderr(), "chg: {}: {}.{:06} {}",
- l, t.as_secs(), t.subsec_micros(), record.args()).unwrap_or(());
+ writeln!(
+ io::stderr(),
+ "chg: {}: {}.{:06} {}",
+ l,
+ t.as_secs(),
+ t.subsec_micros(),
+ record.args()
+ )
+ .unwrap_or(());
}
}
- fn flush(&self) {
- }
+ fn flush(&self) {}
}
fn main() {
@@ -71,28 +77,24 @@
let handler = ChgUiHandler::new();
let (result_tx, result_rx) = oneshot::channel();
let fut = UnixClient::connect(sock_path)
- .and_then(|client| {
- client.set_current_dir(current_dir)
- })
- .and_then(|client| {
- client.attach_io(io::stdin(), io::stdout(), io::stderr())
- })
+ .and_then(|client| client.set_current_dir(current_dir))
+ .and_then(|client| client.attach_io(io::stdin(), io::stdout(), io::stderr()))
.and_then(|client| {
let pid = client.server_spec().process_id.unwrap();
let pgid = client.server_spec().process_group_id;
procutil::setup_signal_handler_once(pid, pgid)?;
Ok(client)
})
- .and_then(|client| {
- client.run_command_chg(handler, env::args_os().skip(1))
- })
+ .and_then(|client| client.run_command_chg(handler, env::args_os().skip(1)))
.map(|(_client, _handler, code)| {
procutil::restore_signal_handler_once()?;
Ok(code)
})
- .or_else(|err| Ok(Err(err))) // pass back error to caller
+ .or_else(|err| Ok(Err(err))) // pass back error to caller
.map(|res| result_tx.send(res).unwrap());
tokio::run(fut);
- result_rx.wait().unwrap_or(Err(io::Error::new(io::ErrorKind::Other,
- "no exit code set")))
+ result_rx.wait().unwrap_or(Err(io::Error::new(
+ io::ErrorKind::Other,
+ "no exit code set",
+ )))
}
--- a/rust/chg/src/message.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/message.rs Sat Dec 07 13:06:25 2019 -0800
@@ -11,7 +11,7 @@
use std::io;
use std::os::unix::ffi::OsStrExt;
-pub use tokio_hglib::message::*; // re-exports
+pub use tokio_hglib::message::*; // re-exports
/// Shell command type requested by the server.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
@@ -42,7 +42,10 @@
let mut s = l.splitn(2, |&c| c == b'=');
let k = s.next().unwrap();
let v = s.next().ok_or(new_parse_error("malformed env"))?;
- envs.push((OsStr::from_bytes(k).to_owned(), OsStr::from_bytes(v).to_owned()));
+ envs.push((
+ OsStr::from_bytes(k).to_owned(),
+ OsStr::from_bytes(v).to_owned(),
+ ));
}
let spec = CommandSpec {
@@ -57,41 +60,54 @@
match value {
b"pager" => Ok(CommandType::Pager),
b"system" => Ok(CommandType::System),
- _ => Err(new_parse_error(format!("unknown command type: {}", decode_latin1(value)))),
+ _ => Err(new_parse_error(format!(
+ "unknown command type: {}",
+ decode_latin1(value)
+ ))),
}
}
fn decode_latin1<S>(s: S) -> String
- where S: AsRef<[u8]>,
+where
+ S: AsRef<[u8]>,
{
s.as_ref().iter().map(|&c| c as char).collect()
}
fn new_parse_error<E>(error: E) -> io::Error
- where E: Into<Box<error::Error + Send + Sync>>,
+where
+ E: Into<Box<error::Error + Send + Sync>>,
{
io::Error::new(io::ErrorKind::InvalidData, error)
}
#[cfg(test)]
mod tests {
+ use super::*;
use std::os::unix::ffi::OsStringExt;
- use super::*;
#[test]
fn parse_command_spec_good() {
- let src = [b"pager".as_ref(),
- b"less -FRX".as_ref(),
- b"/tmp".as_ref(),
- b"LANG=C".as_ref(),
- b"HGPLAIN=".as_ref()].join(&0);
+ let src = [
+ b"pager".as_ref(),
+ b"less -FRX".as_ref(),
+ b"/tmp".as_ref(),
+ b"LANG=C".as_ref(),
+ b"HGPLAIN=".as_ref(),
+ ]
+ .join(&0);
let spec = CommandSpec {
command: os_string_from(b"less -FRX"),
current_dir: os_string_from(b"/tmp"),
- envs: vec![(os_string_from(b"LANG"), os_string_from(b"C")),
- (os_string_from(b"HGPLAIN"), os_string_from(b""))],
+ envs: vec![
+ (os_string_from(b"LANG"), os_string_from(b"C")),
+ (os_string_from(b"HGPLAIN"), os_string_from(b"")),
+ ],
};
- assert_eq!(parse_command_spec(Bytes::from(src)).unwrap(), (CommandType::Pager, spec));
+ assert_eq!(
+ parse_command_spec(Bytes::from(src)).unwrap(),
+ (CommandType::Pager, spec)
+ );
}
#[test]
--- a/rust/chg/src/procutil.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/procutil.rs Sat Dec 07 13:06:25 2019 -0800
@@ -33,7 +33,7 @@
}
let r = unsafe { libc::fcntl(fd, libc::F_SETFL, flags & !libc::O_NONBLOCK) };
if r < 0 {
- return Err(io::Error::last_os_error())
+ return Err(io::Error::last_os_error());
}
Ok(())
}
--- a/rust/chg/src/runcommand.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/runcommand.rs Sat Dec 07 13:06:25 2019 -0800
@@ -11,9 +11,9 @@
use std::io;
use std::mem;
use std::os::unix::io::AsRawFd;
-use tokio_hglib::{Client, Connection};
use tokio_hglib::codec::ChannelMessage;
use tokio_hglib::protocol::MessageLoop;
+use tokio_hglib::{Client, Connection};
use super::attachio::AttachIo;
use super::message::{self, CommandType};
@@ -26,8 +26,9 @@
}
enum CommandState<C, H>
- where C: Connection,
- H: SystemHandler,
+where
+ C: Connection,
+ H: SystemHandler,
{
Running(MessageLoop<C>, H),
SpawningPager(Client<C>, <H::SpawnPagerResult as IntoFuture>::Future),
@@ -41,18 +42,19 @@
/// Future resolves to `(exit_code, client)`.
#[must_use = "futures do nothing unless polled"]
pub struct ChgRunCommand<C, H>
- where C: Connection,
- H: SystemHandler,
+where
+ C: Connection,
+ H: SystemHandler,
{
state: CommandState<C, H>,
}
impl<C, H> ChgRunCommand<C, H>
- where C: Connection + AsRawFd,
- H: SystemHandler,
+where
+ C: Connection + AsRawFd,
+ H: SystemHandler,
{
- pub fn with_client(client: Client<C>, handler: H, packed_args: Bytes)
- -> ChgRunCommand<C, H> {
+ pub fn with_client(client: Client<C>, handler: H, packed_args: Bytes) -> ChgRunCommand<C, H> {
let msg_loop = MessageLoop::start_with_args(client, b"runcommand", packed_args);
ChgRunCommand {
state: CommandState::Running(msg_loop, handler),
@@ -61,8 +63,9 @@
}
impl<C, H> Future for ChgRunCommand<C, H>
- where C: Connection + AsRawFd,
- H: SystemHandler,
+where
+ C: Connection + AsRawFd,
+ H: SystemHandler,
{
type Item = (Client<C>, H, i32);
type Error = io::Error;
@@ -87,8 +90,9 @@
}
impl<C, H> CommandState<C, H>
- where C: Connection + AsRawFd,
- H: SystemHandler,
+where
+ C: Connection + AsRawFd,
+ H: SystemHandler,
{
fn poll(self) -> CommandPoll<C, H> {
match self {
@@ -102,14 +106,16 @@
CommandState::SpawningPager(client, mut fut) => {
if let Async::Ready((handler, pin)) = fut.poll()? {
let fut = AttachIo::with_client(client, io::stdin(), pin, None);
- Ok(AsyncS::PollAgain(CommandState::AttachingPager(fut, handler)))
+ Ok(AsyncS::PollAgain(CommandState::AttachingPager(
+ fut, handler,
+ )))
} else {
Ok(AsyncS::NotReady(CommandState::SpawningPager(client, fut)))
}
}
CommandState::AttachingPager(mut fut, handler) => {
if let Async::Ready(client) = fut.poll()? {
- let msg_loop = MessageLoop::start(client, b""); // terminator
+ let msg_loop = MessageLoop::start(client, b""); // terminator
Ok(AsyncS::PollAgain(CommandState::Running(msg_loop, handler)))
} else {
Ok(AsyncS::NotReady(CommandState::AttachingPager(fut, handler)))
@@ -124,14 +130,15 @@
Ok(AsyncS::NotReady(CommandState::WaitingSystem(client, fut)))
}
}
- CommandState::Finished => panic!("poll ChgRunCommand after it's done")
+ CommandState::Finished => panic!("poll ChgRunCommand after it's done"),
}
}
}
fn process_message<C, H>(client: Client<C>, handler: H, msg: ChannelMessage) -> CommandPoll<C, H>
- where C: Connection,
- H: SystemHandler,
+where
+ C: Connection,
+ H: SystemHandler,
{
match msg {
ChannelMessage::Data(b'r', data) => {
@@ -143,9 +150,10 @@
let msg_loop = MessageLoop::resume(client);
Ok(AsyncS::PollAgain(CommandState::Running(msg_loop, handler)))
}
- ChannelMessage::InputRequest(..) | ChannelMessage::LineRequest(..) => {
- Err(io::Error::new(io::ErrorKind::InvalidData, "unsupported request"))
- }
+ ChannelMessage::InputRequest(..) | ChannelMessage::LineRequest(..) => Err(io::Error::new(
+ io::ErrorKind::InvalidData,
+ "unsupported request",
+ )),
ChannelMessage::SystemRequest(data) => {
let (cmd_type, cmd_spec) = message::parse_command_spec(data)?;
match cmd_type {
--- a/rust/chg/src/uihandler.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/chg/src/uihandler.rs Sat Dec 07 13:06:25 2019 -0800
@@ -3,8 +3,8 @@
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
+use futures::future::IntoFuture;
use futures::Future;
-use futures::future::IntoFuture;
use std::io;
use std::os::unix::io::AsRawFd;
use std::os::unix::process::ExitStatusExt;
@@ -33,8 +33,7 @@
}
/// Default cHg implementation to process requests received from server.
-pub struct ChgUiHandler {
-}
+pub struct ChgUiHandler {}
impl ChgUiHandler {
pub fn new() -> ChgUiHandler {
@@ -57,7 +56,7 @@
// otherwise the server won't get SIGPIPE if it does not write
// anything. (issue5278)
// kill(peerpid, SIGPIPE);
- tokio::spawn(pager.map(|_| ()).map_err(|_| ())); // just ignore errors
+ tokio::spawn(pager.map(|_| ()).map_err(|_| ())); // just ignore errors
Ok((self, pin))
}
@@ -67,7 +66,9 @@
.into_future()
.flatten()
.map(|status| {
- let code = status.code().or_else(|| status.signal().map(|n| -n))
+ let code = status
+ .code()
+ .or_else(|| status.signal().map(|n| -n))
.expect("either exit code or signal should be set");
(self, code)
});
@@ -84,4 +85,4 @@
.env_clear()
.envs(spec.envs.iter().cloned());
builder
- }
+}
--- a/rust/hg-core/src/dirstate/status.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hg-core/src/dirstate/status.rs Sat Dec 07 13:06:25 2019 -0800
@@ -170,8 +170,8 @@
pub removed: Vec<&'a HgPath>,
pub deleted: Vec<&'a HgPath>,
pub clean: Vec<&'a HgPath>,
- // TODO ignored
- // TODO unknown
+ /* TODO ignored
+ * TODO unknown */
}
fn build_response(
--- a/rust/hg-cpython/src/dirstate/status.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hg-cpython/src/dirstate/status.rs Sat Dec 07 13:06:25 2019 -0800
@@ -8,7 +8,6 @@
//! Bindings for the `hg::status` module provided by the
//! `hg-core` crate. From Python, this will be seen as
//! `rustext.dirstate.status`.
-//!
use crate::dirstate::DirstateMap;
use cpython::exc::ValueError;
--- a/rust/hg-cpython/src/filepatterns.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hg-cpython/src/filepatterns.rs Sat Dec 07 13:06:25 2019 -0800
@@ -10,7 +10,6 @@
//! `hg-core` crate. From Python, this will be seen as `rustext.filepatterns`
//! and can be used as replacement for the the pure `filepatterns` Python
//! module.
-//!
use crate::exceptions::{PatternError, PatternFileError};
use cpython::{
PyBytes, PyDict, PyModule, PyObject, PyResult, PyTuple, Python, ToPyObject,
--- a/rust/hg-cpython/src/parsers.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hg-cpython/src/parsers.rs Sat Dec 07 13:06:25 2019 -0800
@@ -9,7 +9,6 @@
//! `hg-core` package.
//!
//! From Python, this will be seen as `mercurial.rustext.parsers`
-//!
use cpython::{
exc, PyBytes, PyDict, PyErr, PyInt, PyModule, PyResult, PyTuple, Python,
PythonObject, ToPyObject,
--- a/rust/hgcli/build.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hgcli/build.rs Sat Dec 07 13:06:25 2019 -0800
@@ -18,9 +18,8 @@
fn get_python_config() -> PythonConfig {
// The python27-sys crate exports a Cargo variable defining the full
// path to the interpreter being used.
- let python = env::var("DEP_PYTHON27_PYTHON_INTERPRETER").expect(
- "Missing DEP_PYTHON27_PYTHON_INTERPRETER; bad python27-sys crate?",
- );
+ let python = env::var("DEP_PYTHON27_PYTHON_INTERPRETER")
+ .expect("Missing DEP_PYTHON27_PYTHON_INTERPRETER; bad python27-sys crate?");
if !Path::new(&python).exists() {
panic!(
@@ -33,8 +32,8 @@
let separator = "SEPARATOR STRING";
let script = "import sysconfig; \
-c = sysconfig.get_config_vars(); \
-print('SEPARATOR STRING'.join('%s=%s' % i for i in c.items()))";
+ c = sysconfig.get_config_vars(); \
+ print('SEPARATOR STRING'.join('%s=%s' % i for i in c.items()))";
let mut command = Command::new(&python);
command.arg("-c").arg(script);
--- a/rust/hgcli/src/main.rs Fri Dec 06 16:09:03 2019 -0500
+++ b/rust/hgcli/src/main.rs Sat Dec 07 13:06:25 2019 -0800
@@ -5,18 +5,18 @@
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
+extern crate cpython;
extern crate libc;
-extern crate cpython;
extern crate python27_sys;
use cpython::{NoArgs, ObjectProtocol, PyModule, PyResult, Python};
use libc::{c_char, c_int};
use std::env;
-use std::path::PathBuf;
use std::ffi::{CString, OsStr};
#[cfg(target_family = "unix")]
use std::os::unix::ffi::{OsStrExt, OsStringExt};
+use std::path::PathBuf;
#[derive(Debug)]
struct Environment {