hello Dale I tried your approach with a new project I created called Nireas, its a theme manager for pharo 4. I followed your instructions and it complains that it cannot find the BaselineOfNireas This is the code I used Metacello new baseline:'Nireas'; repository:'github://kilon/nireas:master'; get; load. here is the repo https://github.com/kilon/Nireas and here is the error MetacelloFetchingMCSpecLoader(MetacelloCommonMCSpecLoader)>>retryingResolvePackageSpecReferences:gofer: linearLoadPackageSpec: packageSpec gofer: gofer MetacelloPlatform current do: [ | references nearestReference cachedReference externalReference mcVersion loadedVersionInfos | "check to see if mcz file is already in cacheRepository" cachedReference := self resolvePackageSpec: packageSpec cachedGofer: self loaderPolicy cacheGofer. (cachedReference ~~ nil and: [ packageSpec getFile ~~ nil ]) ifTrue: [ cachedReference name = packageSpec file ifTrue: [ "exact match between packageSpec file and cache" ^ self scheduleFetchFor: packageSpec cachedReference: cachedReference ] ]. "look up mcz file" references := self retryingResolvePackageSpecReferences: packageSpec gofer: gofer. nearestReference := references last asMetacelloCachingResolvedReference. "If the mcz is already in the cacheRepository, no need to copy" (cachedReference ~~ nil and: [ cachedReference name = nearestReference name ]) ifTrue: [ "latest reference in repository matches cachedReference ... " ^ self scheduleFetchFor: packageSpec nearestReference: nearestReference ]. "If the mcz is already loaded into the image, no need to copy" (self ignoreImage not and: [ (loadedVersionInfos := self ancestorsFor: packageSpec) ~~ nil ]) ifTrue: [ loadedVersionInfos do: [ :info | info name = nearestReference name ifTrue: [ ^ self ] ] ]. externalReference := (references select: [ :ref | ref name = nearestReference name ]) first asMetacelloCachingResolvedReference. self repositoryMap at: externalReference name put: externalReference repository. (self resolveDependencies: externalReference nearest: nearestReference into: (OrderedCollection with: nearestReference)) do: [ :reference | | pSpec l | mcVersion := reference version. (l := (GoferVersionReference name: reference name) resolveAllWith: self loaderPolicy cacheGofer) isEmpty ifTrue: [ self cacheRepository storeVersion: mcVersion. reference == nearestReference ifTrue: [ pSpec := packageSpec ] ifFalse: [ pSpec := packageSpec project packageSpec. pSpec name: mcVersion package name ]. self loadData addVersion: mcVersion versionInfo: mcVersion info resolvedReference: reference packageSpec: pSpec ] ]. self scheduleFetchFor: packageSpec externalReference: externalReference ] displaying: 'Fetching ' , packageSpec file in MetacelloFetchingMCSpecLoader>>linearLoadPackageSpec:gofer: in Block: linearLoadPackageSpec: packageSpec gofer: gofer... MetacelloPharo30Platform(MetacelloPlatform)>>do:displaying: MetacelloFetchingMCSpecLoader>>linearLoadPackageSpec:gofer: MetacelloPackageSpec>>loadUsing:gofer: [ :pkg | pkg loadUsing: self gofer: gofer ] in MetacelloFetchingMCSpecLoader(MetacelloCommonMCSpecLoader)>>linearLoadPackageSpecs:repositories: in Block: [ :pkg | pkg loadUsing: self gofer: gofer ] Array(SequenceableCollection)>>do: MetacelloFetchingMCSpecLoader(MetacelloCommonMCSpecLoader)>>linearLoadPackageSpecs:repositories: [ super linearLoadPackageSpecs: packageSpecs repositories: repositories ] in MetacelloFetchingMCSpecLoader>>explicitLoadPackageSpecs:repositories: in Block: [ super linearLoadPackageSpecs: packageSpecs repos...etc... BlockClosure>>ensure: MetacelloLoaderPolicy>>pushLoadDirective:during: MetacelloLoaderPolicy>>pushExplicitLoadDirectivesDuring:for: MetacelloFetchingMCSpecLoader>>explicitLoadPackageSpecs:repositories: MetacelloPackageSpec>>explicitLoadUsing: MetacelloPackageSpec>>load [ self setDefaultsAndValidateProjectSpec. spec := self projectSpec. projectPackage := spec projectPackage. projectPackage repositorySpecs do: [ :repoSpec | repoSpec createRepository flushForScriptGet ]. projectPackage load. self root: (Smalltalk at: spec className asSymbol) project. MetacelloProjectRegistration registrationForProjectSpec: spec ifAbsent: [ :new | new registerProject ] ifPresent: [ :existing :new | existing copyOnWrite: [ :existingCopy | spec copyForRegistration: existingCopy onWrite: [ :specCopy | specCopy ifNil: [ existingCopy merge: new ] ifNotNil: [ specCopy mergeScriptRepository: spec ] ] ] ] ] in MetacelloScriptEngine>>get in Block: [ ... BlockClosure>>ensure: MetacelloProjectRegistration class>>copyRegistryRestoreOnErrorWhile: MetacelloScriptEngine>>get [ :projectSpec | | engine | engine := MetacelloScriptEngine new options: self options copy; projectSpec: projectSpec; yourself. engine perform: actionArg key withArguments: actionArg value. engine root ifNotNil: [ :root | self roots add: root ] ] in MetacelloScriptApiExecutor(MetacelloScriptExecutor)>>execute: in Block: [ :projectSpec | ... [ :projectSpec | projectSpec ifNotNil: [ projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ] in MetacelloScriptApiExecutor>>executeString:do: in Block: [ :projectSpec | projectSpec ifNotNil: [ projectSp...etc... Array(SequenceableCollection)>>do: MetacelloScriptApiExecutor>>executeString:do: ByteString(String)>>execute:against: MetacelloScriptApiExecutor(MetacelloScriptExecutor)>>execute: Metacello>>execute Metacello>>get UndefinedObject>>DoIt OpalCompiler>>evaluate RubSmalltalkEditor>>evaluateSelectionAndDo: On Tue, Oct 21, 2014 at 10:55 PM, kilon alios <kilon.alios@gmail.com> wrote:
Thank you Dale very much , this is very clear :)
On Tue, Oct 21, 2014 at 10:53 PM, Dale Henrichs < dale.henrichs@gemtalksystems.com> wrote:
On Tue, Oct 21, 2014 at 12:04 PM, kilon alios <kilon.alios@gmail.com> wrote:
Thank you Dale, this is more simple than I expected.
From what you linked it looks like by [:comitish] you mean the git branch .Which in my case is master so it should be
Metacello new baseline: 'BaselineOfXXX'; repository: 'github://kilon/phEphestos:master/' get; load.
From looking at your repo on githug, the expression would be:
Metacello new baseline: 'Ephestos'; repository: 'github://kilon/phEphestos:master' get; load.
A commitish is a branch, SHA or tag. Note also, that my example was wrong ... the 'BaselineOf' shouldn't be used in the baseline: argument, just the base name of the project.
You also need to create a BaselineOfEphestos which specifies package load order. BaselineOfEphestos would be created as a subclass of BaselineOf and have a single method:
baseline: spec <baseline> spec for: #pharo do: [ spec package: 'Ephestos' ].
Then the above expression would load the Epestos package.
If you were to add another package, say EphestosTests, then you'd update the baseline to declare that EphestosTests requires Ephestos to be loaded first you'd edit the baseline: method:
baseline: spec <baseline> spec for: #pharo do: [ spec package: 'Ephestos'; package: 'EphestosTests' with: [ spec requires: #( 'Ephestos' ) ] ].
You commit the BaselineOf along with the rest of the packages for your project ...
For more information see the Metacello chapter in Pharo by Example...
Dale