Christoph Thiede uploaded a new version of SMLoader to project The Trunk: http://source.squeak.org/trunk/SMLoader-ct.98.mcz
==================== Summary ====================
Name: SMLoader-ct.98 Author: ct Time: 18 May 2022, 7:28:33.967874 pm UUID: 86668f56-4011-d34c-bc66-a69a58e6898d Ancestors: SMLoader-mt.97
Improves multilingual support and fixes broken link to swiki. Moves from UIManager default to Project uiManager.
=============== Diff against SMLoader-mt.97 ===============
Item was changed: ----- Method: SMClient>>ensurePassword (in category 'private') ----- ensurePassword + self password isEmptyOrNil ifTrue: [ self password: (Project uiManager requestPassword: 'Please enter your SqueakMap password.' translated) ]. - self password isEmptyOrNil ifTrue: [ self password: (UIManager default requestPassword: 'Please enter your SqueakMap password.') ]. self password isEmptyOrNil ifTrue: [ self error: 'authentication failure' ]!
Item was changed: ----- Method: SMLoader>>cachePackageReleaseAndOfferToCopy (in category 'actions') ----- cachePackageReleaseAndOfferToCopy "Cache package release, then offer to copy it somewhere. Answer the chosen file's location after copy, or the cache location if no directory was chosen."
| release installer newDir newName newFile oldFile oldName | release := self selectedPackageOrRelease. release isPackageRelease ifFalse: [ self error: 'Should be a package release!!']. installer := SMInstaller forPackageRelease: release. [Cursor wait showWhile: [installer cache]] on: Error do: [:ex | | msg | msg := ex messageText ifNil: [ex asString]. + self informException: ex msg: ('Error occurred during download:\{1}' translated format: {msg}). - self informException: ex msg: ('Error occurred during download:', msg, '') withCRs. ^nil ]. + installer isCached ifFalse: [self inform: 'Download failed, see transcript for details' translated. ^nil]. - installer isCached ifFalse: [self inform: 'Download failed, see transcript for details'. ^nil]. oldName := installer fullFileName. + newDir := Project uiManager chooseDirectoryFrom: installer directory. - newDir := UIManager default chooseDirectoryFrom: installer directory. newDir ifNil: [ ^oldName ]. newDir = installer directory ifTrue: [ ^oldName ]. newName := newDir fullNameFor: installer fileName. newFile := FileStream newFileNamed: newName. newFile ifNil: [ ^oldName ]. newFile binary. oldFile := FileStream readOnlyFileNamed: oldName. oldFile ifNil: [ ^nil ]. oldFile binary. [[ newDir copyFile: oldFile toFile: newFile ] ensure: [ oldFile close. newFile close ]] on: Error do: [ :ex | ^oldName ]. ^newName!
Item was changed: ----- Method: SMLoaderCategoricalPlus>>defaultLabel (in category 'interface') ----- defaultLabel + ^ 'Categorical {1}' translated format: {super defaultLabel}! - ^ 'Categorical ' , super defaultLabel!
Item was changed: ----- Method: SMLoaderCategoricalPlus>>installButtonLabel (in category 'interface') ----- installButtonLabel ^ self currentPackageList = #notInstalled + ifTrue: ['Install the above package' translated] + ifFalse: ['Remove the above package' translated]! - ifTrue: ['Install the above package'] - ifFalse: ['Remove the above package']!
Item was changed: ----- Method: SMLoaderPlus>>addFiltersToMenu: (in category 'menus') ----- addFiltersToMenu: aMenu | filterSymbol help | self filterSpecs do: [:filterArray | filterSymbol := filterArray second. help := filterArray third. aMenu addUpdating: #showFilterString: target: self selector: #toggleFilterState: argumentList: (Array with: filterSymbol). aMenu balloonTextForLastItem: help]. aMenu addLine; + addTranslatedList: #(('Clear all filters' uncheckFilters 'Unchecks all filters to list all packages')) - addList: #(('Clear all filters' uncheckFilters 'Unchecks all filters to list all packages')) !
Item was changed: ----- Method: SMLoaderPlus>>buildPackagePaneWith: (in category 'interface') ----- buildPackagePaneWith: aBuilder "Create the text area to the right in the loader."
^ aBuilder pluggableTextSpec new model: self; getText: #itemDescription; name: #packagePane; + help: 'Select a package to view its description.' translated; - help: 'Select a package to view its description.'; yourself!
Item was changed: ----- Method: SMLoaderPlus>>buildSearchPaneWith: (in category 'interface') ----- buildSearchPaneWith: aBuilder ^ aBuilder pluggableInputFieldSpec new model: self; selection: #searchSelection; setText: #findPackage:notifying:; + help: 'Search packages...' translated; - help: 'Search packages...'; name: #search; yourself!
Item was changed: ----- Method: SMLoaderPlus>>cachePackageReleaseAndOfferToCopy (in category 'actions') ----- cachePackageReleaseAndOfferToCopy "Cache package release, then offer to copy it somewhere. Answer the chosen file's location after copy, or the cache location if no directory was chosen."
| release installer newDir newName newFile oldFile oldName | release := self selectedPackageOrRelease. + release isPackageRelease ifFalse: [ self error: 'Should be a package release!!' translated]. - release isPackageRelease ifFalse: [ self error: 'Should be a package release!!']. installer := SMInstaller forPackageRelease: release. + [Project uiManager informUser: ('Caching {1}' translated format: {release}) during: [installer cache]] on: Error do: [:ex | - [UIManager default informUser: 'Caching ' , release asString during: [installer cache]] on: Error do: [:ex | | msg | msg := ex messageText ifNil: [ex asString]. + self informException: ex msg: ('Error occurred during download:\{1}' withCRs translated format: {msg}). - self informException: ex msg: ('Error occurred during download:', msg, '') withCRs. ^nil ]. + installer isCached ifFalse: [self inform: 'Download failed, see transcript for details' translated. ^nil]. - installer isCached ifFalse: [self inform: 'Download failed, see transcript for details'. ^nil]. oldName := installer fullFileName. + newDir := Project uiManager chooseDirectoryFrom: installer directory. - newDir := UIManager default chooseDirectoryFrom: installer directory. newDir ifNil: [ ^oldName ]. newDir = installer directory ifTrue: [ ^oldName ]. newName := newDir fullNameFor: installer fileName. newFile := FileStream newFileNamed: newName. newFile ifNil: [ ^oldName ]. newFile binary. oldFile := FileStream readOnlyFileNamed: oldName. oldFile ifNil: [ ^nil ]. oldFile binary. [[ newDir copyFile: oldFile toFile: newFile ] ensure: [ oldFile close. newFile close ]] on: Error do: [ :ex | ^oldName ]. ^newName!
Item was changed: ----- Method: SMLoaderPlus>>defaultLabel (in category 'lists') ----- defaultLabel + ^ 'SqueakMap Package Loader' translated! - ^ 'SqueakMap Package Loader'!
Item was changed: ----- Method: SMLoaderPlus>>downloadPackageRelease (in category 'actions') ----- downloadPackageRelease "Force a download of the selected package release into the cache."
| release | release := self selectedPackageOrRelease. + release isPackageRelease ifFalse: [ self error: 'Should be a package release!!' translated]. + [Project uiManager informUser: ('Downloading {1}' translated format: {release}) during: [ - release isPackageRelease ifFalse: [ self error: 'Should be a package release!!']. - [UIManager default informUser: 'Downloading ' , release asString during: [ (SMInstaller forPackageRelease: release) download] ] on: Error do: [:ex | | msg | msg := ex messageText ifNil: [ex asString]. + self informException: ex msg: ('Error occurred during download:\{1}' translated format: {msg})]! - self informException: ex msg: ('Error occurred during download:', msg, '') withCRs]!
Item was changed: ----- Method: SMLoaderPlus>>findPackage:notifying: (in category 'actions') ----- findPackage: aString notifying: aView "Search and select a package with the given (sub) string in the name or description. " | index list match descriptions | match := aString asString asLowercase. index := self packagesListIndex. list := self packageNameList. list isEmpty ifTrue: [^ self]. descriptions := self packageList collect: [:e | e description]. index + 1 to: list size do: [:i | (((list at: i) includesSubstring: match caseSensitive: false) or: [(descriptions at: i) includesSubstring: match caseSensitive: false]) ifTrue: [^ self packagesListIndex: i]]. "wrap around" 1 to: index do: [:i | (((list at: i) includesSubstring: match caseSensitive: false) or: [(descriptions at: i) includesSubstring: match caseSensitive: false]) ifTrue: [^ self packagesListIndex: i]]. + self inform: ('No package matching {1}' translated format: {aString})! - self inform: 'No package matching ' , aString asString!
Item was changed: ----- Method: SMLoaderPlus>>help (in category 'interface') ----- help "Present help text. If there is a web server available, offer to open it. Use the WebBrowser registry if possible, or Scamper if available." | message browserClass | + message := 'Welcome to the SqueakMap package loader. The names of packages are followed by versions: (installed -> latest). If there is no arrow, your installed version of the package is the latest. Bold packages and releases have been installed. The checkbox menu items modify which packages you''ll see. + Take a look at them - only some packages are shown initially. The options available for a package depend on how it was packaged. Comment on a package by emailing the author or the squeak list.' translated. - message := 'Welcome to the SqueakMap package loader. - The names of packages are followed by versions: (installed -> latest). - If there is no arrow, your installed version of the package is the latest. - Bold packages and releases have been installed. - The checkbox menu items modify which packages you''ll see. - Take a look at them - only some packages are shown initially. - The options available for a package depend on how it was packaged. - Comment on a package by emailing the author or the squeak list.'.
browserClass := Smalltalk at: #WebBrowser ifPresent: [ :registry | registry default ]. browserClass := browserClass ifNil: [ Smalltalk at: #Scamper ifAbsent: [ ^self inform: message ]].
+ (self confirm: ('{1}\Would you like to view more detailed help on the SqueakMap swiki page?' translated format: {message})) + ifTrue: [ browserClass openOnUrl: 'http://wiki.squeak.org/squeak/2726' asUrl]! - (self confirm: message, ' - Would you like to view more detailed help on the SqueakMap swiki page?') - ifTrue: [ browserClass openOnUrl: 'http://wiki.squeak.org/2726' asUrl]!
Item was changed: ----- Method: SMLoaderPlus>>informException:msg: (in category 'private') ----- informException: ex msg: msg "Tell the user that an error has occurred. Offer to open debug notifier."
+ (self confirm: ('{1}\Would you like to open a debugger?' translated format: {msg})) - (self confirm: msg, 'Would you like to open a debugger?') ifTrue: [ex pass]!
Item was changed: ----- Method: SMLoaderPlus>>installPackageRelease (in category 'actions') ----- installPackageRelease "Install selected package or release. The cache is used." | item release | item := self selectedPackageOrRelease ifNil: [^ nil]. item isPackageRelease ifTrue: [^ self installPackageRelease: item] ifFalse: [release := item lastReleaseForCurrentSystemVersion. release + ifNil: [(self confirm: 'The package has no published release for your Squeak version, try releases for any Squeak version?' translated) - ifNil: [(self confirm: 'The package has no published release for your Squeak version, try releases for any Squeak version?') ifTrue: [release := item lastPublishedRelease. release + ifNil: [(self confirm: 'The package has no published release at all, take the latest of the unpublished releases?' translated) - ifNil: [(self confirm: 'The package has no published release at all, take the latest of the unpublished releases?') ifTrue: [release := item lastRelease]]]]. release ifNotNil: [^ self installPackageRelease: release]]!
Item was changed: ----- Method: SMLoaderPlus>>installPackageRelease: (in category 'private') ----- installPackageRelease: aRelease "Install a package release. The cache is used."
| myRelease installer | aRelease isCompatibleWithCurrentSystemVersion ifFalse: [(self confirm: + ('The package you are about to install is not listed as being compatible with your image version ({1}), so the package may not work properly. + + Do you still want to proceed with the install?' translated format: {SystemVersion current majorMinorVersion})) - 'The package you are about to install is not listed as - being compatible with your image version (', SystemVersion current majorMinorVersion, '), - so the package may not work properly. - Do you still want to proceed with the install?') ifFalse: [^ self]]. myRelease := self installedReleaseOfMe. installer := SMInstaller forPackageRelease: aRelease. + [Project uiManager + informUser: ('Downloading {1}' translated format: {aRelease}) during: + [installer download]; + informUser: ('Installing {1}' translated format: {aRelease}) during: + [installer install. + myRelease = self installedReleaseOfMe + ifFalse: [self reOpen] + ifTrue: [self noteChanged]] - [UIManager default informUser: 'Downloading ' , aRelease asString during: - [installer download]. - UIManager default informUser: 'Installing ' , aRelease asString during: [ - installer install. - myRelease = self installedReleaseOfMe - ifFalse: [self reOpen] - ifTrue: [self noteChanged]] ] on: Error do: [:ex | | msg | msg := ex messageText ifNil:[ex asString]. + self informException: ex msg: ('Error occurred during install:\{1}' withCRs translated format: {msg})].! - self informException: ex msg: ('Error occurred during install:', msg, '') withCRs].!
Item was changed: ----- Method: SMLoaderPlus>>labelForShown: (in category 'lists') ----- labelForShown: packagesShown "Update the label of the window." + ^ (packagesShown size < map packages size + ifTrue: ['{1} ({2} shown out of {2} packages)' translated] + ifFalse: ['{1} ({3} packages)' translated]) + format: + {self defaultLabel. + packagesShown size. + map packages size}! - ^ self defaultLabel , ' (', - (packagesShown size < map packages size ifTrue: [packagesShown size printString, - ' shown out of '] ifFalse: ['']) , map packages size printString, ' packages)'!
Item was changed: ----- Method: SMLoaderPlus>>loadUpdates (in category 'actions') ----- loadUpdates + [Project uiManager informUser: 'Loading updates' translated during: [ - [UIManager default informUser: 'Loading Updates' during: [ map loadUpdates. self noteChanged ] ] on: Error do: [:ex | + self informException: ex msg: ('Error occurred when updating map:\{1}' translated format: {ex messageText})]! - self informException: ex msg: ('Error occurred when updating map:', ex messageText, '') withCRs]!
Item was changed: ----- Method: SMLoaderPlus>>reOpen (in category 'private') ----- reOpen "Close this package loader, probably because it has been updated, and open a new one." + self inform: 'This package loader has been upgraded and will be closed and reopened to avoid strange side effects.' translated. - self inform: 'This package loader has been upgraded and will be closed and reopened to avoid strange side effects.'. window delete. (Smalltalk at: self class name) open!
Item was changed: ----- Method: SMLoaderPlus>>upgradeInstalledPackages (in category 'actions') ----- upgradeInstalledPackages "Tries to upgrade all installed packages to the latest published release for this version of Squeak. So this is a conservative approach."
| installed old myRelease toUpgrade info | installed := map installedPackages. old := map oldPackages. old isEmpty ifTrue: [ + ^self inform: ('All {1} installed packages are up to date.' translated format: {installed size})]. - ^self inform: 'All ', installed size printString, ' installed packages are up to date.']. toUpgrade := map upgradeableAndOldPackages. toUpgrade isEmpty ifTrue: [ + ^self inform: ('None of the {1} old packages of the {2} installed can be automatically upgraded. You need to upgrade them manually.' translated format: {old size. installed size})]. - ^self inform: 'None of the ', old size printString, ' old packages of the ', installed size printString, ' installed can be automatically upgraded. You need to upgrade them manually.']. info := old size < toUpgrade size ifTrue: [ + 'Of the {1} old packages only {2} can be upgraded. The following packages will not be upgraded:\{3}' withCRs translated format: {old size. toUpgrade size. String streamContents: [:s | (old removeAll: toUpgrade; yourself) + do: [:p | s nextPutAll: p nameWithVersionLabel; cr]]}] + ifFalse: ['All old packages upgradeable.' translated]. + (self confirm: ('{1}\About to upgrade the following packages:\{2}\Proceed?' translated format: {info. String streamContents: [:s | toUpgrade do: [:p | s nextPutAll: p nameWithVersionLabel; cr]]})) ifTrue: [ - 'Of the ', old size printString, ' old packages only ', toUpgrade size printString, ' can be upgraded. - The following packages will not be upgraded: - ', (String streamContents: [:s | (old removeAll: toUpgrade; yourself) - do: [:p | s nextPutAll: p nameWithVersionLabel; cr]])] - ifFalse: ['All old packages upgradeable.']. - (self confirm: info, ' - About to upgrade the following packages: - ', (String streamContents: [:s | toUpgrade do: [:p | s nextPutAll: p nameWithVersionLabel; cr]]), 'Proceed?') ifTrue: [ myRelease := self installedReleaseOfMe. + [Project uiManager informUser: 'Upgrading installed packages' translated during: [ - [UIManager default informUser: 'Upgrading Installed Packages' during: [ map upgradeOldPackages. + self inform: ('{1} packages successfully upgraded.' translated format: {toUpgrade size}). - self inform: toUpgrade size printString, ' packages successfully upgraded.'. myRelease = self installedReleaseOfMe ifFalse: [self reOpen] ifTrue: [self noteChanged]] ] on: Error do: [:ex | + self informException: ex msg: ('Error occurred when upgrading old packages:\{1}' withCRs translated format: {ex messageText})]]! - self informException: ex msg: ('Error occurred when upgrading old packages:', ex messageText, '') withCRs]]!
Item was changed: ----- Method: SMLoaderPlus>>upgradeInstalledPackagesConfirm: (in category 'private') ----- upgradeInstalledPackagesConfirm: confirmEach "Tries to upgrade all installed packages to the latest published release for this version of Squeak. If confirmEach is true we ask for every upgrade. " | installed old myRelease toUpgrade info | installed := map installedPackages. old := map oldPackages. old isEmpty + ifTrue: [^ self inform: ('All {1} installed packages are up to date.' translated format: {installed size})]. - ifTrue: [^ self inform: 'All ' , installed size printString , ' installed packages are up to date.']. toUpgrade := map upgradeableAndOldPackages. toUpgrade isEmpty + ifTrue: [^ self inform: ('None of the {1} old packages of the {1} installed can be automatically upgraded. You need to upgrade them manually.' translated format: {old size. installed size})]. - ifTrue: [^ self inform: 'None of the ' , old size printString , ' old packages of the ' , installed size printString , ' installed can be automatically upgraded. You need to upgrade them manually.']. info := old size < toUpgrade size + ifTrue: [('Of the {1} old packages only {2} can be upgraded.\The following packages will not be upgraded:\{3}' withCRs translated format: {old size. toUpgrade size. String - ifTrue: ['Of the ' , old size printString , ' old packages only ' , toUpgrade size printString , ' can be upgraded. - The following packages will not be upgraded: - ' - , (String streamContents: [:s | (old removeAll: toUpgrade; yourself) do: [:p | s nextPutAll: p nameWithVersionLabel; + cr]]})] + ifFalse: ['All old packages upgradeable.' translated]. + (self confirm: ('{1}\About to upgrade the following packages:\{2}\Proceed?' withCRs translated format: {info. String - cr]])] - ifFalse: ['All old packages upgradeable.']. - (self confirm: info , ' - About to upgrade the following packages: - ' - , (String streamContents: [:s | toUpgrade do: [:p | s nextPutAll: p nameWithVersionLabel; + cr]]})) - cr]]) , 'Proceed?') ifTrue: [myRelease := self installedReleaseOfMe. + [Project uiManager informUser: 'Upgrading installed packages' translated during: - [UIManager default informUser: 'Upgrading Installed Packages' during: [confirmEach ifTrue: [map + upgradeOldPackagesConfirmBlock: [:p | self confirm: ('Upgrade {1} to {2}?' translated format: {p installedRelease packageNameWithVersion. (p lastPublishedReleaseForCurrentSystemVersionNewerThan: p installedRelease) listName})]] - upgradeOldPackagesConfirmBlock: [:p | self confirm: 'Upgrade ' , p installedRelease packageNameWithVersion , ' to ' , (p lastPublishedReleaseForCurrentSystemVersionNewerThan: p installedRelease) listName , '?']] ifFalse: [map upgradeOldPackages]. + self inform: ('{1} packages successfully processed.' translated format: {toUpgrade size}). - self inform: toUpgrade size printString , ' packages successfully processed.'. myRelease = self installedReleaseOfMe ifTrue: [self noteChanged] ifFalse: [self reOpen]]] on: Error + do: [:ex | self informException: ex msg: ('Error occurred when upgrading old packages:\{1}' withCRs translated format: {ex messageText})]]! - do: [:ex | self informException: ex msg: ('Error occurred when upgrading old packages:' , ex messageText , '') withCRs]]!
Item was changed: ----- Method: SMReleaseBrowser>>userError: (in category 'private') ----- userError: aString + Project uiManager inform: aString! - UIManager default inform: aString!
packages@lists.squeakfoundation.org