# http://stackoverflow.com/questions/15069127/python-configparser-module-\
# rename-a-section
def rename_section(cp, section_from, section_to):
    items = cp.items(section_from)
    cp.add_section(section_to)
    for item in items:
        cp.set(section_to, item[0], item[1])
    cp.remove_section(section_from)


# Checkpoint version F renames an internal member of Process class.
def upgrader(cpt):
    import re

    for sec in cpt.sections():
        fdm = "FdMap"
        fde = "FDEntry"
        if re.match(f".*\\.{fdm}.*", sec):
            rename = re.sub(fdm, fde, sec)
            split = re.split(fde, rename)

            # rename the section and add the 'mode' field
            rename_section(cpt, sec, rename)
            cpt.set(rename, "mode", "0")  # no proper value to set :(

            # add in entries 257 to 1023
            if split[1] == "0":
                for x in range(257, 1024):
                    seq = (split[0], fde, f"{x}")
                    section = "".join(seq)
                    cpt.add_section(section)
                    cpt.set(section, "fd", "-1")


legacy_version = 15
