nimporter
nimporter copied to clipboard
prevent_win32_max_path_length_error deletes files
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:
- before the
replace, addassert not item.with_name(new_name).exists()to prevent future occurrences of this bug. - Add an
elsebranch to the for loop that does the same thing as for "bare" modules, i.e. just remove the@m. This is necessary for local imports which wont include a semver. - Update the
is_semverfunction to also detect if a commit hash is added to the semver in the formatname-major.minor.patch-hash
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