use crate::earlier_name_moved_to_current_in_place::{existing_kept_name, kept_name_for_use};
use crate::rename_that_never_replaces::rename_noreplace;
use crate::wrapper_names_old_and_new::{
COMMIT_TIMING_LOG, DATA_FOLDER, DISCARD_AUDIT_LOG, MERGE_INTENT_FOLDER, PUSH_TRIGGER_LOG, RenamedName, WORKTREE_ADD_TIMING_LOG,
WORKTREE_COPY_RECORD_FOLDER,
};
use std::path::{Path, PathBuf};
const ROTATING_LOGS_IN_COMMON_DIRECTORY: [RenamedName; 3] = [DISCARD_AUDIT_LOG, COMMIT_TIMING_LOG, WORKTREE_ADD_TIMING_LOG];
const OTHER_NAMES_IN_COMMON_DIRECTORY: [RenamedName; 3] = [DATA_FOLDER, PUSH_TRIGGER_LOG, WORKTREE_COPY_RECORD_FOLDER];
const NAMES_IN_WORKTREE_DIRECTORY: [RenamedName; 2] = [DATA_FOLDER, MERGE_INTENT_FOLDER];
fn is_digit_byte(byte: u8) -> bool {
return byte.is_ascii_digit();
}
fn move_numbered_copies(parent: &Path, name: RenamedName) {
let Ok(listing) = std::fs::read_dir(parent) else {
return;
};
let wanted_start: String = format!("{}.", name.earlier);
for entry in listing.flatten() {
let file_name: String = entry.file_name().to_string_lossy().into_owned();
let Some(number) = file_name.strip_prefix(wanted_start.as_str()) else {
continue;
};
if number.is_empty() || !number.bytes().all(is_digit_byte) {
continue;
}
let target: PathBuf = parent.join(format!("{}.{number}", name.current));
let _moved = rename_noreplace(entry.path().as_path(), target.as_path());
}
}
pub fn settle_kept_names(git_dir: &Path, common_dir: &Path) {
settle_worktree_directory_names(git_dir);
settle_common_directory_names(common_dir);
}
pub fn settle_worktree_directory_names(git_dir: &Path) {
for name in NAMES_IN_WORKTREE_DIRECTORY {
let _placed = kept_name_for_use(git_dir, name);
}
}
pub fn settle_common_directory_names(common_dir: &Path) {
for name in OTHER_NAMES_IN_COMMON_DIRECTORY {
let _placed = kept_name_for_use(common_dir, name);
}
for name in ROTATING_LOGS_IN_COMMON_DIRECTORY {
let _placed = kept_name_for_use(common_dir, name);
move_numbered_copies(common_dir, name);
}
}
pub fn path_for_reading(directory: &Path, relative: &str) -> PathBuf {
let prefix: String = format!("{}/", DATA_FOLDER.current);
if let Some(rest) = relative.strip_prefix(prefix.as_str()) {
return data_folder_for_reading(directory).join(rest);
}
return directory.join(relative);
}
pub fn data_folder_for_reading(directory: &Path) -> PathBuf {
return existing_kept_name(directory, DATA_FOLDER);
}
#[cfg(test)]
#[path = "kept_names_in_the_git_directories_tests.rs"]
mod tests;