On 6/3/16 2:43 AM, Otto Behrens wrote:
For FileTree repos it is even better to just load the package (Monticello
does a good job of only loading the changed packages and we're looking at
packages already on disk) ... ... I have an extension to Metacello for
Filetree repos (it's only been around for about 3 years) that ignores
version numbers and "loads" all of the packages from the the repo (I
mentioned _this_ to Thierry:) ... which for FileTree repos is actually the
proper behavior ... I happen to be very busy at the moment so I don't have
time to blow the dust off of that extension ... the big gotcha is everyone
has to have the extension present in their image for this kind of thing to
work and AFAIK pharo is not kept up-to-date with the latest versions that I
publish on github, so I'm afraid that much breakage would ensure if only a
few individuals started using this extension ... Seems to be that we're
stuck between a rock and a had place... I wish there was a better way to
keep the Metacello distribution up-to-date in images that I have no control
over ...
FWIW, I've found that if I manually flush the cache for each package before
I save it, I don't have to wait the minute or so for all of the repos to be
refreshed ...
Dale, will you please publish this stuff somewhere, with dust on, as
is? (Or tell us where we can find it).
Well let's see there's the Metacello-Cypress package is in the Metacello
repo[1] and the following should load the Cypress support into an image
with Metacello already loaded:
Metacello image
baseline: 'Metacello';
load: ' Cypress'
To use the Cypress support, implement a #projectClass method in your
BaselineOf that returns MetacelloCypressBaselineProject:
projectClass
^MetacelloCypressBaselineProject
and you should be in business ...
IIRC the MetacelloCypressBaselineProject should be usable with any
BaselineOf. The only difference for Cypress is that Monticello versions
are ignored when making loading decisions --- at least that's the intent.
Before going full scale, we'd need to add some tests for the Cypress
project and of course make sure that the Cypress support gets loaded by
default ...
[1]
https://github.com/dalehenrich/metacello-work/tree/master/repository/Metacello-Cypress.package
We've just battled sooo much in this area. I wonder if it is worth it
to think again about this whole git / monticello / metacello thing.
For me, it's just too much to comprehend. As soon as I dig into
something here, I get lost within minutes.
I believe the complexity has to do with trying to maintain too many
different ways of solving the problem. We are trying to keep things
(Monticello / Metacello) working with or without git or filetree or
whatever else people are using.
I would really like to do merging in git and just have a fast and
simple way of loading / compiling into an image (and GemStone). I do
not want a package cache, 3 way merging and all the other things,
because it makes what I end up with unpredictable. But you see, other
people want to work in other ways, which I understand. My perception
is that the result is messy.
We should try to strive more towards *fewer* ways of doing things,
without killing innovation to try different ways. It feels as if there
are enormous, yet very incomplete silos of efforts to solve problems.
I basically agree with everything you say here.
I added the Cypress package support several years ago when Richard
Sargent wrote a Cypress implementation for the base GemStone[2], so
we've had the bits a pieces necessary for a cleaner simpler mechanism
for a while at least for GemStone ...
I would like to distinguish between Cypress and FileTree.
FileTree was created (by you:) to support disk-based repos while
maintaining full Monticello compatibility. Over the years I've
(stubbornly) maintained that the Monticello meta data be preserved in
FileTree repositories. By preserving Monticello meta data, the packages
can be easily moved between FileTree and SmalltalkHub, etc. while
faithfully preserving the Monticello ancestry. Maintaining Monticello
meta data is critical for folks to be able to "dip their toe into the
git pool" while preserving Monticello ancestry.
When I say "Cypress" (as opposed to FileTree), I think of a stripped
down implementation of FileTree where Monticello meta data is not stored
on disk and, perhaps more importantly the package loading code, in-image
package management and tool support is also stripped down to support a
simple model where package history and version numbers are non-existent.
This particular model is aimed at projects that spend their entire lives
in "git" repos and there is no desire, nor need to keep a parallel
ancestry in the Monticello meta data and I think that what you are
asking for ... in fact with Cypress package names do not need any
package meta data ... the SHA of the commit is all that is needed to
uniquely identify packages [in tODE the development environment is
focused on the Metacello project and the package is not really the
focus, so right now the Metacello registry is capable of tracking the
SHA of the commit used to load a _project_, so I don't think that a
package needs to have any additional meta data like UUID or version
number or and the SHA of the commit at _project_ load time is all that
is needed]
For Pharo, I think that GitFileTree provides you with support for a
metadata-less disk footprint, but the in-image support is still based on
Monticello --- at least that's what I understand about GitFileTree,
since up to now I haven't spent any time working with it ... that will
change this summer as I am working on a project in Pharo5. GitFileTree
is an extension of the "FileTree model" in that it is compatible with
the current in-image tools that all pretty much expect Monticello
packages --- this approach is needed because it is a big job to
incorporate an alternate source code management scheme in the in-image
tools across the board ... If one were to switch the pharo tool focus
from the _package_ (Monticello Browser) to the the _project_ (Project
Browser) there would be additional work to be done: 'save' of project
means save all dirty packages in project as well as a `git commit`,
'diff' of project means show changes for all dirty packages in project,
and there would be analogs for 'load', 'revert', 'history' etc.
For GemStone, I have written tODE to be git-aware from the beginning and
I have built tools to support Cypress package management as well[3]
although they _are_ 3 years old and would deserve additional work ...
Internally we are seriously considering adding Cypress support to the
base image for the GemStone 3.4 release and of course in the process of
doing that work, I assume that we'd make the code available for use in
3.2 and 3.3 as well.
In the short term I think that a combination of Cypress package support
from Metacello, GitFileTree in Pharo and the updating of the Cypress
tools for tODE will allow you to share packages between Pharo and
GemStone without needing to create and maintain Monticello meta data ...
in the midterm Cypress support is slated for this year and if necessary
I can make changes to the current tODE FileTree implementation to allow
the writing of metadata-less packages -- I think GitFileTree records
whether or not a repository is metadata-less in a repository property
file that I can use if necessary ...
Does this make sense?
Dale
[2] https://github.com/rjsargent/CypressReferenceImplementation
[3]
https://github.com/dalehenrich/tode/tree/master/repository/Topez-Server-CypressTools.package