<div dir="ltr">Hi Christoph,<div><br></div><div>+1 for the multilingual change.<br><div><br></div><div>However, the UI does already support the ability to diff between _any_ two versions via the existing browsers.  Simply opening the History browser on the descendant, and then select whichever ancestor you wish to compare to.</div></div><div><br></div><div>Best,</div><div>  Chris</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 17, 2020 at 6:47 AM <<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">A new version of Monticello was added to project The Inbox:<br>
<a href="http://source.squeak.org/inbox/Monticello-ct.728.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/inbox/Monticello-ct.728.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Monticello-ct.728<br>
Author: ct<br>
Time: 17 September 2020, 1:47:00.019813 pm<br>
UUID: 7d44995a-f19b-ee49-b16b-c710c9f2bce6<br>
Ancestors: Monticello-cmm.726<br>
<br>
Implements comparing a Monticello version against any of its ancestors. Not absolutely sure about the code quality, but it's a relevant feature for me (until now I always used to consult the Nabble archive). Also improves multilingual support.<br>
<br>
=============== Diff against Monticello-cmm.726 ===============<br>
<br>
Item was changed:<br>
  ----- Method: MCHttpRepository>>httpGet:arguments: (in category 'private') -----<br>
  httpGet: url arguments: arguments<br>
<br>
        | progress urlString client  response result |<br>
        progress := [ :total :amount |<br>
                HTTPProgress new <br>
                        total: total;<br>
                        amount: amount;<br>
+                       signal: 'Downloading...' translated ].<br>
-                       signal: 'Downloading...' ].<br>
        urlString := arguments<br>
                ifNil: [ url ]<br>
                ifNotNil: [ <br>
                        | queryString |<br>
                        queryString := WebUtils encodeUrlEncodedForm: arguments.<br>
                        (url includes: $?)<br>
                                ifTrue: [ url, '&', queryString ]<br>
                                ifFalse: [ url, '?', queryString ] ].<br>
        self class useSharedWebClientInstance ifTrue: [<br>
                "Acquire webClient by atomically storing it in the client variable and setting its value to nil."<br>
                client := webClient.<br>
                webClient := nil ].<br>
        client <br>
                ifNil: [ client := WebClient new ]<br>
                ifNotNil: [ <br>
                        "Attempt to avoid an error on windows by recreating the underlying stream."<br>
                        client isConnected ifFalse: [ client close ] ].<br>
        response := client<br>
                username: self user;<br>
                password: self password;<br>
                httpGet: urlString do: [ :request |<br>
                        request<br>
                                headerAt: 'Authorization' put: 'Basic ', (self user, ':', self password) base64Encoded;<br>
                                headerAt: 'Connection' put: 'Keep-Alive';<br>
                                headerAt: 'Accept' put: '*/*' ].<br>
        result := (response code between: 200 and: 299) <br>
                ifFalse: [<br>
                        response content. "Make sure content is read."<br>
                        nil ]<br>
                ifTrue: [ (RWBinaryOrTextStream with: (response contentWithProgress: progress)) reset ].<br>
        self class useSharedWebClientInstance<br>
                ifTrue: [<br>
                        "Save the WebClient instance for reuse, but only if there is no client cached."<br>
                        webClient  <br>
                                ifNil: [ webClient := client ]<br>
                                ifNotNil: [ client close ] ]<br>
                ifFalse: [ client close ].<br>
+       result ifNil: [ NetworkError signal: ('Could not access {1} (Code {2})' translated format: {location. response code}) ].<br>
-       result ifNil: [ NetworkError signal: 'Could not access ', location ].<br>
        ^result!<br>
<br>
Item was changed:<br>
  ----- Method: MCRepositoryInspector>>versionListMenu: (in category 'morphic ui') -----<br>
  versionListMenu: aMenu<br>
+ <br>
        1 to: self orderSpecs size do: [ :index |<br>
                aMenu addUpdating: #orderString: target: self selector: #order: argumentList: { index } ].<br>
        aMenu addLine.<br>
+       aMenu add: 'Changes against ...' translated action: [<br>
+               | ri versions seen |<br>
-       aMenu add: 'Changes against ...' action: [| ri |<br>
                ri := aMenu defaultTarget.<br>
+               versions := ri versionList<br>
+                       collect: [:name | MCVersionName on: name]<br>
+                       as: OrderedCollection.<br>
+               seen := versions asSet.<br>
+               self version info breadthFirstAncestors do: [:ancestor |<br>
+                       (seen includes: ancestor name) ifFalse: [<br>
+                               versions add: ancestor.<br>
+                               seen add: ancestor name]].<br>
                (UIManager default<br>
+                       chooseFrom: (versions collect: [:version | version name])<br>
+                       values: versions<br>
+                       title: 'Select version to show patch against ...' translated) ifNotNil: [:name |<br>
+                       | target base |<br>
-                       chooseFrom: ri versionList<br>
-                       values: ri versionList<br>
-                       title: 'Select version to show patch against ...') ifNotNil: [:name |<br>
-                       | versionName target base |<br>
-                       versionName := MCVersionName on: name.<br>
                        target := ri repository versionNamed: ri versionInfo name.<br>
+                       base := name isString<br>
+                               ifTrue: [ri repository versionNamed: name]<br>
+                               ifFalse: [ri version workingCopy repositoryGroup versionWithInfo: name].<br>
-                       base := aMenu defaultTarget repository versionNamed: versionName.<br>
                        (MCPatchBrowser<br>
                                forPatch: (target snapshot patchRelativeToBase: base snapshot))<br>
+                       showLabelled: ('Changes from {1} to {2}' translated format: {name. ri versionInfo name})]].<br>
-                       showLabelled: 'Changes from ', versionName, ' to ', ri versionInfo name]].<br>
        ^aMenu!<br>
<br>
Item was added:<br>
+ ----- Method: MCVersionName>>name (in category 'as yet unclassified') -----<br>
+ name<br>
+ <br>
+       ^ self!<br>
<br>
<br>
</blockquote></div>