""" Step 1: Scan a restored FCCS backup directory for drawer IDs. Every subdirectory in the backup root corresponds to a drawer. Writes the sorted list of drawer IDs to the configured drawer_id_file. """ import os import sys from fccs_config import ( parse_args, load_config, make_logger, load_lines, check_for_clashes, ) def main(): args = parse_args() cfg = load_config(args.config) log = make_logger(cfg.get("paths", "log_file")) backup_dir = cfg.get("paths", "backup_dir") output_file = cfg.get("paths", "drawer_id_file") ignore_file = cfg.get("paths", "ignore_file") if not os.path.isdir(backup_dir): log(f"ERROR: backup directory not found: {backup_dir}") sys.exit(1) drawer_ids = sorted( name for name in os.listdir(backup_dir) if os.path.isdir(os.path.join(backup_dir, name)) ) with open(output_file, "w", encoding="utf-8") as f: for did in drawer_ids: f.write(did + "\n") log(f"Found {len(drawer_ids)} drawers, written to {output_file}") # Report which drawers are set to be ignored (skipped by the export). ignored = set(load_lines(ignore_file)) if ignored: present = sorted(ignored & set(drawer_ids)) log(f"Ignore list ({ignore_file}): {len(ignored)} IDs, " f"{len(present)} present in this backup — these will be SKIPPED " f"by fccs_export.py: {', '.join(present) if present else '(none present)'}") # Flag prefix clashes: FCCS search on the shorter ID pops a selection box. clashes = check_for_clashes(drawer_ids) if clashes: log("-" * 60) log(f"WARNING: {len(clashes)} potential drawer ID clash(es) found.") log("Searching the shorter ID in FCCS may show a selection box " "instead of navigating directly, which breaks the export.") log("Consider exporting these manually, or add the shorter ID to " f"the ignore list ({ignore_file}).") for short, matches in clashes: flag = " [ignored]" if short in ignored else "" log(f" {short}{flag} -> also matches: {', '.join(matches)}") log("-" * 60) else: log("No drawer ID prefix clashes found.") if __name__ == "__main__": main()