<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p>Hi Chris,</p>
<p><br>
</p>
<p>thanks for the hint to the history browser! Still, this is some clicks further away. How do you think about offering all ancestor versions directly into the "changes against" menu as proposed below?</p>
<p><br>
</p>
<p>Best,</p>
<p>Christoph</p>
<div id="Signature">
<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;">
<div name="divtagdefaultwrapper" style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:; margin:0">
<div>
<div class="_rp_T4" id="Item.MessagePartBody">
<div class="_rp_U4 ms-font-weight-regular ms-font-color-neutralDark rpHighlightAllClass rpHighlightBodyClass" id="Item.MessageUniqueBody" style="font-family:wf_segoe-ui_normal,"Segoe UI","Segoe WP",Tahoma,Arial,sans-serif,serif,EmojiFont">
<div dir="ltr">
<div id="divtagdefaultwrapper"><font face="Calibri,Helvetica,sans-serif,EmojiFont,Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols">
<div id="Signature">
<div style="margin:0px"><font style="font-family:Calibri,Arial,Helvetica,sans-serif,serif,EmojiFont">
<div><font size="3" color="black"><span style="font-size:12pt"><a href="http://www.hpi.de/" target="_blank" rel="noopener noreferrer" id="LPNoLP"><font size="2"><span id="LPlnk909538"><font color="#757B80"></font></span></font></a></span></font></div>
</font></div>
</div>
</font></div>
</div>
</div>
</div>
</div>
<div><font size="2" color="#808080"></font></div>
</div>
</div>
</div>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>Von:</b> Squeak-dev <squeak-dev-bounces@lists.squeakfoundation.org> im Auftrag von Chris Muller <asqueaker@gmail.com><br>
<b>Gesendet:</b> Freitag, 18. September 2020 06:42:38<br>
<b>An:</b> squeak dev<br>
<b>Betreff:</b> Re: [squeak-dev] The Inbox: Monticello-ct.728.mcz</font>
<div> </div>
</div>
<div>
<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>
</div>
</body>
</html>