<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        Hmpf. :-(<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.11.2020 17:13:47 schrieb Nicolas Cellier <nicolas.cellier.aka.nice@gmail.com>:</p><div style='font-family:Arial,Helvetica,sans-serif'>
<div dir="ltr"><div>Remember this mail from February 2019?</div><div><br></div><div>
<div>Still cleaning the inbox...</div><div>I see this:</div><div><br></div><div><b>Name: <span class="gmail-il">Monticello</span>-<span class="gmail-il">bf</span>.<span class="gmail-il">540</span><br>Author: <span class="gmail-il">bf</span><br>Time: 3 May 2013, 12:06:01.01 pm<br>UUID: 759525eb-5ca8-4ab2-9e4a-bddc7d0680dc<br>Ancestors: <span class="gmail-il">Monticello</span>-<span class="gmail-il">bf</span>.532, <span class="gmail-il">Monticello</span>-fbs.539<br><br>This
 is my allow-partial-commits mod, improved to always diff to the target 
repository, and merged with the latest fbs.359 trunk version.</b></div><div><br></div><div>It
 is not signalled as false ancestor, so it means that this ancestor is 
in history, or another package in history has same UUID (unlikely!).</div><div><br></div><div>But in trunk there is a different package:</div><div><br></div><div><b>Name: <span class="gmail-il">Monticello</span>-<span class="gmail-il">bf</span>.<span class="gmail-il">540</span><br>Author: <span class="gmail-il">bf</span><br>Time: 4 May 2013, 8:13:11.165 pm<br>UUID: b8904753-a5e5-4061-a912-49480229e91a<br>Ancestors: <span class="gmail-il">Monticello</span>-fbs.539<br><br>Add MCReorganizationPreloader which can resolve moves between arbitrary packages.</b></div><div><br></div><div>Do we really have two different <span class="gmail-il">Monticello</span>-<span class="gmail-il">bf</span>.<span class="gmail-il">540</span> in ancestors or what?</div><div>Is there a morphic tool to visualize the ancestry graph?</div><div><br></div><div>I do not remember the conclusion, but can we browse/download/access the two ancestors?<br></div>

</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le mer. 4 nov. 2020 à 15:57, <<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Marcel Taeumel uploaded a new version of Monticello to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/Monticello-bf.540.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/trunk/Monticello-bf.540.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Monticello-bf.540<br>
Author: bf<br>
Time: 3 May 2013, 12:06:01.01 pm<br>
UUID: 759525eb-5ca8-4ab2-9e4a-bddc7d0680dc<br>
Ancestors: Monticello-bf.532, Monticello-fbs.539<br>
<br>
This is my allow-partial-commits mod, improved to always diff to the target repository, and merged with the latest fbs.359 trunk version.<br>
<br>
=============== Diff against Monticello-fbs.539 ===============<br>
<br>
Item was added:<br>
+ ----- Method: MCPatch>>ignoring: (in category 'accessing') -----<br>
+ ignoring: ignoredOperations<br>
+       ^ MCPatch operations: (operations difference: ignoredOperations)!<br>
<br>
Item was added:<br>
+ Notification subclass: #MCRepositoryRequest<br>
+       instanceVariableNames: ''<br>
+       classVariableNames: ''<br>
+       poolDictionaries: ''<br>
+       category: 'Monticello-UI'!<br>
<br>
Item was changed:<br>
+ MCPatchBrowser subclass: #MCSaveVersionDialog<br>
+       instanceVariableNames: 'name message ignore'<br>
- MCTool subclass: #MCSaveVersionDialog<br>
-       instanceVariableNames: 'name message'<br>
        classVariableNames: ''<br>
        poolDictionaries: ''<br>
        category: 'Monticello-UI'!<br>
<br>
Item was changed:<br>
  ----- Method: MCSaveVersionDialog>>accept (in category 'as yet unclassified') -----<br>
  accept<br>
        self answer:<br>
                (Array<br>
                        with: (self findTextMorph: #versionName) text asString<br>
+                       with: (self findTextMorph: #logMessage) text asString<br>
+                       with: ignore)<br>
+ !<br>
-                       with: (self findTextMorph: #logMessage) text asString)<br>
-       !<br>
<br>
Item was changed:<br>
  ----- Method: MCSaveVersionDialog>>defaultExtent (in category 'as yet unclassified') -----<br>
  defaultExtent <br>
+       ^ 600@600!<br>
-       ^ 400@300!<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>ignore (in category 'as yet unclassified') -----<br>
+ ignore<br>
+       ^ ignore ifNil: [ignore := Set new]!<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>ignoreSelection (in category 'as yet unclassified') -----<br>
+ ignoreSelection<br>
+       selection<br>
+               ifNil: [ignore size = items size<br>
+                       ifFalse: [ignore addAll: items]<br>
+                       ifTrue: [ignore removeAll]]<br>
+               ifNotNil: [<br>
+                       ignore remove: selection ifAbsent: [<br>
+                               ignore add: selection].<br>
+                       self selection < items size<br>
+                               ifTrue: [self selection: self selection + 1]].<br>
+       self changed: #list<br>
+ !<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>installSelection (in category 'as yet unclassified') -----<br>
+ installSelection<br>
+       super installSelection.<br>
+       selection ifNotNil: [<br>
+               ignore remove: selection ifAbsent: [].<br>
+               self changed: #list].<br>
+ <br>
+ !<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>list (in category 'as yet unclassified') -----<br>
+ list<br>
+       ^ self items collect: [:ea |<br>
+               (self ignore includes: ea)<br>
+                       ifFalse: [ea summary]<br>
+                       ifTrue: [Text string: '( ', ea summary, ' )' attribute: TextEmphasis struckOut ]]!<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>methodListKey:from: (in category 'as yet unclassified') -----<br>
+ methodListKey: aKeystroke from: aListMorph <br>
+       aKeystroke caseOf: {<br>
+               [$I] -> [self ignoreSelection].<br>
+       } otherwise: [super methodListKey: aKeystroke from: aListMorph ]!<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>methodListMenu: (in category 'as yet unclassified') -----<br>
+ methodListMenu: aMenu<br>
+       aMenu addList:#(<br>
+               ('ignore (I)'   ignoreSelection 'Do not include this change when saving')<br>
+               -).<br>
+       super methodListMenu: aMenu.<br>
+       ^aMenu!<br>
<br>
Item was added:<br>
+ ----- Method: MCSaveVersionDialog>>revertSelection (in category 'as yet unclassified') -----<br>
+ revertSelection<br>
+       super revertSelection.<br>
+       selection ifNotNil: [<br>
+               ignore add: selection.<br>
+               self changed: #list].<br>
+ !<br>
<br>
Item was changed:<br>
  ----- Method: MCSaveVersionDialog>>widgetSpecs (in category 'as yet unclassified') -----<br>
  widgetSpecs<br>
        ^ #(    <br>
                ((textMorph: versionName) (0 0 1 0) (0 0 0 30))<br>
+               ((textMorph: logMessage) (0 0 1 0.3) (0 30 0 -30))<br>
+               ((buttonRow) (0 0.3 1 0.3) (0 -40 0 0))<br>
+               ((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0.3 1 0.6) (0 0 0 0))<br>
+               ((textMorph: text) (0 0.6 1 1) (0 0 0 0))<br>
-               ((textMorph: logMessage) (0 0 1 1) (0 30 0 -30))<br>
-               ((buttonRow) (0 1 1 1) (0 -40 0 0))<br>
                )!<br>
<br>
Item was changed:<br>
  ----- Method: MCTool>>showModally (in category 'morphic ui') -----<br>
  showModally<br>
        modalProcess := Processor activeProcess.<br>
+       self window openInWorldExtent: self defaultExtent.<br>
-       self window openInWorldExtent: (400@400).<br>
        [self window world notNil] whileTrue: [<br>
                self window outermostWorldMorph doOneCycle.<br>
        ].<br>
        morph := nil.<br>
        ^ modalValue!<br>
<br>
Item was changed:<br>
  Notification subclass: #MCVersionNameAndMessageRequest<br>
+       instanceVariableNames: 'suggestion initialMessage patch'<br>
-       instanceVariableNames: 'suggestion initialMessage'<br>
        classVariableNames: ''<br>
        poolDictionaries: ''<br>
        category: 'Monticello-Versioning'!<br>
<br>
Item was changed:<br>
  ----- Method: MCVersionNameAndMessageRequest>>defaultAction (in category 'as yet unclassified') -----<br>
  defaultAction<br>
        ^ MCSaveVersionDialog new<br>
                versionName: suggestion;<br>
                logMessage: initialMessage;<br>
+               patch: patch;<br>
                showModally!<br>
<br>
Item was added:<br>
+ ----- Method: MCVersionNameAndMessageRequest>>patch (in category 'as yet unclassified') -----<br>
+ patch<br>
+       ^ patch!<br>
<br>
Item was added:<br>
+ ----- Method: MCVersionNameAndMessageRequest>>patch: (in category 'as yet unclassified') -----<br>
+ patch: aPatch<br>
+       patch := aPatch<br>
+ !<br>
<br>
Item was changed:<br>
  ----- Method: MCWorkingCopy>>newVersion (in category 'operations') -----<br>
  newVersion<br>
+       | packageSnapshot parentSnapshot patch |<br>
+       parentSnapshot := self parentSnapshot.<br>
+       packageSnapshot := package snapshot.<br>
+       patch := packageSnapshot patchRelativeToBase: parentSnapshot.<br>
        ^ (self requestVersionNameAndMessageWithSuggestion: self uniqueVersionName<br>
+               initialMessage: self patchMessageDefault<br>
+               patch: patch) ifNotNil:<br>
+                       [:tuple |<br>
+                       self newVersionWithName: tuple first withBlanksTrimmed<br>
+                               message: (self patchMessageStripped: tuple second)<br>
+                               snapshot: (tuple third<br>
+                                       ifEmpty: [packageSnapshot]<br>
+                                       ifNotEmpty: [<br>
+                                               MCPatcher apply: (patch ignoring: tuple third)<br>
+                                                       to: parentSnapshot])]<br>
-               initialMessage: self patchMessageSuggestion) ifNotNil:<br>
-                       [:pair |<br>
-                       self newVersionWithName: pair first withBlanksTrimmed<br>
-                               message: (self patchMessageStripped: pair last)].<br>
  !<br>
<br>
Item was changed:<br>
  ----- Method: MCWorkingCopy>>newVersionWithName:message: (in category 'operations') -----<br>
  newVersionWithName: nameString message: messageString<br>
+       ^self newVersionWithName: nameString message: messageString snapshot: package snapshot!<br>
-       | info deps |<br>
-       info := ancestry infoWithName: nameString message: messageString.<br>
-       ancestry := MCWorkingAncestry new addAncestor: info.<br>
-       self modified: true; modified: false.<br>
-       <br>
-       deps := self requiredPackages collect:<br>
-               [:ea | <br>
-               MCVersionDependency<br>
-                       package: ea<br>
-                       info: ea workingCopy currentVersionInfo].<br>
- <br>
-       ^ MCVersion<br>
-               package: package<br>
-               info: info<br>
-               snapshot: package snapshot<br>
-               dependencies: deps!<br>
<br>
Item was added:<br>
+ ----- Method: MCWorkingCopy>>newVersionWithName:message:snapshot: (in category 'operations') -----<br>
+ newVersionWithName: nameString message: messageString snapshot: aSnapshot<br>
+       | info deps clean |<br>
+       info := ancestry infoWithName: nameString message: messageString.<br>
+       ancestry := MCWorkingAncestry new addAncestor: info.<br>
+       clean := (package snapshot patchRelativeToBase: aSnapshot) isEmpty.<br>
+       self modified: clean; modified: clean not. "hack to ensure label is updated"<br>
+       <br>
+       deps := self requiredPackages collect:<br>
+               [:ea | <br>
+               MCVersionDependency<br>
+                       package: ea<br>
+                       info: ea workingCopy currentVersionInfo].<br>
+ <br>
+       ^ MCVersion<br>
+               package: package<br>
+               info: info<br>
+               snapshot: aSnapshot<br>
+               dependencies: deps!<br>
<br>
Item was added:<br>
+ ----- Method: MCWorkingCopy>>parentSnapshot (in category 'private') -----<br>
+ parentSnapshot<br>
+       "prefer parent in selected repository"<br>
+       MCRepositoryRequest signal ifNotNil: [:repo |<br>
+               self ancestors do: [:ancestor |<br>
+                       (repo versionWithInfo: ancestor)<br>
+                               ifNotNil: [:ver | ^ver snapshot]]].<br>
+       "otherwise, look in all repositories"<br>
+       self ancestors do: [:ancestor |<br>
+               (self repositoryGroup versionWithInfo: ancestor)<br>
+                       ifNotNil: [:ver | ^ver snapshot]].<br>
+       "otherwise"<br>
+       ^MCSnapshot empty!<br>
<br>
Item was changed:<br>
  ----- Method: MCWorkingCopy>>patchMessageChanges (in category 'operations') -----<br>
  patchMessageChanges<br>
+       | changes |<br>
+       changes := package snapshot patchRelativeToBase: self parentSnapshot.<br>
-       | changes parentInfo parentSnapshot |<br>
-       parentInfo := self ancestors<br>
-               ifEmpty: [nil]<br>
-               ifNotEmpty: [self ancestors first].<br>
-       parentSnapshot :=       self findSnapshotWithVersionInfo: parentInfo.<br>
-       changes := package snapshot patchRelativeToBase: parentSnapshot.<br>
        ^ (MCPatchMessage new patch: changes) message!<br>
<br>
Item was removed:<br>
- ----- Method: MCWorkingCopy>>requestVersionNameAndMessageWithSuggestion:initialMessage: (in category 'private') -----<br>
- requestVersionNameAndMessageWithSuggestion: nameString initialMessage: msgString<br>
-       ^ (MCVersionNameAndMessageRequest new<br>
-               suggestedName: nameString;<br>
-               initialMessage: msgString<br>
-               ) signal!<br>
<br>
Item was added:<br>
+ ----- Method: MCWorkingCopy>>requestVersionNameAndMessageWithSuggestion:initialMessage:patch: (in category 'private') -----<br>
+ requestVersionNameAndMessageWithSuggestion: nameString initialMessage: msgString patch: aPatch<br>
+       ^ (MCVersionNameAndMessageRequest new<br>
+               suggestedName: nameString;<br>
+               initialMessage: msgString;<br>
+               patch: aPatch<br>
+               ) signal!<br>
<br>
Item was changed:<br>
  ----- Method: MCWorkingCopyBrowser>>saveVersion (in category 'actions') -----<br>
  saveVersion<br>
        | repo |<br>
        self canSave ifFalse: [^self].<br>
        self checkForNewerVersions ifFalse: [^self].<br>
        repo := self repository.<br>
+       (self withRepository: repo do: [workingCopy newVersion]) ifNotNil:<br>
-       workingCopy newVersion ifNotNil:<br>
                [:v |<br>
                (MCVersionInspector new version: v) show.<br>
                Cursor wait showWhile: [repo storeVersion: v].<br>
                MCCacheRepository default cacheAllFileNamesDuring: <br>
                        [repo cacheAllFileNamesDuring: <br>
                                [v allAvailableDependenciesDo:<br>
                                        [:dep |<br>
                                        (repo includesVersionNamed: dep info name)<br>
                                                ifFalse: [repo storeVersion: dep]]]]]!<br>
<br>
Item was added:<br>
+ ----- Method: MCWorkingCopyBrowser>>withRepository:do: (in category 'actions') -----<br>
+ withRepository: aRepository do: aBlock<br>
+       ^aBlock<br>
+               on: MCRepositoryRequest<br>
+               do: [:req | req resume: aRepository]!<br>
<br>
<br>
</blockquote></div>
</div></blockquote>
                                        </div></body>