diff --git a/Mac/scripts/fixgusidir.py b/Mac/scripts/fixgusidir.py new file mode 100644 index 00000000000..53ca5ba5b20 --- /dev/null +++ b/Mac/scripts/fixgusidir.py @@ -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() +