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.