# 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()