2020-03-25 13:08:13 +00: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 = []
|
2020-03-26 11:38:41 +00:00
|
|
|
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.
|
2020-03-25 13:08:13 +00:00
|
|
|
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)
|