63 lines
2.0 KiB
Rust
63 lines
2.0 KiB
Rust
use kebab_parse_code::repo::detect_repo;
|
|
use std::fs;
|
|
use std::process::Command;
|
|
use tempfile::TempDir;
|
|
|
|
fn init_git_repo(root: &std::path::Path) {
|
|
let run = |args: &[&str]| {
|
|
Command::new("git")
|
|
.args(args)
|
|
.current_dir(root)
|
|
.status()
|
|
.expect("git command failed");
|
|
};
|
|
run(&["init", "-q"]);
|
|
run(&["config", "user.email", "test@test"]);
|
|
run(&["config", "user.name", "test"]);
|
|
fs::write(root.join("README.md"), "hi").unwrap();
|
|
run(&["add", "README.md"]);
|
|
run(&["commit", "-q", "-m", "init"]);
|
|
}
|
|
|
|
#[test]
|
|
fn detect_repo_returns_none_outside_git() {
|
|
let tmp = TempDir::new().unwrap();
|
|
let nested = tmp.path().join("a/b/c.txt");
|
|
fs::create_dir_all(nested.parent().unwrap()).unwrap();
|
|
fs::write(&nested, "x").unwrap();
|
|
assert!(detect_repo(&nested).is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn detect_repo_walks_up_to_git_dir() {
|
|
let tmp = TempDir::new().unwrap();
|
|
let repo_root = tmp.path().join("myrepo");
|
|
fs::create_dir_all(&repo_root).unwrap();
|
|
init_git_repo(&repo_root);
|
|
let nested = repo_root.join("src/deep/file.rs");
|
|
fs::create_dir_all(nested.parent().unwrap()).unwrap();
|
|
fs::write(&nested, "x").unwrap();
|
|
|
|
let meta = detect_repo(&nested).expect("should detect repo");
|
|
assert_eq!(meta.name, "myrepo");
|
|
assert!(meta.branch.is_some());
|
|
assert!(meta.commit.is_some());
|
|
assert_eq!(meta.commit.as_ref().unwrap().len(), 40);
|
|
}
|
|
|
|
#[test]
|
|
fn detect_repo_returns_consistent_metadata_for_paths_in_same_repo() {
|
|
let tmp = TempDir::new().unwrap();
|
|
let repo_root = tmp.path().join("myrepo");
|
|
fs::create_dir_all(&repo_root).unwrap();
|
|
init_git_repo(&repo_root);
|
|
let f1 = repo_root.join("a.rs");
|
|
let f2 = repo_root.join("b.rs");
|
|
fs::write(&f1, "x").unwrap();
|
|
fs::write(&f2, "x").unwrap();
|
|
let m1 = detect_repo(&f1).unwrap();
|
|
let m2 = detect_repo(&f2).unwrap();
|
|
assert_eq!(m1.name, m2.name);
|
|
assert_eq!(m1.commit, m2.commit);
|
|
}
|