cli: upload-pack events

Introduce an `UploadPack` type for keeping track of relevant data from
upload-pack events and displaying progress to the terminal.

It keeps track of the number of remotes that are being uploaded to as well as
the throughput of transmitted data.

The `Progress` events are logged rather than being displayed since they don't
provide any useful details to the user.

Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
This commit is contained in:
Fintan Halpenny
2024-05-17 21:05:43 +02:00
committed by cloudhead
parent 3fe6bbe1cf
commit 740106d759
6 changed files with 129 additions and 14 deletions
+22 -11
View File
@@ -83,12 +83,8 @@ where
let mut stdin = child.stdin.take().unwrap();
let mut stdout = io::BufReader::new(child.stdout.take().unwrap());
let mut reporter = Reporter {
rid: header.repo,
remote,
emitter: emitter.clone(),
send,
};
let mut reporter = Reporter::new(header.repo, remote, emitter.clone(), send);
thread::scope(|s| {
thread::spawn_scoped(nid, "upload-pack", s, || {
// N.b. we indefinitely copy stdout to the sender,
@@ -152,17 +148,32 @@ struct Reporter<W> {
remote: NodeId,
emitter: Emitter<Event>,
send: W,
total: usize,
}
impl<W> Reporter<W> {
fn emit(&self, buf: &[u8]) {
if let Some(progress) = Self::as_upload_pack_progress(buf) {
log::trace!(target: "worker", "upload-pack progress: {progress}");
self.emitter
.emit(events::UploadPack::write(self.rid, self.remote, progress).into());
fn new(rid: RepoId, remote: NodeId, emitter: Emitter<Event>, send: W) -> Self {
Self {
rid,
remote,
emitter,
send,
total: 0,
}
}
fn emit(&mut self, buf: &[u8]) {
let event = match Self::as_upload_pack_progress(buf) {
Some(progress) => events::UploadPack::write(self.rid, self.remote, progress),
None => {
self.total += buf.len();
events::UploadPack::pack_progress(self.rid, self.remote, self.total)
}
};
log::trace!(target: "worker", "upload-pack progress: {event:?}");
self.emitter.emit(event.into())
}
fn as_upload_pack_progress(buf: &[u8]) -> Option<events::upload_pack::Progress> {
use events::upload_pack::Progress::*;
let gix_protocol::RemoteProgress {