auto generate the ignore list then we can manually adjust for locked drawers

This commit is contained in:
2026-07-09 16:44:19 -05:00
parent 60cc36893e
commit acd985432e
3 changed files with 74 additions and 14 deletions

View File

@@ -13,6 +13,61 @@ from fccs_config import (
)
_IGNORE_HEADER = [
"# Drawer IDs to SKIP during export (one ID per line).",
"# Lines starting with # are comments and are ignored.",
"#",
"# Add password-protected or otherwise-excluded drawers here.",
"#",
"# The IDs auto-added below are prefix clashes: searching them in FCCS",
"# pops a selection box that breaks the automation, so they're skipped by",
"# default. DELETE or comment out any you actually DO want exported (then",
"# handle them manually), and keep the rest.",
"",
]
def update_ignore_file(ignore_file, clashes, log):
"""Create ignore.txt if missing and seed it with clash prefix IDs.
Never overwrites existing entries — only appends clash prefixes that
aren't already present. The shorter (prefix) ID of each clash is the one
that triggers the FCCS selection box, so it's the candidate to skip.
Returns the list of IDs that were added.
"""
existing = set(load_lines(ignore_file))
file_exists = os.path.exists(ignore_file)
to_add = [(short, matches) for short, matches in clashes
if short not in existing]
# Existing file already covers every clash — leave it untouched.
if file_exists and not to_add:
return []
lines = []
if not file_exists:
lines.extend(_IGNORE_HEADER)
for short, matches in to_add:
lines.append(f"# clashes with: {', '.join(matches)}")
lines.append(short)
mode = "a" if file_exists else "w"
with open(ignore_file, mode, encoding="utf-8") as f:
if file_exists:
f.write("\n") # separate the new block from prior content
f.write("\n".join(lines) + "\n")
added = [short for short, _ in to_add]
if not file_exists:
log(f"Created ignore file: {ignore_file}")
if added:
log(f"Added {len(added)} clash prefix ID(s) to ignore list: "
f"{', '.join(added)}")
return added
def main():
args = parse_args()
cfg = load_config(args.config)
@@ -37,14 +92,6 @@ def main():
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:
@@ -52,15 +99,23 @@ def main():
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(f" {short} -> also matches: {', '.join(matches)}")
# Seed ignore.txt with the clash prefixes for review (never overwrites).
update_ignore_file(ignore_file, clashes, log)
log(f"Review the ignore list: {ignore_file}")
log("-" * 60)
else:
log("No drawer ID prefix clashes found.")
# Report which drawers will be 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 listed, "
f"{len(present)} present in this backup — these will be SKIPPED "
f"by fccs_export.py: {', '.join(present) if present else '(none present)'}")
if __name__ == "__main__":
main()