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