summaryrefslogtreecommitdiffstats
path: root/Mac/scripts/MkDistr.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/scripts/MkDistr.py')
-rw-r--r--Mac/scripts/MkDistr.py318
1 files changed, 0 insertions, 318 deletions
diff --git a/Mac/scripts/MkDistr.py b/Mac/scripts/MkDistr.py
deleted file mode 100644
index 3e2ee27..0000000
--- a/Mac/scripts/MkDistr.py
+++ /dev/null
@@ -1,318 +0,0 @@
-#
-# Interactively decide what to distribute
-#
-#
-# The exclude file signals files to always exclude,
-# The pattern file lines are of the form
-# *.c
-# This excludes all files ending in .c.
-#
-# The include file signals files and directories to include.
-# Records are of the form
-# ('Tools:bgen:AE:AppleEvents.py', 'Lib:MacToolbox:AppleEvents.py')
-# This includes the specified file, putting it in the given place, or
-# ('Tools:bgen:AE:AppleEvents.py', None)
-# This excludes the specified file.
-#
-from MkDistr_ui import *
-import fnmatch
-import re
-import os
-import sys
-import macfs
-import macostools
-
-DEBUG=0
-
-SyntaxError='Include/exclude file syntax error'
-
-class Matcher:
- """Include/exclude database, common code"""
-
- def __init__(self, filename):
- self.filename = filename
- self.rawdata = []
- self.parse(filename)
- self.rawdata.sort()
- self.rebuild()
- self.modified = 0
-
- def parse(self, dbfile):
- try:
- fp = open(dbfile)
- except IOError:
- return
- data = fp.readlines()
- fp.close()
- for d in data:
- d = d[:-1]
- if not d or d[0] == '#': continue
- pat = self.parseline(d)
- self.rawdata.append(pat)
-
- def save(self):
- fp = open(self.filename, 'w')
- self.savedata(fp, self.rawdata)
- self.modified = 0
-
- def add(self, value):
- if len(value) == 1:
- value = value + ('',)
- self.rawdata.append(value)
- self.rebuild1(value)
- self.modified = 1
-
- def delete(self, value):
- key = value
- for i in range(len(self.rawdata)):
- if self.rawdata[i][0] == key:
- del self.rawdata[i]
- self.unrebuild1(i, key)
- self.modified = 1
- return
- print 'Not found!', key
-
- def getall(self):
- return map(lambda x: x[0], self.rawdata)
-
- def get(self, value):
- for src, dst in self.rawdata:
- if src == value:
- return src, dst
- print 'Not found!', value
-
- def is_modified(self):
- return self.modified
-
-class IncMatcher(Matcher):
- """Include filename database and matching engine"""
-
- def rebuild(self):
- self.idict = {}
- self.edict = {}
- for v in self.rawdata:
- self.rebuild1(v)
-
- def parseline(self, line):
- try:
- data = eval(line)
- except:
- raise SyntaxError, line
- if type(data) <> type(()) or len(data) not in (1,2):
- raise SyntaxError, line
- if len(data) == 1:
- data = data + ('',)
- return data
-
- def savedata(self, fp, data):
- for d in self.rawdata:
- fp.write(`d`+'\n')
-
- def rebuild1(self, (src, dst)):
- if dst == '':
- dst = src
- if dst == None:
- self.edict[src] = None
- else:
- self.idict[src] = dst
-
- def unrebuild1(self, num, src):
- if self.idict.has_key(src):
- del self.idict[src]
- else:
- del self.edict[src]
-
- def match(self, patharg):
- removed = []
- # First check the include directory
- path = patharg
- while 1:
- if self.idict.has_key(path):
- # We know of this path (or initial piece of path)
- dstpath = self.idict[path]
- # We do want it distributed. Tack on the tail.
- while removed:
- dstpath = os.path.join(dstpath, removed[0])
- removed = removed[1:]
- # Finally, if the resultant string ends in a separator
- # tack on our input filename
- if dstpath[-1] == os.sep:
- dir, file = os.path.split(path)
- dstpath = os.path.join(dstpath, file)
- if DEBUG:
- print 'include', patharg, dstpath
- return dstpath
-## path, lastcomp = os.path.split(path)
-## if not path:
-## break
-## removed[0:0] = [lastcomp]
-## # Next check the exclude directory
-## path = patharg
-## while 1:
- if self.edict.has_key(path):
- if DEBUG:
- print 'exclude', patharg, path
- return ''
- path, lastcomp = os.path.split(path)
- if not path:
- break
- removed[0:0] = [lastcomp]
- if DEBUG:
- print 'nomatch', patharg
- return None
-
- def checksourcetree(self):
- rv = []
- for name in self.idict.keys():
- if not os.path.exists(name):
- rv.append(name)
- return rv
-
-class ExcMatcher(Matcher):
- """Exclude pattern database and matching engine"""
-
- def rebuild(self):
- self.relist = []
- for v in self.rawdata:
- self.rebuild1(v)
-
- def parseline(self, data):
- return (data, None)
-
- def savedata(self, fp, data):
- for d in self.rawdata:
- fp.write(d[0]+'\n')
-
- def rebuild1(self, (src, dst)):
- pat = fnmatch.translate(src)
- if DEBUG:
- print 'PATTERN', `src`, 'REGEX', `pat`
- self.relist.append(re.compile(pat))
-
- def unrebuild1(self, num, src):
- del self.relist[num]
-
- def match(self, path):
- comps = os.path.split(path)
- file = comps[-1]
- for pat in self.relist:
- if pat and pat.match(file):
- if DEBUG:
- print 'excmatch', file, pat
- return 1
- return 0
-
-
-class Main:
- """The main program glueing it all together"""
-
- def __init__(self):
- InitUI()
- os.chdir(sys.prefix)
- if not os.path.isdir(':Mac:Distributions'):
- os.mkdir(':Mac:Distributions')
- self.typedist = GetType()
- self.inc = IncMatcher(':Mac:Distributions:%s.include'%self.typedist)
- self.exc = ExcMatcher(':Mac:Distributions:%s.exclude'%self.typedist)
- self.ui = MkDistrUI(self)
- self.ui.mainloop()
-
- def check(self):
- return self.checkdir(':', 1)
-
- def checkdir(self, path, istop):
- if DEBUG:
- print 'checkdir', path
- files = os.listdir(path)
- rv = []
- todo = []
- for f in files:
- if DEBUG:
- print 'checkfile', f
- if self.exc.match(f):
- if DEBUG:
- print 'exclude match', f
- continue
- fullname = os.path.join(path, f)
- if DEBUG:
- print 'checkpath', fullname
- matchvalue = self.inc.match(fullname)
- if matchvalue == None:
- if os.path.isdir(fullname):
- if DEBUG:
- print 'do dir', fullname
- todo.append(fullname)
- else:
- if DEBUG:
- print 'include', fullname
- rv.append(fullname)
- elif DEBUG:
- print 'badmatch', matchvalue
- for d in todo:
- if len(rv) > 500:
- if istop:
- rv.append('... and more ...')
- return rv
- rv = rv + self.checkdir(d, 0)
- return rv
-
- def run(self):
- missing = self.inc.checksourcetree()
- if missing:
- print '==== Missing source files ===='
- for i in missing:
- print i
- print '==== Fix and retry ===='
- return
- destprefix = os.path.join(sys.prefix, ':Mac:Distributions:(vise)')
- destprefix = os.path.join(destprefix, '%s Distribution'%self.typedist)
- if not self.rundir(':', destprefix, 0):
- return
- self.rundir(':', destprefix, 1)
-
- def rundir(self, path, destprefix, doit):
- files = os.listdir(path)
- todo = []
- rv = 1
- for f in files:
- if self.exc.match(f):
- continue
- fullname = os.path.join(path, f)
- if os.path.isdir(fullname):
- todo.append(fullname)
- else:
- dest = self.inc.match(fullname)
- if dest == None:
- print 'Not yet resolved:', fullname
- rv = 0
- if dest:
- if doit:
- print 'COPY ', fullname
- print ' -> ', os.path.join(destprefix, dest)
- try:
- macostools.copy(fullname, os.path.join(destprefix, dest), 1)
- except: #DBG
- print '*** Copy failed mysteriously, try again'
- print '*** cwd', os.getcwd() #DBG
- print '*** fsspec', macfs.FSSpec(fullname) #DBG
- # Get rid of open files
- try:
- i = 1 / 0
- except:
- pass
- macostools.copy(fullname, os.path.join(destprefix, dest), 1)
- for d in todo:
- if not self.rundir(d, destprefix, doit):
- rv = 0
- return rv
-
- def save(self):
- self.inc.save()
- self.exc.save()
-
- def is_modified(self):
- return self.inc.is_modified() or self.exc.is_modified()
-
-if __name__ == '__main__':
- Main()
-