diff options
-rw-r--r-- | src/git.rs | 32 | ||||
-rw-r--r-- | src/lib.rs | 11 | ||||
-rw-r--r-- | src/parser.rs | 2 | ||||
-rw-r--r-- | tests/cli.rs | 34 |
4 files changed, 68 insertions, 11 deletions
@@ -3,7 +3,7 @@ use crate::{ ShackleError, }; use git2::{Repository, RepositoryInitMode, RepositoryInitOptions}; -use std::{path::PathBuf, process::Command}; +use std::{fs, path::PathBuf, process::Command}; use user_info::{get_user_groups, get_username}; pub struct GitInitResult { @@ -99,6 +99,36 @@ pub fn init(repo_name: &str, group: &Option<String>) -> Result<GitInitResult, Sh } } +pub struct RepoMetadata { + pub path: PathBuf, + pub description: String, +} + +pub fn list() -> Result<Vec<RepoMetadata>, ShackleError> { + let mut results = Vec::new(); + + let personal_dir = personal_git_dir()?; + if personal_dir.is_dir() { + for dir in personal_dir.read_dir()? { + let path = dir?.path(); + let description_path = path.join("description"); + let has_git_ext = path.extension().map_or(false, |ext| ext == "git"); + let has_description = description_path.is_file(); + + // TODO: Read the config to tell if this is a shared repo + + if has_git_ext && has_description { + let description = fs::read_to_string(description_path)?; + results.push(RepoMetadata { path, description }); + } + } + } + + // TODO: Do the same (more or less) for group repos + + Ok(results) +} + pub fn upload_pack(upload_pack_args: &GitUploadPackArgs) -> Result<(), ShackleError> { if !is_valid_git_repo_path(&upload_pack_args.directory)? { return Err(ShackleError::InvalidDirectory); @@ -1,6 +1,7 @@ pub mod git; pub mod parser; +use comfy_table::Table; use parser::*; use rustyline::error::ReadlineError; use std::{io, ops::ControlFlow}; @@ -15,6 +16,16 @@ pub fn run_command(user_input: String) -> Result<ControlFlow<(), ()>, ShackleErr Ok(ShackleCommand::Exit) => { return Ok(ControlFlow::Break(())); } + Ok(ShackleCommand::List) => { + let mut table = Table::new(); + table.set_header(vec!["path", "description"]); + let listing = git::list()?; + for meta in listing { + table.add_row(vec![meta.path.display().to_string(), meta.description]); + } + + println!("{table}"); + } Ok(ShackleCommand::GitInit(GitInitArgs { repo_name, group })) => { let init_result = git::init(&repo_name, &group)?; println!("Successfully created \"{}\"", init_result.path.display()); diff --git a/src/parser.rs b/src/parser.rs index 700414c..88b32bb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -11,6 +11,8 @@ pub enum ShackleCommand { #[command(skip)] Whitespace, Exit, + /// List all repositories available + List, GitInit(GitInitArgs), GitUploadPack(GitUploadPackArgs), GitReceivePack(GitReceivePackArgs), diff --git a/tests/cli.rs b/tests/cli.rs index aa25e0a..648b6c1 100644 --- a/tests/cli.rs +++ b/tests/cli.rs @@ -229,19 +229,33 @@ fn allows_single_quotes_and_spaces_inside_double_quotes() -> Result<()> { fn list_can_print_an_empty_list() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line("list")?; - c.p.exp_string( - r" ----------------------- -| path | description | -====================== ----------------------- -", - )?; + c.p.exp_string("+------+-------------+")?; + c.p.exp_string("| path | description |")?; + c.p.exp_string("+====================+")?; + c.p.exp_string("+------+-------------+")?; + expect_prompt(&mut c.p)?; + Ok(()) } #[test] -#[ignore] fn list_can_print_an_list_of_all_repos_with_descriptions() -> Result<()> { - todo!() + let mut c = spawn_interactive_process()?; + let personal_repo_name = "my-personal-repo"; + c.p.send_line(&format!("git-init {}", personal_repo_name))?; + + let group = get_user_groups().pop().unwrap(); + let shared_repo_name = "my-shared-repo"; + c.p.send_line(&format!("git-init --group {} {}", group, shared_repo_name))?; + + c.p.send_line("list")?; + c.p.exp_string("+------+-------------+")?; + c.p.exp_string("| path | description |")?; + c.p.exp_string("+====================+")?; + c.p.exp_string("| git/shukkie/my-personal-repo | |+")?; + c.p.exp_string(&format!("| git/{group}/{shared_repo_name} | |+"))?; + c.p.exp_string("+------+-------------+")?; + expect_prompt(&mut c.p)?; + + Ok(()) } |