You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
88 lines
2.0 KiB
|
|
#[macro_use] extern crate log;
|
|
|
|
use color_eyre::{
|
|
eyre::{
|
|
self,
|
|
eyre,
|
|
WrapErr as _,
|
|
},
|
|
SectionExt as _,
|
|
Help as _,
|
|
};
|
|
use tokio::{
|
|
sync::{
|
|
mpsc,
|
|
},
|
|
};
|
|
|
|
mod order;
|
|
mod work;
|
|
mod walk;
|
|
|
|
fn init_logging() -> eyre::Result<()>
|
|
{
|
|
color_eyre::install()?;
|
|
pretty_env_logger::init();
|
|
Ok(())
|
|
}
|
|
|
|
async fn work_on(cfg: work::Config, mut into: mpsc::Receiver<work::FileInfo>) -> eyre::Result<work::FSTimeMap>
|
|
{
|
|
use work::*;
|
|
let mut map = FSTimeMap::new(cfg);
|
|
while let Some(file) = into.recv().await {
|
|
if cfg!(debug_assertions) {
|
|
trace!("insert +{}", map.len());
|
|
}
|
|
map.insert(file);
|
|
}
|
|
Ok(map)
|
|
}
|
|
|
|
|
|
#[tokio::main]
|
|
async fn main() -> eyre::Result<()> {
|
|
init_logging().wrap_err("Failed to set logging handlers")?;
|
|
|
|
let (tx, rx) = mpsc::channel(4096);
|
|
|
|
// Spin up ordering task.
|
|
let ordering = tokio::spawn(async move {
|
|
trace!("spun up ordering backing thread");
|
|
work_on(Default::default(), rx).await //TODO: Parse config from args
|
|
});
|
|
|
|
trace!("Starting recursive walk of input locations");
|
|
//TODO: Trace directory trees from paths in `args` and/or `stdin` and pass results to `tx`
|
|
|
|
|
|
let set = ordering.await.wrap_err("Ordering task panic")?
|
|
.wrap_err(eyre!("Failed to collect ordered files"))?;
|
|
|
|
tokio::task::spawn_blocking(move || -> eyre::Result<()> {
|
|
use std::io::Write;
|
|
use std::os::unix::prelude::*;
|
|
let mut stdout = {
|
|
let lock = std::io::stdout().lock();
|
|
std::io::BufWriter::new(lock)
|
|
};
|
|
|
|
for info in set.into_iter()
|
|
{
|
|
stdout.write_all(info.path().as_os_str().as_bytes())
|
|
.and_then(|_| stdout.write_all(&[b'\n']))
|
|
.wrap_err("Failed to write raw pathname for entry to stdout")
|
|
.with_context(|| format!("{:?}", info.path()).header("Pathname was"))?;
|
|
}
|
|
|
|
stdout.flush().wrap_err("Failed to flush buffered output to stdout")?;
|
|
Ok(())
|
|
}).await.wrap_err("Writer task panic")?
|
|
.wrap_err("Failed to write results to stdout")?;
|
|
|
|
trace!("Finished output task");
|
|
|
|
Ok(())
|
|
}
|