[squeak-dev] The Trunk: SMBase-gk.109.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Apr 11 21:02:42 UTC 2010
Göran Krampe uploaded a new version of SMBase to project The Trunk:
http://source.squeak.org/trunk/SMBase-gk.109.mcz
==================== Summary ====================
Name: SMBase-gk.109
Author: gk
Time: 11 April 2010, 11:01:20 pm
UUID: f2deba90-73b7-422a-a783-547c1353571d
Ancestors: SMBase-gk.108, SMBase-gk.90
- Added #oldReload to be able to load an old map using ImageSegments. Only to be used when switching on the server.
And a bunch of fixes from a long time back:
2006, Doug Way:
- A bunch of additions and cleanups for the SMPackage and SMPackageRelease full descriptions which appear in the package loader.
2008, Göran Krampe:
- Fix in default installer for text file converter.
2009, Göran Krampe:
-Added #isPurged and fix in synchWithDisk to avoid problems with a purged map when there is no map on disk (fresh install)
- Fix included from http://bugs.squeak.org/view.php?id=7201
=============== Diff against SMBase-gk.108 ===============
Item was changed:
----- Method: SMSqueakMap>>synchWithDisk (in category 'private') -----
synchWithDisk
"Synchronize myself with the checkpoints on disk.
If there is a newer checkpoint than I know of, load it.
If there is no checkpoint or if I have a higher checkpoint number,
create a new checkpoint from me.
The end result is that I am in synch with the disk and we are both as
updated as possible."
| checkpointNumberOnDisk |
"If there is no checkpoint, save one from me."
+ (self isCheckpointAvailable) ifFalse: [
+ "If I am purged - don't checkpoint, no point"
+ self isPurged ifTrue: [^self].
+ ^self createCheckpointNumber: checkpointNumber].
- (self isCheckpointAvailable) ifFalse: [^self createCheckpointNumber: checkpointNumber].
"If the one on disk is newer, load it"
checkpointNumberOnDisk := self lastCheckpointNumberOnDisk.
(checkpointNumber < checkpointNumberOnDisk)
ifTrue: [^self reload].
"If I am newer, recreate me on disk"
(checkpointNumberOnDisk < checkpointNumber)
ifTrue: [^self createCheckpointNumber: checkpointNumber]!
Item was changed:
----- Method: SMDefaultInstaller>>fileIn (in category 'private') -----
fileIn
"Installing in the standard installer is simply filing in.
Both .st and .cs files will file into a ChangeSet of their own.
We let the user confirm filing into an existing ChangeSet
or specify another ChangeSet name if
the name derived from the filename already exists."
| fileStream |
(self class nonMultiSuffixes anySatisfy: [:each | unpackedFileName endsWith: (FileDirectory dot, each)])
ifTrue:[
fileStream := dir readOnlyFileNamed: unpackedFileName.
+ (fileStream respondsTo: #setConverterForCode) ifTrue: [fileStream setConverterForCode].
- (fileStream respondsTo: #setConverterCode) ifTrue: [fileStream setConverterForCode].
self fileIntoChangeSetNamed: (fileStream localName sansPeriodSuffix) fromStream: fileStream.
^self].
(self class multiSuffixes anySatisfy: [:each | unpackedFileName endsWith: (FileDirectory dot, each)])
ifTrue:[
fileStream := dir readOnlyFileNamed: unpackedFileName.
"Only images with converters should have multi suffixes"
fileStream converter: (Smalltalk at: #UTF8TextConverter) new.
self fileIntoChangeSetNamed: (fileStream localName sansPeriodSuffix) fromStream: fileStream.
^self].
self error: 'Filename should end with a proper extension'.
!
Item was changed:
----- Method: SMDependencyAnalysis>>removeOlderReleasesIn: (in category 'private') -----
removeOlderReleasesIn: collectionOfReleases
"Remove older multiple releases of the same package.
2 scans to retain order."
+ | newestReleases rel |
- | newestReleases |
newestReleases := Dictionary new.
collectionOfReleases do: [:r |
+ rel := newestReleases at: r package ifAbsentPut: [r].
- | rel |
- rel := newestReleases at: r package ifAbsent: [newestReleases at: r package put: r].
(r newerThan: rel) ifTrue: [newestReleases at: r package put: r]].
^collectionOfReleases select: [:r |
(newestReleases at: r package) == r]!
Item was added:
+ ----- Method: SMSqueakMap>>oldReload (in category 'private') -----
+ oldReload
+ "Reload the map from the latest checkpoint on disk.
+ The opposite of #purge."
+
+ | fname stream map |
+ fname := self directory lastNameFor: self filename extension: 'sgz'.
+ fname ifNil: [self error: 'No ImageSegment checkpoint available!!'].
+ stream := (StandardFileStream oldFileNamed: (self directory fullNameFor: fname)) asUnZippedStream.
+ stream ifNil: [self error: 'Couldn''t open stream on checkpoint file!!'].
+ [map := (stream fileInObjectAndCode) install arrayOfRoots first] ensure: [stream close].
+ self copyFrom: map!
Item was changed:
----- Method: SMSqueakMap>>categories (in category 'accessing') -----
categories
"Lazily maintain a cache of all known category objects."
categories ifNotNil: [^categories].
+ objects isNil ifTrue: [ ^ #() ].
categories := objects select: [:o | o isCategory].
^categories!
Item was changed:
----- Method: SMInstaller classSide>>changeSetNamed: (in category 'changeset utilities') -----
changeSetNamed: newName
"This method copied here to ensure SqueakMap is independent of ChangesOrganizer."
+ Smalltalk at: #ChangesOrganizer ifPresentAndInMemory: [ :cs | ^cs changeSetNamed: newName ].
- Smalltalk at: #ChangesOrganizer ifPresent: [ :cs | ^cs changeSetNamed: newName ].
^ChangeSet allInstances detect: [ :cs | cs name = newName ] ifNone: [ nil ].!
Item was changed:
----- Method: SMPackageRelease>>fullDescription (in category 'printing') -----
fullDescription
"Return a full textual description of the package release."
| s |
s := TextStream on: (Text new: 400).
+ self describe: self package name withBoldLabel: 'Package Name: ' on: s.
+ name isEmptyOrNil ifFalse:
+ [self describe: self name withBoldLabel: 'Release Name: ' on: s].
+ summary isEmptyOrNil ifFalse:
+ [self describe: self summary withBoldLabel: 'Release Summary: ' on: s].
- self describe: self package name withBoldLabel: 'Package name: ' on: s.
self
describe: self version
+ withBoldLabel: 'Version: '
- withBoldLabel: 'version: '
on: s.
categories isEmptyOrNil
ifFalse:
[s
cr;
withAttribute: TextEmphasis bold do: [s nextPutAll: 'Categories: '];
cr.
+ (self categories asSortedCollection: [:a :b | a path < b path])
+ do: [:c |
- self categoriesDo:
- [:c |
s
tab;
withAttribute: TextEmphasis italic
do:
[c parentsDo:
[:p |
s
nextPutAll: p name;
nextPutAll: '/'].
s nextPutAll: c name];
nextPutAll: ' - ' , c summary;
cr].
s cr].
+ created ifNotNil: [
+ s
+ withAttribute: TextEmphasis bold do: [ s nextPutAll: 'Created: ' ];
+ print: self created;
+ cr].
+ updated ifNotNil: [
+ s
+ withAttribute: TextEmphasis bold do: [ s nextPutAll: 'Modified: ' ];
+ print: self updated;
+ cr].
+ publisher ifNotNil: [
+ s
+ withAttribute: TextEmphasis bold
+ do: [s nextPutAll: 'Publisher: '].
+ s
+ withAttribute: (PluggableTextAttribute
+ evalBlock: [self userInterface
+ sendMailTo: self publisher email
+ regardingPackageRelease: self])
+ do: [s nextPutAll: self publisher nameAndEmail];
+ cr].
+
self note isEmptyOrNil
ifFalse:
[s
cr;
withAttribute: TextEmphasis bold do: [s nextPutAll: 'Version Comment:'].
s cr.
+ s withAttribute: (TextIndent tabs: 1) do: [s nextPutAll: self note withSqueakLineEndings].
- s withAttribute: (TextIndent tabs: 1) do: [s nextPutAll: self note].
s
cr;
cr].
url isEmptyOrNil
ifFalse:
[s
withAttribute: TextEmphasis bold do: [s nextPutAll: 'Homepage:'];
tab;
withAttribute: (TextURL new url: url) do: [s nextPutAll: url];
cr].
self downloadUrl isEmptyOrNil
ifFalse:
[s
withAttribute: TextEmphasis bold do: [s nextPutAll: 'Download:'];
tab;
withAttribute: (TextURL new url: self downloadUrl)
do: [s nextPutAll: self downloadUrl];
cr].
^s contents.
!
Item was changed:
----- Method: SMInstaller classSide>>basicNewChangeSet: (in category 'changeset utilities') -----
basicNewChangeSet: newName
"This method copied here to ensure SqueakMap is independent of
ChangesOrganizer. "
Smalltalk
at: #ChangesOrganizer
+ ifPresentAndInMemory: [:cs | ^ cs basicNewChangeSet: newName].
- ifPresent: [:cs | ^ cs basicNewChangeSet: newName].
(self changeSetNamed: newName)
ifNotNil: [self error: 'The name ' , newName , ' is already used'].
^ ChangeSet basicNewNamed: newName!
Item was changed:
----- Method: SMInstallationProposal>>collectConflictsIn: (in category 'initialize-release') -----
collectConflictsIn: collectionOfReleases
"Collect all conflicts where there are either
- multiple releases of the same package and/or
- another release of the same package already installed
Return the conflicts as an IdentityDictionary with
the package as key and the value being a Set of releases."
+ | conflicts set |
- | conflicts |
conflicts := IdentityDictionary new.
+ collectionOfReleases do: [:r |
+ set := conflicts at: r package ifAbsentPut: [OrderedCollection new].
- collectionOfReleases do: [:r | | set |
- set := conflicts at: r package ifAbsent: [
- conflicts at: r package put: OrderedCollection new].
set add: r].
"Add the installed releases too"
conflicts keysAndValuesDo: [:key :value |
key isInstalled ifTrue: [value add: key installedRelease]].
"Prune release sets with only one member"
^conflicts select: [:releaseSet | releaseSet size > 1]!
Item was changed:
----- Method: SMInstallationRegistry>>markInstalled:version:time:counter: (in category 'private') -----
markInstalled: uuid version: version time: time counter: num
"Private. Mark the installation. SM2 uses an Association
to distinguish the automatic version from old versions."
| installs |
installedPackages ifNil: [installedPackages := Dictionary new].
+ installs := installedPackages at: uuid ifAbsentPut: [OrderedCollection new].
- installs := installedPackages at: uuid
- ifAbsent: [installedPackages at: uuid put: OrderedCollection new].
installs add:
(Array with: 2->version
with: time
with: num)!
Item was changed:
----- Method: SMPackage>>fullDescription (in category 'accessing') -----
fullDescription
"Return a full textual description of the package.
Most of the description is taken from the last release."
+ | s publishedRelease sqDescription |
- | s publishedRelease |
s := TextStream on: (Text new: 400).
self
describe: name
withBoldLabel: 'Name: '
on: s.
summary isEmptyOrNil
ifFalse: [self
describe: summary
withBoldLabel: 'Summary: '
on: s ].
author isEmptyOrNil
ifFalse: [s
withAttribute: TextEmphasis bold
do: [s nextPutAll: 'Author:'];
tab;
tab.
s
withAttribute: (PluggableTextAttribute
evalBlock: [self userInterface
sendMailTo: (SMUtilities stripEmailFrom: author)
regardingPackageRelease: self lastRelease])
do: [s nextPutAll: author];
cr].
self owner
ifNotNil: [s
withAttribute: TextEmphasis bold
do: [s nextPutAll: 'Owner:'];
tab; tab.
s
withAttribute: (PluggableTextAttribute
evalBlock: [self userInterface
sendMailTo: self owner email
regardingPackageRelease: self lastRelease])
do: [s nextPutAll: self owner nameAndEmail];
cr].
self maintainers isEmpty ifFalse: [
+ s withAttribute: TextEmphasis bold do: [s nextPutAll: 'Co-Maintainers:']; tab.
- s withAttribute: TextEmphasis bold do: [s nextPutAll: 'Co-maintainers:']; tab.
self maintainers do: [:com |
com = self maintainers first ifFalse: [s nextPutAll: ', '].
s
withAttribute:
(PluggableTextAttribute
evalBlock: [self userInterface
sendMailTo: com email
regardingPackageRelease: self lastRelease])
do: [s nextPutAll: com nameAndEmail]].
s cr].
description isEmptyOrNil
+ ifFalse: [sqDescription := description withSqueakLineEndings.
+ s cr.
- ifFalse: [s cr.
s
withAttribute: TextEmphasis bold
do: [s nextPutAll: 'Description:'].
s cr.
s
withAttribute: (TextIndent tabs: 1)
+ do: [s next: (sqDescription findLast: [ :c | c isSeparator not ]) putAll: sqDescription].
- do: [s next: (description findLast: [ :c | c isSeparator not ]) putAll: description].
s cr ].
self describeCategoriesOn: s indent: 1.
s cr.
publishedRelease := self lastPublishedRelease.
self
describe: (self publishedVersion ifNil: ['<not published>'])
+ withBoldLabel: 'Published Version: '
- withBoldLabel: 'Published version: '
on: s.
self isPublished ifTrue: [
s
withAttribute: TextEmphasis bold do: [ s nextPutAll: 'Created: ' ];
print: publishedRelease created;
cr.
self note isEmptyOrNil
ifFalse: [s
withAttribute: TextEmphasis bold
+ do: [s nextPutAll: 'Release Note:'].
- do: [s nextPutAll: 'Release note:'].
s cr.
s
withAttribute: (TextIndent tabs: 1)
+ do: [s nextPutAll: publishedRelease note withSqueakLineEndings].
- do: [s nextPutAll: publishedRelease note].
s cr ]].
url isEmptyOrNil
ifFalse: [s cr;
withAttribute: TextEmphasis bold
+ do: [s nextPutAll: 'Homepage: '];
- do: [s nextPutAll: 'Homepage:'];
- tab;
withAttribute: (TextURL new url: url)
do: [s nextPutAll: url];
cr].
+ packageInfoName isEmptyOrNil
+ ifFalse: [self
+ describe: packageInfoName
+ withBoldLabel: 'Package Info: '
+ on: s ].
^ s contents!
Item was added:
+ ----- Method: SMSqueakMap>>isPurged (in category 'public') -----
+ isPurged
+ "Is this instance purged (empty)?"
+
+ ^checkpointNumber isZero!
More information about the Squeak-dev
mailing list
|