From e5fef4f81679582cd6e55de3c8d4461fe712c997 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Sun, 2 Apr 2023 21:04:52 +0200 Subject: Start the basics of listing repos --- src/git.rs | 32 +++++++++++++++++++++++++++++++- src/lib.rs | 11 +++++++++++ src/parser.rs | 2 ++ 3 files changed, 44 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/git.rs b/src/git.rs index 7337a6a..ea27add 100644 --- a/src/git.rs +++ b/src/git.rs @@ -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) -> Result Result, 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); diff --git a/src/lib.rs b/src/lib.rs index e96614f..4685e53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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, 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), -- cgit v1.2.3