Metacello GIT methodProperties.json

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
22 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: Metacello GIT methodProperties.json

Dale Henrichs-3


On 04/08/2015 01:11 AM, Thierry Goubier wrote:


2015-04-08 8:47 GMT+02:00 Peter Uhnák <[hidden email]>:
I thnk that rather than focus on the disk format which I hardly ever actually look at ... that folks should be looking at tools support (like Thierry) ... this is where the real work needs to happen ... good tools can hide the disk fomat completely so why does the disk format matter ...
I am personally not really a fan of this; I've been using git for a while and I am perfectly content with using command line on the disk (maybe I'm rare breed); I have yet to see a GUI/tool that would come even close to the power of command line, but I've been using Linux for a long time.

Agreed and this is in that spirit I did GitFileTree. Dale went a bit further and even integrated the git command line access inside smalltalk via CommandShell... so that you get the best of both worlds without leaving your beloved Smalltalk :)

Actually it is not quite CommandShell based ... the shell is tODE shell, where Smalltalk is the scripting language. The tODE git commands  are implemented by parsing the command line args, resolving options and args to objects, and then calling a Smalltalk git command API that eventually does make shell calls (sometimes multiple git commands are folded into a single tODE git command ... thus making it possible to ultimately switch out the actual `git calls` and use something FFI-based, like libgit2...

This approach also makes it quite feasible to write fairly complicated Smalltalk scripts that call the smalltalk git command api directly, bypassing the command line interface altogether ...

 
As I've said to Thierry some time ago in different thread, I would be interested in idea of having everything on disk side and Pharo would only somehow refresh it's content (just like a Java IDE / text editor would). But that may be a lot o work so I can only dream about it, as nobody has time for that (me included).

Well, as I said elsewhere, Smalltalk doesn't work like that: code has to be lived in the image for most tools to work properly... it doesn't really have an "editor of file" mindset, but an "object inspector" mindset.

What we're looking at in another thread is how to emulate that live object approach over dead files, and, thinking of it, I'm not sure we will succeed well.

In short, what you want may never work properly because it is not how it should be conceptualized.
 
In tODE I regularly drop off live objects to the file system using STON ... The tODE shell which allows you to navigate an object-based directory also allows you to mount the nodes from the file system and when traversing the file system recognizes STON files and presents objects to you instead of the dead files:)

I haven't tried taking this approach all the way to source files ... but????

Dale
Reply | Threaded
Open this post in threaded view
|

Re: Metacello GIT methodProperties.json

Dale Henrichs-3
In reply to this post by Thierry Goubier


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

12