use super::support::{Fixture, Observed, fixture, git, observe, remove, repository, wrapped};
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
const CONFIGURATION_UNKNOWN: &str = "the Git configuration cannot be read without running Git";
const SYSTEM_ATTRIBUTES_UNKNOWN: &str = "the location of the system attributes file cannot be established without running Git";
const DIFFERS: &str = "differs from the committed content";
const STALE_BY: std::time::Duration = std::time::Duration::from_secs(900);
fn stderr_text(observed: &Observed) -> String {
return String::from_utf8_lossy(&observed.stderr).into_owned();
}
fn repository_with_unvouched_worktrees(fixture: &Fixture) -> PathBuf {
let repo: PathBuf = repository(fixture, OsStr::new("repo"));
std::fs::write(repo.join("tracked.txt"), b"committed\n").expect("tracked file");
git(fixture, repo.as_path(), &["add", "tracked.txt"]);
git(fixture, repo.as_path(), &["commit", "--quiet", "--message=tracked"]);
for name in ["clean", "edited"] {
git(fixture, repo.as_path(), &["worktree", "add", "--quiet", "--detach", name]);
}
let exclude: PathBuf = repo.join(".git/info/exclude");
std::fs::write(&exclude, "/clean/\n/edited/\n").expect("exclude");
std::fs::write(repo.join("edited/tracked.txt"), b"changed after the commit\n").expect("edit");
for name in ["clean", "edited"] {
let file = std::fs::OpenOptions::new().write(true).open(repo.join(name).join("tracked.txt")).expect("open for the time");
file.set_modified(std::time::SystemTime::now() - STALE_BY).expect("move the modification time");
}
return repo;
}
fn dry_run(fixture: &Fixture, repo: &Path, worktree: &str, unset: &[&str]) -> Observed {
let mut command = wrapped(fixture);
command.current_dir(repo).args(["cli-git", "convert-worktree-to-subvolume", "--dry-run", worktree]);
for name in unset {
command.env_remove(name);
}
return observe(&mut command, b"");
}
#[test]
fn a_worktree_the_stat_data_cannot_vouch_for_is_judged_by_content_not_refused_for_not_knowing_git() {
let fixture: Fixture = fixture("convert-knows-real-git");
let repo: PathBuf = repository_with_unvouched_worktrees(&fixture);
let clean: Observed = dry_run(&fixture, repo.as_path(), "clean", &["GIT_CONFIG_NOSYSTEM"]);
let clean_text: String = stderr_text(&clean);
assert!(!clean_text.contains(CONFIGURATION_UNKNOWN), "{clean_text}");
assert!(!clean_text.contains(SYSTEM_ATTRIBUTES_UNKNOWN), "{clean_text}");
assert!(!clean_text.contains("is not quiet and unmodified"), "{clean_text}");
let edited: Observed = dry_run(&fixture, repo.as_path(), "edited", &["GIT_CONFIG_NOSYSTEM"]);
let edited_text: String = stderr_text(&edited);
assert!(edited_text.contains(DIFFERS), "{edited_text}");
remove(&fixture);
}
#[test]
fn the_system_attributes_file_is_located_through_the_real_git_too() {
let fixture: Fixture = fixture("convert-knows-attributes");
let repo: PathBuf = repository_with_unvouched_worktrees(&fixture);
let clean: Observed = dry_run(&fixture, repo.as_path(), "clean", &[]);
let clean_text: String = stderr_text(&clean);
assert!(!clean_text.contains(SYSTEM_ATTRIBUTES_UNKNOWN), "{clean_text}");
assert!(!clean_text.contains("is not quiet and unmodified"), "{clean_text}");
let edited: Observed = dry_run(&fixture, repo.as_path(), "edited", &[]);
assert!(stderr_text(&edited).contains(DIFFERS), "{}", stderr_text(&edited));
remove(&fixture);
}