102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
import os
|
|
import re
|
|
import common as c
|
|
|
|
def ensure_dir_exists(path: str):
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
|
|
def set_ini_values(ini_path, section, entries):
|
|
if not c.drive:
|
|
c.show_popup("Error", "This feature requires a valid drive to be selected")
|
|
return
|
|
|
|
ini_path = str(ini_path)
|
|
|
|
try:
|
|
with open(ini_path, "r") as f:
|
|
lines = f.readlines()
|
|
except FileNotFoundError:
|
|
lines = []
|
|
|
|
output_lines = []
|
|
current_section = None
|
|
section_lines = []
|
|
section_found = False
|
|
|
|
def flush_section():
|
|
nonlocal section_lines, output_lines
|
|
if section_lines:
|
|
output_lines.extend(section_lines)
|
|
section_lines = []
|
|
|
|
for line in lines:
|
|
section_match = re.match(r"\s*\[([^\]]+)\]", line)
|
|
if section_match:
|
|
if current_section == section and entries:
|
|
new_lines = []
|
|
keys_handled = set()
|
|
for l in section_lines[1:]:
|
|
key_match = re.match(r"\s*([A-Za-z0-9_.]+)\s*=", l)
|
|
if key_match:
|
|
key = key_match.group(1)
|
|
if key in entries:
|
|
val = entries[key]
|
|
if val is None:
|
|
continue
|
|
new_lines.append(f"{key} = {val}\n")
|
|
keys_handled.add(key)
|
|
else:
|
|
new_lines.append(l)
|
|
else:
|
|
new_lines.append(l)
|
|
for k, v in entries.items():
|
|
if k not in keys_handled and v is not None:
|
|
new_lines.append(f"{k} = {v}\n")
|
|
section_lines = [section_lines[0]] + new_lines
|
|
flush_section()
|
|
current_section = section_match.group(1)
|
|
section_lines = [line]
|
|
if current_section == section:
|
|
section_found = True
|
|
continue
|
|
section_lines.append(line)
|
|
|
|
if current_section == section and entries:
|
|
new_lines = []
|
|
keys_handled = set()
|
|
for l in section_lines[1:]:
|
|
key_match = re.match(r"\s*([A-Za-z0-9_.]+)\s*=", l)
|
|
if key_match:
|
|
key = key_match.group(1)
|
|
if key in entries:
|
|
val = entries[key]
|
|
if val is None:
|
|
continue
|
|
new_lines.append(f"{key} = {val}\n")
|
|
keys_handled.add(key)
|
|
else:
|
|
new_lines.append(l)
|
|
else:
|
|
new_lines.append(l)
|
|
for k, v in entries.items():
|
|
if k not in keys_handled and v is not None:
|
|
new_lines.append(f"{k} = {v}\n")
|
|
section_lines = [section_lines[0]] + new_lines
|
|
|
|
flush_section()
|
|
|
|
if not section_found and entries:
|
|
output_lines.append(f"\n[{section}]\n")
|
|
for k, v in entries.items():
|
|
if v is not None:
|
|
output_lines.append(f"{k} = {v}\n")
|
|
|
|
ensure_dir_exists(ini_path)
|
|
|
|
if output_lines:
|
|
with open(ini_path, "w") as f:
|
|
f.writelines(output_lines)
|
|
else:
|
|
if os.path.exists(ini_path):
|
|
os.remove(ini_path)
|