diff --git a/Mac/scripts/MkDistr.py b/Mac/scripts/MkDistr.py index deda71b20f4..f2a1c00eef2 100644 --- a/Mac/scripts/MkDistr.py +++ b/Mac/scripts/MkDistr.py @@ -1,24 +1,18 @@ # # Interactively decide what to distribute # -# The distribution type is signalled by a letter. The currently -# defined letters are: -# p PPC normal distribution -# P PPC development distribution -# m 68K normal distribution -# M 68K development distribution # # The exclude file signals files to always exclude, -# The pattern file records are of the form -# ('pm', '*.c') -# This excludes all files ending in .c for normal distributions. +# 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 -# ('pPmM', 'Lib') -# This includes the Lib dir in all distributions -# ('pPmM', 'Tools:bgen:AE:AppleEvents.py', 'Lib:MacToolbox:AppleEvents.py') -# This includes the specified file, putting it in the given place. +# ('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 @@ -33,8 +27,7 @@ SyntaxError='Include/exclude file syntax error' class Matcher: """Include/exclude database, common code""" - def __init__(self, type, filename): - self.type = type + def __init__(self, filename): self.filename = filename self.rawdata = [] self.parse(filename) @@ -55,25 +48,13 @@ class Matcher: pat = self.parseline(d) self.rawdata.append(pat) - def parseline(self, line): - try: - data = eval(line) - except: - raise SyntaxError, line - if type(data) <> type(()) or len(data) not in (2,3): - raise SyntaxError, line - if len(data) == 2: - data = data + ('',) - return data - def save(self): fp = open(self.filename, 'w') - for d in self.rawdata: - fp.write(`d`+'\n') + self.savedata(fp, self.rawdata) self.modified = 0 def add(self, value): - if len(value) == 2: + if len(value) == 1: value = value + ('',) self.rawdata.append(value) self.rebuild1(value) @@ -82,7 +63,7 @@ class Matcher: def delete(self, value): key = value for i in range(len(self.rawdata)): - if self.rawdata[i][1] == key: + if self.rawdata[i][0] == key: del self.rawdata[i] self.unrebuild1(i, key) self.modified = 1 @@ -90,12 +71,12 @@ class Matcher: print 'Not found!', key def getall(self): - return map(lambda x: x[1], self.rawdata) + return map(lambda x: x[0], self.rawdata) def get(self, value): - for t, src, dst in self.rawdata: + for src, dst in self.rawdata: if src == value: - return t, src, dst + return src, dst print 'Not found!', value def is_modified(self): @@ -110,13 +91,28 @@ class IncMatcher(Matcher): for v in self.rawdata: self.rebuild1(v) - def rebuild1(self, (tp, src, dst)): - if self.type in tp: - if dst == '': - dst = src - self.idict[src] = dst + 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.edict[src] = '' + self.idict[src] = dst def unrebuild1(self, num, src): if self.idict.has_key(src): @@ -140,7 +136,7 @@ class IncMatcher(Matcher): # tack on our input filename if dstpath[-1] == os.sep: dir, file = os.path.split(path) - dstpath = os.path.join(dstpath, path) + dstpath = os.path.join(dstpath, file) return dstpath path, lastcomp = os.path.split(path) if not path: @@ -172,13 +168,17 @@ class ExcMatcher(Matcher): for v in self.rawdata: self.rebuild1(v) - def rebuild1(self, (tp, src, dst)): - if self.type in tp: - pat = fnmatch.translate(src) - self.relist.append(regex.compile(pat)) - else: - self.relist.append(None) - + 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) + self.relist.append(regex.compile(pat)) + def unrebuild1(self, num, src): del self.relist[num] @@ -200,10 +200,11 @@ class Main: if not ok: sys.exit(0) os.chdir(fss.as_pathname()) - self.typedist = GetType() - print 'TYPE', self.typedist - self.inc = IncMatcher(self.typedist, '(MkDistr.include)') - self.exc = ExcMatcher(self.typedist, '(MkDistr.exclude)') + if not os.path.isdir(':(MkDistr)'): + os.mkdir(':(MkDistr)') + typedist = GetType() + self.inc = IncMatcher(':(MkDistr):%s.include'%typedist) + self.exc = ExcMatcher(':(MkDistr):%s.exclude'%typedist) self.ui = MkDistrUI(self) self.ui.mainloop() diff --git a/Mac/scripts/MkDistr.rsrc.hqx b/Mac/scripts/MkDistr.rsrc.hqx index f417d73dfcb..a8f557f2d40 100644 --- a/Mac/scripts/MkDistr.rsrc.hqx +++ b/Mac/scripts/MkDistr.rsrc.hqx @@ -1,31 +1,31 @@ (This file must be converted with BinHex 4.0) -:$%eV4'PcG()ZFR0bB`"bFh*M8P0&4!%!N!F&SINN!*!%!3!!!!5[!!!$V`!!!2) +:$%eV4'PcG()ZFR0bB`"bFh*M8P0&4!%!N!F&Lh`-!*!%!3!!!!3X!!!$,!!!!9m 8T8SJ&+9+%"5P5rJ6'6!)%!!!#"!!!!J3!!!)%!!!#!a0Dd4TFh4b,R*cFQ0b!J! -!!(*cFQ058d9%!3!""!#3"(*cFQ058d9%!3!""!#3&+fG)[m!N!B&SIri(rrq!"r +!!(*cFQ058d9%!3!""!#3"(*cFQ058d9%!3!""!#3&+fG)[m!N!B&Lrri(rrq!"r rr`!Irrq!(rrr`"rrrq!Irrr`(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"r rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJIrrri(rrrq"r -rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ!!!!9!&`!2J$q!D%!"3%!!3#3"3) -!N!89!&`!2J$q!D%!"3%!!3#3"3)"!*!%c!!)!*!&JJ%L!*B"A!3#6dX!N!@#!!S -!PJ"%"!C$B@jMC@`!N!9N!0`!GJ&E"3C6Eh9bBf8!N!93!0`!BJ&E"3Y38%-JC'9 -fC@a[F!#3"P!!EJ"L!0J&#MBi5b"#D@jKFRN!N!9N!'i!GJ$B"3T38%-JBQPZBA* -j!*!&&!"Z!#-"9K!*4@4TG#"8CAKd@`#3"43!#J!N!'')#&"KG(4PFQik!*!&8!! -+!'!!BSJ,4AKME(9NC5"TEMS!N!6d!!S!N!@#!5)!PJ&F"!*25`#3"B)!#J#@!%3 -%"N0KEQ0PE!#3"@3!h!"f!9X&"P0[GA*MC3#3"9!!h!"L!9X&#e"33b"NCACPE'p -`!*!'8!"Z!')!f!8+0MK,)%*TEQ&bH3#3"@3!EJ"f!0J&#P"33b"LD@jKFRN!N!8 -8!'i!)`&@%!P&C'Pd)&4PH(4E!*!&-J"Z!%%"9a!!N!B8!!S!*!"KL!G6Eh9bBf8 -k$`#3"6)!#J"#!'')$%4PFh4TEQ&dD@pZ1J#3"9!!#J"J!'+)#dPZBfaeC'8JD@i -kE!!!!"8!+!!S!6S"a!!!!3!"!*!&!J)!N!39!#J!+!%k!F3!!!%!!3#3"3)$!*! -%6J!$!*!&#J!+!0d"MJ#3"r!""!%%!Bm%"N4PE'9dC3#3"I!!EJ%%!2N%"d9NDA3 -Z,Li!N!E`!!S""!"L"!C"C'3Z,Li!!!!9!(!!EJ$V!9X!!!%!!3#3"3)%!*!%SJ! -%!*!&(J!8!$!!j!B,4R9XE#"cEh9bBf9d!*!&-J!8!%3!j!B28&"$)'4PGQ9XEh" -YC@jdj`#3"8B!&!"B!13'$cBi5b"LD@jKFRNYEfjXHHF!N!9D!"3!E!$N"Jp38%- -JBQPZBA*j,@pZE(RR!*!&#J!+!"S!jSJH9(P`C5"[CL"NDA0dFQPLGA4TEfiJG'm -JBR9TE'3k!!!!EJ!%!*!&#J!+!0d"MJ#3"r!"0J%&!B`%#N4TFh4bD@*eG'8!N!A -`!0)""!%Z"!T$D'9MDb"dFQ9P!*!&m!!+!33!BJ3+5@jME(9NC5iZ,J#3"I!!EJ% -%!-B%"d9iBfaeC'8!!!!"!!!!"+m!!!1[!!!!mJ$0P*344!!!!"`!TJ!"4%a24`! -%!"*%594-!!3!6J)!N!M0Nh!#!3!2!!!!'3$0NhJ#!J!H!!!"qJ$0Nf`#!`!M!!! -#%`$0NfJ#"!!k!!!#IJ$0Nf3#!2rr!!!"!J#3"!)"rrm!!!!b!*!%!J,rr`!!!cd -!cC)m!J2rr`!!!L`!N!3#"2rr!!!#P`#3"!j*EQ0XG@4P)'4TB@a[C`j&H'0XG@4 -P)'4TB@a[C`40B@PZ&NPZBfaeC'8[CAKME(9NC5"hD@jNEhF44'PcG(*TBR9dD@p -Z)(4jF'ALr`: +rrrJIrrri(rrrq"rrrrJIrrri(rrrq"rrrrJ!!!"D!!-!N!8i!4m!6!&C"!G&H'0 +XG@4P!*!'1!!(!%`!333'3f&ZBf9X!*!&&!"a!#-"@4!*4@4TG#"8CAKd@`#3"43 +!"`!N!&k)#&"KG(4PFQik!!!!Q!!'!*!&93%I!'N"@33(5@jME(9NC3#3"P8!#J" +T!%3%"N0KEQ0PE!#3"43!F3!M!9N3#89NDA3J9'9iG,i!N!8b!(!!33&C%!#3"P8 +!e3"T!3m%"d9iBfaeC'8!N!B8!!S!*!"KL!G6Eh9bBf8kG!#3"6)!#J"#!'')$%4 +PFh4TEQ&dD@pZ1J!!!%i!!`#3"3S!#J$G!Bi!N!I`!4N""3'0"!C%C@aPG'8!N!A +`!)N""!%""!G&C'Pd,LiZ!*!'m!!+!3-!F`3'3@4N,LiZ!!!!&3"`!'i!d`&G!!% +"!!%!N!8#"!#3"'i!"!#3"3S!#J$G!Bi!N!I`!6B""3'-"!T%DA0dFQPLGA4P!*! +&m!$5!33",J3+3fKPBfXJG(*PC3#3"I!!#J%%!')%#NPZBfaeC'8Z,Li!N!A`!'i +""!$'"!G&H'0XG@4P!*!%+!!S!#J"1J(%!!!"!!%!N!8#!a03BA4dCA*ZFb"dEb" +TEQ0XG@4P!!!!+!"F!$i!d3'K!!8"!!%!N!8#!"0*EQ0XG@4P)'CTE'8[CQpXC'9 +b!!!!*!"F!$i!YJ'I!!8"!!%!N!8#!3p&H'0XG@4P)("KG(4PFQi!!!!X!#J!+!% +k!F3!!!%!N!F#!KG'D@aPFb"dEb"LC5"MBA4PCfpbDATPC!!!!$%!+!!S!6S"a!! +!!3!"!*!&!J-F4QPXCA-JB@jN)'C[E'4PFR-JG'mJD@jME(9NC3!!!'`!!J#3"3N +!$!!G!0d%(e0PE'9MG#"PH'PcG'PZCb"NDA0dFQPLGA4TEfiZ,Li!N!BP!!X!13$ +F""T$FQ9KG'8JEQ9h)'4TFh4bD@*eG'P[ELiZ,J#3"8)!$!"@!0d%"N0KEQ0PE!! +!!3!!!!3X!!!$,!!!!9m"[JKd(cJ!!!!F!,)!!84-6dF!"3!54%P86!!%!&S#!*! +&!J-"[JG-!J%!$`!!!Lm"[JG8!J)!(J!!!PF"[JG)!J-!RJ!!!SF"[JG%!J3!)`! +!!8`"[JG!!J8!M`!!!GF"[JFm!J!!03!!!&i!N!3#!3"%!*!)!J)!8`!!!@8!N!3 +#!`"I!!!!qJ#3"!)%!(B!!!+m!*!%$NPZBfaeC'8JC'PKE'pR$N9iBfaeC'8JC'P +KE'pR"%eKD@i44'PcG(*TBR9dD@pZ)(4jF'818h*M,f4cG#"ND@&XEfF14AKME(9 +NC5"ND@&XEfF,6@&TEL"hD@jNEhF@5@jME(9NC5pPH'0XG@4P)(GTEQ4[GaK%DA0 +dFQPLGA4TEfiJG(P`C5"hD@jNEhF14AKME(9NC5"hD@jNEhF15@jME(9NC5"hD@j +NEhF5G3: diff --git a/Mac/scripts/MkDistr_ui.py b/Mac/scripts/MkDistr_ui.py index 0f15cad878e..6ca788c9339 100644 --- a/Mac/scripts/MkDistr_ui.py +++ b/Mac/scripts/MkDistr_ui.py @@ -21,6 +21,8 @@ import Qd from FrameWork import * import EasyDialogs import macfs +import os +import sys # Resource IDs ID_MAIN = 514 @@ -30,82 +32,65 @@ MAIN_CHECK=3 MAIN_INCLUDE=4 MAIN_EXCLUDE=5 -ID_INCEXC=515 +ID_INCWINDOW=515 +ID_EXCWINDOW=517 INCEXC_DELETE=2 INCEXC_CHANGE=3 INCEXC_ADD=4 ID_INCLUDE=512 ID_EXCLUDE=513 -DLG_OK=1 +DLG_OK=1 # Include for include, exclude for exclude DLG_CANCEL=2 -DLG_FULL=3 -DLG_PPCDEV=4 -DLG_68K=5 -DLG_PPC=6 -DLG_BUTTONS=[DLG_FULL, DLG_PPCDEV, DLG_68K, DLG_PPC] -DLG_LETTERS=['S', 'P', 'm', 'p'] -DLG_SRCPATH=7 -DLG_DSTPATH=8 +DLG_SRCPATH=3 +DLG_DSTPATH=4 # include dialog only +DLG_EXCLUDE=5 # Exclude, include dialog only ID_DTYPE=516 +DTYPE_EXIST=1 +DTYPE_NEW=2 +DTYPE_CANCEL=3 class EditDialogWindow(DialogWindow): """Include/exclude editor (modeless dialog window)""" - def open(self, id, (type, src, dst), callback, cancelrv): + def open(self, id, (src, dst), callback, cancelrv): self.id = id - if id == ID_INCLUDE: - title = "Include file dialog" - else: - title = "Exclude pattern dialog" - #self.wid.as_Window().SetWTitle(title) self.callback = callback self.cancelrv = cancelrv DialogWindow.open(self, id) tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH) Dlg.SetDialogItemText(h, src) + self.wid.SetDialogDefaultItem(DLG_OK) + self.wid.SetDialogCancelItem(DLG_CANCEL) if id == ID_INCLUDE: tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH) + if dst == None: + dst = '' Dlg.SetDialogItemText(h, dst) - for b in range(len(DLG_BUTTONS)): - if type == None or DLG_LETTERS[b] in type: - self.setbutton(DLG_BUTTONS[b], 1) - - def setbutton(self, num, value): - tp, h, rect = self.wid.GetDialogItem(num) - h.as_Control().SetControlValue(value) - - def getbutton(self, num): - tp, h, rect = self.wid.GetDialogItem(num) - return h.as_Control().GetControlValue() + self.wid.DrawDialog() def do_itemhit(self, item, event): - if item in (DLG_OK, DLG_CANCEL): + if item in (DLG_OK, DLG_CANCEL, DLG_EXCLUDE): self.done(item) - elif item in DLG_BUTTONS: - v = self.getbutton(item) - self.setbutton(item, (not v)) # else it is not interesting def done(self, item): + tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH) + src = Dlg.GetDialogItemText(h) if item == DLG_OK: - distlist = '' - for i in range(len(DLG_BUTTONS)): - if self.getbutton(DLG_BUTTONS[i]): - distlist = distlist + DLG_LETTERS[i] - tp, h, rect = self.wid.GetDialogItem(DLG_SRCPATH) - src = Dlg.GetDialogItemText(h) if self.id == ID_INCLUDE: tp, h, rect = self.wid.GetDialogItem(DLG_DSTPATH) dst = Dlg.GetDialogItemText(h) - rv = (distlist, src, dst) + rv = (src, dst) else: - rv = (distlist, src) + rv = (src, None) + elif item == DLG_EXCLUDE: + rv = (src, None) else: rv = self.cancelrv self.close() - self.callback((item==DLG_OK), rv) + self.callback((item in (DLG_OK, DLG_EXCLUDE)), rv) class ListWindow(DialogWindow): """A dialog window containing a list as its main item""" @@ -113,8 +98,10 @@ class ListWindow(DialogWindow): def open(self, id, contents): self.id = id DialogWindow.open(self, id) + Qd.SetPort(self.wid) tp, h, rect = self.wid.GetDialogItem(MAIN_LIST) - rect2 = rect[0], rect[1], rect[2]-16, rect[3]-16 # Scroll bar space + self.listrect = rect + rect2 = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-16 # Scroll bar space self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid, 0, 1, 1, 1) self.setlist(contents) @@ -127,7 +114,8 @@ class ListWindow(DialogWindow): for i in range(len(contents)): self.list.LSetCell(contents[i], (0, i)) self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) + ##self.list.LUpdate(self.wid.GetWindowPort().visRgn) + Win.InvalRect(self.listrect) def additem(self, item): where = self.list.LAddRow(1, 0) @@ -162,6 +150,7 @@ class ListWindow(DialogWindow): def do_rawupdate(self, window, event): Qd.SetPort(window) + Qd.FrameRect(self.listrect) self.list.LUpdate(self.wid.GetWindowPort().visRgn) def do_close(self): @@ -173,7 +162,7 @@ class ListWindow(DialogWindow): def mycb_add(self, ok, item): if item: - self.additem(item[1]) + self.additem(item[0]) self.cb_add(item) class MainListWindow(ListWindow): @@ -181,35 +170,45 @@ class MainListWindow(ListWindow): def open(self, id, cb_check, cb_run, cb_add): ListWindow.open(self, id, []) - title = "MkDistr: Unresolved files" - #self.wid.as_Window().SetWTitle(title) + self.wid.SetDialogDefaultItem(ID_INCLUDE) self.cb_run = cb_run self.cb_check = cb_check self.cb_add = cb_add + setwatchcursor() + list = self.cb_check() + self.setlist(list) + setarrowcursor() def do_itemhit(self, item, event): if item == MAIN_LIST: self.do_listhit(event) if item == MAIN_MKDISTR: - fss, ok = macfs.StandardPutFile('Destination folder:') - if not ok: - return - self.cb_run(fss.as_pathname()) +## XXXX This somehow stopped working... +## fss, ok = macfs.StandardPutFile('Destination folder:') +## if not ok: +## return +## dest = fss.as_pathname() + dest = os.path.join(os.getcwd(), 'Distribution') + setwatchcursor() + self.cb_run(dest) + setarrowcursor() if item == MAIN_CHECK: + setwatchcursor() list = self.cb_check() self.setlist(list) + setarrowcursor() if item == MAIN_INCLUDE: self.do_dclick(self.delgetselection()) if item == MAIN_EXCLUDE: for i in self.delgetselection(): - self.cb_add(('', i, '')) + self.cb_add((i, None)) def do_dclick(self, list): if not list: list = [''] for l in list: w = EditDialogWindow(self.parent) - w.open(ID_INCLUDE, (None, l, ''), self.mycb_add, None) + w.open(ID_INCLUDE, (l, None), self.mycb_add, None) def mycb_add(self, ok, item): if item: @@ -219,11 +218,7 @@ class IncListWindow(ListWindow): """An include/exclude window""" def open(self, id, editid, contents, cb_add, cb_del, cb_get): ListWindow.open(self, id, contents) - if editid == ID_INCLUDE: - title = "MkDistr: files to include" - else: - title = "MkDistr: patterns to exclude" - #self.wid.as_Window().SetWTitle(title) + self.wid.SetDialogDefaultItem(INCEXC_CHANGE) self.editid = editid self.cb_add = cb_add self.cb_del = cb_del @@ -240,7 +235,7 @@ class IncListWindow(ListWindow): self.do_dclick(self.delgetselection()) if item == INCEXC_ADD: w = EditDialogWindow(self.parent) - w.open(self.editid, (None, '', ''), self.mycb_add, None) + w.open(self.editid, ('', None), self.mycb_add, None) def do_dclick(self, list): if not list: @@ -285,7 +280,7 @@ class MkDistrUI(Application): self.iwin.close() del self.iwin self.iwin = IncListWindow(self) - self.iwin.open(ID_INCEXC, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add, + self.iwin.open(ID_INCWINDOW, ID_INCLUDE, self.main.inc.getall(), self.main.inc.add, self.main.inc.delete, self.main.inc.get) def showexc(self, *args): @@ -294,7 +289,7 @@ class MkDistrUI(Application): self.ewin.close() del self.ewin self.ewin = IncListWindow(self) - self.ewin.open(ID_INCEXC, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add, + self.ewin.open(ID_EXCWINDOW, ID_EXCLUDE, self.main.exc.getall(), self.main.exc.add, self.main.exc.delete, self.main.exc.get) def do_about(self, id, item, window, event): @@ -302,11 +297,33 @@ class MkDistrUI(Application): def GetType(): """Ask user for distribution type""" - d = Dlg.GetNewDialog(ID_DTYPE, -1) while 1: - rv = ModalDialog(None) - if rv >= 1 and rv <= 4: - return DLG_LETTERS[rv-1] + d = Dlg.GetNewDialog(ID_DTYPE, -1) + d.SetDialogDefaultItem(DTYPE_EXIST) + d.SetDialogCancelItem(DTYPE_CANCEL) + while 1: + rv = ModalDialog(None) + if rv in (DTYPE_EXIST, DTYPE_NEW, DTYPE_CANCEL): + break + del d + if rv == DTYPE_CANCEL: + sys.exit(0) + if rv == DTYPE_EXIST: +## macfs.SetFolder(':(MkDistr)') + fss, ok = macfs.StandardGetFile('TEXT') + if not ok: + sys.exit(0) + path = fss.as_pathname() + basename = os.path.split(path)[-1] + if basename[-8:] <> '.include': + EasyDialogs.Message('That is not a distribution include file') + else: + return basename[:-8] + else: + name = EasyDialogs.AskString('Distribution name:') + if name: + return name + sys.exit(0) def InitUI(): """Initialize stuff needed by UI (a resource file)"""