mirror of
https://codeberg.org/Cyborus/forgejo-cli.git
synced 2025-03-14 21:25:54 +01:00
Merge pull request 'add repo readme
' (#134) from repo-readme into main
Reviewed-on: https://codeberg.org/Cyborus/forgejo-cli/pulls/134
This commit is contained in:
commit
d9615538a5
2 changed files with 55 additions and 2 deletions
18
src/main.rs
18
src/main.rs
|
@ -381,6 +381,21 @@ impl SpecialRender {
|
|||
}
|
||||
}
|
||||
|
||||
fn max_line_length() -> usize {
|
||||
let (terminal_width, _) = crossterm::terminal::size().unwrap_or((80, 24));
|
||||
(terminal_width as usize - 2).min(80)
|
||||
}
|
||||
|
||||
fn render_text(text: &str) -> String {
|
||||
let mut ansi_printer = AnsiPrinter::new(max_line_length());
|
||||
|
||||
ansi_printer.pause_style();
|
||||
ansi_printer.prefix();
|
||||
ansi_printer.resume_style();
|
||||
ansi_printer.text(text);
|
||||
ansi_printer.out
|
||||
}
|
||||
|
||||
fn markdown(text: &str) -> String {
|
||||
let SpecialRender {
|
||||
fancy,
|
||||
|
@ -427,8 +442,7 @@ fn markdown(text: &str) -> String {
|
|||
|
||||
let mut list_numbers = Vec::new();
|
||||
|
||||
let (terminal_width, _) = crossterm::terminal::size().unwrap_or((80, 24));
|
||||
let max_line_len = (terminal_width as usize - 2).min(80);
|
||||
let max_line_len = max_line_length();
|
||||
|
||||
let mut links = Vec::new();
|
||||
|
||||
|
|
39
src/repo.rs
39
src/repo.rs
|
@ -368,6 +368,13 @@ pub enum RepoCommand {
|
|||
#[clap(long, short = 'R')]
|
||||
remote: Option<String>,
|
||||
},
|
||||
/// View a repo's README
|
||||
Readme {
|
||||
#[clap(id = "[HOST/]OWNER/REPO")]
|
||||
name: Option<RepoArg>,
|
||||
#[clap(long, short = 'R')]
|
||||
remote: Option<String>,
|
||||
},
|
||||
/// Clone a repo's code locally
|
||||
Clone {
|
||||
#[clap(id = "[HOST/]OWNER/REPO")]
|
||||
|
@ -474,6 +481,15 @@ impl RepoCommand {
|
|||
.ok_or_eyre("couldn't get repo name, please specify")?;
|
||||
view_repo(&api, repo).await?
|
||||
}
|
||||
RepoCommand::Readme { name, remote } => {
|
||||
let repo =
|
||||
RepoInfo::get_current(host_name, name.as_ref(), remote.as_deref(), &keys)?;
|
||||
let api = keys.get_api(repo.host_url()).await?;
|
||||
let repo = repo
|
||||
.name()
|
||||
.ok_or_eyre("couldn't get repo name, please specify")?;
|
||||
view_repo_readme(&api, repo).await?
|
||||
}
|
||||
RepoCommand::Clone { repo, path } => {
|
||||
let repo = RepoInfo::get_current(host_name, Some(&repo), None, &keys)?;
|
||||
let api = keys.get_api(repo.host_url()).await?;
|
||||
|
@ -921,6 +937,29 @@ async fn view_repo(api: &Forgejo, repo: &RepoName) -> eyre::Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
async fn view_repo_readme(api: &Forgejo, repo: &RepoName) -> eyre::Result<()> {
|
||||
let query = forgejo_api::structs::RepoGetRawFileQuery { r#ref: None };
|
||||
let file = api
|
||||
.repo_get_raw_file(repo.owner(), repo.name(), "README.md", query)
|
||||
.await;
|
||||
if let Ok(readme) = file {
|
||||
let readme_str = String::from_utf8_lossy(&readme);
|
||||
println!("{}", crate::markdown(&readme_str));
|
||||
return Ok(());
|
||||
} else {
|
||||
let query = forgejo_api::structs::RepoGetRawFileQuery { r#ref: None };
|
||||
let file = api
|
||||
.repo_get_raw_file(repo.owner(), repo.name(), "README.txt", query)
|
||||
.await;
|
||||
if let Ok(readme) = file {
|
||||
let readme_str = String::from_utf8_lossy(&readme);
|
||||
println!("{}", crate::render_text(&readme_str));
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
eyre::bail!("Repo does not have README.md or README.txt");
|
||||
}
|
||||
|
||||
async fn cmd_clone_repo(
|
||||
api: &Forgejo,
|
||||
name: &RepoName,
|
||||
|
|
Loading…
Add table
Reference in a new issue