<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000;text-align: left" dir="ltr">
                                        <img id="783b9cfb-397a-41f4-b1a0-d337803e6abe" src="cid:b9eef856-c153-47ac-a6db-ef4db63dcc66" width="323" height="335"></img><br><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;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 04.08.2021 18:15:31 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style="font-family:Arial,Helvetica,sans-serif"> <br>Marcel Taeumel uploaded a new version of VMMakerUI to project VM Maker:<br>http://source.squeak.org/VMMaker/VMMakerUI-mt.43.mcz<br><br>==================== Summary ====================<br><br>Name: VMMakerUI-mt.43<br>Author: mt<br>Time: 4 August 2021, 6:15:23.154699 pm<br>UUID: 369857e6-00b7-ac45-917c-d31bf0b7c6c0<br>Ancestors: VMMakerUI-eem.42<br><br>Adds badges for GitHub workflows. PNG badges via shields.io ... needs displayed action name instead of file name. Might break easily. Hmm... Also, timestamp access parses actual HTML file. API access would need extra key. So ...<br><br>Fixes minor regression from previous version, which did never set oldVersionInfo to "nil" so that the "*added*" label was not used for new packages. And not-updated packages spoiled the list.<br><br>=============== Diff against VMMakerUI-eem.42 ===============<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_AppVeyor_statusBadgeUrl (in category '*VMMakerUI-updater') -----<br>- osvm_AppVeyor_statusBadgeUrl<br>- <br>-      ^ 'https://ci.appveyor.com/api/projects/status/ecrpcrqt844n8lkm/branch/Cog'!<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_AppVeyor_statusPageUrl (in category '*VMMakerUI-updater') -----<br>- osvm_AppVeyor_statusPageUrl<br>- <br>-     ^ 'https://ci.appveyor.com/project/OpenSmalltalk/vm/branch/Cog'!<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_AppVeyor_statusTimestamp (in category '*VMMakerUI-updater') -----<br>- osvm_AppVeyor_statusTimestamp<br>- <br>-     | url stamp  dateAndTime |<br>-   url := 'https://ci.appveyor.com/api/projects/OpenSmalltalk/vm/branch/Cog'.<br>-   stamp := ((WebUtils jsonDecode: (WebClient httpGet: url) content readStream) at: 'build') at: 'finished'.<br>-    stamp ifEmpty: [^ stamp].<br>-    dateAndTime := DateAndTime readFrom: stamp readStream.<br>-       ^ String streamContents: [:s |<br>-               dateAndTime asDate = Date today<br>-                      ifTrue: [s nextPutAll: 'Today' translated, ',']<br>-                      ifFalse: [dateAndTime asDate = Date yesterday<br>-                                ifTrue: [s nextPutAll: 'Yesterday' translated, ',']<br>-                          ifFalse: [dateAndTime printYMDOn: s]].<br>-               s space.<br>-             dateAndTime printHMSOn: s]!<br><br>Item was added:<br>+ ----- Method: TheWorldMainDockingBar>>osvm_GitHubActions_statusBadgeUrl: (in category '*VMMakerUI-updater') -----<br>+ osvm_GitHubActions_statusBadgeUrl: workflowName<br>+ <br>+     | id |<br>+       id := workflowName encodeForHTTP.<br>+    ^ 'https://raster.shields.io/github/workflow/status/OpenSmalltalk/opensmalltalk-vm/{1}?style=flat&logo=github'<br>+           format: {id}!<br><br>Item was added:<br>+ ----- Method: TheWorldMainDockingBar>>osvm_GitHubActions_statusPageUrl: (in category '*VMMakerUI-updater') -----<br>+ osvm_GitHubActions_statusPageUrl: workflow<br>+ <br>+         ^ 'https://github.com/OpenSmalltalk/opensmalltalk-vm/actions/workflows/{1}.yml'<br>+              format: {workflow}!<br><br>Item was added:<br>+ ----- Method: TheWorldMainDockingBar>>osvm_GitHubActions_statusTimestamp: (in category '*VMMakerUI-updater') -----<br>+ osvm_GitHubActions_statusTimestamp: workflow<br>+   "Slow. Fetch HTML page, extract first occurrence of<br>+             ... <time-ago datetime="2021-08-04T14:24:20Z" ...=""></time-ago><br>+ <br>+         | statusPage begin end dateAndTime |<br>+         statusPage := (WebClient httpGet: (self osvm_GitHubActions_statusPageUrl: workflow)) content.<br>+        begin := statusPage findString: 'datetime' startingAt: 100000. "Skip the first X bytes decoration."<br>+        end := statusPage findString: 'Z' startingAt: begin.<br>+         dateAndTime := DateAndTime readFrom: (statusPage copyFrom: begin + 10 to: end) readStream.<br>+   ^ String streamContents: [:s |<br>+               dateAndTime asDate = Date today<br>+                      ifTrue: [s nextPutAll: 'Today' translated, ',']<br>+                      ifFalse: [dateAndTime asDate = Date yesterday<br>+                                ifTrue: [s nextPutAll: 'Yesterday' translated, ',']<br>+                          ifFalse: [dateAndTime printYMDOn: s]].<br>+               s space.<br>+             dateAndTime printHMSOn: s]!<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_TravisCI_statusBadgeUrl (in category '*VMMakerUI-updater') -----<br>- osvm_TravisCI_statusBadgeUrl<br>- <br>-    ^ 'https://api.travis-ci.com/OpenSmalltalk/opensmalltalk-vm.png?branch=Cog'!<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_TravisCI_statusPageUrl (in category '*VMMakerUI-updater') -----<br>- osvm_TravisCI_statusPageUrl<br>- <br>-     ^ 'https://travis-ci.com/OpenSmalltalk/opensmalltalk-vm'!<br><br>Item was removed:<br>- ----- Method: TheWorldMainDockingBar>>osvm_TravisCI_statusTimestamp (in category '*VMMakerUI-updater') -----<br>- osvm_TravisCI_statusTimestamp<br>- <br>-    | stamp " 'Mon, 05 Jul 2021 17:52:11 GMT' " dateAndTime |<br>-  stamp := (WebClient httpGet: self osvm_TravisCI_statusBadgeUrl) headerAt: 'last-modified'.<br>-   stamp ifEmpty: [^ stamp].<br>-    dateAndTime := DateAndTime readFrom: (((stamp allButFirst: 4) allButLast: 4), ' Z') readStream.<br>-      ^ String streamContents: [:s |<br>-               dateAndTime asDate = Date today<br>-                      ifTrue: [s nextPutAll: 'Today' translated, ',']<br>-                      ifFalse: [dateAndTime asDate = Date yesterday<br>-                                ifTrue: [s nextPutAll: 'Yesterday' translated, ',']<br>-                          ifFalse: [dateAndTime printYMDOn: s]].<br>-               s space.<br>-             dateAndTime printHMSOn: s]!<br><br>Item was changed:<br>  ----- Method: TheWorldMainDockingBar>>updateVMMaker (in category '*VMMakerUI-updater') -----<br>  updateVMMaker<br>       <updater: 'update="" vmmaker'=""><br>  <br>       | updater history message |<br>   updater := MCMcmUpdater<br>               updateMapNamed: 'update.oscog'<br>                repository: 'http://source.squeak.org/VMMaker'.<br>       updater lastUpdateMap ifEmpty: [<br>              "If this is the first time that you use the updater, start at 5.mcm to avoid loading old code."<br>             updater lastUpdateMap at: updater repository put: 5].<br>  <br>     history := updater dependentPackages<br>+                 collect: [:package | package name -> (package workingCopy ancestors<br>+                       "N.B. the first version in a package's history will have empty ancestors."<br>+                         ifEmpty: [nil] ifNotEmpty: [:ancestors| ancestors first])]<br>-           collect: [:package | package name -> (package workingCopy ancestors ifNotEmpty: [:ancestors| ancestors first])]<br>            as: OrderedDictionary.<br>  <br>    updater doUpdate: false.<br>      <br>      "Set update history to the packages that actually changed."<br>         updater dependentPackages do: [:package | | oldVersionInfo newVersionInfo |<br>           oldVersionInfo := history at: package name ifAbsent: [].<br>              newVersionInfo := package workingCopy ancestors first.<br>+               (oldVersionInfo ifNil: [0] ifNotNil: [oldVersionInfo versionNumber]) < newVersionInfo versionNumber<br>-               "N.B. the first version in a package's history will have empty ancestors.<br>-                oldVersionInfo basicSize = 0 is true for these as well as nil."<br>-                (oldVersionInfo basicSize = 0 ifTrue: [0] ifFalse: [oldVersionInfo versionNumber]) < newVersionInfo versionNumber<br>                          ifTrue: [history at: package name put: {oldVersionInfo. newVersionInfo}]<br>                      ifFalse: [history removeKey: package name]].<br>          <br>      "Prepare message, including the update history and OSVM ci badges."<br>         message := String streamContents: [:s |<br>               s nextPutAll: 'VMMaker update succesful.<br><br>'.<br>                history<br>                       ifEmpty: [s nextPutAll: 'All packages were already up-to-date.']<br>                      ifNotEmpty: [s nextPutAll: 'Updated packages:'].<br>              history keysAndValuesDo: [:packageName :updateInfo |<br>                          s nextPutAll: '<br> - '.<br>                        s nextPutAll: packageName; space.<br>                     updateInfo isArray<br>                            ifFalse: [s nextPutAll: '*removed*' translated]<br>                               ifTrue: [<br>                                     updateInfo first<br>                                              ifNil: [s nextPutAll: '*added*' translated]<br>+                                          ifNotNil: [s print: updateInfo first versionNumber].<br>-                                                 ifNotNil: [updateInfo first isArray ifFalse: [s print: updateInfo first versionNumber]].<br>                                      s nextPutAll: ' -> <b>'.<br>                                     s print: updateInfo second versionNumber.<br>                                     s nextPutAll: '</b>']].<br>                 s nextPutAll: ('<br><br>Url: <a href="{1}">{1}</a>' format: {updater repository}).<br>                  s nextPutAll: '<br>Map: '; print: updater updateMapName.<br>+ <br>+           s nextPutAll: '<br>'.<br>+          #('macOS' macos 'Build for macOS'<br>+            'Windows' win 'Build for Windows'<br>+            'Linux (x86)' linux 'Build for Linux (x86)'<br>+          'Linux (ARM)' 'linux-arm' 'Build for Linux (ARM)')<br>+                   groupsDo: [:label :workflow :workflowName |<br>+                          s nextPutAll: ('<br>{1} status: <a href="{2}"><img></img> {4}</a>'<br>+                                   format: {<br>+                                            label.<br>+                                               self osvm_GitHubActions_statusPageUrl: workflow.<br>+                                             self osvm_GitHubActions_statusBadgeUrl: workflowName.<br>+                                                self osvm_GitHubActions_statusTimestamp: workflow})].<br>-        <br>-             s nextPutAll: ('<br><br>TravisCI status: <a href="{1}"><img></img> {3}</a>'<br>-                    format: {<br>-                            self osvm_TravisCI_statusPageUrl.<br>-                            self osvm_TravisCI_statusBadgeUrl.<br>-                           self osvm_TravisCI_statusTimestamp}).<br>-                s nextPutAll: ('<br>AppVeyor status: <a href="{1}"><img></img> {3}</a>'<br>-                      format: {<br>-                            self osvm_AppVeyor_statusPageUrl.<br>-                            self osvm_AppVeyor_statusBadgeUrl.<br>-                           self osvm_AppVeyor_statusTimestamp}).<br>                 <br>              s nextPutAll: ('<br><br>NOTE THAT updated platform sources might be available, too:<br> -> <a href="{1}">{1}</a>' format: {'https://github.com/OpenSmalltalk/opensmalltalk-vm'}).<br>                          <br>                      ].<br>    self inform: message asTextFromHtml.!<br><br></updater:></div></blockquote></div>