summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/git.rs32
-rw-r--r--src/lib.rs11
-rw-r--r--src/parser.rs2
-rw-r--r--tests/cli.rs34
4 files changed, 68 insertions, 11 deletions
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<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);
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<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(())
}