[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.tools.buckminster] Re: Buckminster updating / change-list generation

Hi Peter,
This sounds very interesting and the improvements that you suggest make a lot of sense. I have some suggestions that might help make it even easier and perhaps keep the API changes to a minimum.


In general, I think the reader should be able to detect the difference between a check-out and and update automatically. For CVS/SVN we can almost provoke this behavior today by adding an advisor node to the CQUERY that prevent that a resolution takes place against the workspace. The problem is that check-outs will still be performed instead of updates.

Buckminster already contains some code that makes a halfhearted attempt to manage what should happen when things already exists (see org.eclipse.buckminster.core.mspec.ConflictResolution). It's not currently used by the workspace materializer but that could easily change. Valid values are FAIL, KEEP, REPLACE, or UPDATE

We also have a way to collect statistics about the materialization (see org.eclipse.buckminster.core.materializer.MaterializationStatistics). It's only used by the "filesystem" and the deprecated "site.mirror" materializer at present but it would serve us well for this purpose.

So what about this:

* We add a default ConflictResolution attribute to the resolution/materialization context (the RMContext)

* This attribute should default to KEEP but we add a command line option to control it to the import command and to the UI

* We make the resolver sensitive to this attribute in the following way:
KEEP - Do what it does today. I.e. resolve from the workspace/target platform (and be happy with what's there)
UPDATE - Don't resolve from the workspace/target platform. Always do an external resolution, then automatically update instead of check-out if the component is already present. If it's not, do a normal check-out
REPLACE - Don't resolve from the workspace/target platform. Do an external resolution, then force a check-out (the behavior we get with an advisor node that prevents workspace resolution).
FAIL - Fail hard if the component already exists at its destination.


* Use the MaterializationStatistics for all types of materializers. Using the IUpdateDeltaObserver that you suggested to populate it might be a good approach for the workspace materializer when SVN/CVS type of readers. The p2 materializer however, does not normally use use a reader to perform its updates. Instead, it uses the p2 engine to run a collect phase.

* Add a command line option to import that will cause the content of the MaterializationStatistics to be reported

I like the idea of a quick-as-possible probe and a dry run. I can see how the latter would be implemented.

Regards,
Thomas Hallgren


Peter M. Murray wrote:


Greetings folks,

I'm relatively new to Buckminster, but enthusiastic! Please excuse me if I don't wield the vocabulary properly or don't grok some of the concepts.

I've read in this newsgroup various postings about extending Buckminster to allow for updating an existing workspace (presumably via a cquery) and generating change-lists as a side effect. Such a functionality would be useful for CI framework integration - the goal being to maintain a workspace and bump it to the latest code, recording changes, comments, authors, etc, then rebuild and run tests. In my case, integration with Hudson is most immediate, but I imagine that other CI frameworks would benefit from similar functionality.

Would something like the following make sense:

* add IComponentReader.update(IPath location, Resolution resolution, MaterializationContext ctx, IUpdateDeltaObserver observer, IProgressMonitor monitor)
* add IComponentReader.canUpdate(); ??
* create IUpdateDeltaObserver which will get update events based on what is being updated.
* create UpdateJob that is designed to update a materialized workspace and record update events into a file based on configuration params
* create UpdateCommand that is wired to buckminster update <cquery> with appropriate options to control placement, naming etc. of the change-list xml output
* Optional extensions
** allow for a quick-as-possible (early bail on first change detected) probe if an update would change something (IComponentReader.needsUpdate() and an additional command?)
** allow for an option to run the update, gather the deltas, but not actually do anything (additional boolean arg to IComponentReader.update?)


Questions:

* Would this be a reasonable pattern for all readers? I suppose, to start, some readers could update silently or noop & log on the update??
* Is the Reader the proper level of abstraction for differentiating the update functionality?
* Would it be better to offer the update as a set of parameters to the materialization Job/Command rather than a separate command entirely (enforce identical resolution and other workflow phases)?
* Is this the right direction?


If it's cool with the powers that be, I'd be happy to roll up my sleeves once a direction is agreed upon.

Cheers,

pete