From 6cc69fd50ea11a94176734652c0c8753acb1e85b Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Thu, 1 Aug 2024 16:53:08 +0100 Subject: fix(remote): display nostr fetch report use stderr to write lines that get displayed when run as a git-remote-helper --- src/git_remote_helper.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs index 6dc00cb..f8a9db4 100644 --- a/src/git_remote_helper.rs +++ b/src/git_remote_helper.rs @@ -9,15 +9,14 @@ use std::{ collections::{HashMap, HashSet}, env, io::{self, Stdin}, - path::PathBuf, + path::{Path, PathBuf}, }; use anyhow::{bail, Context, Result}; use auth_git2::GitAuthenticator; -#[cfg(not(test))] -use client::Connect; use client::{ - fetching_with_report, get_repo_ref_from_cache, get_state_from_cache, sign_event, STATE_KIND, + consolidate_fetch_reports, get_repo_ref_from_cache, get_state_from_cache, sign_event, Connect, + STATE_KIND, }; use git::RepoActions; use git2::{Oid, Repository}; @@ -72,7 +71,7 @@ async fn main() -> Result<()> { let repo_coordinates = nostr_git_url_to_repo_coordinates(nostr_remote_url).context("invalid nostr url")?; - fetching_with_report(git_repo_path, &client, &repo_coordinates).await?; + fetching_with_report_for_helper(git_repo_path, &client, &repo_coordinates).await?; let repo_ref = get_repo_ref_from_cache(git_repo_path, &repo_coordinates).await?; @@ -190,6 +189,30 @@ fn nostr_git_url_to_repo_coordinates(url: &str) -> Result> { ); } +async fn fetching_with_report_for_helper( + git_repo_path: &Path, + #[cfg(test)] client: &crate::client::MockConnect, + #[cfg(not(test))] client: &Client, + repo_coordinates: &HashSet, +) -> Result<()> { + let term = console::Term::stderr(); + term.write_line("nostr: fetching...")?; + let (relay_reports, progress_reporter) = client + .fetch_all(git_repo_path, repo_coordinates, &HashSet::new()) + .await?; + if !relay_reports.iter().any(std::result::Result::is_err) { + let _ = progress_reporter.clear(); + term.clear_last_lines(1)?; + } + let report = consolidate_fetch_reports(relay_reports); + if report.to_string().is_empty() { + term.write_line("nostr: no updates")?; + } else { + term.write_line(&format!("nostr updates: {report}"))?; + } + Ok(()) +} + async fn list(git_repo: &Repo, repo_ref: &RepoRef, for_push: bool) -> Result<()> { if let Ok(repo_state) = get_state_from_cache(git_repo.get_path()?, repo_ref).await { for (name, value) in &repo_state.state { -- cgit v1.2.3