On 04/08/2015 12:47 PM, Thierry Goubier wrote:
Hi Dale,

Le 08/04/2015 19:30, Dale Henrichs a écrit :


On 04/07/2015 10:24 PM, Thierry Goubier wrote:
Le 08/04/2015 02:05, Dale Henrichs a écrit :
I have threatened in the past to add an option to a repository that
would eliminate the need to store monticello meta data ... Damien is
working on "starting from scratch" on the new format, because the
current implementation supports 4-5 different FileTree formats. Damien's work could be leveraged to add an "optional Monticello meta data" option to FileTree and if your SCM (like git) gives you per method history with
the proper tools you can leverage that information..

I would say this could be a reasonable possibility, in that you could
have two modes of compatibility:

- Complete filetree compatibility for gitfiletree: the current
situation, with properties and version written to disk.

- Partial filetree compatibility, where that metadata isn't written
and you rely on gitfiletree to recreate it to export as .mcz.

Partial compatibility has two effects, which need to be considered.
When using github:// or bitbucket:// urls, filetree will be used and
your packages will end up having no version number (except .1?), no
author, no timestamps for methods, etc... And the second one is that,
if you clone a mcz inside the gitfiletree repository, the mcz ancestry
of versions and author timestamps on methods will be lost, which is
something you may not want.
Yes for Metacello some modifications would need to be made because in a
normal mcz universe Metacello will not load a package if the version is
older or the same as the one in the image ... and following in the
tradition of other Monticello tools the UUID is ignored:( .. I was
working with a pure cypress implementation and have written the
Metacello code to support these repos ...

Ok.

Yes, the version number handling is delicate; even the one used by gitfiletree feels unsatisfying, even if it allows Metacello/Monticello to work as usual.
The work I had done was at the Metacello level and is in the Metacello-Cypress package where I changed the load semantics to unconditionally load the package ... the snapshot comparison logic in play when loading packages is pretty good so it isn't necessarily a penalty to unconditionally compare snapshots when loading a package from FileTree ...

A better long term solution is to treat these as a CypressPackage or
FileTreePackage which has some similarities to Monticello packages ...
because faking out Monitcello version numbers and users is not much
different than storing the metadata in FileTree ...

Not sure I understand. I know where the Cypress/FileTree code handles the lack of metadata when reading, that's all :)

But someone were to add those options to filetree, I think we could
reduce the overall number of hacks:)

Another solution I'd see possible is a reduced metadata format, where just the version number of the current package is stored and retrieved (i.e. a version file without ancestry).

It would allow FileTree and Metacello to work exactly as usual.

And, maybe, I could even unify the UUIDs?

There are things in Monticello which needs a rethink to better adapt to SCMs like git (or Fossil: it's so similar to git :) ) while keeping more or less the same appearance: branches, hashes, tags and semantic versionning.

But I don't see yet how to handle that or to propose anything.

I know that it would be great to reduce the cognitive distance between MC version and history handling, and the same as seen from Metacello baselines and configurations. Branches + baselines are doing a lot to simplify, but MC stuff is unaware of that. And MC should delegate merging to the underlying repository, as well.

So this "extraneous" Monticello meta data is really related to the versioning aspects of the Monticello package ... aspects that really needed if you are using "git" (read "git" as svn, hg, git, fossil, etc.:) for version control .. in working with "git" the SHA of the commit for the repository as a whole is more important than any of the package meta data ... from the SHA one can see the commit comment for the "git" commit the SHA is related to a project not a package ... the project contents is represented by the BaselineOf ... in git one can reason about the collection of commits associated with a directory (package or class or method) and look at diffs at that level of granularity .... The primary point being that a "git" package can be stripped down to the basic list of definitions and the ancestry and version names and method properties can be dropped on the floor instead of fabricated ...

What I imagine is a separate software stack for these "git" packages the commonality is at the snapshot/definition level and the core definitions can migrate between Monticello and "git" packages almost without change ... if one wanted to know the "history" of a package the Monticello package would answer back a representation of the ancestor graph, while the "git" package would answer back a representation of the commit history ... there would be different objects in the histories, since the meta data for extracting the useful bits varies considerably between the two package implementations, but from a tools perspective and arranging for a common tool-level api would be able to accommodate these two completely different packages as well as any number of package implementations that could wrap packages stored in the wide variety of SCMS floating around out there .... and those to come ... what the hell:)

Well there's a year or so of work:)

Dale

Reply via email to