summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2023-04-02 21:04:52 +0200
committerJustin Wernick <justin@worthe-it.co.za>2023-04-02 21:04:52 +0200
commite5fef4f81679582cd6e55de3c8d4461fe712c997 (patch)
treed3455653f52261db8ccc0b42841a8d953f5d494b /src
parent3a0452fb06c116de61ae75cf34931d4747c5953f (diff)
Start the basics of listing repos
Diffstat (limited to 'src')
-rw-r--r--src/git.rs32
-rw-r--r--src/lib.rs11
-rw-r--r--src/parser.rs2
3 files changed, 44 insertions, 1 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),