<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
This is also about information hiding. The selector is called #<span style="font-family: Arial, Helvetica, sans-serif;font-size: 13px">conflictsWithUpdatedMethods. So, it should return a collection of conflicts. Under which circumstances a result may be empty does not matter at all. Could be user-cancelled or actually empty. :-)</span><div><span style="font-family: Arial, Helvetica, sans-serif;font-size: 13px"><br></span></div><div><span style="font-family: Arial, Helvetica, sans-serif;font-size: 13px">Best,</span></div><div><span style="font-family: Arial, Helvetica, sans-serif;font-size: 13px">Marcel</span></div><div class="mb_sig"></div><blockquote class="history_container" type="cite" style="border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;">
<p style="color: #AAAAAA; margin-top: 10px;">Am 04.03.2020 09:30:34 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style="font-family:Arial,Helvetica,sans-serif">Marcel Taeumel uploaded a new version of UpdateStream to project The Trunk:<br>http://source.squeak.org/trunk/UpdateStream-mt.14.mcz<br><br>==================== Summary ====================<br><br>Name: UpdateStream-mt.14<br>Author: mt<br>Time: 4 March 2020, 9:30:27.350885 am<br>UUID: 8238c043-21eb-284c-aec1-f376ec57389e<br>Ancestors: UpdateStream-ct.13<br><br>Fixes some contracts, i.e., "nil" vs. "#()" vs. "self".<br><br>=============== Diff against UpdateStream-ct.13 ===============<br><br>Item was changed:<br> ----- Method: FilePackage class>>conflictsWithUpdatedMethods: (in category '*UpdateStream-instance creation') -----<br> conflictsWithUpdatedMethods: fullName<br> | conflicts changeList |<br>+ (conflicts := (self fromFileNamed: fullName) conflictsWithUpdatedMethods)<br>+ ifEmpty: [^ self].<br>- conflicts := (self fromFileNamed: fullName) conflictsWithUpdatedMethods.<br>- (conflicts isNil or: [conflicts isEmpty]) ifTrue: [^ self].<br> changeList := ChangeList new.<br> changeList<br> changes: conflicts<br> file: (FileDirectory default readOnlyFileNamed: fullName) close.<br> ChangeList <br> open: changeList<br> name: 'Conflicts for ', (FileDirectory localNameFor: fullName)<br> multiSelect: true.!<br><br>Item was changed:<br> ----- Method: FilePackage>>conflictsWithUpdatedMethods (in category '*UpdateStream-conflict checker') -----<br> conflictsWithUpdatedMethods<br> "Check this package for conflicts with methods in the image which are in newer updates."<br> <br> | localFileName stream updateNumberString updateNumber imageUpdateNumber updateNumberChangeSet conflicts fileStream |<br> <br> localFileName := FileDirectory localNameFor: fullName.<br> stream := ReadStream on: sourceSystem.<br> stream upToAll: 'latest update: #'.<br> updateNumberString := stream upTo: $].<br> stream close.<br> <br> fileStream := FileStream readOnlyFileNamed: fullName.<br> (fileStream contentsOfEntireFile includes: Character linefeed)<br> ifTrue: [self notify: 'The changeset file ', localFileName, ' contains linefeeds. Proceed if...<br> you know that this is okay (e.g. the file contains raw binary data).'].<br> fileStream close.<br> <br> updateNumberString isEmpty ifFalse: "remove prepended junk, if any"<br> [updateNumberString := (updateNumberString findTokens: Character space) last].<br> updateNumberString asInteger ifNil:<br> [(self confirm: 'Error: ', localFileName, ' has no valid Latest Update number in its header.<br> Do you want to enter an update number for this file?')<br>+ ifFalse: [^ #()]<br>- ifFalse: [^ nil]<br> ifTrue: [updateNumberString := UIManager default<br> request: 'Please enter the estimated update number (e.g. 4332).']].<br>+ updateNumberString asInteger ifNil: [self inform: 'Conflict check cancelled.'. ^ #()].<br>- updateNumberString asInteger ifNil: [self inform: 'Conflict check cancelled.'. ^ self].<br> updateNumber := updateNumberString asInteger.<br> <br> imageUpdateNumber := SystemVersion current highestUpdate.<br> updateNumber > imageUpdateNumber ifTrue:<br> [(self confirm: 'Warning: The update number for this file (#', updateNumberString, ')<br> is greater than the highest update number for this image (#', imageUpdateNumber asString, ').<br> This probably means you need to update your image.<br> Should we proceed anyway as if the file update number is #', imageUpdateNumber asString, '?')<br> ifTrue:<br> [updateNumber := imageUpdateNumber.<br> updateNumberString := imageUpdateNumber asString]<br>+ ifFalse: [^ #()]].<br>- ifFalse: [^ nil]].<br> <br> updateNumberChangeSet := self findUpdateChangeSetMatching: updateNumber.<br>+ updateNumberChangeSet ifNil: [^ #()].<br>- updateNumberChangeSet ifNil: [^ nil].<br> <br> Smalltalk isMorphic ifTrue: [self currentWorld findATranscript: self currentEvent].<br> self class logCr; logCr; log: 'Checking ', localFileName, ' (#', updateNumberString, ') for method conflicts with changesets after ', updateNumberChangeSet name, ' ...'.<br> <br> conflicts := OrderedCollection new.<br> self classes do: [:pseudoClass |<br> (Array with: pseudoClass with: pseudoClass metaClass) do: [:classOrMeta |<br> classOrMeta selectorsDo: [:selector | | conflict |<br> conflict := self<br> checkForMoreRecentUpdateThanChangeSet: updateNumberChangeSet<br> pseudoClass: classOrMeta<br> selector: selector.<br> conflict ifNotNil: [conflicts add: conflict].<br> ].<br> ].<br> ].<br> self class logCr; log: conflicts size asString, (' conflict' asPluralBasedOn: conflicts), ' found.'; logCr.<br> self class closeLog.<br> ^ conflicts!<br><br><br></div></blockquote>
</div></body>