Skip to content

Commit 8c177a6

Browse files
committed
feat(utils): add get_repo_name function with robust path handling and tests
1 parent 4cd4fc5 commit 8c177a6

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/utils/get_repo_name.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use std::collections::HashMap;
2+
use std::path::Path;
3+
4+
/// Get repository name
5+
///
6+
/// # Parameters
7+
/// - `repo_dir`: repository path
8+
/// - `format`: mapping from directory name to repository name
9+
///
10+
/// # Returns
11+
/// - repository name (None if not found)
12+
pub fn get_repo_name(repo_dir: &str, format: &HashMap<String, String>) -> Option<String> {
13+
let repo_dir = repo_dir.trim_end_matches(std::path::MAIN_SEPARATOR);
14+
let path = Path::new(repo_dir);
15+
if let Some(key_osstr) = path.file_name() {
16+
let key = key_osstr.to_string_lossy();
17+
format.get(key.as_ref()).cloned()
18+
} else {
19+
None
20+
}
21+
}
22+
23+
#[cfg(test)]
24+
mod tests {
25+
use super::*;
26+
use std::collections::HashMap;
27+
28+
#[test]
29+
fn test_get_repo_name_found() {
30+
let mut format = HashMap::new();
31+
format.insert("my-repo".to_string(), "My Repository".to_string());
32+
let repo_dir = "/Users/xxx/projects/my-repo";
33+
let repo_name = get_repo_name(repo_dir, &format);
34+
assert_eq!(repo_name, Some("My Repository".to_string()));
35+
}
36+
37+
#[test]
38+
fn test_get_repo_name_not_found() {
39+
let format = HashMap::new();
40+
let repo_dir = "/Users/xxx/projects/unknown-repo";
41+
let repo_name = get_repo_name(repo_dir, &format);
42+
assert_eq!(repo_name, None);
43+
}
44+
45+
#[test]
46+
fn test_get_repo_name_empty_path() {
47+
let format = HashMap::new();
48+
let repo_dir = "";
49+
let repo_name = get_repo_name(repo_dir, &format);
50+
assert_eq!(repo_name, None);
51+
}
52+
53+
#[test]
54+
fn test_get_repo_name_trailing_slash() {
55+
let mut format = HashMap::new();
56+
format.insert("my-repo".to_string(), "My Repository".to_string());
57+
let repo_dir = "/Users/xxx/projects/my-repo/";
58+
let repo_name = get_repo_name(repo_dir, &format);
59+
assert_eq!(repo_name, Some("My Repository".to_string()));
60+
}
61+
}

src/utils/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod format_commit;
2+
pub mod get_repo_name;
23
pub mod keypress;

0 commit comments

Comments
 (0)