expoweb/scripts/detect-filename-clashes.py

53 lines
1.7 KiB
Python
Raw Normal View History

2020-05-24 22:39:55 +01:00
#!/usr/bin/env python
"""
Recursively checks that no filenames from the current working directory
down are the same, even if they are in different subdirectories. Exits
with status 0 if no matching filenames are found, or 1 if a match is
found.
2020-03-25 PMS Copied originally from https://gist.github.com/seanh/229455
Modified to lowercase everything before checking, to detect clashes caused
by capitalisation, and to capture full path for all clashing files
"""
import sys,os
print "Checking for filename clashes...",
def sortSecond(val):
return val[1]
allfilenames = []
detect = []
clashes = []
report = []
exclude = set([".git",".hg"])
for root, dirs, files in os.walk('.', topdown=True):
dirs[:] = [d for d in dirs if d not in exclude] # modifies dirs in-place.
for filename in files:
if filename.endswith('~'):
# Ignore automatically created backup files.
continue
if os.path.islink(os.path.join(root,filename)):
# Don't count symlinks as filename clashes.
continue
allfilenames.append((root,filename))
if filename.lower() in detect:
clashes.append(filename.lower())
else:
detect.append(filename.lower())
print len(allfilenames), 'files found...',
if clashes == []:
print 'OK'
sys.exit(0)
else:
print len(clashes)," clash(es) found."
for r,f in allfilenames:
if f in clashes:
report.append((r,f))
# sorts the array in descending according to
# second element: the clashing filename
report.sort(key = sortSecond)
for r,f in report:
print os.path.join(r,f)
print len(clashes)," clash(es) found."
sys.exit(1)