[squeak-dev] The Trunk: SMBase-bf.133.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Dec 8 01:00:04 UTC 2014
Bert Freudenberg uploaded a new version of SMBase to project The Trunk:
http://source.squeak.org/trunk/SMBase-bf.133.mcz
==================== Summary ====================
Name: SMBase-bf.133
Author: bf
Time: 8 December 2014, 1:59:49.419 am
UUID: 6561d5c0-abd2-4521-ab54-656fdf9fab4b
Ancestors: SMBase-nice.132
Restore timestamps lost in assignment conversion.
=============== Diff against SMBase-nice.132 ===============
Item was changed:
----- Method: ImageSegment>>writeForExportOn: (in category '*SMBase-export') -----
writeForExportOn: fileStream
"Write the segment on the disk with all info needed to reconstruct it in a new image. For export. Out pointers are encoded as normal objects on the disk."
| temp |
state = #activeCopy ifFalse: [self error: 'wrong state'].
temp := endMarker.
endMarker := nil.
fileStream fileOutClass: nil andObject: self.
"remember extra structures. Note class names."
endMarker := temp.
!
Item was changed:
----- Method: RcsDiff>>commandLines: (in category 'accessing') -----
commandLines: aString
commandLines := aString!
Item was changed:
----- Method: SMAccount>>advogatoId: (in category 'accessing') -----
advogatoId: aString
advogatoId := aString!
Item was changed:
----- Method: SMAccount>>correctPassword: (in category 'passwords') -----
correctPassword: aPassword
"We store the password as a SHA hash so that we can let the slave maps
have them too. Also check the optional new random password."
| try |
aPassword isEmptyOrNil ifTrue:[^false].
try := SecureHashAlgorithm new hashMessage: aPassword.
^password = try or: [newPassword = try]!
Item was changed:
----- Method: SMAccount>>deleteFiles: (in category 'files') -----
deleteFiles: fileNames
"Delete all fileNames from the uploads directory."
| dir |
dir := self uploadsDirectory.
fileNames do: [:fn | dir deleteFileNamed: fn]
!
Item was changed:
----- Method: SMAccount>>directory (in category 'files') -----
directory
"Get the directory for the account."
| dir |
dir := (map directory directoryNamed: 'accounts') assureExistence; yourself.
^(dir directoryNamed: id asString) assureExistence; yourself
!
Item was changed:
----- Method: SMAccount>>email: (in category 'accessing') -----
email: address
email := address!
Item was changed:
----- Method: SMAccount>>initialize (in category 'initialize-release') -----
initialize
"Initialize account."
super initialize.
initials := signature := advogatoId := ''.
isAdmin := false.
objects := OrderedCollection new.
coObjects := OrderedCollection new!
Item was changed:
----- Method: SMAccount>>initials: (in category 'accessing') -----
initials: aString
"If these are changed we need to update the dictionary in the map."
initials ~= aString ifTrue: [
initials := aString.
map clearUsernames]!
Item was changed:
----- Method: SMAccount>>isAdmin: (in category 'accessing') -----
isAdmin: aBoolean
isAdmin := aBoolean!
Item was changed:
----- Method: SMAccount>>newPassword: (in category 'accessing') -----
newPassword: aHashNumber
"Set the parallell password hash."
newPassword := aHashNumber!
Item was changed:
----- Method: SMAccount>>password: (in category 'accessing') -----
password: aHashNumber
"Set the password hash."
password := aHashNumber!
Item was changed:
----- Method: SMAccount>>setNewPassword: (in category 'passwords') -----
setNewPassword: aString
"Set a new parallell password the user can use to get in
if the old password is forgotten. We don't delete the old
password since the request for this new password is made
anonymously. Note that the password is stored as a secured
hash large integer."
newPassword := SecureHashAlgorithm new hashMessage: aString!
Item was changed:
----- Method: SMAccount>>setPassword: (in category 'passwords') -----
setPassword: aString
"We also clear the random extra password."
password := SecureHashAlgorithm new hashMessage: aString.
newPassword := nil!
Item was changed:
----- Method: SMAccount>>signature: (in category 'accessing') -----
signature: aSignature
"Set the signature."
signature := aSignature!
Item was changed:
----- Method: SMCategorizableObject>>addCategory: (in category 'private') -----
addCategory: aCategory
"Add <aCategory> to me. If I already have it do nothing."
categories ifNil: [categories := OrderedCollection new].
(categories includes: aCategory) ifFalse:[
aCategory addObject: self.
categories add: aCategory].
^aCategory!
Item was changed:
----- Method: SMCategory>>addCategory: (in category 'private') -----
addCategory: cat
"Add a category as a subcategory to self.
The collection of subcategories is lazily instantiated."
subCategories ifNil: [subCategories := OrderedCollection new].
cat parent ifNotNil: [cat parent removeCategory: cat ].
subCategories add: cat.
cat parent: self.
^cat!
Item was changed:
----- Method: SMCategory>>delete (in category 'private') -----
delete
"Delete me. Disconnect me from my objects and my parent.
Then delete my subcategories."
super delete.
self removeFromObjects; removeFromParent.
self subCategories do: [:c | c delete ]!
Item was changed:
----- Method: SMCategory>>initialize (in category 'initialize-release') -----
initialize
super initialize.
name := summary := url := ''.
objects := OrderedCollection new!
Item was changed:
----- Method: SMCategory>>mandatory: (in category 'accessing') -----
mandatory: aSet
mandatory := aSet!
Item was changed:
----- Method: SMCategory>>parent: (in category 'private') -----
parent: aCategory
"Change the parent category.
This method relies on that somebody else
updates the parent's subCategories collection."
parent := aCategory!
Item was changed:
----- Method: SMDVSInstaller>>install (in category 'services') -----
install
"Install using DVS."
| imagePackageLoader streamPackageLoader packageInfo packageManager baseName current new manager |
self cache; unpack.
imagePackageLoader := Smalltalk at: #ImagePackageLoader ifAbsent: [].
streamPackageLoader := Smalltalk at: #StreamPackageLoader ifAbsent: [].
packageInfo := Smalltalk at: #PackageInfo ifAbsent: [].
packageManager := Smalltalk at: #FilePackageManager ifAbsent: [].
({ imagePackageLoader. streamPackageLoader. packageInfo. packageManager } includes: nil)
ifTrue: [ (self confirm: ('DVS support is not loaded, but would be helpful in loading ', unpackedFileName, '.
It isn''t necessary, but if you intend to use DVS later it would be a good idea to load it now.
Load it from SqueakMap?'))
ifTrue: [ self class loadDVS. ^self install ]
ifFalse: [ ^self fileIn ]].
baseName := packageRelease name.
dir rename: unpackedFileName toBe: (baseName, '.st').
unpackedFileName := baseName, '.st'.
(manager := packageManager allManagers detect: [ :pm | pm packageName = baseName ] ifNone: [])
ifNotNil: [
current := imagePackageLoader new package: (packageInfo named: baseName).
new := streamPackageLoader new stream: (dir readOnlyFileNamed: unpackedFileName).
(new changesFromBase: current) fileIn ]
ifNil: [
self fileIn.
manager := packageManager named: baseName. ].
manager directory: dir.
packageManager changed: #allManagers.
packageRelease noteInstalled!
Item was changed:
----- Method: SMDocument>>author: (in category 'accessing') -----
author: aString
author := aString!
Item was changed:
----- Method: SMDocument>>description: (in category 'accessing') -----
description: aString
description := aString!
Item was changed:
----- Method: SMExternalResource>>downloadUrl: (in category 'accessing') -----
downloadUrl: anUrl
downloadUrl := anUrl!
Item was changed:
----- Method: SMFileCache>>directoryForPackage: (in category 'accessing') -----
directoryForPackage: aPackage
"Returns the local path for storing the package cache's package file area.
This also ensures that the path exists."
| slash path dir |
slash := FileDirectory slash.
path := 'packages' , slash , aPackage id asString36 , slash.
dir := FileDirectory default on: self directory fullName, slash, path.
dir assureExistence.
^dir!
Item was changed:
----- Method: SMFileCache>>directoryForPackageRelease: (in category 'accessing') -----
directoryForPackageRelease: aPackageRelease
"Returns the local path for storing the package cache's version of a
package file. This also ensures that the path exists."
| slash path dir |
slash := FileDirectory slash.
path := 'packages' , slash , aPackageRelease package id asString36 , slash , aPackageRelease automaticVersionString.
dir := FileDirectory default on: self directory fullName, slash, path.
dir assureExistence.
^dir!
Item was changed:
----- Method: SMFileCache>>directoryForResource: (in category 'accessing') -----
directoryForResource: aResource
"Returns the local path for storing the package cache's version of a
resource file. This also ensures that the path exists."
| slash path dir |
slash := FileDirectory slash.
path := 'resources' , slash , aResource id asString36.
dir := FileDirectory default on: self directory fullName, slash, path.
dir assureExistence.
^dir!
Item was changed:
----- Method: SMFileCache>>forMap: (in category 'initialize') -----
forMap: aMap
"Initialize the ache, make sure the cache dir exists."
map := aMap!
Item was changed:
----- Method: SMInstaller class>>classForPackageRelease: (in category 'instance creation') -----
classForPackageRelease: aPackageRelease
"Decide which subclass to instantiate.
We detect and return the first subclass
that wants to handle the release going
recursively leaf first so that subclasses gets
first chance if several classes compete over
the same packages, like for example SMDVSInstaller
that also uses the .st file extension."
self subclasses do: [:ea |
(ea classForPackageRelease: aPackageRelease)
ifNotNilDo: [:class | ^ class]].
^(self canInstall: aPackageRelease)
ifTrue: [self]!
Item was changed:
----- Method: SMInstaller class>>forPackageRelease: (in category 'deprecated') -----
forPackageRelease: aPackageRelease
"Instantiate the first class suitable to install the package release.
If no installer class is found we raise an Error."
| class |
aPackageRelease ifNil: [self error: 'No package release specified to find installer for.'].
class := self classForPackageRelease: aPackageRelease.
^class
ifNil: [self error: 'No installer found for package ', aPackageRelease name, '.']
ifNotNil: [class new packageRelease: aPackageRelease]!
Item was changed:
----- Method: SMInstaller>>packageRelease: (in category 'accessing') -----
packageRelease: aPackageRelease
packageRelease := aPackageRelease!
Item was changed:
----- Method: SMMcInstaller class>>canInstall: (in category 'testing') -----
canInstall: aPackage
"Is this a Monticello package and do I have MCInstaller
or Monticello available?"
| fileName |
((Smalltalk includesKey: #MCMczReader) or: [
Smalltalk includesKey: #MczInstaller])
ifTrue: [
fileName := aPackage downloadFileName.
fileName ifNil: [^false].
^ 'mcz' = (FileDirectory extensionFor: fileName) asLowercase].
^false!
Item was changed:
----- Method: SMMcInstaller>>fileIn (in category 'private') -----
fileIn
| extension |
extension := (FileDirectory extensionFor: fileName) asLowercase.
extension = 'mcz'
ifTrue: [self installMcz]
ifFalse: [self error: 'Cannot install file of type .', extension]!
Item was changed:
----- Method: SMObject>>id: (in category 'accessing') -----
id: anId
id := anId!
Item was changed:
----- Method: SMObject>>initialize (in category 'initialize-release') -----
initialize
"Initialize the receiver."
updated := created := TimeStamp current asSeconds.
name := summary := url := ''.!
Item was changed:
----- Method: SMObject>>map: (in category 'accessing') -----
map: aMap
map := aMap!
Item was changed:
----- Method: SMObject>>map:id: (in category 'initialize-release') -----
map: aMap id: anId
"Initialize the receiver."
self initialize.
map := aMap.
id := anId!
Item was changed:
----- Method: SMObject>>name: (in category 'accessing') -----
name: aName
name := aName!
Item was changed:
----- Method: SMObject>>stampAsUpdated (in category 'updating') -----
stampAsUpdated
"This method should be called whenever the object is modified."
updated := TimeStamp current asSeconds!
Item was changed:
----- Method: SMObject>>summary: (in category 'accessing') -----
summary: aString
summary := aString!
Item was changed:
----- Method: SMObject>>url: (in category 'accessing') -----
url: aString
url := aString!
Item was changed:
----- Method: SMPackage>>isSafelyOld (in category 'testing') -----
isSafelyOld
"Answer if I am installed and there also is a
newer published version for this version of Squeak available."
| installed |
installed := self installedRelease.
^installed ifNil: [false] ifNotNil: [
^(self lastPublishedReleaseForCurrentSystemVersionNewerThan: installed) notNil]!
Item was changed:
----- Method: SMPackage>>isSafelyOldAndUpgradeable (in category 'testing') -----
isSafelyOldAndUpgradeable
"Answer if I am installed and there also is a
newer published version for this version of Squeak available
that can be upgraded to (installer support)."
| installed newRelease |
installed := self installedRelease.
^installed ifNil: [false] ifNotNil: [
newRelease := self lastPublishedReleaseForCurrentSystemVersionNewerThan: installed.
^newRelease ifNil: [false] ifNotNil: [newRelease isUpgradeable]]!
Item was changed:
----- Method: SMPackage>>packageInfoName: (in category 'accessing') -----
packageInfoName: aString
packageInfoName := aString!
Item was changed:
----- Method: SMPackage>>releaseWithId: (in category 'services') -----
releaseWithId: anIdString
"Look up a specific package release of mine. Return nil if missing.
They are few so we just do a #select:."
| anId |
anId := UUID fromString: anIdString.
releases detect: [:rel | rel id = anId ].
^nil!
Item was changed:
----- Method: SMPackage>>upgrade (in category 'installation') -----
upgrade
"Upgrade to the latest newer published version for this version of Squeak."
| installed |
installed := self installedRelease.
installed
ifNil: [self error: 'No release installed, can not upgrade.']
ifNotNil: [^installed upgrade]!
Item was changed:
----- Method: SMPackage>>upgradeOrInstall (in category 'installation') -----
upgradeOrInstall
"Upgrade to or install the latest newer published version for this version of Squeak."
| installed |
installed := self installedRelease.
installed
ifNil: [^self install]
ifNotNil: [^installed upgrade]!
Item was changed:
----- Method: SMPackage>>versionLabel (in category 'installation') -----
versionLabel
"Return a label indicating installed and available version as:
'1.0' = 1.0 is installed and no new published version for this version of Squeak is available
'1.0->1.1' = 1.0 is installed and 1.1 is published for this version of Squeak
'->1.1' = No version is installed and 1.1 is published for this version of Squeak
'->(1.1) = No version is installed and there is only a non published version available for this version of Squeak
The version showed is the one that #smartVersion returns.
If a version name is in parenthesis it is not published."
| installedVersion r r2 |
r := self installedRelease.
r ifNotNil: [
installedVersion := r smartVersion.
r2 := self lastPublishedReleaseForCurrentSystemVersionNewerThan: r]
ifNil: [
installedVersion := ''.
r2 := self lastPublishedReleaseForCurrentSystemVersion ].
^r2 ifNil: [installedVersion ] ifNotNil: [installedVersion, '->', r2 smartVersion].!
Item was changed:
----- Method: SMPackageRelease>>package: (in category 'private') -----
package: aPackage
"Set when I am created."
package := aPackage!
Item was changed:
----- Method: SMPackageRelease>>upgrade (in category 'services') -----
upgrade
"Upgrade this package release if there is a new release available."
| newRelease |
newRelease := package lastPublishedReleaseForCurrentSystemVersionNewerThan: self.
newRelease ifNotNil: [(SMInstaller forPackageRelease: newRelease) upgrade]!
Item was changed:
----- Method: SMPersonalObject>>owner: (in category 'accessing') -----
owner: anAccount
owner := anAccount!
Item was changed:
----- Method: SMProjectInstaller class>>canInstall: (in category 'testing') -----
canInstall: aPackage
"Answer if this class can install the package.
We handle .pr files (upper and lowercase)"
| fileName |
fileName := aPackage downloadFileName.
fileName ifNil: [^false].
^'pr' = (FileDirectory extensionFor: fileName) asLowercase!
Item was changed:
----- Method: SMResource>>version: (in category 'accessing') -----
version: aVersion
version := aVersion!
Item was changed:
----- Method: SMSimpleInstaller>>cache (in category 'services') -----
cache
"Download object into cache if needed.
Set the directory and fileName for subsequent unpacking and install."
packageRelease ensureInCache ifTrue: [
fileName := packageRelease downloadFileName.
dir := packageRelease cacheDirectory]!
Item was changed:
----- Method: SMSimpleInstaller>>download (in category 'services') -----
download
"This service downloads the last release of the package
even if it is in the cache already."
packageRelease download ifTrue: [
fileName := packageRelease downloadFileName.
dir := packageRelease cacheDirectory]!
Item was changed:
----- Method: SMSimpleInstaller>>fileName: (in category 'accessing') -----
fileName: aFileName
fileName := aFileName!
Item was changed:
----- Method: SMSqueakMap class>>clear (in category 'instance creation') -----
clear
"Clear out the model in the image. This will forget
about what packages are installed and what versions.
The map is itself on disk though and will be reloaded.
If you only want to reload the map and not forget about
installed packages then use 'SMSqueakMap default reload'.
If you want to throw out the map perhaps when shrinking
an image, then use 'SMSqueakMap default purge'."
"SMSqueakMap clear"
DefaultMap := nil!
Item was changed:
----- Method: SMSqueakMap class>>default (in category 'instance creation') -----
default
"Return the default map, create one if missing."
"SMSqueakMap default"
^DefaultMap ifNil: [DefaultMap := self new]!
Item was changed:
----- Method: SMSqueakMap class>>findServer (in category 'server detection') -----
findServer
"Go through the list of known master servers, ping
each one using simple http get on a known 'ping'-url
until one responds return the server name.
If some servers are bypassed we write that to Transcript.
If all servers are down we inform the user and return nil."
| notAnswering deafServers |
Socket initializeNetwork.
notAnswering := OrderedCollection new.
Cursor wait
showWhile: [ServerList
do: [:server | (self pingServer: server)
ifTrue: [notAnswering isEmpty
ifFalse: [deafServers := String
streamContents: [:str | notAnswering
do: [:srvr | str nextPutAll: srvr printString;
nextPut: Character cr]].
Transcript show: ('These SqueakMap master servers did not respond:\' , deafServers , 'Falling back on ' , server printString , '.') withCRs].
^ server]
ifFalse: [notAnswering add: server]]].
deafServers := String
streamContents: [:str | notAnswering
do: [:srvr | str nextPutAll: srvr printString;
nextPut: Character cr]].
self error: ('All SqueakMap master servers are down:\' , deafServers , '\ \Can not update SqueakMap...') withCRs.
^ nil!
Item was changed:
----- Method: SMSqueakMap>>accountWithId: (in category 'queries') -----
accountWithId: anIdString
"Look up an account. Return nil if missing.
Raise error if it is not an account."
| account |
account := self objectWithId: anIdString.
account ifNil: [^nil].
account isAccount ifTrue:[^account].
self error: 'UUID did not map to a account.'!
Item was changed:
----- Method: SMSqueakMap>>accounts (in category 'accessing') -----
accounts
"Lazily maintain a cache of all known account objects."
accounts ifNotNil: [^accounts].
accounts := objects select: [:o | o isAccount].
^accounts!
Item was changed:
----- Method: SMSqueakMap>>adminPassword: (in category 'accessing') -----
adminPassword: aString
"We store the password as a SHA hash so that we can let the slave maps
have it too."
adminPassword := SecureHashAlgorithm new hashMessage: aString!
Item was changed:
----- Method: SMSqueakMap>>categoryWithId: (in category 'queries') -----
categoryWithId: anIdString
"Look up a category. Return nil if missing.
Raise error if it is not a category."
| cat |
cat := self objectWithId: anIdString.
cat ifNil: [^nil].
cat isCategory ifTrue:[^cat].
self error: 'UUID did not map to a category.'!
Item was changed:
----- Method: SMSqueakMap>>categoryWithNameBeginning: (in category 'queries') -----
categoryWithNameBeginning: aString
"Look up a category beginning with <aString>. Return nil if missing.
We return the shortest matching one. We also strip out spaces and
ignore case in both <aString> and the names."
| candidates shortest answer searchString |
searchString := (aString asLowercase) copyWithout: Character space.
candidates := self categories select: [:cat |
((cat name asLowercase) copyWithout: Character space)
beginsWith: searchString ].
shortest := 1000.
candidates do: [:ca |
ca name size < shortest ifTrue:[answer := ca. shortest := ca name size]].
^answer !
Item was changed:
----- Method: SMSqueakMap>>clearCaches (in category 'private') -----
clearCaches
"Clear the caches."
packages := accounts := users := categories := nil
!
Item was changed:
----- Method: SMSqueakMap>>clearCachesFor: (in category 'private') -----
clearCachesFor: anObject
"Clear the valid caches."
anObject isPackage ifTrue:[packages := nil].
anObject isAccount ifTrue:[accounts := users := nil].
anObject isCategory ifTrue:[categories := nil]
!
Item was changed:
----- Method: SMSqueakMap>>clearUsernames (in category 'private') -----
clearUsernames
"Clear the username cache."
users := nil!
Item was changed:
----- Method: SMSqueakMap>>installPackage: (in category 'public-installation') -----
installPackage: aPackage
"Install the package.
Note: This method should not be used anymore, better
to specify a specific release."
| rel |
rel := aPackage lastPublishedReleaseForCurrentSystemVersion
ifNil: [self error: 'No published release for this system version found to install.'].
^self installPackageRelease: rel!
Item was changed:
----- Method: SMSqueakMap>>installPackage:autoVersion: (in category 'public-installation') -----
installPackage: aPackage autoVersion: version
"Install the release <version> of <aPackage.
<version> is the automatic version name."
| r |
r := aPackage releaseWithAutomaticVersionString: version.
r ifNil: [self error: 'No package release found with automatic version ', version].
^self installPackageRelease: r!
Item was changed:
----- Method: SMSqueakMap>>installPackageNamed: (in category 'public-installation') -----
installPackageNamed: aString
"Install the last published release
for this Squeak version of the package with a name
beginning with aString (see method comment
of #packageWithNameBeginning:).
Note: This method should not be used anymore.
Better to specify a specific release."
| p |
p := self packageWithNameBeginning: aString.
p ifNil: [self error: 'No package found with name beginning with ', aString].
^self installPackage: p!
Item was changed:
----- Method: SMSqueakMap>>installPackageNamed:autoVersion: (in category 'public-installation') -----
installPackageNamed: aString autoVersion: version
"Install the release <version> of the package with a name
beginning with aString (see method comment
of #packageWithNameBeginning:). <version> is the
automatic version name."
| p r |
p := self packageWithNameBeginning: aString.
p ifNil: [self error: 'No package found with name beginning with ', aString].
r := p releaseWithAutomaticVersionString: version.
r ifNil: [self error: 'No package release found with automatic version ', version].
^self installPackageRelease: r!
Item was changed:
----- Method: SMSqueakMap>>installPackageReleaseWithId: (in category 'public-installation') -----
installPackageReleaseWithId: anUUIDString
"Look up and install the given release."
| r |
r := self packageReleaseWithId: anUUIDString.
r ifNil: [self error: 'No package release available with id: ''', anUUIDString, ''''].
^self installPackageRelease: r!
Item was changed:
----- Method: SMSqueakMap>>installPackageWithId: (in category 'public-installation') -----
installPackageWithId: anUUIDString
"Look up and install the latest release of the given package.
Note: This method should not be used anymore.
Better to specify a specific release."
| package |
package := self packageWithId: anUUIDString.
package ifNil: [self error: 'No package available with id: ''', anUUIDString, ''''].
^self installPackage: package!
Item was changed:
----- Method: SMSqueakMap>>installPackageWithId:autoVersion: (in category 'public-installation') -----
installPackageWithId: anUUIDString autoVersion: version
"Install the release <version> of the package with id <anUUIDString>.
<version> is the automatic version name."
| p |
p := self packageWithId: anUUIDString.
p ifNil: [self error: 'No package available with id: ''', anUUIDString, ''''].
^self installPackage: p autoVersion: version!
Item was changed:
----- Method: SMSqueakMap>>loadUpdatesFull: (in category 'private') -----
loadUpdatesFull: full
"Find a server and load updates from it."
| server |
server := self class findServer.
server ifNotNil: [
self synchWithDisk.
full ifTrue: [self loadFullFrom: server]
ifFalse:[self error: 'Not supported yet!!'."self loadUpdatesFrom: server"]]!
Item was changed:
----- Method: SMSqueakMap>>mutex (in category 'transactions') -----
mutex
"Lazily initialize the Semaphore."
^mutex ifNil: [mutex := Semaphore forMutualExclusion]!
Item was changed:
----- Method: SMSqueakMap>>newAccount:username:email: (in category 'public-master') -----
newAccount: name username: username email: email
"Create an account. Checking for previous account should already have been done.
To add the account to the map, use SMSqueakMap>>addObject:"
| account |
account := self newAccount
name: name;
initials: username;
email: email.
^account
!
Item was changed:
----- Method: SMSqueakMap>>noteInstalledPackageNamed:autoVersion: (in category 'public-installation') -----
noteInstalledPackageNamed: aString autoVersion: aVersion
"Mark that the package release was just successfully installed.
<aVersion> is the automatic version as a String.
Can be used to inform SM of an installation not been done using SM."
| p |
p := self packageWithNameBeginning: aString.
p ifNil: [self error: 'No package found with name beginning with ', aString].
^self noteInstalledPackage: p autoVersion: aVersion asVersion!
Item was changed:
----- Method: SMSqueakMap>>packageCacheDirectory (in category 'accessing') -----
packageCacheDirectory
"Return a FileDirectory for the package cache of the map.
Creates it if it is missing."
| dirName baseDir |
dirName := self packageCacheDirectoryName.
baseDir := self directory.
(baseDir fileOrDirectoryExists: dirName)
ifFalse:[baseDir createDirectory: dirName].
^baseDir directoryNamed: dirName!
Item was changed:
----- Method: SMSqueakMap>>packageReleaseWithId: (in category 'queries') -----
packageReleaseWithId: anIdString
"Look up a package release. Return nil if missing.
Raise error if it is not a package release."
| r |
r := self objectWithId: anIdString.
r ifNil: [^nil].
r isPackageRelease ifTrue:[^r].
self error: 'UUID did not map to a package release.'!
Item was changed:
----- Method: SMSqueakMap>>packageWithId: (in category 'queries') -----
packageWithId: anIdString
"Look up a package. Return nil if missing.
Raise error if it is not a package."
| package |
package := self objectWithId: anIdString.
package ifNil: [^nil].
package isPackage ifTrue:[^package].
self error: 'UUID did not map to a package.'!
Item was changed:
----- Method: SMSqueakMap>>packageWithNameBeginning: (in category 'queries') -----
packageWithNameBeginning: aString
"Look up a package beginning with <aString>. Return nil if missing.
We return the shortest matching one. We also strip out spaces and
ignore case in both <aString> and the names."
| candidates shortest answer searchString |
searchString := (aString asLowercase) copyWithout: Character space.
candidates := self packages select: [:package |
((package name asLowercase) copyWithout: Character space)
beginsWith: searchString ].
shortest := 1000.
candidates do: [:package |
package name size < shortest ifTrue:[answer := package. shortest := package name size]].
^answer !
Item was changed:
----- Method: SMSqueakMap>>packages (in category 'accessing') -----
packages
"Lazily maintain a cache of all known package objects."
packages ifNotNil: [^packages].
objects ifNil: [^#()].
packages := objects select: [:o | o isPackage].
^packages!
Item was changed:
----- Method: SMSqueakMap>>setDirty (in category 'transactions') -----
setDirty
"Set the map modified so that it will get written to disk."
isDirty := true!
Item was changed:
----- Method: SMSqueakMap>>silentlyDo: (in category 'public-installation') -----
silentlyDo: aBlock
"Execute <aBlock> with the Silent flag set.
This is a crude way of avoiding user interaction
during batch operations, like loading updates."
[silent := true.
aBlock value]
ensure: [silent := nil]!
Item was changed:
----- Method: SMSqueakMap>>transaction: (in category 'transactions') -----
transaction: aBlock
"Execute aBlock and then make sure any modified SMObjects
are committed to disk. We do this inside a mutex in order to
serialize transactions. Transactions must be initiated from
service methods in this class and not from inside the domain
objects - otherwise they could get nested and a deadlock occurs."
"In first version of SM2 we simply set the isDirty flag,
when next client asks for updates, or 30 minutes has passed,
we checkpoint."
" self mutex critical: ["
aBlock value.
isDirty := true
" ]"
" self mutex critical: [
dirtyList := OrderedCollection new.
aBlock value.
dirtyList do: [:obj | obj commit].
dirtyList := nil
]"!
Item was changed:
----- Method: SMSqueakMap>>upgradeOldPackagesConfirmBlock: (in category 'public-installation') -----
upgradeOldPackagesConfirmBlock: aBlock
"First we find out which of the installed packages are upgradeable and old.
Then we upgrade them if confirmation block yields true.
The block will be called with each SMPackage to upgrade.
We return a Dictionary with the packages we tried to upgrade as keys
and the value being the result of the upgrade, true or false."
| result |
result := Dictionary new.
self upgradeableAndOldPackages
do: [:package |
(aBlock value: package)
ifTrue:[ result at: package put: package upgrade]].
^result
!
Item was changed:
----- Method: SMSqueakMap>>upgradeOrInstallPackageWithId: (in category 'public-installation') -----
upgradeOrInstallPackageWithId: anUUIDString
"Upgrade package (or install) to the latest published release for this Squeak version."
| package |
package := self packageWithId: anUUIDString.
package ifNil: [self error: 'No package available with id: ''', anUUIDString, ''''].
^package upgradeOrInstall!
Item was changed:
----- Method: SMSqueakMap>>upgradePackageWithId: (in category 'public-installation') -----
upgradePackageWithId: anUUIDString
"Upgrade package to the latest published release for this Squeak version.
Will raise error if there is no release installed, otherwise use
#upgradeOrInstallPackageWithId: "
| package |
package := self packageWithId: anUUIDString.
package ifNil: [self error: 'No package available with id: ''', anUUIDString, ''''].
^package upgrade!
Item was changed:
----- Method: SMSqueakMap>>users (in category 'accessing') -----
users
"Lazily maintain a cache of all known account objects
keyed by their developer initials."
users ifNotNil: [^users].
users := Dictionary new.
self accounts do: [:a | users at: a initials put: a].
^users!
Item was changed:
----- Method: SMUtilities class>>mailServer:masterServer: (in category 'class initialization') -----
mailServer: ipName masterServer: httpUrl
"Initialize server settings."
MailServer := ipName.
MasterServer := httpUrl!
Item was changed:
----- Method: SMUtilities class>>stripNameFrom: (in category 'utilities') -----
stripNameFrom: aString
"Picks out the name from:
'Robert Robertson <rob at here.com>' => 'Robert Robertson'
"
| lessThan |
lessThan := aString indexOf: $<.
^(aString copyFrom: 1 to: lessThan - 1) withBlanksTrimmed !
More information about the Squeak-dev
mailing list
|