]> granicus.if.org Git - python/commitdiff
Script to synchronize files with / in their name and their _s_ counterparts.
authorJust van Rossum <just@lettererror.com>
Sun, 24 Jan 1999 23:24:21 +0000 (23:24 +0000)
committerJust van Rossum <just@lettererror.com>
Sun, 24 Jan 1999 23:24:21 +0000 (23:24 +0000)
Needed to keep CWGUSI under cvs because of filesnames with slashes.

Mac/scripts/fixgusidir.py [new file with mode: 0644]

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