mirror of https://github.com/python/cpython
Script to synchronize files with / in their name and their _s_ counterparts.
Needed to keep CWGUSI under cvs because of filesnames with slashes.
This commit is contained in:
parent
e3308ecb34
commit
d0f0637dad
|
@ -0,0 +1,89 @@
|
|||
# fixgusidir - Modify filenames in the CWGUSI source tree, so
|
||||
# that it can be put under CVS. Needed because there are files with slashes
|
||||
# in their name, which CVS does not approve of.
|
||||
#
|
||||
# Usage:
|
||||
# - On importing gusi in cvs:
|
||||
# - Run the script after unpacking the gusi distribution. This creates
|
||||
# _s_ files for all / files.
|
||||
# - Remove all / files with "find file" or some such.
|
||||
# - import the tree
|
||||
# - On checking out gusi:
|
||||
# - After checkout, run the script to create / files for all _s_ files.
|
||||
# - After modifying stuff, or later checkouts:
|
||||
# - Run the script. Conflicts between / and _s_ files will be reported.
|
||||
# - Fix the problems by removing the outdated / or _s_ file.
|
||||
# - Run the script again. Possibly do a cvs checkin.
|
||||
import macfs
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
|
||||
# Substitution for slashes in filenames
|
||||
SUBST = '_s_'
|
||||
# Program to find those substitutions
|
||||
SUBSTPROG = re.compile(SUBST)
|
||||
|
||||
def main():
|
||||
if len(sys.argv) > 1:
|
||||
gusidir = sys.argv[1]
|
||||
else:
|
||||
fss, ok = macfs.GetDirectory("CWGUSI source folder?")
|
||||
if not ok: sys.exit(0)
|
||||
gusidir = fss.as_pathname()
|
||||
fixgusifolder(gusidir)
|
||||
sys.exit(1)
|
||||
|
||||
def fixgusifolder(gusidir):
|
||||
"""Synchronize files with / in their name with their _s_ counterparts"""
|
||||
os.path.walk(gusidir, gusiwalk, None)
|
||||
|
||||
def gusiwalk(dummy, top, names):
|
||||
"""Helper for fixgusifolder: convert a single directory full of files"""
|
||||
# First remember names with slashes and with our slash-substitution
|
||||
macnames = []
|
||||
codenames = []
|
||||
for name in names:
|
||||
if '/' in name:
|
||||
macnames.append(name)
|
||||
if SUBSTPROG.search(name):
|
||||
codenames.append(name)
|
||||
# Next, check whether we need to copy any slash-files to subst-files
|
||||
for name in macnames:
|
||||
if os.path.isdir(name):
|
||||
print '** Folder with slash in name cannot be handled!'
|
||||
sys.exit(1)
|
||||
othername = mac2codename(name)
|
||||
if len(othername) > 31:
|
||||
print '** Converted filename too long:', othername
|
||||
sys.exit(1)
|
||||
if othername in codenames:
|
||||
codenames.remove(othername)
|
||||
sync(os.path.join(top, name), os.path.join(top, othername))
|
||||
# Now codenames contains only files that have no / equivalent
|
||||
for name in codenames:
|
||||
othername = code2macname(name)
|
||||
sync(os.path.join(top, name), os.path.join(top, othername))
|
||||
|
||||
def mac2codename(name):
|
||||
return re.sub('/', SUBST, name)
|
||||
|
||||
def code2macname(name):
|
||||
return re.sub(SUBST, '/', name)
|
||||
|
||||
def sync(old, new):
|
||||
if os.path.exists(new):
|
||||
# Both exist. Check that they are indentical
|
||||
d1 = open(old, 'rb').read()
|
||||
d2 = open(new, 'rb').read()
|
||||
if d1 == d2:
|
||||
print '-- OK ', old
|
||||
return
|
||||
print '** OUT-OF-SYNC', old
|
||||
fp = open(new, 'wb')
|
||||
fp.write(open(old, 'rb').read())
|
||||
print '-- COPIED ', old
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
Loading…
Reference in New Issue