Pebaz / nimporter

Compile Nim Extensions for Python On Import!
MIT License
821 stars 33 forks source link

prevent_win32_max_path_length_error deletes files #95

Open MegaIng opened 4 weeks ago

MegaIng commented 4 weeks ago

prevent_win32_max_path_length_error silently overwrites files that it shouldn't. This leads to mysterious compilation bugs.

            # Bare module. Module not from library dependency
            if '@s' not in item.name:
                mod_name = item.name.replace('@m', '')

            # Module from a library dependency. Find the package the module
            # belongs to (if any)
            else:
                segments = item.name.replace('@m', '').split('@s')

                for segment in reversed(segments):
                    if is_semver(segment):
                        index = segments.index(segment)
                        mod_name = '@'.join(segments[index:])
                        break

            new_name = ic(f'NIMPORTER@{mod_name}')
            item.replace(item.with_name(new_name))

If the for-loop through the segments doesn't find any semver segment, mod_name is not modified and the same mod_name as the last item is used, leading to the file being silently overwritten.

I would suggested multiple fixes:

MegaIng commented 4 weeks ago

Note that I encountered this while trying to debug https://github.com/MegaIng/py_save_monger If you want, you could use it to test that your changes solve the issues (btw, thanks for the quick response!). Currently, it's setup.py monkey patches prevent_win32_max_path_length_error with a slightly different solution than what you are trying in #96