Squeak SmalltalkJoker Squeak Smalltalk : Image VM OS Application : prevnext Stable Universe Release Making Squeakmap

MAKING OF THE STABLE 3.7 UNIVERSE

The universe itself was developed roughly as follows:

1. Import SqueakMap into a universe named "Squeak 3.7".
2. Announce that a stable universe is being built.
3. Wait 2 weeks for people to hack away at it.
4. Close the universe off from public edits.  Only the release manager 
   can edit it after this point.
5. Try loading all the packages, and remove ones that fail a basic 
   smoke test.  (This was MISERABLE.  It should get better in the 
   future, though.)
6. Scan through the packages and clean up names adn description.  For 
   example, we don't need "Refactoring Browser for 3.7", and can 
   instead call it "Refactoring Browser".
7. Fix up dependencies.  These all had to be added by hand.
8. Clean up a few packages, that do not load nicely.  (I won't do this 
   in the future!)
9. Programatically remove all old versions of packages.  There is no 
   point to them in a stable universe.

10. Clear out the universetmp directory, and create a new one by 
    downloading all the packages that have survived to this point.
11. Upload all the package files to a single directory on the 
    universes server.
12. Edit all package entries to point to the universes server, instead 
    of where the original package was.

Two weeks is short for creating a truly low-bug universe, but I didn't 
expect people to really spend a lot of time on this first stable 
universe.  In the future, we should think about driving it from the 
bug tracker: continue until the number of severe bugs is reasonably 
low.

Item 8 is *much* easier if the bug tracker is helping.  I would like 
to get to the point where failure to load is a true surprise and is 
worth filing a bug about.  Right now, nobody is surprised when a 
package doesn't load, and they don't seem to complain, and thus the 
situation never gets remedied.

Items 11 and 12 are optional, but they seem to make a big difference 
in practice.  It's bad to pull from 20 different web sites and ftp 
sites, because at any given time ,it is likely at least one of them 
will be down.  With the current solution,

Item 5 truly sucked.  Downloading all those packages, waiting for http 
servers to time out, dealing with the errors (either fixing the error 
and uploading a new version, fixing a dependency, or removing the 
package from the universe), then trying to continue where i left 
off.... I think it will be better now that the worst offenders have 
already been removed.

The image itself was developed as follows:

1. Start with a 3.7 basic image.
2. Load universes.
3. Set Stable 3.7 as the current system universe.
4. Open a universes browser and "update list".
5. Remove SqueakMap. It's in the universes browser, and it is 
   confusing to have two package loaders visible to newbies.
6. Install the "Universes", "Compiler", and "AppRegistry" packages. 
   These are pre-installed packages that also have enttries in the 
   universe, and you have to do this in order for the universes tools 
   to realize they have already been loaded.
7. Write a readme window.

The zip file includes the image plus a fully populated universetmp 
cache.

USEFUL CODE SNIPPETS

I was not careful to keep all these around, but here are a few useful 
ones.

univ _ UUniverse systemUniverse.

"delete all downloaded files that are no longer needed"
dir _ FileDirectory default directoryNamed: 'universetmp'.
univ packages do: [ :p | (dir isAFileNamed: p url path last) ifFalse: [
p inspect ] ].
extraneous _ dir entries select: [ :ent | univ packages noneSatisfy: [
:p | p url path last = ent name ] ].
extraneous do: [ :ent | dir deleteFileNamed: ent name ].

"update all entries to point to the universes server instead of their
original location"
client _ UUniverseClient new.
univ packages select: [ :p | p url scheme ~= 'http' ]
univ packages do: [ :p |
	newp _ p deepCopy.
	newcomponents _ { 'universes' . 'repositories' . 'stable-3.7' . p url
path last }.
	newp url: (HttpUrl schemeName: 'http' authority:
'universes.dnsalias.net:8888' path: newcomponents query: nil).
	client sendMessage: (UMAddPackage username: 'master' password:
'PASSWORD' package: newp) ].
client processIO

"remove the list of packages in toRemove from the server"
client _ UUniverseClient new.
toRemove do: [ :p | client sendMessage: (UMRemovePackage username:
'master' password: 'PASSWORD' packageName: p name packageVersion: p
version) ].
client processIO.