Diff between two change sets
Masashi Umezawa
squeak-dev at lists.squeakfoundation.org
Thu Oct 31 11:49:10 UTC 2002
This is a multi-part message in MIME format.
------=_NextPart_000_0093_01C2811E.F6AAB5E0
Content-Type: text/plain;
charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
Hi,
----- Original Message -----
From: "Nevin Pratt" <nevin at smalltalkpro.com>
To: <squeak-dev at lists.squeakfoundation.org>
Sent: Tuesday, October 29, 2002 6:02 AM
Subject: Diff between two change sets
> Is there any way to get Squeak to show the diffs between two change sets?
>
Try the attached MergeBrowser. It can read two changeSets and display one
merged view.
First file-in 'ColoredPluggableListMorph.cs' and then 'MergeBrowser.cs'.
>From the FileList, select the 'browse diff code' menu.
This tool is used daily for our project - NetMorph. Maybe useful.
Cheers,
---
[:masashi | ^umezawa]
------=_NextPart_000_0093_01C2811E.F6AAB5E0
Content-Type: application/octet-stream;
name="ColoredPluggableListMorph.cs"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="ColoredPluggableListMorph.cs"
'From Squeak 3.2 of 11 July 2002 [latest update: #4917] on 7 August 2002 =
at 7:24:34 pm'!=0D"Change Set: Colored PluggableListMorph=0DDate: 7 =
August 2002=0DAuthor: Masashi Umezawa=0D=0DHighlight/unhighlight color =
support for PluggableListMorph.=0D=0DBy setting =
#getHighlightColorSelector and #getUnhighlightColorSelector, you can =
customize highlight/unhighlight colors of =
PluggableListMorph.=0D=0D"!=0D=0DScrollPane subclass: =
#PluggableListMorph=0D instanceVariableNames: 'list selectedMorph =
selection getListSelector getIndexSelector setIndexSelector =
keystrokeActionSelector autoDeselect font lastKeystrokeTime =
lastKeystrokes lastClickTime doubleClickSelector potentialDropMorph =
getUnhighlightColorSelector getHighlightColorSelector '=0D =
classVariableNames: ''=0D poolDictionaries: ''=0D category: =
'Morphic-Windows'!=0D=0D!PluggableListMorph methodsFor: 'accessing' =
stamp: 'MU 6/13/2002 13:59'!=0DgetHighlightColorSelector: aSymbol=0D =
getHighlightColorSelector:=3D aSymbol! !=0D=0D!PluggableListMorph =
methodsFor: 'accessing' stamp: 'MU 6/13/2002 =
13:59'!=0DgetUnhighlightColorSelector: aSymbol=0D =
getUnhighlightColorSelector:=3D aSymbol! !=0D=0D!PluggableListMorph =
methodsFor: 'drawing' stamp: 'MU 6/13/2002 =
13:43'!=0DhighlightSelection=0D selectedMorph ifNotNil: [selectedMorph =
color: self highlightSelectionColor; changed]! =
!=0D=0D!PluggableListMorph methodsFor: 'drawing' stamp: 'MU 6/13/2002 =
13:43'!=0DunhighlightSelection=0D selectedMorph ifNotNil: [selectedMorph =
color: self unhighlightSelectionColor; changed]! =
!=0D=0D!PluggableListMorph methodsFor: 'selection' stamp: 'MU 6/13/2002 =
15:02'!=0DhighlightSelectionColor=0D ^ getHighlightColorSelector =
isNil=0D ifTrue: [Color red]=0D ifFalse: [self model perform: =
getHighlightColorSelector with: selection]! !=0D=0D!PluggableListMorph =
methodsFor: 'selection' stamp: 'MU 6/13/2002 =
15:02'!=0DunhighlightSelectionColor=0D ^ getUnhighlightColorSelector =
isNil=0D ifTrue: [Color black]=0D ifFalse: [self model perform: =
getUnhighlightColorSelector with: selection]! !=0D=0DScrollPane =
subclass: #PluggableListMorph=0D instanceVariableNames: 'list =
selectedMorph selection getListSelector getIndexSelector =
setIndexSelector keystrokeActionSelector autoDeselect font =
lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector =
potentialDropMorph getHighlightColorSelector getUnhighlightColorSelector =
'=0D classVariableNames: ''=0D poolDictionaries: ''=0D category: =
'Morphic-Windows'!=0D
------=_NextPart_000_0093_01C2811E.F6AAB5E0
Content-Type: application/octet-stream;
name="MergeBrowser.cs"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="MergeBrowser.cs"
'From Squeak3.2gamma of 15 January 2002 [latest update: #4857] on 10 =
July 2002 at 6:26:15 pm'!=0D"Change Set: MergeBrowser=0DDate: 27 June =
2002=0DAuthor: Masashi Umezawa=0D=0DMerging support for =
FileContentsBrowser.=0D=0DBy using FileMergeContentsBrowser, you can =
easily integrate two changeSets without filing-in =
them.=0D=0DFileContentsBrowser is colored, so you can quickly detect =
conflicts. It can also extract conlicted parts from two changeSets and =
write them to other file. =0D =0DPrerequisites: #('Colored =
PluggableListMorph')=0D"!=0D=0DFileContentsBrowser subclass: =
#FileMergeContentsBrowser=0D instanceVariableNames: 'otherPackage '=0D =
classVariableNames: ''=0D poolDictionaries: ''=0D category: 'Tools-File =
Contents Browser'!=0DFileMergeContentsBrowser class=0D =
instanceVariableNames: ''!=0DObject subclass: #PseudoClass=0D =
instanceVariableNames: 'name definition organization source metaClass =
classDefinitionMergeStatus methodFileInStatusDict methodMergeStatusDict =
isClassDefinitionFileIn isClassCommentFileIn classCommentMergeStatus =
'=0D classVariableNames: ''=0D poolDictionaries: ''=0D category: =
'Tools-File Contents Browser'!=0D=0D!FileList methodsFor: 'file list =
menu' stamp: 'MU 6/26/2002 17:25'!=0DitemsForFileEnding: suffix=0D | =
labels lines selectors |=0D labels _ OrderedCollection new.=0D lines _ =
OrderedCollection new.=0D selectors _ OrderedCollection new.=0D (suffix =
=3D 'bmp') | (suffix =3D 'gif') | (suffix =3D 'jpg') | (suffix =3D =
'form') | (suffix =3D '*') | (suffix =3D 'png') ifTrue:=0D [labels =
addAll: #('open image in a window' 'read image into ImageImports' 'open =
image as background').=0D selectors addAll: #(openImageInWindow =
importImage openAsBackground)].=0D (suffix =3D 'morph') | (suffix =3D =
'morphs') | (suffix =3D 'sp') | (suffix =3D '*') ifTrue:=0D [labels =
add: 'load as morph'.=0D selectors add: #openMorphFromFile.=0D labels =
add: 'load as project'.=0D selectors add: #openProjectFromFile].=0D =
(suffix =3D 'mdl') ifTrue:=0D [labels add: 'load into Wonderland'.=0D =
selectors add: #openModelintoAlice].=0D (suffix =3D 'extseg') | (suffix =
=3D 'project') | (suffix =3D 'pr') ifTrue:=0D [labels add: 'load as =
project'.=0D selectors add: #openProjectFromFile].=0D (suffix =3D 'bo') =
| (suffix =3D '*') ifTrue:[=0D labels add: 'load as book'.=0D =
selectors add: #openBookFromFile].=0D (suffix =3D 'mid') | (suffix =3D =
'*') ifTrue:=0D [labels add: 'play midi file'.=0D selectors add: =
#playMidiFile].=0D (suffix =3D 'movie') | (suffix =3D '*') ifTrue:=0D =
[labels add: 'open as movie'.=0D selectors add: #openAsMovie].=0D =
(suffix =3D 'st') | (suffix =3D 'cs') | (suffix =3D '*') ifTrue:=0D =
[suffix =3D '*' ifTrue: [lines add: labels size].=0D labels addAll: =
#('fileIn' 'file into new change set' 'browse changes' 'browse code' =
'browse diff code' 'remove line feeds' 'broadcast as update').=0D lines =
add: labels size - 1.=0D selectors addAll: #(fileInSelection =
fileIntoNewChangeSet browseChanges browseFile browseDiffFile =
removeLinefeeds putUpdate)].=0D (suffix =3D 'swf') | (suffix =3D '*') =
ifTrue:[=0D labels add:'open as Flash'.=0D selectors add: =
#openAsFlash].=0D (suffix =3D 'ttf') | (suffix =3D '*') ifTrue:[=0D =
labels add: 'open true type font'.=0D selectors add: #openAsTTF].=0D =
(suffix =3D 'gz') | (suffix =3D '*') ifTrue:[=0D labels addAll: #('view =
decompressed' 'decompress to file').=0D selectors addAll: =
#(viewGZipContents saveGZipContents)].=0D (suffix =3D '3ds') | (suffix =
=3D '*') ifTrue:[=0D labels add: 'Open 3DS file'.=0D selectors add: =
#open3DSFile].=0D (suffix =3D 'tape') | (suffix =3D '*') ifTrue:=0D =
[labels add: 'open for playback'.=0D selectors add: =
#openTapeFromFile].=0D (suffix =3D 'wrl') | (suffix =3D '*') ifTrue:=0D =
[labels add: 'open in Wonderland'.=0D selectors add: #openVRMLFile].=0D =
(suffix =3D 'htm') | (suffix =3D 'html') ifTrue:=0D [labels add: 'open =
in browser'.=0D selectors add: #openInBrowser].=0D (suffix =3D 'zip') | =
(suffix =3D '*') ifTrue:=0D [labels add: 'open archive viewer'.=0D =
selectors add: #openArchiveViewer].=0D (suffix =3D '*') ifTrue:=0D =
[labels addAll: #('generate HTML').=0D lines add: labels size - 1.=0D =
selectors addAll: #(renderFile)].=0D (suffix =3D CRDictionary =
fileNameSuffix) ifTrue:=0D [labels add: 'load Genie Gesture =
Dictionary'.=0D selectors add: #loadCRDictionary].=0D (suffix =3D =
CRDisplayProperties fileNameSuffix) ifTrue:=0D [labels add: 'load Genie =
Display Properties'.=0D selectors add: #loadCRDisplayProperties].=0D ^ =
Array with: labels with: lines with: selectors! !=0D=0D!FileList =
methodsFor: 'menu messages' stamp: 'MU 6/26/2002 =
17:39'!=0DbrowseDiffFile=0D=0D | aResult otherName |=0D (aResult :=3D =
StandardFileMenu oldFileFrom: directory) printString.=0D otherName :=3D =
(aResult directory fullNameFor: aResult name).=0D =0D =
FileMergeContentsBrowser browseFile: self fullName with: otherName! =
!=0D=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: =
'kuri-t 6/4/2002 15:13'!=0DotherPackage=0D otherPackage isNil ifTrue: =
[otherPackage:=3D self buildOtherPackage].=0D ^ otherPackage! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: 'kuri-t =
6/4/2002 14:33'!=0DotherPackage: aValue=0D=0D otherPackage :=3D aValue! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: 'kuri-t =
6/12/2002 14:38'!=0DselectedPackage=0D | selectedPkg |=0D selectedPkg =
:=3D super selectedPackage.=0D ^ selectedPkg isNil=0D ifTrue: [self =
systemCategoryListIndex: 1.=0D super selectedPackage]=0D ifFalse: =
[selectedPkg]! !=0D=0D!FileMergeContentsBrowser methodsFor: 'interface =
opening' stamp: 'kuri-t 6/5/2002 18:41'!=0DopenBrowserOnOtherPackage=0D =
self class browseFile: self otherPackage fullPackageName with: self =
selectedPackage fullPackageName! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'actions' stamp: 'kuri-t 6/5/2002 =
18:35'!=0DotherPackageName=0D ^self otherPackage packageName! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' stamp: 'kuri-t =
6/5/2002 18:43'!=0DpackageName=0D ^self selectedPackage packageName! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' stamp: 'MU =
6/25/2002 19:00'!=0Dreset=0D self packageFilename: self selectedPackage =
fullPackageName otherPackageFilename: self otherPackage =
fullPackageName.=0D self systemCategoryListIndex: 1.=0D self changed: =
#classList.=0D ! !=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' =
stamp: 'kuri-t 7/2/2002 19:11'!=0DswapMessageWithOther=0D | messageName =
otherClassOrMetaClass originalMessage otherMessage |=0D messageName :=3D =
self selectedMessageName=0D ifNil: [^ self].=0D otherClassOrMetaClass =
:=3D self otherPseudoClassOf: self selectedClassOrMetaClass.=0D =
otherClassOrMetaClass isNil=0D ifFalse: [originalMessage :=3D self =
selectedClassOrMetaClass sourceCode=0D at: messageName=0D =
ifAbsent: [].=0D otherMessage :=3D otherClassOrMetaClass sourceCode=0D =
at: messageName=0D ifAbsent: [^self inform: 'Cannot =
swap!!'].=0D self selectedClassOrMetaClass sourceCode at: messageName =
put: otherMessage.=0D otherClassOrMetaClass sourceCode at: messageName =
put: originalMessage].=0D self changed: #contents.! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'MU =
6/21/2002 11:58'!=0DbuildOtherPackage=0D | aResult |=0D (aResult :=3D =
StandardFileMenu oldFile) printString.=0D ^FilePackage fromFileNamed: =
(aResult directory fullNameFor: aResult name).=0D ! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'kuri-t =
6/4/2002 19:03'!=0DotherPseudoClassOf: pseudoClass =0D ^pseudoClass =
isMetaClass=0D ifTrue: [(self otherPackage classes values collect: =
[:each | each metaClass]) =0D detect: [:pMetaClass | pMetaClass name =
=3D pseudoClass name]=0D ifNone: []]=0D ifFalse: [self otherPackage =
classes=0D at: pseudoClass name=0D ifAbsent: []]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'MU =
6/26/2002 19:07'!=0DsharedFileDirectory=0D ^FileDirectory on: =
(FileDirectory dirPathFor: self selectedPackage fullPackageName)! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' stamp: 'kuri-t =
6/12/2002 16:57'!=0DmergeAll=0D self mergeClassesWithOtherPackage! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' stamp: 'kuri-t =
6/18/2002 16:24'!=0DmergeClassesWithOtherPackage=0D | selectedPkg =
movingKeys |=0D self okToChange=0D ifFalse: [^ self].=0D selectedPkg =
:=3D self selectedPackage.=0D selectedPkg isNil=0D ifTrue: [^ self].=0D =
Cursor wait=0D showWhile: [selectedPkg classes=0D do: [:theClass | =
=0D | otherPseudoClass | =0D otherPseudoClass :=3D self =
otherPseudoClassOf: theClass.=0D theClass mergeWith: =
otherPseudoClass.=0D (otherPseudoClass notNil=0D and: =
[otherPseudoClass hasChanges not])=0D ifTrue: [self otherPackage =
removeClass: theClass]].=0D movingKeys :=3D self otherPackage classes =
keys=0D reject: [:eachKey | selectedPkg classes includesKey: =
eachKey].=0D movingKeys=0D do: [:eachKey | =0D | migrated | =0D =
migrated :=3D self otherPackage classes at: eachKey.=0D =
selectedPkg addClass: migrated.=0D migrated =
setClassMergeStatusMigrated.=0D migrated =
setAllMessagesMergeStatusMigrated.=0D self otherPackage classes =
removeKey: eachKey]].=0D self classListIndex: 0.=0D self changed: =
#classList! !=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' =
stamp: 'MU 6/21/2002 11:58'!=0DmergeMessageCategoriesWithOtherPackage=0D =
| theClass otherPseudoClass |=0D self okToChange ifFalse: [^self].=0D =
theClass:=3D self selectedClass.=0D theClass isNil ifTrue: [^self].=0D =
otherPseudoClass:=3D self otherPseudoClassOf: theClass.=0D =
otherPseudoClass isNil ifTrue: [^self].=0D Cursor wait showWhile:=0D =
[theClass mergeMessages: theClass selectors with: otherPseudoClass.=0D =
theClass metaClass mergeMessages: theClass metaClass selectors with: =
otherPseudoClass].=0D self messageCategoryListIndex: 0.=0D self changed: =
#messageCategoryList.! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'merging' stamp: 'kuri-t 6/5/2002 =
17:10'!=0DmergeMessagesWithOtherPackage=0D | theClass cat =
otherPseudoClass |=0D self okToChange ifFalse:[^self].=0D theClass :=3D =
self selectedClassOrMetaClass.=0D theClass isNil ifTrue:[^self].=0D =
otherPseudoClass:=3D self otherPseudoClassOf: theClass.=0D =
otherPseudoClass isNil ifTrue: [^self].=0D cat :=3D self =
selectedMessageCategoryName.=0D cat isNil ifTrue:[^self].=0D Cursor wait =
showWhile:[=0D theClass mergeMessages: (theClass organization =
listAtCategoryNamed: cat) with: otherPseudoClass.=0D ].=0D self =
messageListIndex: 0.=0D self changed: #messageList.! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'MU =
6/26/2002 16:06'!=0DclassListMenu: aMenu=0D=0D ^ aMenu =0D =
labels:=0D'definition=0Dcomment=0Dbrowse full (b)=0Dclass refs =
(N)=0DfileIn=0DfileInOther=0DfileInDefinition=0DfileInOtherDefinition=0Df=
ileInComment=0DfileInOtherComment=0DfileOut=0Drename...=0Dremove=0Dmerge =
with other...'=0D lines: #(2 4 10 11 13)=0D selections: #(editClass =
editComment browseMethodFull browseClassRefs fileInClass =
fileInOtherClass fileInClassDefinition fileInOtherClassDefinition =
fileInClassComment fileInOtherClassComment fileOutClass renameClass =
removeClass mergeMessageCategoriesWithOtherPackage)! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'kuri-t =
6/5/2002 17:10'!=0DmessageCategoryMenu: aMenu=0D=0D ^ aMenu =0D =
labels:=0D'fileIn=0DfileOut=0Dreorganize=0Dadd =
item...=0Drename...=0Dremove=0Dmerge with other...'=0D lines: #(2 3 =
6)=0D selections: #(fileInMessageCategories fileOutMessageCategories =
editMessageCategories addCategory renameCategory removeMessageCategory =
mergeMessagesWithOtherPackage)! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'menus' stamp: 'MU 6/21/2002 16:27'!=0DmessageListMenu: =
aMenu=0D=0D ^ aMenu =0D =
labels:=0D'fileIn=0DfileInOther=0DfileOut=0DfileOutOther=0Dswap=0Dsenders=
(n)=0Dimplementors (m)=0Dmethod inheritance (h)=0Dremove'=0D lines: =
#(4 5)=0D selections: #(fileInMessage fileInOtherMessage fileOutMessage =
fileOutOtherMessage swapMessageWithOther=0DbrowseSenders =
browseImplementors methodHierarchy =0DremoveMessage).! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'MU =
6/26/2002 17:00'!=0DpackageListMenu: aMenu=0D ^ aMenu =0D =
labels:=0D'find class... (f)=0Dmerge with other...=0Dreset=0Dopen =
other...=0DfileIn=0DfileIn not conflicted=0Dfile into new =
changeset=0Dfile into new changeset not conflicted=0DfileOut=0DfileOut =
conflicted only=0DfileOut not conflicted=0D'=0D lines: #(1 4 8)=0D =
selections: #(findClass mergeClassesWithOtherPackage reset =
openBrowserOnOtherPackage fileInPackage fileInNotConflicted =
fileIntoNewChangeSet fileIntoNewChangeSetNotConflicted fileOutPackage =
fileOutConflicted fileOutNotConflicted )! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'infoView' stamp: 'MU =
6/26/2002 17:42'!=0DextraInfo=0D ^ (self=0D methodDiffFor: (self =
selectedClassOrMetaClass sourceCodeAt: self selectedMessageName)=0D =
class: self selectedClass=0D selector: self selectedMessageName=0D =
meta: self metaClassIndicated) asText unembellished=0D ifTrue: [' - =
identical']=0D ifFalse: [' - #CONFLICTED#']! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'infoView' stamp: 'mu =
7/4/2002 12:33'!=0DinfoViewContents=0D | theClass |=0D editSelection =
=3D=3D #newClass=0D ifTrue: [^ self packageInfo: self =
selectedPackage].=0D self selectedClass isNil=0D ifTrue: [^ ''].=0D =
theClass:=3D self otherPseudoClassOf: self selectedClass.=0D =
editSelection =3D=3D #editClass=0D ifTrue: [self =
selectedClassOrMetaClass mergeStatus =3D=3D #original ifTrue: [^'Class =
exists original package'].=0D self selectedClassOrMetaClass =
mergeStatus =3D=3D #migrated ifTrue: [^'Class was migrated from the =
other package'].=0D self selectedClassOrMetaClass mergeStatus =3D=3D =
#conflicted ifTrue: [^'#CONFLICTS# in the class or methods'].].=0D =
editSelection =3D=3D #editMessage=0D ifFalse: [^ ''].=0D (theClass =
notNil=0D and: [self classMessagesIndicated])=0D ifTrue: [theClass =
:=3D theClass metaClass].=0D ^ (theClass notNil=0D and: [theClass =
includesSelector: self selectedMessageName])=0D ifTrue: ['Method also =
exists in the other package' , self extraInfo]=0D ifFalse: [(self =
selectedClassOrMetaClass methodMergeStatusAt: self =
selectedMessageName)=0D =3D=3D #migrated=0D ifTrue: ['Method was =
migrated from the other package']=0D ifFalse: ['Method exists in =
original package']]! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'infoView' stamp: 'kuri-t 6/4/2002 16:16'!=0DpackageInfo: p=0D | =
nClasses newClasses oldClasses |=0D p isNil ifTrue:[^''].=0D nClasses =
:=3D newClasses :=3D oldClasses :=3D 0.=0D p classes do:[:cls|=0D =
nClasses:=3D nClasses + 1.=0D ((self otherPseudoClassOf: cls) =
notNil)=0D ifTrue:[oldClasses :=3D oldClasses + 1]=0D =
ifFalse:[newClasses :=3D newClasses + 1]].=0D ^nClasses printString,' =
classes (', newClasses printString, ' new / ', oldClasses printString, ' =
modified)'! !=0D=0D!FileMergeContentsBrowser methodsFor: 'diffs' stamp: =
'MU 6/26/2002 17:44'!=0DmethodDiffFor: aString class: aPseudoClass =
selector: selector meta: meta =0D "Answer the diff between the current =
copy of the given class/selector/meta for the string provided"=0D=0D | =
theClass source |=0D theClass :=3D self otherPseudoClassOf: =
aPseudoClass.=0D theClass isNil ifTrue: [^aString copy].=0D meta=0D =
ifTrue: [theClass :=3D theClass metaClass].=0D (theClass =
includesSelector: selector)=0D ifFalse: [^ aString copy].=0D source =
:=3D theClass sourceCodeAt: selector.=0D ^ Cursor wait=0D showWhile: =
[TextDiffBuilder buildDisplayPatchFrom: source to: aString inClass: =
theClass prettyDiffs: self showingPrettyDiffs]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'diffs' stamp: 'kuri-t =
7/2/2002 18:51'!=0DmodifiedClassDefinition=0D | pClass old new diff =
oClass |=0D pClass :=3D self selectedClassOrMetaClass.=0D pClass isNil =
ifTrue: [^ nil].=0D pClass hasDefinition ifFalse:[^pClass =
definition].=0D oClass :=3D self otherPseudoClassOf: self =
selectedClass.=0D oClass isNil ifTrue:[^pClass definition].=0D self =
metaClassIndicated ifTrue:[ oClass :=3D oClass metaClass].=0D old :=3D =
oClass hasDefinition ifTrue: [oClass definition] ifFalse:[^pClass =
definition].=0D new :=3D pClass definition.=0D Cursor wait =
showWhile:[=0D diff :=3D ClassDiffBuilder buildDisplayPatchFrom: old =
to: new=0D ].=0D ^diff! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'other' stamp: 'kuri-t 6/4/2002 16:31'!=0DlabelString=0D "Answer the =
string for the window title"=0D=0D ^ self class name, ': ', (self =
selectedSystemCategoryName ifNil: ['']), '/', self otherPackage =
packageName! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'initialize-release' stamp: 'mu 7/4/2002 16:11'!=0DhighlightClassList: =
list with: morphList=0D list=0D with: morphList=0D do: [:item :morph | =
| cls | cls :=3D (self selectedPackage classAt: item).=0D self =
classMessagesIndicated ifTrue: [cls :=3D cls metaClass].=0D cls =
mergeStatus =3D=3D #conflicted ifTrue: [morph color: self class =
conflictedColor].=0D cls mergeStatus =3D=3D #migrated ifTrue: [morph =
color: self class migratedColor].=0D cls mergeStatus =3D=3D #original =
ifTrue: [morph color: self class originalColor]]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'initialize-release' stamp: =
'kuri-t 6/13/2002 15:24'!=0DhighlightMessageList: list with: =
morphList=0D | selClass |=0D selClass :=3D self selectedClass.=0D self =
classMessagesIndicated ifTrue: [selClass :=3D selClass metaClass].=0D =
list=0D with: morphList=0D do: [:item :morph | | methodStatus | =
methodStatus:=3D selClass methodMergeStatusAt: item. =0D =
methodStatus =3D=3D #conflicted ifTrue: [morph color: self class =
conflictedColor].=0D methodStatus =3D=3D #migrated ifTrue: [morph =
color: self class migratedColor].=0D methodStatus =3D=3D #original =
ifTrue: [morph color: self class originalColor]]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'initialize-release' stamp: =
'kuri-t 6/7/2002 14:05'!=0DpackageFilename: aFilename =
otherPackageFilename: otherFilename =0D | packageDict organizer package =
|=0D packageDict :=3D Dictionary new.=0D organizer :=3D SystemOrganizer =
defaultList: Array new.=0D package :=3D FilePackage fromFileNamed: =
aFilename.=0D otherPackage :=3D FilePackage fromFileNamed: =
otherFilename.=0D packageDict at: package packageName put: package.=0D =
organizer classifyAll: package classes keys under: package =
packageName.=0D self systemOrganizer: organizer.=0D self packages: =
packageDict.=0D self otherPackage: otherPackage! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: =
'kuri-t 6/13/2002 15:02'!=0DbuildMorphicClassList=0D | morph |=0D morph =
:=3D super buildMorphicClassList.=0D morph getUnhighlightColorSelector: =
#classMergeStatusColor:.=0D ^morph! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'view creation' stamp: 'kuri-t 6/13/2002 =
15:02'!=0DbuildMorphicMessageList=0D | messageListMorph |=0D =
messageListMorph:=3D PluggableListMorph=0D on: self=0D list: =
#messageList=0D selected: #messageListIndex=0D changeSelected: =
#messageListIndex:=0D menu: #messageListMenu:=0D keystroke: =
#messageListKey:from:.=0D messageListMorph setProperty: =
#highlightSelector toValue: #highlightMessageList:with:.=0D =
messageListMorph getUnhighlightColorSelector: =
#messageMergeStatusColor:.=0D ^ messageListMorph! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: =
'kuri-t 6/13/2002 16:32'!=0DclassMergeStatusColor: selection=0D | status =
selClass |=0D selClass :=3D self selectedPackage classAt: selection =
ifAbsent: [].=0D selClass isNil ifTrue: [^self class originalColor].=0D =
self classMessagesIndicated ifTrue: [selClass :=3D selClass =
metaClass].=0D status :=3D selClass mergeStatus.=0D status =3D=3D =
#conflicted ifTrue:[^self class conflictedColor].=0D status =3D=3D =
#migrated ifTrue:[^self class migratedColor].=0D ^self class =
originalColor! !=0D=0D!FileMergeContentsBrowser methodsFor: 'view =
creation' stamp: 'kuri-t 6/13/2002 15:27'!=0DmessageMergeStatusColor: =
selection=0D | status selClass |=0D self selectedClassName isNil ifTrue: =
[^self class originalColor].=0D selClass :=3D self selectedPackage =
classAt: self selectedClassName.=0D self classMessagesIndicated ifTrue: =
[selClass:=3D selClass metaClass].=0D status :=3D selClass =
methodMergeStatusAt: selection.=0D status =3D=3D #conflicted =
ifTrue:[^self class conflictedColor].=0D status =3D=3D #migrated =
ifTrue:[^self class migratedColor].=0D ^self class originalColor! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: 'MU =
6/21/2002 12:00'!=0DopenAsMorph=0D "Create a pluggable version of all =
the views for a Browser, including views and controllers."=0D | window =
aListExtent next mySingletonList |=0D window :=3D (SystemWindow =
labelled: 'later') model: self.=0D self packages size =3D 1=0D ifTrue: =
[=0D aListExtent :=3D 0.333333 @ 0.34.=0D self =
systemCategoryListIndex: 1.=0D mySingletonList :=3D PluggableListMorph =
on: self list: #systemCategorySingleton=0D selected: #indexIsOne =
changeSelected: #indexIsOne:=0D menu: #packageListMenu:=0D =
keystroke: #packageListKey:from:.=0D mySingletonList =
hideScrollBarIndefinitely.=0D window addMorph: mySingletonList frame: =
(0 at 0 extent: 1.0 at 0.06).=0D next :=3D 0 at 0.06]=0D ifFalse: [=0D =
aListExtent:=3D 0.25 @ 0.4.=0D window addMorph: (PluggableListMorph =
on: self list: #systemCategoryList=0D selected: =
#systemCategoryListIndex changeSelected: #systemCategoryListIndex:=0D =
menu: #packageListMenu:=0D keystroke: #packageListKey:from:)=0D =
frame: (0 at 0 extent: aListExtent).=0D next :=3D aListExtent x @ =
0].=0D=0D self addClassAndSwitchesTo: window at: (next extent: =
aListExtent) plus: 0.=0D=0D next :=3D next + (aListExtent x @ 0).=0D =
window addMorph: (PluggableListMorph on: self list: =
#messageCategoryList=0D selected: #messageCategoryListIndex =
changeSelected: #messageCategoryListIndex:=0D menu: =
#messageCategoryMenu:)=0D frame: (next extent: aListExtent).=0D next =
:=3D next + (aListExtent x @ 0).=0D =0D window addMorph: self =
buildMorphicMessageList=0D frame: (next extent: aListExtent).=0D=0D =
self addLowerPanesTo: window at: (0 at 0.4 corner: 1 at 1) with: nil.=0D ^ =
window=0D! !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' =
stamp: 'MU 6/26/2002 17:08'!=0DfileInClass=0D super fileInClass.=0D self =
changed: #classList! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 17:06'!=0DfileInClassComment=0D =
Cursor read showWhile:[=0D self selectedClass fileInComment.=0D ].=0D =
self changed: #classList! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 17:06'!=0DfileInClassDefinition=0D =
Cursor read showWhile:[=0D self selectedClass fileInDefinition.=0D =
].=0D self changed: #classList! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'fileIn/fileOut' stamp: 'kuri-t 7/2/2002 =
18:26'!=0DfileInNotConflicted=0D Cursor read showWhile:[=0D self =
selectedPackage fileInNotConflicted.=0D ].=0D self changed: #classList! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU =
6/26/2002 17:06'!=0DfileInOtherClass=0D Cursor read showWhile:[ | =
otherClass |=0D otherClass :=3D self otherPseudoClassOf: self =
selectedClass.=0D otherClass isNil ifFalse: [otherClass fileIn].=0D =
].=0D self changed: #classList! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
17:06'!=0DfileInOtherClassComment=0D Cursor read showWhile:[ | =
otherClass |=0D otherClass :=3D self otherPseudoClassOf: self =
selectedClass.=0D otherClass isNil ifFalse: [otherClass =
fileInComment].=0D ].=0D self changed: #classList! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU =
6/26/2002 17:06'!=0DfileInOtherClassDefinition=0D Cursor read =
showWhile:[ | otherClass |=0D otherClass :=3D self otherPseudoClassOf: =
self selectedClass.=0D otherClass isNil ifFalse: [otherClass =
fileInDefinitionOnly].=0D ].=0D self changed: #classList! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU =
6/21/2002 16:24'!=0DfileInOtherMessage=0D | otherClassOrMetaClass |=0D =
self selectedMessageName=0D ifNil: [^ self].=0D Cursor read=0D =
showWhile: [otherClassOrMetaClass :=3D self otherPseudoClassOf: self =
selectedClassOrMetaClass.=0D otherClassOrMetaClass isNil=0D =
ifFalse: [otherClassOrMetaClass fileInMethod: self =
selectedMessageName]]! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/25/2002 19:02'!=0DfileInPackage=0D super =
fileInPackage.=0D self changed: #classList! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU =
6/26/2002 17:10'!=0DfileIntoNewChangeSetNotConflicted=0D=0D | package =
changeSet |=0D (package :=3D self selectedPackage) ifNil: [^ self =
beep].=0D changeSet :=3D ChangeSorter newChangeSet: package =
packageName.=0D Smalltalk newChanges: changeSet.=0D self =
fileInPackageNotConflicted=0D ! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
18:27'!=0DfileOutConflicted=0D Cursor write=0D showWhile: [| fileStream =
| =0D fileStream :=3D self sharedFileDirectory forceNewFileNamed: self =
selectedPackage shortPackageName , ' x ' , self otherPackage =
shortPackageName , ' Conflicts.cs'.=0D self selectedPackage =
fileOutConflictedOn: fileStream.=0D fileStream cr; cr.=0D self =
otherPackage fileOutConflictedOn: fileStream]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU =
6/26/2002 19:24'!=0DfileOutMessage=0D self selectedMessageName=0D =
ifNil: [^ self].=0D Cursor write=0D showWhile: [| fileStream | =0D =
fileStream:=3D self sharedFileDirectory forceNewFileNamed: self =
selectedMessageName , '.st'.=0D self selectedClassOrMetaClass=0D =
fileOutMethods: (Array with: self selectedMessageName)=0D on: =
fileStream]! !=0D=0D!FileMergeContentsBrowser methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 18:27'!=0DfileOutNotConflicted=0D =
Cursor write=0D showWhile: [| fileStream | =0D fileStream :=3D self =
sharedFileDirectory forceNewFileNamed: self selectedPackage =
shortPackageName , ' x ' , self otherPackage shortPackageName , ' =
NotConflicts.cs'.=0D self selectedPackage fileOutNotConflictedOn: =
fileStream.=0D fileStream cr; cr.=0D self otherPackage =
fileOutNotConflictedOn: fileStream]! !=0D=0D!FileMergeContentsBrowser =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
19:20'!=0DfileOutOtherMessage=0D | otherClassOrMetaClass |=0D self =
selectedMessageName=0D ifNil: [^ self].=0D Cursor write=0D showWhile: =
[otherClassOrMetaClass:=3D self otherPseudoClassOf: self =
selectedClassOrMetaClass.=0D otherClassOrMetaClass isNil=0D =
ifFalse: [| fileStream | =0D fileStream :=3D self =
sharedFileDirectory forceNewFileNamed: self selectedMessageName , ' =
Other.st'.=0D otherClassOrMetaClass=0D fileOutMethods: (Array =
with: self selectedMessageName)=0D on: fileStream]]! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'class list' stamp: 'MU =
6/25/2002 18:59'!=0DclassList=0D | originalList selectedPkg clsList |=0D =
originalList:=3D super classList.=0D selectedPkg :=3D self =
selectedPackage.=0D clsList :=3D originalList=0D collect: [:each | =
(selectedPkg classAt: each) isClassDefinitionFileIn=0D ifTrue: =
[each asText addAttribute: TextEmphasis struckOut]=0D ifFalse: =
[each]].=0D clsList :=3D clsList=0D collect: [:each | (selectedPkg =
classAt: each) isClassCommentFileIn=0D ifTrue: [each asText =
addAttribute: TextEmphasis italic]=0D ifFalse: [each]].=0D ^ =
clsList! !=0D=0D!FileMergeContentsBrowser methodsFor: 'code pane' stamp: =
'MU 6/25/2002 19:32'!=0Dcontents=0D | cont |=0D cont :=3D super =
contents.=0D editSelection =3D=3D #editComment=0D ifTrue: [| theClass =
comment otherClass otherClassComment | =0D (theClass :=3D self =
selectedClass)=0D ifNil: [^ ''].=0D comment :=3D theClass =
comment.=0D otherClass :=3D self otherPseudoClassOf: theClass.=0D =
otherClassComment:=3D otherClass isNil=0D ifTrue: [^ comment]=0D =
ifFalse: [otherClass comment].=0D cont :=3D (TextDiffBuilder from: =
otherClassComment to: comment) buildDisplayPatch].=0D ^ cont! =
!=0D=0D!FileMergeContentsBrowser methodsFor: 'message list' stamp: 'MU =
6/25/2002 19:12'!=0DmessageList=0D | msgList selectedClassOrMetaClass =
originalList |=0D originalList :=3D super messageList.=0D self =
selectedClass isNil ifTrue: [^originalList].=0D selectedClassOrMetaClass =
:=3D self selectedClassOrMetaClass.=0D msgList :=3D originalList=0D =
collect: [:sele | (selectedClassOrMetaClass methodFileInStatusAt: =
sele)=0D ifTrue: [sele asText addAttribute: TextEmphasis =
struckOut;=0D addAttribute: TextEmphasis italic;=0D =
yourself]=0D ifFalse: [sele]].=0D ^ msgList! =
!=0D=0D=0D!FileMergeContentsBrowser class methodsFor: 'instance =
creation' stamp: 'MU 7/3/2002 16:28'!=0DbrowseFile: aFilename with: =
otherFilename =0D | browser |=0D Cursor wait=0D showWhile: [browser =
:=3D self new packageFilename: aFilename otherPackageFilename: =
otherFilename.=0D self openBrowserView: browser createViews label: =
self name , ': ' , browser packageName , '/' , browser =
otherPackageName.=0D browser mergeAll]! =
!=0D=0D!FileMergeContentsBrowser class methodsFor: 'instance creation' =
stamp: 'kuri-t 6/12/2002 14:39'!=0DfileNamed: aFilename with: =
otherFilename =0D ^self new packageFilename: aFilename =
otherPackageFilename: otherFilename.! !=0D=0D!FileMergeContentsBrowser =
class methodsFor: 'window color' stamp: 'kuri-t 6/7/2002 =
13:57'!=0DwindowColorSpecification=0D "Answer a WindowColorSpec object =
that declares my preference"=0D ^ WindowColorSpec=0D classSymbol: self =
name=0D wording: 'File Merge Contents Browser'=0D brightColor: =
(Color=0D r: 0.977=0D g: 0.963=0D b: 0.923)=0D pastelColor: =
#paleTan=0D helpMessage: 'Lets you view the contents of a file as code, =
in a browser-like tool.'! !=0D=0D!FileMergeContentsBrowser class =
methodsFor: 'constants' stamp: 'kuri-t 6/13/2002 =
15:10'!=0DconflictedColor=0D ^Color magenta! =
!=0D=0D!FileMergeContentsBrowser class methodsFor: 'constants' stamp: =
'kuri-t 6/13/2002 14:36'!=0DmigratedColor=0D ^Color blue! =
!=0D=0D!FileMergeContentsBrowser class methodsFor: 'constants' stamp: =
'kuri-t 6/13/2002 14:36'!=0DoriginalColor=0D ^Color black! =
!=0D=0D=0D!FilePackage methodsFor: 'accessing' stamp: 'kuri-t 6/13/2002 =
16:31'!=0DclassAt: className ifAbsent: aBlock=0D ^self classes at: =
className ifAbsent: aBlock! !=0D=0D!FilePackage methodsFor: 'accessing' =
stamp: 'MU 6/26/2002 15:52'!=0DshortPackageName=0D ^FileDirectory =
baseNameFor: self packageName=0D=0D=0D! !=0D=0D!FilePackage methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 16:59'!=0DfileInNotConflicted=0D | =
doitsMark |=0D doitsMark :=3D 1.=0D doIts isEmpty ifFalse: [doitsMark =
:=3D self askForDoits].=0D doitsMark =3D 4 ifTrue: [^ nil].=0D doitsMark =
=3D 2 ifTrue: [self fileInDoits].=0D self superclassOrder=0D do: [:cls =
| cls hasDefinition=0D ifTrue: [cls =
fileInDefinitionOnlyNotConflicted]].=0D classes=0D do: [:cls | =0D =
cls hasComment=0D ifTrue: [cls fileInCommentNotConflicted].=0D cls =
fileInMethodsNotConflicted.=0D cls hasMetaclass=0D ifTrue: [cls =
metaClass fileInNotConflicted]].=0D doitsMark =3D 3 ifTrue: [self =
fileInDoits]! !=0D=0D!FilePackage methodsFor: 'fileIn/fileOut' stamp: =
'MU 6/26/2002 17:01'!=0DfileOutConflicted=0D | fileName stream |=0D =
fileName:=3D FillInTheBlank request: 'Enter the file name' =
initialAnswer:''.=0D stream :=3D FileStream newFileNamed: fileName.=0D =
self fileOutConflictedOn: stream! !=0D=0D!FilePackage methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 17:01'!=0DfileOutConflictedOn: =
aStream=0D self superclassOrder do:[:each | each fileOutConflictedOn: =
aStream].=0D ! !=0D=0D!FilePackage methodsFor: 'fileIn/fileOut' stamp: =
'MU 6/26/2002 17:03'!=0DfileOutNotConflicted=0D | fileName stream |=0D =
fileName:=3D FillInTheBlank request: 'Enter the file name' =
initialAnswer:''.=0D stream :=3D FileStream newFileNamed: fileName.=0D =
self fileOutNotConflictedOn: stream! !=0D=0D!FilePackage methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 17:01'!=0DfileOutNotConflictedOn: =
aStream=0D self superclassOrder do:[:each | each fileOutNotConflictedOn: =
aStream].=0D ! !=0D=0D!FilePackage methodsFor: 'actions' stamp: 'kuri-t =
6/18/2002 16:24'!=0DaddClass: aClass=0D self classes at: aClass name =
put: aClass.=0D classOrder add: aClass.! !=0D=0D!FilePackage methodsFor: =
'superclass ordering' stamp: 'MU 6/21/2002 =
12:31'!=0DallSuperPseudoClassNamesOf: aPseudoClass =0D | pseudoCls =
isMeta allSuperClassNames completed allClasses |=0D pseudoCls :=3D =
aPseudoClass.=0D isMeta :=3D aPseudoClass isMetaClass.=0D =
allSuperClassNames:=3D OrderedCollection new.=0D completed :=3D =
false.=0D allClasses :=3D classes values.=0D [completed]=0D whileFalse: =
[| superCls | =0D superCls :=3D allClasses=0D detect: [:each | =
each name =3D pseudoCls parsedSuperPseudoClassName]=0D ifNone: =
[].=0D superCls isNil=0D ifTrue: [completed :=3D true]=0D =
ifFalse: [allSuperClassNames addFirst: superCls name.=0D pseudoCls =
:=3D superCls]].=0D isMeta=0D ifTrue: [allSuperClassNames addFirst: =
#'Object class']=0D ifFalse: [allSuperClassNames addFirst: #Object].=0D =
^ allSuperClassNames! !=0D=0D!FilePackage methodsFor: 'superclass =
ordering' stamp: 'MU 6/21/2002 12:31'!=0DallSuperPseudoClassesOf: =
aPseudoClass =0D | names allClasses allSuperClasses |=0D names :=3D self =
allSuperPseudoClassNamesOf: aPseudoClass.=0D allClasses :=3D classes =
values.=0D allSuperClasses :=3D OrderedCollection new.=0D names =0D do: =
[:eachName | =0D | superClass | =0D (eachName =3D 'Object' or: =
[eachName =3D 'Object class'])=0D ifTrue: [allSuperClasses=0D =
add: (PseudoClass new name: eachName)].=0D superClass :=3D =
allClasses=0D detect: [:cls | cls name =3D eachName]=0D =
ifNone: [].=0D superClass isNil=0D ifFalse: [allSuperClasses add: =
superClass]].=0D ^ allSuperClasses! !=0D=0D!FilePackage methodsFor: =
'superclass ordering' stamp: 'MU 6/21/2002 12:30'!=0DdoWeFileOut: aClass =
given: aSet cache: cache =0D "Weird but copied from ChangeSet"=0D | =
aClassAllSuperclasses aClassSoleInstanceAllSuperclasses |=0D =
aClassAllSuperclasses:=3D cache=0D at: aClass=0D ifAbsent: [cache =
at: aClass put: (self allSuperPseudoClassesOf: aClass) asArray].=0D =
(aSet includesAnyOf: aClassAllSuperclasses)=0D ifTrue: [^ false].=0D =
aClass isMetaClass=0D ifFalse: [^ true].=0D (aSet=0D includes: (self =
soleInstanceOf: aClass))=0D ifTrue: [^ false].=0D =
aClassSoleInstanceAllSuperclasses:=3D cache=0D at: (self =
soleInstanceOf: aClass)=0D ifAbsent: [cache at: aClass soleInstance =
put: (self=0D allSuperPseudoClassesOf: (self soleInstanceOf: =
aClass)) asArray].=0D (aSet includesAnyOf: =
aClassSoleInstanceAllSuperclasses)=0D ifTrue: [^ false].=0D ^ true! =
!=0D=0D!FilePackage methodsFor: 'superclass ordering' stamp: 'MU =
6/21/2002 12:31'!=0DsoleInstanceOf: aPseudoClass =0D ^ classes values=0D =
detect: [:each | each name =3D aPseudoClass soleInstanceName]=0D =
ifNone: []! !=0D=0D!FilePackage methodsFor: 'superclass ordering' stamp: =
'MU 6/25/2002 17:15'!=0DsuperclassOrder=0D ^self superclassOrder: =
classes values! !=0D=0D!FilePackage methodsFor: 'superclass ordering' =
stamp: 'MU 6/21/2002 12:30'!=0DsuperclassOrder: klasses =0D | all list =
aClass inclusionSet aClassIndex cache |=0D list :=3D klasses copy.=0D =
"list is indexable"=0D inclusionSet :=3D list asSet.=0D cache :=3D =
Dictionary new.=0D all :=3D OrderedCollection new: list size.=0D list =
size=0D timesRepeat: [aClassIndex :=3D list=0D findFirst: [:one | =
one isNil not=0D and: [self=0D doWeFileOut: one=0D =
given: inclusionSet=0D cache: cache]].=0D aClass :=3D list =
at: aClassIndex.=0D all addLast: aClass.=0D inclusionSet remove: =
aClass.=0D list at: aClassIndex put: nil].=0D ^ all! =
!=0D=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 =
15:32'!=0DclassCommentMergeStatus=0D ^ classCommentMergeStatus! =
!=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 =
15:32'!=0DclassCommentMergeStatus: statusSymbol=0D =
classCommentMergeStatus:=3D statusSymbol! !=0D=0D!PseudoClass =
methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 =
15:31'!=0DclassDefinitionMergeStatus=0D ^ classDefinitionMergeStatus! =
!=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 =
15:31'!=0DclassDefinitionMergeStatus: statusSymbol=0D =
classDefinitionMergeStatus:=3D statusSymbol! !=0D=0D!PseudoClass =
methodsFor: 'accessing' stamp: 'MU 6/25/2002 =
14:45'!=0DisClassCommentFileIn=0D isClassCommentFileIn isNil ifTrue: =
[isClassCommentFileIn:=3D false].=0D ^isClassCommentFileIn! =
!=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'MU 6/25/2002 =
14:39'!=0DisClassCommentFileIn: anObject=0D isClassCommentFileIn :=3D =
anObject! !=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'MU =
6/25/2002 14:45'!=0DisClassDefinitionFileIn=0D isClassDefinitionFileIn =
isNil ifTrue: [isClassDefinitionFileIn :=3D false].=0D =
^isClassDefinitionFileIn! !=0D=0D!PseudoClass methodsFor: 'accessing' =
stamp: 'MU 6/25/2002 14:39'!=0DisClassDefinitionFileIn: anObject=0D =
isClassDefinitionFileIn:=3D anObject! !=0D=0D!PseudoClass methodsFor: =
'accessing' stamp: 'MU 6/25/2002 14:40'!=0DmethodFileInStatusDict=0D =
methodFileInStatusDict isNil=0D ifTrue: [methodFileInStatusDict :=3D =
Dictionary new].=0D ^ methodFileInStatusDict! !=0D=0D!PseudoClass =
methodsFor: 'accessing' stamp: 'kuri-t 6/11/2002 =
17:09'!=0DmethodMergeStatusDict=0D methodMergeStatusDict isNil=0D =
ifTrue: [methodMergeStatusDict :=3D Dictionary new].=0D ^ =
methodMergeStatusDict! !=0D=0D!PseudoClass methodsFor: 'accessing' =
stamp: 'MU 6/20/2002 17:17'!=0DparsedSuperPseudoClassName=0D | clsName =
|=0D self hasDefinition ifFalse: [^nil].=0D clsName :=3D (self =
definition readStream upTo: Character space) asSymbol.=0D ^clsName! =
!=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:19'!=0DfileInComment=0D self exists ifFalse:[^self =
classNotDefined].=0D self hasComment ifTrue: [self realClass =
classComment: self comment.=0D self isClassCommentFileIn: true=0D ]! =
!=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:56'!=0DfileInCommentNotConflicted=0D (self classCommentMergeStatus =
=3D=3D #conflicted) ifTrue: [^ self].=0D self fileInComment! =
!=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/25/2002 =
15:39'!=0DfileInDefinition=0D (self=0D makeSureSuperClassExists: =
(definition copyUpTo: Character space))=0D ifFalse: [^ self].=0D self =
hasDefinition=0D ifTrue: [Transcript cr; show: 'Defining ' , self =
name.=0D self evaluate: self definition.=0D self =
isClassDefinitionFileIn: true].=0D self exists=0D ifFalse: [^ self].=0D =
self hasComment=0D ifTrue: [self realClass classComment: self =
comment.=0D self isClassCommentFileIn: true]! !=0D=0D!PseudoClass =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:24'!=0DfileInDefinitionOnly=0D "file-in ##definition only##"=0D self =
hasDefinition=0D ifFalse: [^ self].=0D (self=0D =
makeSureSuperClassExists: (definition copyUpTo: Character space))=0D =
ifFalse: [^ self].=0D Transcript cr; show: 'Defining ' , self name.=0D =
self evaluate: self definition.=0D self isClassDefinitionFileIn: true! =
!=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:57'!=0DfileInDefinitionOnlyNotConflicted=0D "file-in ##definition =
only##"=0D (self classDefinitionMergeStatus =3D=3D #conflicted) ifTrue: =
[^ self].=0D self fileInDefinitionOnly! !=0D=0D!PseudoClass methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/25/2002 14:46'!=0DfileInMethods: =
aCollection=0D "FileIn all methods with selectors taken from =
aCollection"=0D | theClass cat |=0D self exists ifFalse:[^self =
classNotDefined].=0D theClass :=3D self realClass.=0D aCollection =
do:[:sel|=0D cat :=3D self organization categoryOfElement: sel.=0D cat =
=3D self removedCategoryName ifFalse:[=0D theClass =0D compile: =
(self sourceCodeAt: sel) =0D classified: cat=0D withStamp: (self =
stampAt: sel)=0D notifying: nil.=0D self methodFileInStatusDict at: =
sel put: true.=0D ].=0D ].! !=0D=0D!PseudoClass methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:57'!=0DfileInMethodsNotConflicted=0D ^self =
fileInMethodsNotConflicted: self selectors! !=0D=0D!PseudoClass =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
16:57'!=0DfileInMethodsNotConflicted: aCollection =0D | selectors |=0D =
selectors:=3D aCollection=0D reject: [:sel | (self =
methodMergeStatusAt: sel)=0D =3D=3D #conflicted].=0D self =
fileInMethods: selectors! !=0D=0D!PseudoClass methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 16:58'!=0DfileInNotConflicted=0D =
self hasDefinition ifTrue: [self fileInDefinitionOnlyNotConflicted].=0D =
self hasComment ifTrue: [self fileInCommentNotConflicted].=0D self =
fileInMethodsNotConflicted.=0D metaClass ifNotNil:[metaClass =
fileInNotConflicted].=0D self needsInitialize ifTrue:[=0D self =
evaluate: self name,' initialize'.=0D ].! !=0D=0D!PseudoClass =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
17:02'!=0DfileOutConflicted=0D | f |=0D f :=3D (FileStream newFileNamed: =
self name,'---conflicts.st').=0D self fileOutConflictedOn: f.! =
!=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
17:02'!=0DfileOutConflictedOn: aStream =0D | methods |=0D (self =
hasDefinition=0D and: [self classDefinitionMergeStatus =3D=3D =
#conflicted])=0D ifTrue: [aStream nextChunkPut: self definition;=0D =
cr].=0D (self hasComment=0D and: [self classCommentMergeStatus =3D=3D =
#conflicted])=0D ifTrue: [aStream cr.=0D self organization =
commentRemoteStr fileOutOn: aStream].=0D methods :=3D OrderedCollection =
new.=0D self methodMergeStatusDict=0D keysAndValuesDo: [:key :value | =
value =3D=3D #conflicted=0D ifTrue: [methods add: key]].=0D self =
fileOutMethods: methods on: aStream.=0D self hasMetaclass=0D ifTrue: =
[self metaClass fileOutConflictedOn: aStream]! !=0D=0D!PseudoClass =
methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 =
17:03'!=0DfileOutNotConflicted=0D | f |=0D f :=3D (FileStream =
newFileNamed: self name,'---notConflicts.st').=0D self =
fileOutNotConflictedOn: f.! !=0D=0D!PseudoClass methodsFor: =
'fileIn/fileOut' stamp: 'MU 6/26/2002 17:03'!=0DfileOutNotConflictedOn: =
aStream =0D | methods |=0D (self hasDefinition=0D and: [self =
classDefinitionMergeStatus ~=3D #conflicted])=0D ifTrue: [aStream =
nextChunkPut: self definition;=0D cr].=0D (self hasComment=0D and: =
[self classCommentMergeStatus ~=3D #conflicted])=0D ifTrue: [aStream =
cr.=0D self organization commentRemoteStr fileOutOn: aStream].=0D =
methods:=3D OrderedCollection new.=0D self methodMergeStatusDict=0D =
keysAndValuesDo: [:key :value | value ~=3D #conflicted=0D ifTrue: =
[methods add: key]].=0D self fileOutMethods: methods on: aStream.=0D =
self hasMetaclass=0D ifTrue: [self metaClass fileOutNotConflictedOn: =
aStream]! !=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'MU 6/25/2002 =
15:41'!=0DmethodFileInStatusAt: selector=0D ^ self =
methodFileInStatusDict at: selector ifAbsent:[false]! =
!=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'kuri-t 6/12/2002 =
19:00'!=0DmethodMergeStatusAt: selector=0D ^ self methodMergeStatusDict =
at: selector ifAbsent:[]! !=0D=0D!PseudoClass methodsFor: 'methods' =
stamp: 'kuri-t 6/7/2002 16:28'!=0DmethodMergeStatusAt: selector put: =
statusSymbol=0D ^ self methodMergeStatusDict at: selector put: =
statusSymbol! !=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'kuri-t =
6/4/2002 15:31'!=0DsourceCodeAt: sel ifAbsent: aBlock=0D | src |=0D src =
:=3D self sourceCode at: sel ifAbsent:[].=0D src isNil ifFalse: [^src =
string].=0D ^aBlock value! !=0D=0D!PseudoClass methodsFor: 'printing' =
stamp: 'MU 6/21/2002 12:05'!=0DprintOn: aStream=0D super printOn: =
aStream.=0D aStream space; nextPutAll: self name.=0D ! =
!=0D=0D!PseudoClass methodsFor: 'testing method dictionary' stamp: =
'kuri-t 6/4/2002 15:47'!=0DincludesSelector: aSymbol=0D ^self selectors =
includes: aSymbol! !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'MU =
6/26/2002 19:13'!=0DmergeMessages: selectors with: otherPseudoClass =0D =
| addedKeys |=0D otherPseudoClass isNil=0D ifTrue: [^ self].=0D =
addedKeys:=3D otherPseudoClass selectors removeAllFoundIn: =
selectors;=0D yourself.=0D addedKeys=0D do: [:addedKey | =0D | =
methodChange | =0D methodChange :=3D otherPseudoClass sourceCode at: =
addedKey.=0D methodChange isText=0D ifFalse: [self addMethodChange: =
methodChange.=0D self methodMergeStatusAt: addedKey put: =
#migrated.=0D otherPseudoClass removeMethod: methodChange =
methodSelector]].=0D selectors=0D do: [:sel | =0D | otherMethod | =0D =
otherMethod :=3D otherPseudoClass=0D sourceCodeAt: sel=0D =
ifAbsent: [].=0D otherMethod isNil=0D ifFalse: [(self sourceCodeAt: =
sel)=0D =3D otherMethod asString=0D ifTrue: [otherPseudoClass =
removeMethod: sel]=0D ifFalse: [self methodMergeStatusAt: sel put: =
#conflicted.=0D otherPseudoClass methodMergeStatusAt: sel put: =
#conflicted]]].=0D otherPseudoClass organization removeEmptyCategories! =
!=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t 6/5/2002 =
16:08'!=0DmergeMessagesWith: otherPseudoClass =0D ^self mergeMessages: =
self selectors with: otherPseudoClass ! !=0D=0D!PseudoClass methodsFor: =
'merging' stamp: 'MU 6/26/2002 15:28'!=0DmergeStatus=0D | status |=0D =
status:=3D Set new.=0D self methodMergeStatusDict=0D valuesDo: [:each =
| status add: each].=0D self classDefinitionMergeStatus isNil=0D =
ifFalse: [status add: self classDefinitionMergeStatus].=0D self =
classCommentMergeStatus isNil=0D ifFalse: [status add: self =
classCommentMergeStatus].=0D (status includes: #conflicted) ifTrue: [^ =
#conflicted].=0D (status includes: #migrated) ifTrue: [^ #migrated].=0D =
^ #original! !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t =
6/14/2002 16:39'!=0DmergeWith: theOtherPseudoClass =0D =
theOtherPseudoClass isNil=0D ifTrue: [^ self].=0D self =
mergeMessagesWith: theOtherPseudoClass.=0D (self hasDefinition=0D and: =
[self definition =3D theOtherPseudoClass definition])=0D ifTrue: =
[theOtherPseudoClass definition: nil].=0D (self hasComment=0D and: =
[self comment asString =3D theOtherPseudoClass comment asString])=0D =
ifTrue: [theOtherPseudoClass classComment: nil].=0D (theOtherPseudoClass =
hasComment=0D and: [self hasComment not])=0D ifTrue: [self =
commentString: theOtherPseudoClass comment asString. =0D =
theOtherPseudoClass classComment: nil].=0D self =
setClassMergeStatusUsing: theOtherPseudoClass.=0D metaClass isNil=0D =
ifFalse: [metaClass mergeWith: theOtherPseudoClass metaClass]! =
!=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t 6/11/2002 =
19:01'!=0DsetAllMessagesMergeStatusMigrated=0D self sourceCode=0D =
keysAndValuesDo: [:key :value | self methodMergeStatusDict at: key put: =
#migrated].=0D metaClass isNil=0D ifFalse: [self metaClass =
setAllMessagesMergeStatusMigrated]! !=0D=0D!PseudoClass methodsFor: =
'merging' stamp: 'kuri-t 6/17/2002 =
16:43'!=0DsetClassMergeStatusMigrated=0D self hasDefinition=0D ifTrue: =
[self classDefinitionMergeStatus: #migrated].=0D self hasComment=0D =
ifTrue: [self classCommentMergeStatus: #migrated].=0D self =
hasMetaclass=0D ifTrue: [self metaClass hasDefinition=0D ifTrue: =
[self metaClass classDefinitionMergeStatus: #migrated]]! =
!=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'MU 6/26/2002 =
15:34'!=0DsetClassMergeStatusUsing: theOtherPseudoClass =0D | =
otherDefinition otherComment |=0D self hasDefinition=0D ifTrue: =
[theOtherPseudoClass hasDefinition=0D ifTrue: [otherDefinition :=3D =
theOtherPseudoClass definition.=0D self definition =3D =
otherDefinition=0D ifFalse: [self classDefinitionMergeStatus: =
#conflicted.=0D theOtherPseudoClass classDefinitionMergeStatus: =
#conflicted]]]=0D ifFalse: [theOtherPseudoClass hasDefinition=0D =
ifTrue: [self classDefinitionMergeStatus: #migrated]].=0D =
theOtherPseudoClass hasComment=0D ifTrue: [self hasComment=0D =
ifTrue: [otherComment :=3D theOtherPseudoClass comment.=0D self =
comment =3D otherComment=0D ifFalse: [self classCommentMergeStatus: =
#conflicted.=0D theOtherPseudoClass classDefinitionMergeStatus: =
#conflicted]]=0D ifFalse: [self classCommentMergeStatus: #migrated]]! =
!=0D=0D!PseudoClass methodsFor: 'comparing' stamp: 'kuri-t 6/18/2002 =
17:54'!=0D<=3D aPsudoClass=0D =0D ^self name <=3D aPsudoClass name! =
!=0D=0D!PseudoClass methodsFor: 'comparing' stamp: 'kuri-t 6/18/2002 =
17:54'!=0D=3D aPsudoClass=0D =0D ^self name =3D aPsudoClass name! =
!=0D=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'MU 6/20/2002 =
17:18'!=0DparsedSuperPseudoClassName=0D | clsName |=0D self =
hasDefinition ifFalse: [^nil].=0D clsName :=3D (self definition =
readStream upTo: Character space) asSymbol.=0D ^clsName, ' class'! =
!=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'kuri-t 6/18/2002 =
17:25'!=0DsoleInstance=0D ^ super realClass class soleInstance! =
!=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'MU 6/20/2002 =
17:57'!=0DsoleInstanceName=0D | clsName |=0D clsName :=3D (self name =
readStream upTo: Character space) asSymbol.=0D ^clsName! !=0D=0DObject =
subclass: #PseudoClass=0D instanceVariableNames: 'name definition =
organization source metaClass classDefinitionMergeStatus =
classCommentMergeStatus methodMergeStatusDict isClassDefinitionFileIn =
isClassCommentFileIn methodFileInStatusDict '=0D classVariableNames: =
''=0D poolDictionaries: ''=0D category: 'Tools-File Contents Browser'!=0D
------=_NextPart_000_0093_01C2811E.F6AAB5E0--
More information about the Squeak-dev
mailing list
|